llm」タグアーカイブ

OpenClaw を複数台の PC を使って 122b の Local LLM だけで運用する

複数台の PC を使って OpenClaw を使用しています。OpenClaw は多くのトークンを消費しますので、クラウドの API を使わずに自分の PC だけで運用できないかいろいろ試しています。

現在は以下の図のように 120b クラスのモデルを使用しています。AI 用の特別なマシンではなく、(メモリ増設した) 汎用の PC です。

本来なら LLM 用の PC は 1台だけでも動作できるのですが、複数台に分けているのは理由があります。PC-3 は空いてる PC の VRAM を間借りすることが目的です。PC-2 を用意したのは Sub Agent をバックグラウンドで並列動作させられることと、Main セッションの KV キャッシュとの分離のためです。

もし使える PC 台数に余裕があるなら、だいぶ贅沢ですが Heartbeat 用 PC も分けることができます。

一般向け PC での生成速度

前回説明したように、普通の PC でもメモリさえあれば 100b 以上のモデルも動くようになってきました。生成速度は 10~20 token/s ほどなので、AI 専用のマシンやクラウドの API と比べると非常に低速です。

それでも Slack のようにストリーミング表示してくれるクライアントで使っていると、思ったよりもずっと早くレスポンスが返ってくることがわかります。生成速度が遅くても使えているのは KV キャッシュが再利用できているおかげです。

逆にキャッシュが効かないケースでは一度のやりとりでも 5~10分ほど待たされるので、これが非常に重要であることがわかります。

Sub Agent を別の PC に割り当てる

OpenClaw は大きなコンテキストサイズを必要としますが、コンテキストウィンドウ長を増やすとその分生成速度は落ちていきます。VRAM 16GB でバランスを取るとだいたい 64K くらいがちょうどよいかと思います。

OpenClaw はコンパクション後でもトークン数は 20K 以上あり、使っていると簡単に 50K を超えます。そのため Main セッションの場合は、コンテキストウィンドウはほぼ単一のスロットです。この状態で Sub Agent などの別のセッションが走ると KV キャッシュが上書きされてしまい、再び長い再生成 (Prefill) 待ちになってしまうことがあります。

そこで Sub Agent に使う LLM 用の PC を別に用意すれば、長いコンテキストでのキャッシュ領域の衝突を避けることができます。.openclaw/openclaw.json の設定だと以下のようになります。

{
  "agents": {
    "defaults": {
      "model": {
        "primary": "llamacpp-pc1/Qwen3.5-122B-A10B"                 Main モデル
      },
      "subagents": {
        "model": "llamacpp-pc2/NVIDIA-Nemotron-3-Super-120B-A12B",  Sub Agent 
        "maxConcurrent": 1
      },
      "maxConcurrent": 2,
      "timeoutSeconds": 1800,
      "llm": {
        "idleTimeoutSeconds": 1800
      },
      
    }
  },
  "models": {
    "providers": {
      "llamacpp-pc1": {
        "api": "openai-completions",
        "apiKey": "llama.cpp",
        "baseUrl": "http://192.168.0.101:8080/v1",     Main  LLM PC  URL
        "models": [
          {
            "contextWindow": 65536,
            "cost": { "cacheRead": 0, "cacheWrite": 0, "input": 0, "output": 0 },
            "id": "Qwen3.5-122B-A10B",
            "input": [ "text", "image" ],
            "maxTokens": 32768,
            "name": "Qwen3.5-122B-A10B",
            "reasoning": true
          }
        ]
      },
      "llamacpp-pc2": {
        "api": "openai-completions",
        "apiKey": "llama.cpp",
        "baseUrl": "http://192.168.0.102:8080/v1",     Sub Agent  LLM PC  URL
        "models": [
          {
            "contextWindow": 65536,
            "cost": { "cacheRead": 0, "cacheWrite": 0, "input": 0, "output": 0 },
            "id": "NVIDIA-Nemotron-3-Super-120B-A12B",
            "input": [ "text" ],
            "maxTokens": 32768,
            "name": "NVIDIA-Nemotron-3-Super-120B-A12B",
            "reasoning": true
          }
        ]
      }
    }
  },
  
}

また PC を分けたことで、Sub Agent を完全にバックグラウンドで並列に走らせられるようになります。

