ローカルLLMを試す (gpt-oss-20b, 2025-08)
古めのPCで gpt-oss-20b を試した際の環境構築の備忘録です。
前回 と基本的な手順は同じですが、 llama.cppの最新イメージを使用する必要 があります。
テストに用いた PC の GPU は VRAM 不足で LLM を全て載せることはできないため、 llama.cpp を用いて専ら CPU で動かしますが、 GPU に一部の層をオフロードする方法も説明します。
本稿では llama.cpp は Docker コンテナ上で実行するようにしています。
試したPCのスペック
- CPU: Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz
- memory: 48GB
- GPU: NVIDIA GeForce RTX 2080 (VRAM 8GB)
- OS: Ubuntu 24.04.3 LTS
CUDA環境構築
Nvidiaドライバーのインストール
こちらのガイドの手順にしたがい、nvidia-open
または cuda-drivers
のインストールまでを実施します。
sudo apt install nvidia-open
Docker のインストール
こちらのガイドの手順にしたがいインストールします。
Nvidia Container Toolkit のインストール
こちらのガイドの手順にしたがい、nvidia-container-toolkit
をインストールします。
sudo apt install nvidia-container-toolkit
LLMをコンテナで動かす手順
LLMモデルのダウンロード
GGUF ファイルをダウンロードします。本稿ではこちらのモデルを使用させていただきました。
以降の例では、次の GUUF ファイルを /data/gguf
配下にダウンロードしたものとします。
- gpt-oss-20b-mxfp4.gguf
- gpt-oss-20b-UD-Q8_K_XL.gguf
docker-compose.yml の編集
Docker で GPU を有効にしつつ、llama.cpp で LLM をサーブするための Docker Compose 設定ファイルの例は次のようになります。GPU 以外にもポート番号やローカルホスト以外からのアクセスを有効にするなどの設定をしています。
llama.cpp の動作はコンテナ内の環境変数で設定できます。
-
LLAMA_ARG_THREADS
で使用する CPU スレッド数、LLAMA_ARG_CTX_SIZE
でコンテキストサイズを設定できます -
LLAMA_ARG_N_GPU_LAYERS
の行を有効にすると、指定されたレイヤー数だけ GPU にオフロードします。お持ちのグラフィックカードの VRAM サイズに応じてレイヤー数を調整します -
LLAMA_ARG_CPU_MOE
LLAMA_ARG_N_CPU_MOE
のいずれかを指定することで、MoE の重みを CPU に保持するようになります-
LLAMA_ARG_CPU_MOE
: 1 を設定すると全て保持 -
LLAMA_ARG_N_CPU_MOE
: 指定した数の層だけ保持
-
services:
llama:
image: ghcr.io/ggml-org/llama.cpp:server-cuda
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
environment:
- LLAMA_ARG_HOST=0.0.0.0
- LLAMA_ARG_THREADS=7
- LLAMA_ARG_CTX_SIZE=20480
# keep all Mixture of Experts (MoE) weights in the CPU
- LLAMA_ARG_CPU_MOE=1
# keep the Mixture of Experts (MoE) weights of the first N layers in the CPU
# - LLAMA_ARG_N_CPU_MOE=32
# 好きなモデルを有効化します
# - LLAMA_ARG_MODEL=/data/gpt-oss-20b-UD-Q8_K_XL.gguf
- LLAMA_ARG_MODEL=/data/gpt-oss-20b-mxfp4.gguf
- LLAMA_ARG_N_GPU_LAYERS=25
volumes:
- /data/gguf:/data
ports:
- "8080:8080"
networks:
- default
注意
ところで llama.cpp のイメージは gpt-oss を試す前に最新のイメージに更新しておく必要があります。以下の issue で報告されているようなエラーで起動しない場合は最新の llama.cpp イメージに更新してみてください。
llama.cpp コンテナの起動
docker-compose.yml
のあるディレクトリで次のコマンドを実行するとコンテナが起動します。
docker compose up
LLM を試す
コンテナを起動すると、 http://<テストPC>:8080
で llama.cpp サーバーにアクセスできるようになります。
回答時間
以下のスクリーンショットの質問で、上の設定ファイルのように GPU に14層オフロードした場合の回答開始までの時間と回答完了までの時間は表のようになりました。
同じ質問でも回答内容や時間はかなりブレますし、試行回数も少ないため参考程度にしてください。
モデル | GPU層数 | 回答開始までの平均(秒) | 回答開始までの標準偏差(秒) | 回答完了までの平均(秒) | 回答完了までの標準偏差(秒) |
---|---|---|---|---|---|
gpt-oss-20b-mxfp4.gguf | 0 | 78.0 | 40.8 | 164.7 | 60.6 |
gpt-oss-20b-mxfp4.gguf | 14 | 65.7 | 30.3 | 116.9 | 35.4 |
gpt-oss-20b-mxfp4.gguf | 25 | 43.9 | 14.5 | 90.6 | 11.0 |
gpt-oss-20b-UD-Q8_K_XL.gguf | 0 | 56.2 | 33.8 | 150.9 | 43.7 |
gpt-oss-20b-UD-Q8_K_XL.gguf | 14 | 58.9 | 30.0 | 118.5 | 27.9 |
gpt-oss-20b-UD-Q8_K_XL.gguf | 25 | 36.1 | 16.1 | 81.3 | 16.1 |
ただし gpt-oss-20b はレイヤー数が24なので、VRAM 16GB の GPU であれば全層を GPU に載せられると思われるため上の表とはかなり異なる結果になると思われます。
llama.cpp コンテナの終了
コンテナの終了は別のコンソールで次のコマンドを実行します。
docker compose down
Discussion