はじめに
これまでローカルの推論環境としてollamaを使用していたが、llama-swapに移行した。
移行に至った理由(ollamaに感じていた不満)は以下の通り。
- ollamaでのgpt-oss-20bの挙動がおかしかった。4bit量子化版かつContext Sizeが16GB程度なら16GBのGPUに乗り切るはずだが、なぜか2枚のGPUに展開されて20GB程度消費されていた。また、Contine.devやClineからollamaでホストしたgpt-oss-20bに連携すると動作しなかった。
- デフォルトのContext sizeが8192と少ない。
- 設定をカスタマイズしたモデルを作るのが面倒。modelfile作るの面倒。また、ベースのモデルをコピーしてollamaのモデルが作成されるため、ディスクを無駄に消費する。
上記の不満があったのと、Redditでllama-swapというのが、ollamaの代替として、たびたび話題になっており、気になっていたので今回乗り換えを実施した。
[補足]
もしかしたらgpt-oss-20bの挙動が変なのはollama v0.11.5で直ってくるかも。v0.11.5のRealase Noteに以下の記載あり。
- Performance improvements for the gpt-oss models
- Improved multi-GPU scheduling and reduced VRAM allocation when using more than 2 GPUs
llama-swapとは
- llama-serverへのプロキシとして動作し、リクエストに指定されたmodelに応じて適切なllama-serverの起動、llama-serverへのリクエスト転送
- llama-serverの起動パラメタ(モデル、サンプリングパラメータ)はシンプルなyamlで管理
- モデルファイル(GGUFなど)はユーザーが自分で管理
- OpenAI互換API
ollamaが隠蔽してくれているモデルファイルの管理や、起動パラメタ(サンプリングパラメータなど)を自分でやる必要があるが、いろいろ柔軟に設定できるようになっているものと考えればよさそう。
llama-swap is a light weight, transparent proxy server that provides automatic model swapping to llama.cpp's server.
Written in golang, it is very easy to install (single binary with no dependencies) and configure (single yaml file). To get started, download a pre-built binary or use the provided docker images.
Features:
✅ Easy to deploy: single binary with no dependencies
✅ Easy to config: single yaml file
✅ On-demand model switching
✅ OpenAI API supported endpoints:
v1/completions
v1/chat/completions
v1/embeddings
v1/rerank, v1/reranking, rerank
v1/audio/speech (#36)
v1/audio/transcriptions (docs)
✅ llama-swap custom API endpoints
/ui - web UI
/log - remote log monitoring
/upstream/:model_id - direct access to upstream HTTP server (demo)
/unload - manually unload running models (#58)
/running - list currently running models (#61)
/health - just returns "OK"
✅ Run multiple models at once with Groups (#107)
✅ Automatic unloading of models after timeout by setting a ttl
✅ Use any local OpenAI compatible server (llama.cpp, vllm, tabbyAPI, etc)
✅ Reliable Docker and Podman support with cmdStart and cmdStop
✅ Full control over server settings per model
✅ Preload models on startup with hooks (#235)
llama-swapの設定ファイル
llama-swapの設定ファイルは、基本的にはllama-serverの起動コマンドをそのまま書くような形になっている。CUDA_VISIBLE_DEVICESを設定すれば、モデルごとに使用するGPUを指定することもできる。ollamaと異なり、複数のモデル定義から、同一モデルファイルを参照できるため、サンプリングパラメータ違いなどのモデル定義を簡単に作成することもできる。llama-serverのtensor-splitオプションもそのまま使えるため、マルチGPU環境でのGPUの使用比率も、モデルごとに指定できる。
healthCheckTimeout: 500
logLevel: info
startPort: 10001
macros:
"latest-llama": >
/app/llama-server
--port ${PORT}
models:
"Qwen3-Coder-30B-A3B-Instruct":
cmd: |
${latest-llama}
--model /app/models/Qwen3-Coder-30B-A3B-Instruct-GGUF/Qwen3-Coder-30B-A3B-Instruct-Q4_K_M.gguf
--ctx-size 32768
--n-gpu-layers 1000
--jinja
--top-p 0.8
--repeat-penalty 1.05
--temp 0.7
--top-k 20
--flash-attn
env:
- "CUDA_VISIBLE_DEVICES=0,1"
ttl: 300
"gpt-oss-20b":
cmd: |
${latest-llama}
--model /app/models/gpt-oss-20b-GGUF/gpt-oss-20b-Q4_K_M.gguf
--ctx-size 16384
--n-gpu-layers 1000
--jinja
--flash-attn
env:
- "CUDA_VISIBLE_DEVICES=0"
ttl: 300
"gemma3-27b-it":
cmd: |
${latest-llama}
--model /app/models/gemma-3-27b-it-GGUF/gemma-3-27b-it-Q4_K_M.gguf
--mmproj /app/models/gemma-3-27b-it-GGUF/mmproj-BF16.gguf
--ctx-size 16384
--tensor-split 0.65,0.35
--n-gpu-layers 1000
--jinja
--flash-attn
env:
- "CUDA_VISIBLE_DEVICES=0,1"
ttl: 300
llama-swapの起動
llama-serverを同梱したllama-swapのDockerイメージが配布されているため、起動も簡単である。
version: '3.8'
services:
llama-swap:
# NVIDIA GPUを使用する場合のイメージ
image: ghcr.io/mostlygeek/llama-swap:v150-cuda-b6140
container_name: llama-swap
ports:
- "22015:8080" # ホストの22015ポートをコンテナの8080にマッピング
volumes:
# llama-swapの設定ファイル(config.yaml)をコンテナ内の/config.yamlにマッピング
- ./llama-swap/config.yaml:/app/config.yaml
# モデル(gguf)を配置したディレクトリをコンテナにマッピング
- ./models:/app/models
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
上記のようにllama-swapの設定ファイル(config.yaml)と、モデル(ggufなど)を配置したディレクトリをコンテナにマウントするようなdocker-compose.yamlを作成し、
docker compose up
で起動できる。
llama-swapの動作確認
REST APIでのアクセス
CURLでREST API(OpenAI互換API)を実行してみる。
$ curl -X POST http://localhost:22015/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-oss-20b",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "こんにちは、元気ですか?"
}
]
}'
{"choices":[{"finish_reason":"stop","index":0,"message":{"role":"assistant","reasoning_content":"User writes Japanese: \"こんにちは、元気ですか?\" Means \"Hello, are you well?\" Likely ask \"Hello, how are you?\" So respond politely. Also mention I'm ChatGPT. Should answer in Japanese.","content":"こんにちは!私は元気です。いつもご相談や質問を楽しみにしています。今日はどんなお手伝いができますか?"}}],"created":1755304164,"model":"gpt-oss-20b","system_fingerprint":"b6140-b0493156","object":"chat.completion","usage":{"completion_tokens":85,"prompt_tokens":87,"total_tokens":172},"id":"chatcmpl-G7lYHpUgg8uVU3fg1faVRzmU5MeUDKp5","timings":{"prompt_n":87,"prompt_ms":153.719,"prompt_per_token_ms":1.7668850574712642,"prompt_per_second":565.9677723638588,"predicted_n":85,"predicted_ms":726.479,"predicted_per_token_ms":8.546811764705883,"predicted_per_second":117.00269381496229}}
特に問題なく動作。
llama-swapのGUIからのアクセス
llama-swapはGUIも付属しており、GUIからモデルのロード、アンロードの操作ができる。
モデルをロードした状態。
モデルのリンクをクリックすると、llama-serverのチャットUIにアクセスできる。
マルチモーダルも問題なく動作する。
VS CodeのAIコーディングアシスタントプラグインのContine.devとの連携
VS Code上で動作するAIコーディングアシスタントであるContine.devとの連携も問題なくできる。
providerにopenaiを、apiBaseにllama-swapのURLを指定するだけでよい。
- name: Qwen3-Coder-30B-A3B-Instruct
provider: openai
model: Qwen3-Coder-30B-A3B-Instruct
apiBase: http://localhost:22015/v1
- name: gpt-oss-20b
provider: openai
model: gpt-oss-20b
apiBase: http://localhost:22015/v1
- name: gemma3-27b-it
provider: openai
model: gemma3-27b-it
apiBase: http://localhost:22015/v1
llama-swapで動作しているQwen3-Coderと問題なく連携できている。
Open WebUIとの連携
llama-swapとOpen WebUIの連携方法。
「設定」-> 「接続」からllama-swapのURLと、モデルIDを追加すればOpen WebUIからもllama-swapと連携できるようになる。
この方法で追加したモデルは、モデル選択画面で「直接」の欄に表示される。
Clineとの連携
Clineとllama-swapのの連携方法。
API Provider -> OpenAI Compatibleを指定。
Base URL -> llama-swapのURLを指定
試しにQwen3-Coderにテトリスを作ってもらう。
1回の指示でほぼ完璧なテトリスが生成された。
まとめ
今回はllama-swapの導入について解説した。llama-swapは、llama-serverの起動パラメータなどの知識がある程度必要となるが、その分、柔軟に設定が可能であり、導入も容易であるため、ollamaに不満を抱えている人の移行先として、オススメできる。