なお Heartbeat は Main と同じコンテキストを共有しますが、同じスロットが割り当てられるので実行するタスクによっては競合する可能性があります。もし Heartbeat に使う LLM 用 PC も別に用意する場合は以下のように設定します。

{
  "agents": {
    "defaults": {
      "model": {
        "primary": "llamacpp-pc1/Qwen3.5-122B-A10B"                 Main モデル
      },
      "subagents": {
        "model": "llamacpp-pc2/NVIDIA-Nemotron-3-Super-120B-A12B",  Sub Agent 
        "maxConcurrent": 1
      },
      "heartbeat": {
        "model": "llamacpp-pc4/Qwen3.5-122B-A10B"                   Heartbeat 
      },
      "maxConcurrent": 2,
      "timeoutSeconds": 1800,
      "llm": {
        "idleTimeoutSeconds": 1800
      },
      
    }
  },
  
}

注意点

OpenClaw 用に Mac 上で LMStudio を使う場合は GGUF の方をお勧めします。単純な生成速度なら MLX の方が速いのですが、MLX ではキャッシュが再利用されずに毎回 Prefill が走ってしまうようです。

LLM 用 PC 側での実行例

LLM 用 PC では llama.cpp を使っています。以下はその実行例です。

llama-server.exe --model Qwen3.5-122B-A10B-Q4_K_M-00001-of-00002.gguf --mmproj mmproj-Qwen3.5-122B-A10B-BF16.gguf --alias Qwen3.5-122B-A10B -t 8 --ctx-size 65536 --host 0.0.0.0 --port 8080 --temp 0.6 --min-p 0.0 --top-p 0.95 --top-k 20 -fa on
llama-server --model NVIDIA-Nemotron-3-Super-120B-A12B-Q4_K_M-00001-of-00003.gguf --alias NVIDIA-Nemotron-3-Super-120B-A12B -t 8 --ctx-size 65536 --temp 0.6 --min-p 0.0 --top-p 0.95 --host 0.0.0.0 --port 8080 -fa on

複数の Sub Agent を同時実行するには

subagents.maxConcurrent = 1 を指定していますが、複数の Sub Agent を実行することは可能です。ただし並列度は 1になるので、Agent の数だけ時間がかかることになります。

もし実行時間短縮のために並列に走らせたい場合は、Sub Agent 用に更に追加の PC を割り当てる必要があります。直接コマンドから spawn 起動する場合は個別にモデル指定ができますが、設定ファイルの openclaw.json には Agent 毎に一つの Sub Agent モデルしか記述しておくことができないようです。

複数台の PC を使った並列化を行いたい場合は、個別にコマンドから model 指定で spawn するか、もしくは別の Coding Agent を利用する方法があります。例えば OpenClaw から Codex CLI の呼び出しができるので、Codex 側の設定で別の PC の Local LLM を割り当てておけば以下の 3つで並列実行になります。

  • Main Session / Heartbeat
  • Sub Agent
  • Codex CLI

画像認識モデルの指定

クラウドの商用モデルと違い、Local LLM が使うオープンモデルは画像認識に対応していないことがあります。Qwen3.5 の場合は画像入力に対応しているので不要ですが、他のモデルを使うときは以下のように VLM モデルを指定することができます。ここでは更に別の PC を割り当てています。

{
  "agents": {
    "defaults": {
      "model": {
        "primary": "llamacpp-pc1/NVIDIA-Nemotron-3-Super-120B-A12B"  Main モデル
      },
      "imageModel": {
        "primary": "lmstudio-pc3/qwen/qwen3-vl-4b"                  画像認識 
      },
      "subagents": {
        "model": "llamacpp-pc2/NVIDIA-Nemotron-3-Super-120B-A12B",  Sub Agent 
        "maxConcurrent": 1
      },
      "maxConcurrent": 2,
      "timeoutSeconds": 1800,
      "llm": {
        "idleTimeoutSeconds": 1800
      },
      
    }
  },
  "models": {
    "providers": {

       pc1/pc2 省略

      "lmstudio-pc3": {
        "api": "openai-completions",
        "apiKey": "lmstudio",
        "baseUrl": "http://192.168.0.103:1234/v1",     画像認識  VLM PC  URL
        "models": [
          {
            "contextWindow": 16384,
            "cost": { "cacheRead": 0, "cacheWrite": 0, "input": 0, "output": 0 },
            "id": "qwen/qwen3-vl-4b",
            "input": [ "text", "image" ],
            "maxTokens": 16384,
            "name": "qwen/qwen3-vl-4b",
            "reasoning": true
          }
        ]
      },
    }
  },
  
}

