毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。
この記事は手動で書きました。
0. はじめに
Ollamaは都度使うにはとても簡単ですが、それを使ってサービス化するのにはちょっと工夫が必要です。あまり、その辺りのノウハウがないと感じたので、まとめてみようと思います。
1. サービス化って?
Ollamaは自前でLLMをローカルで動かす為のツールです。気楽に使えて便利ですが、API経由で使うために永続化しようとすると少々問題があります。
- モデルが自動でアンロードされる:Ollamaはloadで読み込んだモデルを5分で自動的にアンロードしてしまいます。誰かが使ってないと使えなくなります
- 複数のモデルを動かせない:デフォルトではロードされるモデルが1つで、ollama runすると元のモデルがアンロードされます
- 並列クエリーがない:APIで複数のクエリーを投げることもできません
- 起動してもモデルがロードされない:デフォルトではOllamaがサーバーとして起動してもモデルはロードされません。必要なときに読み込むという考え方のようで、OSから再起動した時に何もロードされていないと呼び出し時に遅延が大きくなります
- Contextが4096:デフォルトではContextが4096で今となってはとても短いので、コーディングとかに向きません。
といういろいろとOllamaをサーバーとしてサービス化すると困るポイントがあります。TritonとかvLLMとかの方がパフォーマンス的に良かったりもするのですが、気軽に使えるという意味ではOllamaも外せないと思います。
1-1. バージョンとか環境とか
$ cat /etc/issue
Ubuntu 24.04.4 LTS \n \l
$ uname -mvrsoip
Linux 6.8.0-107-generic #107-Ubuntu SMP PREEMPT_DYNAMIC Fri Mar 13 19:51:50 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux
$ ollama --version
ollama version is 0.20.2
$ nvidia-smi
Mon Apr 6 15:59:26 2026
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.126.20 Driver Version: 580.126.20 CUDA Version: 13.0 |
+-----------------------------------------+------------------------+----------------------+
| 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 2070 On | 00000000:01:00.0 On | N/A |
| 0% 38C P8 5W / 175W | 7166MiB / 8192MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
2. 公式デフォルト設定
https://docs.ollama.com/linux でインストールされたものとします。
ollamaをサービスとして設定するの為には、以下の設定が必要!と公式ページ
Linux - Ollamaにはありますが、以下のユーザー作成とsystemdの設定ファイルはインストール時にインストールされているはずです。
sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama
sudo usermod -a -G ollama $(whoami)
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=$PATH"
[Install]
WantedBy=multi-user.target
2-1. 再起動時にモデルを自動ロード
自動起動はsudo systemctl enable ollamaされていれば、起動すると思いますが、モデルのロードは別になりますので、以下のスクリプトで自動的にロードします。単に/api/generateで、モデルを呼び出すだけです。複数のモデルをロードする場合は複数行書いてください。
ExecStartする前に30秒待っていますが、これはollamaが起動する前にcurlで呼び出すのをよけるためです。
[Unit]
Description=Preload Qwen Model into Ollama
After=ollama.service
Requires=ollama.service
[Service]
Type=oneshot
ExecStartPre=/usr/bin/sleep 30s
ExecStart=/usr/bin/curl -X POST http://localhost:11434/api/generate -d '{"model": "qwen3.5-9b-20k"}'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
2-2. モデルが自動的にアンロードされるのを禁止する
Ollamaにロードされたモデルは自動的に5分でアンロードされます。そこでollama.service.d/override.confに環境変数を設定します。その他の環境変数もこのファイルに書いていきます。(sudo systemctl edit ollama.serviceコマンドで書き換えるのがいいでしょう)
[Service]
Environment="OLLAMA_KEEP_ALIVE=-1"
2-3. 他のホストからの問合せも受け付ける
Ollamaはデフォルトではlocalループバックインターフェース(127.0.0.1)からしか利用できません。サービスとして利用するにはそれでは困りますので、設定を変更します。
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
2-4.複数のモデルをロードする
デフォルトではロードできる1GPUにつきモデルは1つです。複数に増やすには以下の環境変数を変更します。
[Service]
Environment="OLLAMA_MAX_LOADED_MODELS=3"
2-5. 複数のクエリーを受け付ける
それぞれのモデルが複数のクエリーを受けた場合にデフォルトでは1つの問合せしか受け付けられません。その他はキューに入り処理されません。過大な設定はパフォーマンスを落とす原因ですが、3つぐらいまでならVRAMの様子を見て追加します。
[Service]
Environment="OLLAMA_NUM_PARALLEL=3"
2-6. コンテキストサイズを大きくする
コンテキストサイズの4096(4k)は今では極小サイズに入ります。さすがにあんまりなので増やしたいところです。Ollamaは搭載VRAMサイズによって自動的に大きくなりますが、24GB以下のVRAMの場合は4kなので設定しないと話になりません。
しかし、モデル毎にContext長を変更したいので、環境変数でOLLAMA_CONTEXT_LENGTH=64000とできません。
その場合は、新しくモデルを作成する必要があります。例えば、qwen3.5:9bのモデルのContext長を5倍の20480にするとします。Modelfileを作成して以下のようにしてください。ついでに、temperatureを下げて乱数要素を減らしておきます。(事前にqwen3.5:9bは、ollama pull qwen3.5:9bしておいてください)
# ベースとなるモデルを指定
FROM qwen3.5:9b
# コンテキストサイズを20480に設定
PARAMETER num_ctx 20480
# 回答のランダム性を抑え、正確性を高める(0に近いほど決定的になります)
PARAMETER temperature 0.5
Modelfileができたら以下のコマンドでContext長を伸ばしたモデルを作ります。
ollama crete <Contextを伸ばしたモデル名> -f Modefile
ロードするときには<Contextを伸ばしたモデル名>を指定してください。
以下のようになって、Context長が大きくなっていればOKです。
$ ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
qwen3.5-9b-20k:latest bce9412159ae 9.6 GB 26%/74% CPU/GPU 20480 Forever
2-6. FLASH_ATTENTIONを有効にする
最近のモデルではFLASH_ATENSIONを有効にできるモデルが増えてきています。Qwen3.5もその一つです。これも有効にしておきます
[Service]
Environment="OLLAMA_FLASH_ATTENTION=1"
2-7. FLASH_ATTENTIONが有効なときにKVキャッシュの指定を変更
コンテキストのキャッシュをどういう形式で保持するか?という設定です。
f16,q8_0,q4_0と3つから選択できます。q4_0の方が必要なメモリーは少なくなりますが、モデルによって精度が下がるということもあるようなので、q8_0にしておきます。
[Service]
Environment="OLLAMA_KV_CACHE_TYPE=q8_0"
2-8. 複数ユーザーが別々のプロンプトを投げてくる場合に有効な設定
スロット選択のロジックが、それぞれのユーザーのプレフィックスに最もマッチするスロットを探すように変わり、ユーザー間でのキャッシュ衝突(=お互いのキャッシュを上書きしてしまう現象)を減らします。decodeフェーズ(生成速度)には一切影響せず、複数クライアントがそれぞれ異なる長いプレフィックスを繰り返し送る環境に限られます。
真実どれぐらいの効果があるかは不明ですが、OLLAMA_NUM_PARALLEL=3にしていますし、trueにしても損はなさそうなので、有効にします。
[Service]
Environment="OLLAMA_MULTIUSER_CACHE=true"
3. systemdの反映と再起動
再起動して適用します。
sudo systemctl daemon-reload
sudo systemctl restart ollama
4. テスト
以下のコマンドでテストします。
curl http://<OllamaサーバーのIPアドレス>:11434/api/chat -d '{
"model": "qwen3.5-9b-20k:latest",
"messages": [{ "role": "user", "content": "こんにちは" }]
}'
5. 参照