£200でデータセンターGPUをゲーミングPCに載せる
(blog.tymscar.com)- ローカルLLM環境で RTX 4080 16GB だけでは不足したため、中古の Tesla V100 SXM2 16GB とアダプターを約 £200 で追加し、合計 32GB VRAM を構成
- V100 SXM2 は PCIe スロット・ディスプレイ出力・一般的な電源コネクターを持たないサーバー向けGPUだが、SXM2-to-PCIe アダプターでゲーミングPCに搭載できた
- サーバー向けファンは標準で 82dB と室内利用が難しかったが、PH2.0-2.54mm ジャンパーケーブルでマザーボードのファンヘッダーに接続し、PWM 制御と静音運用を実現
- llama.cpp の tensor splitting で RTX 4080 と V100 に Qwen3.6-27B-MTP Q5_K_M を分散配置し、128k コンテキストと約 32 tok/s の推論速度を得た
- 単体の 32GB GPU ほどスマートではなく、ドライバー・CUDA・warm reboot の問題は残るが、中古サーバーGPU は安価なローカルLLM用 VRAM 拡張の代替になり得る
£200で構築した 32GB ローカルLLM環境
- RTX 4080 16GB VRAM だけでは望むローカルモデルの実行に足りず、中古のデータセンターGPUをアダプター経由でゲーミングPCに追加
- Tesla V100 SXM2 16GB と SXM2-to-PCIe アダプターを合わせて約 £200 で購入し、2枚のGPU合計で 32GB VRAM 環境を構築
- 27B パラメータモデルを2枚のGPUに分散して載せ、約 32 tokens/s で動作し、モデル全体とコンテキストがVRAMに収まった
- 単体の 32GB コンシューマーGPU と同じ体験ではないが、RTX 5090 32GB よりはるかに低コストで VRAM 容量を確保
Tesla V100 SXM2 とアダプター
- Tesla V100 SXM2 16GB は NVIDIA DGX サーバーやハイパースケーラー向けラック用GPU
- 一般的な PCIe スロット、ディスプレイ出力、通常の電源コネクターを持たない
- サーバー内部の独自ボードに装着され、NVLink で通信する構造
- マザーボードに直接挿すには別途アダプターが必要
- V100 は Volta GPU で、16GB HBM2 メモリと 5120 CUDA コアを搭載
- eBay での購入価格は約 £150
- 2017年のGPUだが、演算性能とVRAMはローカルLLM用途では今でも有効
- HBM2 メモリ帯域幅 が主な強み
- V100 は 4096-bit メモリバスで 900GB/s の帯域幅を提供
- RTX 4080 の GDDR6X 帯域幅 736GB/s より 22% 高い
- Apple M3 Max の 400GB/s、M4 Max の 546GB/s、M5 Max の 614GB/s より高い
- AMD RX 7900 XTX は 24GB GDDR6 と 960GB/s の帯域幅で V100 をわずかに上回るが、価格は £700 以上
- ROCm の LLM 推論サポートは CUDA に比べてまだ粗いと評価
- V100 は RX 7900 XTX の帯域幅の 94% を 4分の1未満の価格で提供し、llama.cpp と動作する
- RTX 5090 は 1,792GB/s の帯域幅で V100 を明確に上回るが、価格は £2,000 以上
- LLM 推論ではメモリ帯域幅が tokens/s を左右するボトルネックになるため重要
- SXM2-to-PCIe アダプター は NVIDIA 公式製品ではなく、公式サポートもない
- 片側に SXM2 ソケット、もう片側に PCIe エッジコネクターを持つ bare PCB 形状
- 価格は約 £50 で、全体構成は約 £200 になった
- このアダプターにより V100 16GB を RTX 4080 と一緒にマザーボードへ挿せた
サーバー向け冷却ファンの問題と解決
- V100 SXM2 は 2U サーバーの産業用冷却環境で動作するよう設計されている
- アダプターのファンは普通の部屋で使うには難しいほど騒音が大きい
- Apple Watch で測定した騒音は 82dB で、ディスポーザーと芝刈り機の中間ほどと表現される
- 初期状態ではファン制御ができなかった
nvidia-smi、Linux のデバイス探索、Windows Afterburner の試行はすべて失敗- アダプターのファンはサーバーラック内で常時 100% 回転する前提に見えた
- 9V バッテリーテスト でファンのピン配列を確認
- VCC と ground にジャンパー線を挿し、9V バッテリーを当てるとファンが回転
- 12V の通常駆動よりかなり静かで、ファン制御の可能性を確認できた
- ファンは標準的なPCケースファンに近い動作をした
- ジャンパー線をファンコネクターに挿し、もう片側をマザーボードの空きファンヘッダーに接続
- マザーボードは RPM を読み取り、PWM 制御も可能だった
- 10% 速度でもフルロード時に 50°C を超えず、ほとんど聞こえないレベルになった
- 最終的なケーブルは 2.54mm male to PH2.0 female jumper cable で構成
- アダプターのファンコネクターは 4ピン JST PH2.0 プラグ
- マザーボードのファンヘッダーは標準 0.1 inch、つまり 2.54mm ピッチ
- PH2.0 female 側はファンの tachometer と PWM ピンに、2.54mm male 側はマザーボードのファンヘッダーに接続
- £2 程度のジャンパーケーブルとコネクター確認で 82dB 問題を解決
2枚のGPUでVRAMを拡張する
- 最終的なGPU構成は以下の通り
- RTX 4080: 16GB VRAM、Ada アーキテクチャ
- Tesla V100: 16GB VRAM、Volta アーキテクチャ
- 合計: 2枚のGPUにまたがって 32GB VRAM
- llama.cpp は tensor splitting でモデルを2枚のGPUに分けて実行できる
- PCIe バスを通じてレイヤーをパイプライン処理
- RTX 4080 が一部のレイヤーを処理し、V100 が残りを処理
- 単体の 32GB GPU より速くはないが、動作し、32GB GPU のコストの約 10% 程度で構成できる
- V100 の消費電力は最大で約 150W 程度と観測
- ローカルLLM推論用GPUとして小さくはないが、異常に大きいわけでもない
- V100 32GB モデル も選択肢として残る
- 購入価格の2倍以上だが、単一カードで 32GB HBM2 を数百ポンドで確保できる
- 32GB V100 を2枚なら 64GB VRAM を構成でき、現在の RTX 5090 価格の約 20% 程度と表現される
- SXM2 形式は NVLink を標準サポート
- きちんとしたマルチGPU構成を組めば、GPU 間で高帯域通信が可能
- PCIe アダプター経由でも tensor split の性能は十分堅実だった
NixOS でドライバーと CUDA を合わせる
- ソフトウェア構成は NixOS のおかげで比較的スムーズに進んだ
- V100 は Volta チップで、NVIDIA はドライバーブランチ 560 から Volta のサポートを終了
- RTX 4080 Ada と V100 Volta の両方を同時にサポートする最後のドライバーは 550.x ブランチ
- NixOS では
nvidiaPackages.legacy_535に相当
- このドライバーは CUDA 12.2 までしか対応しない
- 現在の nixpkgs は CUDA 12.6 以上を提供
- CUDA 12.2 を nixpkgs 24.05 から持ってくる必要があった
- ドライバーは Linux kernel 6.6 を要求
- legacy ドライバーはそれより新しいカーネルをサポートしない
- ヘッドレス推論サーバーなのに
services.xserver.enable = trueが必要だった- この設定がないと NVIDIA カーネルモジュールがロードされない
- 重要な NixOS 設定は、カーネル、NVIDIA legacy ドライバー、X server の NVIDIA ドライバー指定で構成
boot.kernelPackages = pkgs.linuxPackages_6_6;
hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.legacy_535;
services.xserver.enable = true;
services.xserver.videoDrivers = [ "nvidia" ];
- CUDA 12.2 は旧版 nixpkgs から overlay で取り込んだ
nixpkgs.overlays = [
(final: prev: {
cudaPackages_12_2 = nixpkgs-cuda.legacyPackages.${prev.system}.cudaPackages_12_2;
})
];
- 2枚のGPUはどちらも認識され、CUDA も正常に動作
- マシン定義全体は dotfiles repo のこの commit に含まれる
- llama.cpp のサービス定義と、正しいバージョンに固定したカスタムビルドも含む
実行したモデルと性能
- 実行モデルは Qwen3.6-27B-MTP Q5_K_M の量子化版
- モデルサイズは約 19GB
- 2枚のGPUを使うことでモデル全体が VRAM に載り、コンテキスト用の余裕も残る
- 主な実行設定は以下の通り
- Model: Qwen3.6-27B-MTP Q5_K_M, 19GB
- Context size: 128k tokens
- GPU layers: 99、すべてオフロード
- Tensor split:
-ts 1.0,1.0、2枚のGPUに均等分配
- 性能は以下の通り
- Inference speed: 約 32 tok/s
- Prompt processing: 約 133〜160 tok/s
- 32 tokens/s は対話用途には十分な速度と評価
- 異なる2つのGPUアーキテクチャを PCIe でつなぎ tensor split する構成でも達成
- ネットワーク遅延まで考えると、ほとんどのクラウド API エンドポイントより速いと表現される
MTP と画像入力
- MTP は Multi-Token Prediction の略
- 通常の LLM 推論は一度に1トークンだけ予測し、それを受理した後に次のトークンを予測する
- MTP は複数の未来トークンをまとめて予測し、当たったトークンを検証する
- 受理されたトークンは実質ほぼ無料で、外れた予測は通常経路に戻る
- MTP の効果は、精度低下なしに生成速度が約 1.5〜2 倍になること
- この構成では約 32 tok/s から、MTP がよく当たると 50〜60 tok/s まで可能とされる
- とくにコードのような予測しやすい出力で効果が大きい
- llama.cpp の MTP サポートはまだ新機能
- nixpkgs の llama.cpp バージョンは Qwen3.6 MTP アーキテクチャをサポートしていない
- そのサポートが追加された特定の commit から llama.cpp をソースビルドする必要があった
- NixOS ではカスタム derivation をその commit に固定し、再現可能に構成
- モデルや llama.cpp のバージョン変更は設定1行を変えて
nixos-rebuild switchを実行するだけで対応
- Qwen3.6-27B は別のマルチモーダル projector ファイル
mmprojを通じて画像入力をサポート- 追加ファイルサイズは約 928MB
- vision encoder が画像ピクセルを LLM のトークン埋め込み空間へ変換する構造
- モデルが人間のように画像を「見る」わけではない
- LLM は変換されたベクトルを別のトークン列のように処理する
- llama.cpp の実行フラグは以下
--mmproj /mnt/nas/llamacpp/mmproj-F16.gguf --mmproj-offload
--mmproj-offloadは vision encoder をモデルと一緒にGPUへ載せる- 画像入力でも高速な推論を維持できる
ローカルでの使い方
- この構成は OpenCode と組み合わせて使われている
- OpenCode はローカルモデルを対象に実行できる AI コーディングアシスタント
- LLM サーバーはデスクトップで動かしているが、利用は別のデバイスから行う
- 家の中の別マシンからネットワーク経由で接続
- 外部からは Tailscale 経由で接続
- OpenCode から llama.cpp サーバーを使う設定は API URL の指定で行う
- モデルはローカルで動作
- 応答は高速で、データはネットワーク外へ出ない
残っている問題と限界
- V100 が warm reboot 後に消える問題 がときどき発生
- OS だけが再起動し、マザーボードには電源が入ったままの再起動後に、
lspciやnvidia-smiで V100 が見えなくなることがある - PCIe スロットの ACPI enumeration 問題に見える
- 物理的に電源を切って数秒待ってから再度入れる cold reboot を行えば、必ず復旧する
- OS だけが再起動し、マザーボードには電源が入ったままの再起動後に、
- V100 がないと llama.cpp は起動しない
- 16GB のGPU 1枚ではモデルが収まらないため
- GPU が戻るまでサービスは crash loop を繰り返す
- たいてい再起動時は近くにいるので、実運用では大きな問題とは見ていない
- 異なるアーキテクチャの2枚のGPUを tensor split する構成は、単体GPUほどスマートではない
- V100 は推論用として最速のGPUでもない
- それでも価格対性能は非常に高いと評価される
選択肢と結論
- 約 £200 で得られたものは以下
- ゲーミングGPUと一緒に動作する 16GB のデータセンターGPU
- ローカルLLM推論向け合計 32GB VRAM
- 27B パラメータモデルで 32 tokens/s
- 128k token コンテキストウィンドウ
- 画像入力向け vision サポート
- クラウドやトークン単価なしで完全ローカル実行されるモデル
- 実質的なコストはファン騒音で、ジャンパーケーブルとコネクター確認で解決した
- 本格的なローカルモデルを回したいなら、中古サーバーGPU市場 は代替案になり得る
- 既存GPUがなくても、単体の V100 を安価なサーバーボックスに入れれば 16GB VRAM と実用的なローカルLLM環境を作れる
- V100 SXM2 だけが選択肢ではない
- P40 は似たコストで 24GB を提供するが、より遅く Tensor Cores もない
- V100 32GB モデルはより高価だが、同容量VRAMのコンシューマーGPUよりなお安価
- ただし、ファン問題への備えは必要
1件のコメント
Lobste.rs の意見
アプローチが本当に素晴らしいし、GPUがPCIeから消える現象は原因が多すぎて、なおさら気になる
GPUファンの大きな回転音を聞くと、NVIDIA CUDAチームにいた頃を思い出す。同僚がNVMLと
nvidia-smiにファン制御機能を追加していて、仕切りの向こうからファンが速くなったり遅くなったりする音が聞こえてきたかと思うと、彼が満面の笑みで顔をのぞかせたコードが動いた瞬間に結果を耳で聞けるので、自分が手がけた機能の中でもいちばんお気に入りだったそうだ
セルフホストのLLMに興味があるなら、Dell OEMのRTX 3090は大手ブランド製品よりたいてい安く、約800カナダドルで入手できた
そろそろ
vLLMがどう動くのか、もっと読んでみないといけない。モデルがときどき関連する名前や形容詞を延々と長いリストで吐き出し始めるので、たぶん何か設定を間違えているまともに使えるモデルの大半は、きちんと動かすには少なくとも48〜64GB VRAMが必要だと思っていたので、そのためにユニファイドメモリアーキテクチャを持つAppleのMシリーズチップがこの分野で人気なのだと思っていた
そういう製品もすでに完成品として売られてはいるけれど、メーカー保証3か月で終わるような感じだ
https://ebay.com/itm/297819576914/…
アメリカでは中古の32GBモデルが600ドル前後で取引されている
アダプターはおそらく原産地の中国から直接買うと思う
AMD側に相当する製品があるのか気になる。今は48GBのW7900を2枚使っているが、もっと大きなモデルを動かせるように拡張したい
冷却は追加する必要があるが、アダプターをいじる必要はない
ローカルモデルの構成を見つけるたびに読んでいるが、今の中規模VRAM需要である48〜128GB帯には、本当に価格性能比の最適解がないように見える。選択肢はだいたい3つだ。3世代前のデータセンターGPUを複数枚使う(Tesla V100、Instinct MI60)、VRAMの大きい現行世代の最下位製品を複数枚使う(Arc Pro B70)、現行世代の一体型ボックスを使う(DGX Spark、Mac Mini、Strix Halo)
32GBのコンシューマー向けGPU 1枚や16GB 2枚からアップグレードする人にとっては、それぞれ妥協点はあるものの利点もある。すでに48GBカードを2枚使っている状況だと、体感できる改善になるような中古ハードウェアのアップグレードがあるかどうかは、正直よくわからない