テキスト埋め込みモデルの指定

OpenClaw で Local LLM を使う場合は、メモリ検索用の埋め込みモデルを指定する必要があります。

OpenClaw が走っている PC のスペックが高く、RAM もストレージも余裕がある場合は CPU が使えます。とはいえ 300m (0.3b) でも 1GB ほどメモリを消費しますので、スペックに余裕がない場合はこれまでと同じ様に他の PC を割り当てて使うことが可能です。

Ollama で Local CPU を使う場合の例

  1. Ollama をインストール
  2. モデルをダウンロード
    • ollama pull embeddinggemma:300m
  3. 以下の設定を追加
{
  "agents": {
      "memorySearch": {
        "provider": "openai",
        "model": "embeddinggemma:300m",             埋め込みモデル
        "fallback": "none",
        "remote": {
          "baseUrl": "http://127.0.0.1:11434/v1",   埋め込みモデル用 PC  URL
          "apiKey": "ollama"
        }
      },
      
    }
  },

}

他の PC で処理する場合の例

LMStudio を使って他の PC 上で走らせる場合の設定例。

{
  "agents": {
      "memorySearch": {
        "provider": "openai",
        "model": "text-embedding-qwen3_embedding_4b",    埋め込みモデル
        "fallback": "none",
        "remote": {
          "baseUrl": "http://192.168.2.103:11434/v1",    埋め込みモデル用 PC  URL
          "apiKey": "lmstudio"
        }
      },
      
    }
  },

}

上記以外に provider = “local” を使う方法もあります。以下のページにまとめています。

しばらく使用してみて

llama.cpp のキャッシュ再利用のおかげで思ったよりもレスポンスは早いです。Slack で簡単な応答なら、リアクションマークが付いたあと 10秒くらいでストリーミングが始まります。ストリーミング表示されないクライアントだと全部生成してからメッセージが届くため、体感速度はだいぶ下がると思います。

たまに Heartbeat ジョブが走って Prefill 待ちが入ることがありますが、それでも長くて 2分くらいです。Heartbeat 用 PC があればこの待ち時間がなくなります。

内容も普通にチャットしている分には全く違和感なく、簡単なプログラムの作成なども問題なくこなします。memory も増えて徐々に育てていくことができます。普通に使う分には十分です。700b などの、よりパラメータ数の多いモデルと比べると細かいところでは正確性(追従性)に差が出るようです。メモリ更新などは指示して明示的にやらせた方が良いです。バックアップはこまめに取りましょう。

応答の仕方はモデルによって結構変わります。用途に合わせてモデルや量子化、temperature 等のパラメータ調整をしていくと良いのかもしれません。Sub Agent も当初はタイトル通り Qwen3.5 122B-A10B を使っていたのですが、今は Nemotron 3 Super に置き換えてテストしています。

注意点

OpenClaw で Local LLM を使用する場合はリスクを伴います。必ず完全に隔離した仮想マシンで Sandbox を有効にしてください。また重要な情報は絶対に与えず、テストする場合でもネットワークアクセスを制限しておくことをお勧めします。

{
  "agents": {
    "defaults": {
      "sandbox": {
        "mode": "all"
      },
      
    }
  },
  
}

openclaw status コマンドを実行すると、制限無しに 300b 未満のモデルを使っている場合にセキュリティの警告が表示されます。今回の説明でも 120b のモデルを使っているためセキュリティ警告が出ています。考えられるリスクとして、AI が騙されて危険な指示に従ってしまう可能性があります。OpenClaw ではできるだけ性能が高いモデルの利用が推奨されていますので、Local LLM を使う場合はご注意ください。

関連ページ

(メモリ増設した) 普通の PC で 100b 以上の LLM を使用する

