📝

ローカル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 のインストールまでを実施します。

https://docs.nvidia.com/datacenter/tesla/driver-installation-guide/#ubuntu-installation

sudo apt install nvidia-open

Docker のインストール

こちらのガイドの手順にしたがいインストールします。

https://docs.docker.com/engine/install/ubuntu/

Nvidia Container Toolkit のインストール

こちらのガイドの手順にしたがい、nvidia-container-toolkit をインストールします。

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

sudo apt install nvidia-container-toolkit

LLMをコンテナで動かす手順

LLMモデルのダウンロード

GGUF ファイルをダウンロードします。本稿ではこちらのモデルを使用させていただきました。
以降の例では、次の GUUF ファイルを /data/gguf 配下にダウンロードしたものとします。

https://huggingface.co/ggml-org/gpt-oss-20b-GGUF

  • gpt-oss-20b-mxfp4.gguf

https://huggingface.co/unsloth/gpt-oss-20b-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: 指定した数の層だけ保持
docker-compose.yml
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 イメージに更新してみてください。

https://github.com/ollama/ollama/issues/11714

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