ローカルで生成AIを動かすために、RTX2060(VRAM12GB)を使っていた
が、VRAM欲しさにRTX2080Ti(VRAM22GB)を買った
それで、余ったRTX2060(VRAM12GB)を使っていない古いパソコンに入れて、生成AIを動かす専用サーバにしてみた
構成
使わずに眠っていたパソコンを再利用
CPUのXeonは2010年発売開始という化石のようなものだ
TPM 2.0にも対応できずWindows11にすることもできなかったので、OSはUbuntuServerの最小構成にした
-
CPU: Intel Xeon X5660 ×2
- 6コア12スレッド ×2ソケット
- 合計 12コア24スレッド
- ベースクロック 2.80GHz
-
メモリー
- DDR3 20GB RAM
-
GPU
- NVIDIA GeForce RTX 2060
- VRAM 約 12GB
-
ストレージ
- SSD 80GB
-
OS
- Ubuntu Server
- x86_64
- 最小構成でインストール
ping を使えるようにする
最小構成すぎて ping さえできなかったので iputils-ping を導入
sudo apt install iputils-ping
パッケージ候補が出るようにする
存在しないコマンドを実行したときに、必要なパッケージ候補を表示できるようにした
sudo apt install command-not-found
これを入れることにより、存在しないコマンドを実行したときに出る表示「-bash: foo: command not found」が以下のように変化して、何をインストールすれば良いかヒントをくれるようになります。
コマンド 'foo' が見つかりません。もしかして:
command 'fop' from deb fop (1:2.10+dfsg-2)
command 'goo' from deb goo (0.155+ds-6build1)
command 'fio' from deb fio (3.41-2)
command 'fox' from deb objcryst-fox (2022.1-2build1)
command 'foot' from deb foot (1.25.0-1)
次を試してみてください: sudo apt install
dialog による対話UI対応
一部のセットアップツールやシェルスクリプトで使われる、テキストベースのダイアログUIを利用できるようにする
sudo apt install dialog
これを入れていないと以下のようなエラーが出ることがあります
debconf: フロントエンドの初期化に失敗しました: Dialog debconf: (利用可能な dialog 系のプログラムがインストールされていないため、ダイアログ形式のフロントエンドは使用できません。
SSD 容量が半分しか使われていなかった
SSDの領域が妙にいっぱいだなと思ったら、全体が認識されていなかった。
Serverセットアップで、すべて自動にしていたことが原因で LVMの空きが未割り当てだった様子
未割り当て領域を root filesystem に追加した
sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
なお、オプションの意味は以下の通り
-
-l +100%FREE:VG の空き領域をすべて使用 -
resize2fs:ext4 filesystem を拡張
確認
df -h
Ubuntuの基本設定が終わったので、いよいよドライバと llama.cppのインストール
NVIDIA Driver と CUDA 開発環境の準備
llama.cpp を CUDA 付きでビルドするため、NVIDIA Driver と CUDA Toolkit を導入した
まず、以下でインストールするドライバの候補を確認する
ubuntu-drivers devices
結果の中から良さそうなものを選ぶ。
私はUbuntuServerを使っているので「server-open」で終わっている中で最もバージョン番号が大きい「nvidia-driver-595-server-open」を選んだ。
sudo apt install nvidia-driver-595-server-open
sudo apt install -y git build-essential cmake curl
sudo apt install -y nvidia-cuda-toolkit
なお、以下で GPU が認識されていることを確認した
nvidia-smi
nvcc --version
結果は以下のような感じ
nvidia-smi
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 595.58.03 Driver Version: 595.58.03 CUDA Version: 13.2 |
+-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 2060 Off | 00000000:08:00.0 Off | N/A |
| 43% 37C P8 21W / 184W | 1MiB / 12288MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
llama.cpp を取得する
CUDA 対応版をビルドするため、公式リポジトリを clone した
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
CUDA 有効で llama.cpp を構成する
RTX 2060 (Turing世代) に合わせて CUDA Architecture 75 を指定した
cmake -B build \
-DGGML_CUDA=ON \
-DCMAKE_CUDA_ARCHITECTURES=75
cmake --build build -j4
なお、オプションの意味は以下の通り
-
-DGGML_CUDA=ON:CUDA を有効化 -
-DCMAKE_CUDA_ARCHITECTURES=75:RTX 2060 向けに最適化
最初 -j4 を指定しないとメモリ不足で異常終了しました。-j[数字]を指定することで同時コンパイル数を指定してメモリ消費を抑えることができます。
なお、やり直すときは「rm -rf build」でbuildを消してからやり直すのがお勧めです。
ビルド成功を確認する
実行ファイルが生成されていることを確認
ファイルがたくさんあればOK
ls build/bin
llama.cppが準備できたので生成AIを動かせるようにする
GGUF モデルをダウンロードする
Hugging Face から wget でダウンロード
cd ~/llama.cpp/models
wget -O Qwen3.5-9B-Q8_0.gguf \
https://huggingface.co/unsloth/Qwen3.5-9B-GGUF/resolve/main/Qwen3.5-9B-Q8_0.gguf?download=true
なお、オプションの意味は以下の通り
-
-O:保存ファイル名を指定
llama-server を CUDA 付きで起動
Qwen3.5 9B を長文コンテキスト対応で起動した
./build/bin/llama-server \
--host 0.0.0.0 \
--port 1234 \
--parallel 1 \
--threads 12 \
--jinja \
--device CUDA0 \
--flash-attn on \
--cache-type-k q8_0 \
--cache-type-v q8_0 \
--ctx-size 128000 \
--temp 0.6 \
--top-p 0.95 \
--top-k 20 \
--repeat-penalty 1.1 \
-m models/Qwen3.5-9B-UD-Q4_K_XL.gguf
なお、オプションの意味は以下の通り
-
--host 0.0.0.0:外部PCから接続可能にする -
--port 1234:待受ポート -
--parallel 1:同時アクセスを1に制限 -
--threads 12:CPU スレッド数 -
--jinja:chat template 有効化 -
--device CUDA0:GPU 使用 -
--flash-attn on:Flash Attention 有効化 -
--cache-type-k q8_0:KV cache の K を量子化 -
--cache-type-v q8_0:KV cache の V を量子化 -
--ctx-size 128000:128K コンテキスト -
--temp 0.6:温度 -
--top-p 0.95:Top-p sampling -
--top-k 20:Top-k sampling -
--repeat-penalty 1.1:繰り返し抑制 -
-m:読み込む GGUF モデル
本当にGPUが使われているかは以下のコマンドで確認できます
llama-serverを実行しているのとは別のウィンドウで実行して、使用率が変化していればGPUが使われています(まぁ、トークン速度でCPU推論かGPU推論かはわかるけど)
watch -n1 nvidia-smi
モデルを色々と入れて実測
RTX2060はVRAMが12GBある。でも、CPUがめちゃ古(2010年発売開始のXeon X5660!)なので、VRAMにどれだけ載せられるかが勝負。
llama_serverを起動したときに、以下のログが出ていればVRAMに収まっていません
llama_model_loader: tensor overrides to CPU are used with mmap enabled - consider using --no-mmap for better performance
実測結果は以下
ただし、KVキャッシュなどの条件をそろえずに色々試行錯誤したので参考程度に。
| モデル | 実測速度 |
|---|---|
| Qwen3.5-9B-UD-Q4_K_XL | 約38.5 t/s |
| Qwen3.5-9B-Q6_K | 約31.8 t/s |
| Qwen3.5-9B-Q8_0 | 約27.7 t/s |
| Qwen3-14B-Q4_K_M | 約28.2 t/s |
| Ministral-3-14B | 約29.7 t/s |
| Qwen3.6-35B IQ3_XXS | 約19.2 t/s |
| Qwen3.6-35B IQ2_XXS | 約55 t/s |
CPUが古すぎてQwen3.6-35Bは厳しそうということで以下で運用
- モデル:Qwen3.5-9B-UD-Q4_K_XL
- ctx:128K
- 約38.5 t/s(完全にGPUに乗っている様子)