普通の自分の PC 上でも (メモリさえ増設できれば) 100b (1000億) 以上のパラメータを持った巨大な言語モデルを走らせることができます。

最近立て続けに 120b 前後のモデルが 3つほどリリースされたので、昨年の gpt-oss-120 を含めて実際に走らせてみました。以下その結果です。token/s の数値が大きい方が高速です。(ctx 4096, Q4)

Modelパラメータ数
(active数)
R7 9700X 128GB
RTX5060Ti 16GB
i7-13700 96GB
RTX4060Ti 16GB
R7 5700X 96GB
RX9060XT 16GB
EVO-X2 128GB
AI Max+ 395
gpt-oss-120b120b (5b)23.8 token/s24.5 token/s15.5 token/s47.5 token/s
Qwen3.5 122B-A12B122b (10b)16.7 token/s18.4 token/s11.7 token/s27.6 token/s
Nemotron 3 Super120b (12b)11.4 token/s12.4 token/s7.0 token/s15.7 token/s
Mistral Small 4 2603119b (6b)13.8 token/s15.4 token/s11.3 token/s33.8 token/s

AI 用の EVO-X2 は別格として、普通の PC (700 番台の CPU + 60 番台の GPU) でも RAM 96GB 以上 + VRAM 16GB あれば 10~20 token/s くらいで動いているのがわかるかと思います。

ちょうど 1年前は普通の PC で 70b のモデルを動かすためにビデオカードを 5枚繋いだりしていたのですが、それでもわずか 4 token/s でした。今ではもっとパラメータ数が多い 120b で 3~6 倍速くなっています。MoE が当たり前になって最適化が進んだおかげです。ありがとうございます。

なお速度は使用するソフトウエアのバージョンや設定によって変わります。非常に更新が激しいので、2026/03/20 現在での参考値としてみてください。

エージェントとして使う場合はコンテキストウィンドウサイズを増やす必要がありますが、その分 VRAM 割当も減って遅くなります。それでも KV キャッシュの再利用ができれば、生成速度が 10~15 token/s くらいでも割と直ぐにレスポンスが来ます。逆に再利用できないケースでは入力プロンプトの Prefill でだいぶ待たされます。

Ollama の場合は MoE でもパラメータが VRAM に乗らないと速度が出ません。LMStudio の方が速いのですが、モデル毎に CPU/GPU のバランス調整が必要です。llama.cpp が最も簡単で、ほぼデフォルトで大丈夫です。

Windows 11 の Ryzen 7 9700X 128GB + RTX 5060Ti で Qwen3.5 122B-A10B を動かす場合の例

  1. gguf の Q4_K_M モデルをダウンロード
    • もし LMStudio ですでにダウンロードしたファイル ( C:\Users\ユーザー名\.lmstudio\models\ 以下 ) があればそのまま利用可能です
  2. llama.cpp の 「Windows x64 (CUDA 12)」と「CUDA 12.4 DLSs」 をダウンロード
  3. llama-server.exe を以下のようにして起動したら、ブラウザで「 http://127.0.0.1:8080 」を開きます
    • 必要に応じてモデル名やパスの部分は変更してください
llama-server.exe --model Qweun3.5-122B-A10B-Q4_K_M-00001-of-00003.gguf -t 16 --ctx-size 4096 --host 127.0.0.1 --port 8080 --temp 1.0 --top-p 0.95 --top-k 20

EVO-X2 の場合は VRAM 割当を 96GB にしたあと、上記のコマンドラインに「 –no-mmap 」を加えます。

実際にどのような設定を使ったかなど、より詳しいデータは以下のページ以下にまとめています。適宜更新しています。

使用したモデル

リリース開発モデルパラメータ数active
2025/08/05OpenAIgpt-oss-120b120b5b
2026/02/24AlibabaQwen 3.5 122B-A10B122b10b
2026/03/11NVIDIANemotron 3 Super120b12b
2026/03/17MistralMistral Small 4 119B-2603119b6b

使用した PC スペック

OSCPUArchcore/threadRAMGPU
Win11Ryzen 7 9700XZen58/16DDR5-5600 128GBGeForce RTX 5060Ti 16GB
LinuxCore i7-13700RaptorLake16/24DDR5-5600 96GBGeForce RTX 4060Ti 16GB
Win11Ryzen 7 5700XZen38/16DDR4-3200 96GBRadeon RX 9060 XT 16GB
Win11Ryzen AI Max+ 395Zen516/32LPDDR5-8000 128GBRadeon 8060S

