0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ollamaからllama-swapへの乗り換えた話

Posted at

はじめに

これまでローカルの推論環境として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の使用比率も、モデルごとに指定できる。

config.yaml(llama-swapの設定ファイル)
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イメージが配布されているため、起動も簡単である。

docker-compose.yaml
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からモデルのロード、アンロードの操作ができる。

image.png

モデルをロードした状態。

image.png

モデルのリンクをクリックすると、llama-serverのチャットUIにアクセスできる。

image.png

マルチモーダルも問題なく動作する。

image.png

VS CodeのAIコーディングアシスタントプラグインのContine.devとの連携

VS Code上で動作するAIコーディングアシスタントであるContine.devとの連携も問題なくできる。
providerにopenaiを、apiBaseにllama-swapのURLを指定するだけでよい。

Continueの設定ファイル(config.yaml)からの抜粋
  - 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と問題なく連携できている。

image.png

Open WebUIとの連携

llama-swapとOpen WebUIの連携方法。

「設定」-> 「接続」からllama-swapのURLと、モデルIDを追加すればOpen WebUIからもllama-swapと連携できるようになる。

image.png

image.png

この方法で追加したモデルは、モデル選択画面で「直接」の欄に表示される。

image.png

Clineとの連携

Clineとllama-swapのの連携方法。

API Provider -> OpenAI Compatibleを指定。
Base URL -> llama-swapのURLを指定

image.png

試しにQwen3-Coderにテトリスを作ってもらう。

image.png

1回の指示でほぼ完璧なテトリスが生成された。

image.png

まとめ

今回はllama-swapの導入について解説した。llama-swapは、llama-serverの起動パラメータなどの知識がある程度必要となるが、その分、柔軟に設定が可能であり、導入も容易であるため、ollamaに不満を抱えている人の移行先として、オススメできる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?