2018年8月に、HP ProLiant Thin Micro TM200という小型サーバー機を中古で買った(こういうやつ)。CPUとしてサーバー用のXeonをいちおう搭載しているが、D-1518というかなり低スペックなやつで、4コア8スレッドの2.2GHzしか出ない。とはいえ消費電力が低く(35W)、メモリもDDR4で32GBはあるので、Debian/GNU Linuxを常時稼働させて開発に使っているぶんには現在でも何ら不満はない。今後も物理的に壊れるまで使い続ける思う。
しかし、何も不満がないというと嘘で、当然ながらディスプレイ用の最低限のGPUしか載っておらず、汎用PCIeスロットもないから、機械学習タスクには手が出せない。GPUが必要なタスクだけをDocker化してGoogle Colabやさくらインターネットの高火力DOKといったサービスで計算してもらうことはできるし、やってもいたのだけど、いかんせんこのフローはエージェントを利用した開発との相性がよくない。もちろん権限を渡せば自動化はできるのだろうが、ただでさえトークン代でびくびくしてるのに、機械学習を試すたびに金額が読めないGPU代におびえることになるので、どうしたって気軽な実験は難しいだろう。
というわけでGPUがほしい。なにもDGX Sparkのようなマシンである必要はなく、そこそこの容量のVRAMを搭載したGPUさえあれば十分である。それでもTM200にPCIeスロットがない*1という現実をふまえるとマシンごと買うことになり、これにはだいたい70万円くらいは必要になる。やっぱり無理めの無理だなあ、と思っていた。
ところが、空き時間にGPUを調べまくっているうちに、NVMe SSD用のM.2 M-keyスロットをPCIeスロットに変換するというアダプターの存在に気が付いた。 AliExpress、ほんとうになんでもある。
TM200は、この時代のサーバー製品としては画期的なことに、筐体の底面からM.2 M-keyスロットにアクセスできる。 ここからPCIeスロットに変換すれば、理論的にはGPUを外付けできる。 もちろん帯域は細いので、MoEモデルをRAMやSSDに置いてローカルLLMをするような使い方は厳しいのだが、やりたいのはVRAMにモデルを載せて長時間学習できるようにすることなので、そこの帯域はそんなにどうでもいい。
そこで、こういう構成でTM200に外付けGPUを接続して機械学習モデル開発ができる体制を作ることにした。
graph LR
TM200["HP ProLiant TM200"]
M2["M.2 M-keyスロット"]
K43["いい感じのアダプタ"]
GPU["GPU"]
TM200 -->|内蔵NVMe| M2
M2 -->|外出しPCIe| K43
K43 -->|PCIeスロット| GPU
物理的な接続
M.2 M-keyスロットからPCIeスロットを引き出すアダプターは、意外といろいろある。 確かにNVMe SSDはPCIe上のデバイスとして見えるので、電気的にはわりと単純な変換なのかもしれない。 逆向き(GPUを使わないけどSSDを増やしたい人向け)の製品もある。
そんなわけで仕様的な面ではあまり心配いらなそう。むしろ気にすべき制約は、GPUという高価な機材を「物理的にどう置くか」である。 GPUへの給電のための電源をどう確保するかも悩ましい。 NVMeからの給電はしょせんSSD向けの容量なので、それでGPUを動かすことはできない。
結論としては、この手のアダプターを出しまくっているADT-LinkというメーカーのK43SG-BK-BK7という製品を選択した。 これはK43SGというアダプターにGPUを固定できる金属製のブラケットが付いているやつで、このブラケットにはATX電源も固定できるようになっている。 ATX電源は古い自作PCで使っていた400W級の静音タイプがあるので、それを取り付けるつもり。
TM200側のM.2 M-keyスロットは、筐体の底面にあるねじ止めされた蓋を空けるとアクセスできる。 SSDを挿入する場合には蓋を締めて使うのだが、アダプターを指したら蓋は締まらないので、しかたないね。 埃や筐体の廃熱性能には問題がありそうだけど…。
GPU
GPUはRTX PRO 4000 SFF Blackwellにした。 VRAMが24GBあり、RTX 5090の32GBには及ばないものの、5070の2倍もある。 旧世代機だとRTX 3090が24GBなんだけど、いま新品を探すとPRO 4000と同じくらいの値段がする(むしろPRO 4000のほうが安い)し、旧世代機だと対応していない精度の量子化を施した言語モデルもあるっぽいので、現行世代にしない理由はなさそう。 70Wという低消費電力なのもえらい(RTX 3090だと350W級)。 PCIeスロット給電のみで動作するので、アダプターであるK43SGに普通のATX電源を接続するだけで動くのもありがたい。
購入と導入
購入前に残る唯一の不安として、TM200のUEFIでGPUが認識されない可能性があったのだけど(PCIeスロットを引き出せることと、その先に接続されたSSD以外のデバイスをUEFIが認識できることは別)、どうしても認識できなかったらWindowsマシン(こちらはPCIeスロット自体はある)で使うことはできるし、とにかくGPUは「必要なら一日でも早く買ったほうが得」という市況なので、購入に踏み切った。
納品されて接続し、とりあえず起動してDebianで確認すると、無事にVGA controllerとしてNVIDIA GB203が見えた。
$ lspci | grep -i -E 'nvidia|vga|3d' 01:00.1 VGA compatible controller: Matrox Electronics Systems Ltd. MGA G200EH (rev 01) 0e:00.0 VGA compatible controller: NVIDIA Corporation GB203GL [RTX PRO 4000 Blackwell SFF Edition] (rev a1) 0e:00.1 Audio device: NVIDIA Corporation GB203 High Definition Audio Controller (rev a1)
Debian 13にNVIDIAドライバを入れる
DebianでCUDA対応のGPUを使うには、NVIDIAのopen kernel moduleを導入する必要がある。
そのためには、NVIDIA公式のAPTリポジトリをsource.listに追加して、nvidia-driver-cudaとnvidia-kernel-open-dkmsをインストールする。
これはDebianのバージョンがtrixieであるだけではだめで、実行中kernelに対応するheaderが入っている必要がある。
$ sudo apt update $ sudo apt install linux-image-amd64 linux-headers-amd64 $ sudo reboot (再起動まち) $ wget https://developer.download.nvidia.com/compute/cuda/repos/debian13/x86_64/cuda-keyring_1.1-1_all.deb $ sudo dpkg -i cuda-keyring_1.1-1_all.deb $ sudo apt update $ sudo apt install nvidia-driver-cuda nvidia-kernel-open-dkms (略) nvidia/610.57.04, 6.12.107+deb13-amd64, x86_64: installed
もういっかい再起動してmodprobe nvidia後にnvidia-smiを実行するとこうなる
$ sudo modprobe nvidia $ nvidia-smi +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 610.57.04 KMD Version: 610.57.04 CUDA UMD Version: 13.3 | ...
やったね。
Qwen3.8-27Bを動かしてみる
目的はローカルLLMではないのだけど、せっかくVRAMが24GBあるので、テストがてらここに収まるLLMを動かしてみたい。
そんな用途にぴったりのモデルとしてQwen3.8-27B(のQ4_K_M)があるので、これを載せてみた。
とりあえず動けばいいので推論エンジンは素のllama.cppです。
$ curl -LsSf https://llama.app/install.sh | sh $ llama cli \ -hf ggml-org/Qwen3.8-27B-GGUF:Q4_K_M \ --n-gpu-layers all \ --ctx-size 8192
やったね。
> こんにちは [Start thinking] We need to respond to user: "こんにちは". Then final in Japanese likely. Simple. [End thinking] こんにちは!有什么可以帮你的吗? [ Prompt: 119.8 t/s | Generation: 17.9 t/s ]
特別に高速化していない素のllama.cppで生成17.9 tok/sを出せるのはちょっと意外だったけど、モデルの重みがぜんぶPRO 4000上に載っていて、TM200とのやり取りが頻繁に発生してるわけでないから、そんなものという気もする。
これからやること
なんでもっと早く買わなかったんだろうって思っている。 いまは、人間(ぼく)の推敲技術を言語モデルに移すための手立てを考えていて、エージェントに基盤を構築してもらいながら学習を回しているところ。 将来的にはローカルLLMも、いわゆるコーディングエージェントとしてでなく、日本語推敲のためのLLM-as-a-judgeとして使いたいので、本を買って応援してください!
*1:言うまでもなく外部GPUのためのThunderboltコネクタもない