関連ページ

ビデオカード RADEON を複数台使ってローカル LLM を動かす

GeForce だけでなく RADEON でもビデオカードを複数台使ってローカル LLM を走らせてみました。自分だけの Chat AI として使えますし、もちろんパラメータ数が同じなら蒸留版 DeepSeek R1 も動きます。

インストール手順

RADEON Vega 64/56 は VM への GPU パススルーができないこともあり、PC には Linux を直接インストールしています。

  1. RADEON を複数枚差した PC に Ubuntu 24.04 をネイティブインストール
    • 通常の Desktop 版を最小インストール
  2. ログインして OS の更新
    • sudo apt update; sudo apt upgrade -y
  3. ollama Linux 版インストーラーを公式の手順に従い実行
    • curl -fsSL https://ollama.com/install.sh | sh
  4. テストするためののモデルのダウンロード
    • ollama pull llama3.3:70b
    • ollama pull qwen2.5:32b
    • ollama pull gemma2:27b
    • ollama pull phi4:14b
    • ollama pull gemma2:9b
    • ollama pull gemma2:2b
  5. 実行
    • 例: ollama run gemma2:27b

特にドライバなどのインストールは不要で、ollama のインストールだけで GPU が認識されます。ただし使用可能な GPU は GCN の場合 Vega 56/64 以降、RDNA2 の場合は RX6800 以上、RDNA3 は RX7600 以上となります。APU は含まれません。

RADEON の推論速度の比較 (27b)

以下は gemma2 27b の結果です。token/s の数値が大きいほど高速に出力できることを意味しています。VRAM 8GB でもビデオカード 3枚使うことで GPU が 100%、14.55 token/s と CPU の 5.7倍の速度で実行できるようになりました。

VRAM合計GPU / CPU必要RAMGPUの割合token/s
なしRyzen 9 3950X18GB0%2.54
8GBRyzen 9 3950X
RX 7600
18GB45%3.52
8GBRyzen 7 9700XX
RX Vega 64
18GB45%4.36
16GB (2台)Ryzen 9 3950X
RX 7600
RX Vega 64
21GB78%6.00
16GB (2台)Ryzen 7 9700X
RX Vega 64
RX Vega 56
21GB79%7.45
24GB (3台)Ryzen 9 3950X
RX 7600
RX Vega 64
RX Vega 56
23GB100%14.55
gemma2 27b の推論速度

RADEON RX7600 (RDNA3) と Vega 64/56 (GCN5) の組み合わせでもきちんと動作しています。GeForce と同じように、異なる世代の混在でも複数の GPU を認識し、マルチ GPU のローカル LLM 推論に使えることがわかりました。

マザーボード上には PCIe x16 スロットが 2つしか無いので、ビデオカードの 3枚目は外部接続です。SSD 用の M.2 スロットに OCulink 変換カードを差し込み、OCulink ケーブル経由で MINISFORUM の DEG1 に接続しています。

RADEON の推論速度の比較 (14b)

14b の結果です。こちらは 8GB のビデオカード 2枚で VRAM に載っています。

VRAM合計GPU / CPU必要RAMGPUの割合token/s
なしRyzen 9 3950X18GB0%4.63
8GBRyzen 9 3950X
RX 7600
10GB82%11.43
8GBRyzen 7 9700XX
RX Vega 64
18GB82%13.97
16GB (2台)Ryzen 9 3950X
RX 7600
RX Vega 64
14GB100%18.00
16GB (2台)Ryzen 7 9700X
RX Vega 64
RX Vega 56
14GB100%22.71
phi4 14b の推論速度

テスト時の PC が異なるので公平な比較とは言えませんが、Vega 64/56 は古い GPU ながらメモリが高速なので RX7600 よりも LLM の推論速度が速いようです。以下は今回使用した GPU のスペックです。

GPUArchspfp32 GflopsVRAMmem b/w
RX 7600RDNA32048 sp217508GB288 GB/s
RX 6400RDNA2768 sp35654GB128 GB/s
RX Vega 64GCN54096 sp126658GB484 GB/s
RX Vega 56GCN53584 sp105448GB410 GB/s

より多くのモデルの結果及び GeForce 含めた結果は以下のページにまとめています。

RADEON RX 6400 (6500XT) でも LLM を使えるようにする

RADEON RX 6400 は RDNA2 世代の下位グレードの GPU です。VRAM 4GB に 12CU 768sp と性能もかなり控えめで、APU 内蔵の GPU に近いスペックです。そのかわり補助電源不要で Low Profile PCI 版のビデオカードも存在します。

公式でも ROCm には非対応ですが、ollama のドキュメントには対応方法が書いてあるので試してみました。なおドキュメント(以下のリンク)には 2025/02/15 現在 RX 5400 と書かれていますが、gfx1034 のことを差しているので RX 6400 (または 6500XT) の間違いだと思われます。

方法: ollama の環境変数 HSA_OVERRIDE_GFX_VERSION に “10.3.0” を設定します。

  1. sudo systemctl edit ollama.service
    • 使用するエディタを指定したい場合は以下のようにする
    • sudo EDITOR=vi systemctl edit ollama.service
  2. エディタが起動したら 3行目からの空行に以下の 2行を挿入する
    • [Service]
    • Environment=”HSA_OVERRIDE_GFX_VERSION=10.3.0″
  3. 保存して終了したら以下のコマンドを実行する
    • sudo systemctl daemon-reload
    • sudo systemctl restart ollama

この設定で RX 6400 でも GPU を使って走らせることができるようになりました。VRAM が 4GB しかないので限界はありますが、小さいモデル限定なら CPU よりは速度が出ています。ただし VRAM 容量や速度を考えると使用できるのは 7b くらいまでになるかと思います。

また同じ世代の GPU 同士に限りますが RX 6400 を複数台使用した場合でもきちんと動作しました。ドキュメントには “HSA_OVERRIDE_GFX_VERSION_番号=10.3.0” のように、環境変数名にデバイス番号を指定することで異なる世代の RADEON を組み合わせられるように記載されていますが、残念ながらうまく動きませんでした。

RX 6400 による推論時間は以下のとおりです。2枚使用した場合と CPU のみの結果も載せています。

model RX6400 x2 (合計 8GB)
token/s
RX6400 (4GB)
Token/s
CPUのみ
Token/s
llama3.3:70b1.05 (16%)1.03 (8%)1.01
qwen2.5:32b2.42 (34%)2.29 (17%)2.16
gemma2:27b2.87 (38%)2.70 (21%)2.54
phi4:14b6.94 (72%)5.60 (39%)4.63
gemma2:9b11.70 (85%)8.52 (51%)6.94
qwen2.5:7b18.52 (100%)13.05 (69%)9.27
gemma2:2b40.60 (100%)46.33 (100%)19.73
RADEON RX 6400 を使った各種モデルの推論時間の比較

関連ページ

普通の PC に GPU 5枚繋いで Llama 70b を動かしてみる

最近は一般の PC でも LLM (Large Language Model) を走らせることができるようになっています。いわゆる ChatGPU のローカル版で、自分の PC 上で動くため API 利用料金などを気にせずに使うことが可能です。ただし動作可能な LLM の規模はビデオカードの VRAM 容量に依存します。

Ollama は複数の GPU に対応しており、前回 VRAM 8GB の GeForce GTX でも十分戦力になることがわかったので更にいろいろと台数をやしてみました。

結果、llama 70b のモデルを GPU 上で走らせるために必要だったビデオカードは 5台で合計 VRAM は 56GB、最終的な速度は 4 tps。CPU よりは数倍速いですが、少々実用には厳しいようです。

使用したビデオカードは以下の通りです。

70b の生成速度のまとめ

ビデオカードの種類や枚数毎の llama 70b の生成速度の違いを表にまとめました。下に行くほどビデオカードの台数が増えています。

VRAM合計GPU / CPU必要RAMCPUの割合GPUの割合token/s
なしRyzen 7 9700X46GB100%1.02
8GBRyzen 7 9700X
GTX 1080
47GB83%17%1.32
8GBRyzen 7 9700X
RX Vega 64
47GB83%17%1.34
16GB (2台)Ryzen 7 9700X
GTX 1080
GTX 1070
48GB67%33%1.45
16GB (2台)Ryzen 7 9700X
RX Vega 64
RX Vega 56
48GB65%35%1.55
32GB (2台)Ryzen 9 3950X
RTX 4060Ti
RTX 4060Ti
47GB32%68%2.22
40GB (3台)Ryzen 9 3950X
RTX 4060Ti
RTX 4060Ti
RTX 2070S
49GB17%83%3.08
48GB (4台)Ryzen 9 3950X
RTX 4060Ti
RTX 4060Ti
RTX 2070S
GTX 1080
51GB5%95%3.94
56GB (5台)RTX 4060Ti
RTX 4060Ti
RTX 2070S
GTX 1080
GTX 1070
55GB100%4.09
llama 70b の推論速度

表にある必要 RAM 及び CPU/GPU の割合はそれぞれ実行時に ollama ps コマンドで表示される数値です。複数のビデオカードに分割できるとはいえ、台数が増えれば増えるほど必要 RAM が増えており、メモリ効率も悪くなっていることがわかります。

枚数を増やすほど消費メモリが増え、ますますビデオカードを増やす必要が生じてしまいます。5台使用時の必要メモリは CPU 単体のみの場合と比べて 10GB ほど増えおりあまり効率はよくありません。やはり VRAM は多ければ多い方が良いです。

動作環境など

マザー上には PCIe x16 スロットが 2つしか無いのでそれ以外の GPU は外付けです。SSD 用の M.2 (PCIe x4) とマザーボード上の PCIe x1 スロットを利用して外部に 3台のビデオカードを繋いでいます。

↓動作時の様子。一番上が MINISFORUM DEG1 (OCulink 接続) に載った GeForce RTX 2070 Super、床に立ててあるのが PCIe x1 接続の GeForce GTX 1080 と GTX 1070。

前回Proxmox 上の VM にパススルーしていましたが、少しでも性能を上げるために今回は SSD に直接 Ubuntu をインストールしています。M.2 スロットはすべて GPU の接続に使用したため SATA SSD を使用しています。

前回は VM だったので RADEON RX Vega 64/56 をパススルーできなかったのですが、OS を直接インストールしたことで Vega でも動くようになりました。Ollama が対応しているのは Vega 56/64 以降なので残念ながら RADEON RX 480 (Polalis) は使用できませんでした。とりあえず手持ちの RADEON でも複数台使用した動作を確認することができました。

GPU 台数とモデルサイズの関係

複数台 GPU を使用した場合に VRAM に 100% 載るモデルサイズの目安は以下のとおりです。

VRAM の組み合わせ合計 VRAM 容量モデルサイズ(Q4)モデルの例
8GB + 8GB16GB14bphi4:14b など
8GB + 8GB + 8GB24GB27bgemma2:27b など
16GB + 8GB24GB32bqwen2.5:32b など

組み合わせの例。

VRAM の組み合わせ合計 VRAM 容量モデルtoken/s
GeForce GTX 1080
GeForce GTX 1070
16GBphi4:14b16.19
RADEON RX Vega 64
RADEON RX Vega 56
16GBphi4:14b22.71
GeForce RTX 2070 Super
GeForce GTX 1080
GeForce GTX 1070
24GBgemma2:27b12.89
GeForce RTX 2070 Super
GeForce RTX 4060Ti
24GBqwen2.5:32b13.56

より詳しい数値は以下のページにまとめています。

関連ページ

VRAM 8GB の GPU 3枚で 30B 前後の LLM を動かす。Ollama でマルチ GPU 速度の比較

PC 上でローカル LLM を実行する場合、VRAM 容量が足りなくてもビデオカードを複数枚集めれば GPU 上で動作することがわかったので、色々組み合わせて速度を比較してみました。

家に眠っていた古いビデオカードを集めて 30B 前後のモデルが動いています。流石にパフォーマンスでは GeForce RTX 4090 等の上位モデルに敵わないと思いますが、13 tps ほど出ていますので動かすだけなら十分かと思います。

以下その結果です。速度は変動があるので数値はあくまで参考程度にお願いします。

27B gemma2:27b

VRAM 8GB のビデオカード 3枚で動作させることができました。使用したのは GeForce RTX 2070 Super (8GB)、GeForce GTX 1080 (8GB)、GeForce GTX 1070 (8GB) といった組み合わせです。GTX 1000 世代は TensorCore がありませんが、それでも CPU よりずっと高速です。

種類GPU合計VRAMメモリ使用量容量の割合速度
CPU のみRyzen 7 9700X19GB100% CPU1.97 tps
3 GPU2070S + 1080 + 10708+8+8=24GB23GB100% GPU12.89 tps
2 GPU4060Ti + 2070S16+8=24GB23GB100% GPU15.94 tps

うまく動いたので、あとから他の PC で使っていた RTX 4060ti (16GB) も持ってきました。「メモリ容量」と「容量の割合」は「ollama ps」コマンドで表示される値です。

32B qwen2.5:32b

32B はギリギリ入りませんでした。同じ 24GB でも GeForce RTX 4060 Ti (16GB) + GeForce RTX 2070 Super (8GB) の場合はメモリに載ります。やはり分割は少ない方がメモリの利用効率が上がるようです。

種類GPU合計VRAMメモリ使用量容量の割合速度
CPU のみRyzen 7 9700X22GB100% CPU1.77 tps
3 GPU2070S + 1080 + 10708+8+8=24GB25GB3% CPU + 97% GPU7.69 tps
2 GPU4060Ti + 2070S16+8=24GB23GB100% GPU13.56 tps

14B phi4:14b

14B はもちろん動きます。4060Ti (16GB) の場合は一枚に収まりました。8GB 2枚でも動くかもしれませんが残念ながら未確認です。余裕があれば後ほど試したいと思っています。

種類GPU合計VRAMメモリ使用量容量の割合速度
CPU のみRyzen 7 9700X11GB100% CPU3.06 tps
3 GPU2070S + 1080 + 10708+8+8=24GB16GB100% GPU17.38 tps
1 GPU4060Ti16GB14GB100% GPU37.38 tps

70B llama3.3:70b

70B はさすがに大きく、手持ちのビデオカード 4枚全部繋いでもメモリに入りませんでした。

種類GPU合計VRAMメモリ使用量容量の割合速度
CPU のみRyzen 7 9700X46GB100% CPU0.88 tps
3 GPU2070S + 1080 + 10708+8+8=24GB50GB52% CPU + 48% GPU1.09 tps
2 GPU4060Ti + 2070S16+8=24GB48GB49% CPU + 51% GPU1.46 tps
3 GPU4060Ti + 2070S + 108016+8+8=32GB49GB35% CPU + 65% GPU1.69 tps
4 GPU4060Ti + 2070S + 1080 + 107016+8+8+8=40GB51GB21% CPU + 79% GPU2.22 tps

データ

より詳しい結果を以下のページにまとめました。

使用した環境など

Proxmox VE 上の VM に Ubuntu 22.04 をインストールし、その上で ollama を走らせています。GPU は最大 4枚を VM にパススルーしています。ビデオカードはそれぞれ以下の方法で接続しています。

  • マザーボード上の PCIe x16 スロット 1 (PCIe 3.0 x16 で RTX 2070Super)
  • マザーボード上の PCIe x16 スロット 2 (PCIe 4.0 x4 で RTX 4060Ti)
  • M.2 スロット + Oculink 経由で外部の DEG1 に接続 (PCIe 3.0 x4 で GTX1080)
  • マザーボード上の PCIe x1 スロットからライザーケーブル (PCIe 3.0 x1 で GTX1070)

GPU を接続した PC は Ryzen 9 3950X + X570 です。CPU のみの結果は別の PC (Ryzen 7 9700X) によるものです。

VM へのパススルーではなく Linux を直接インストールした場合ではもう少しパフォーマンスが上がるかもしれません。

GeForce RTX 4090 や RTX 3090 といった上位 GPU がなくても、家にあった古いビデオカードを利用して組み合わせるだけで 30B 前後のモデルが使えるようになりました。その分パフォーマンスは限られていますが、13 tps あればそれなりに使えると思いますので、アプリケーションから呼び出すテストに使ったりと色々活用できそうです。

関連エントリ