Ollamaが並列リクエストを処理する方法
オラマを並列リクエストの実行に設定する。
Ollama サーバーが同時に2つのリクエストを受けると、その動作は設定と利用可能なシステムリソースに依存します。
並行リクエスト処理
-
並列処理: Ollama はリクエストの並行処理をサポートしています. システムに十分な利用可能なメモリ(CPU 推論では RAM、GPU 推論では VRAM)がある場合、複数のモデルを一度にロードし、それぞれのロードされたモデルが複数のリクエストを並列して処理できます。これは環境変数
OLLAMA_NUM_PARALLEL
によって制御され、各モデルが同時に処理できる最大の並列リクエスト数を設定します。デフォルトでは、4(メモリの利用可能性によっては 1)に設定されていますが、調整可能です。 -
バッチ処理: 同じモデルに対する複数のリクエストが同時に到着した場合、Ollama はそれらをバッチ処理し、一緒に処理します。これは、リクエストが並列して処理され、ユーザーは同時に応答をストリーミングで受け取ることを意味します。サーバーは意図的にバッチを満たすのを待つことはありません。リクエストが利用可能になった時点で処理が開始されます。
キューイングと制限
-
キューイング: 並行リクエスト数が設定された並列性(例えば、モデルに対して
OLLAMA_NUM_PARALLEL
よりも多くのリクエスト)を超える場合、追加のリクエストはキューに追加されます。キューは、先着順(FIFO)で動作します。 -
キューの制限: キューに追加できるリクエストの最大数は
OLLAMA_MAX_QUEUE
(デフォルト: 512)によって制御されます。キューがいっぱいになると、新しいリクエストはサーバーが過負荷であることを示す 503 エラーを受け取ります。 -
モデルのロード: 同時にロードできる異なるモデルの数は
OLLAMA_MAX_LOADED_MODELS
によって制御されます。リクエストが新しいモデルをロードする必要があり、メモリが不足している場合、Ollama はアイドル状態のモデルをアンロードしてスペースを作り出し、リクエストはモデルがロードされるまでキューに追加されます。
例のシナリオ
同じモデルに対する2つのリクエストが同時に到着し、サーバーの並列性が少なくとも 2 に設定されている場合、両方のリクエストはバッチで一緒に処理され、両方のユーザーは同時に応答を受け取ります。並列性が 1 に設定されている場合、1 つのリクエストはすぐに処理され、もう1つは最初のリクエストが完了するまでキューに追加されます。
リクエストが異なるモデルに対してあり、十分なメモリがある場合、両方のモデルがロードされ、リクエストは並列して処理されます。メモリが不足している場合、1 つのモデルがアンロードされ、リクエストはモデルがロードされるまでキューに追加されます。
要約表
シナリオ | 結果 |
---|---|
2つのリクエスト、同じモデル、十分な並列性 | 両方を並列して処理(バッチ処理) |
2つのリクエスト、同じモデル、並列性=1 | 1つは処理され、もう1つは最初が完了するまでキューに追加 |
2つのリクエスト、異なるモデル、十分なメモリ | 両方のモデルがロードされ、リクエストは並列して処理 |
2つのリクエスト、異なるモデル、メモリ不足 | 1つはメモリが利用可能になるか、モデルがアンロードされるまでキューに追加 |
要約すると、Ollama は、サーバーが並列性に設定されていて十分なリソースがある場合、複数の同時リクエストを効率的に処理するように設計されています。それ以外の場合は、リクエストは順序に従ってキューイングされ、処理されます。
メモリ不足時の処理
Ollama が入力リクエストを処理するメモリが不足した場合、キューイングメカニズムとリソース管理戦略の組み合わせを使用して安定性を維持します:
リクエストキューイング
- メモリがすぐに割り当てられない場合、新しいリクエストは FIFO(先着順)キューに追加されます。
- キューのサイズは OLLAMA_MAX_QUEUE(デフォルト: 512 リクエスト)によって制御されます。
- キューが容量に達した場合、新しいリクエストは 503 “サーバー過負荷” エラーを受け取ります。
モデル管理
- アクティブなモデルがアイドル状態になると、メモリからアンロードされ、キューイングされたリクエストのためにリソースが解放されます。
- 同時にロードできるモデルの数は OLLAMA_MAX_LOADED_MODELS(デフォルト: 3×GPU 数または CPU では 3)によって制限されます。
メモリ最適化
- 同じモデルに対するリクエストをバッチ処理して、メモリ効率を最大化します。
- GPU 推論では、モデルごとにフル VRAM 割り当てが必要で、部分的なロードはサポートされていません。
失敗シナリオ
重要なメモリ枯渇: たとえキューイングされたリクエストが利用可能なリソースを越えても、Ollama は以下を行います:
- ディスクへのページング(パフォーマンスが大幅に低下)
- “メモリ不足” エラーの返還
- 極端なケースではモデルインスタンスのクラッシュ
設定制御項目 | 目的 | デフォルト値 |
---|---|---|
OLLAMA_MAX_QUEUE | キューイングされた最大リクエスト数 | 512 |
OLLAMA_NUM_PARALLEL | ロードされたモデルごとの並列リクエスト数 | 4(メモリが限られている場合は 1) |
OLLAMA_MAX_LOADED_MODELS | 同時にロードできるモデルの最大数 | 3×GPU 数または CPU では 3 |
管理者はメモリ使用状況を監視し、ハードウェアの能力に基づいてこれらのパラメータを調整する必要があります。メモリ不足の処理は、より大きなモデル(7B以上のパラメータ)を実行するか、複数の並列リクエストを処理するときに特に重要です。
Ollama の最適化戦略
GPU 加速を有効にするには export OLLAMA_CUDA=1
を実行し、CPU スレッド数は export OLLAMA_NUM_THREADS=84
で設定します。
ハードウェアの改善
- RAM: 13B モデルには 32GB 以上、70B モデルには 64GB 以上
- ストレージ: モデルのロード/スワップを高速化するために NVMe SSD
- GPU: 大規模なモデルには NVIDIA RTX 3080/4090(16GB 以上の VRAM)を推奨
運営戦略
- リクエストのバッチ処理: 複数のクエリを同時に処理して、メモリオーバーヘッドを均等に分散
- 自動モデルアンロード: Ollama がアイドル状態のモデルをメモリから削除
- よく使われるモデルのキャッシュ: 一般的なモデルをメモリに常駐
モニタリングとトラブルシューティング
nvidia-smi
(GPU)およびhtop
(CPU/RAM)を使用してボトルネックを特定- メモリエラーの対処:
- 量子化モデルにアップグレード
- 並列リクエストを減らす
- スワップスペースを拡張
例の最適化ワークフロー:
# 量子化モデルを使用して GPU 加速
export OLLAMA_CUDA=1
ollama run llama2:7b-q4_0 --context-size 2048
# ロードされたモデルと並列リクエストを制限
export OLLAMA_MAX_LOADED_MODELS=2
export OLLAMA_NUM_PARALLEL=4
これらの調整により、応答品質を維持しつつ、メモリ使用量を 30-60% 減少させることができます。特に複数のモデルを実行したり、高リクエスト量を処理する場合に有益です。
Ollama: リクエストのバッチ処理と並列実行
Ollama における バッチ処理 とは、複数の入力リクエストをグループ化し、単位として処理することを指します。これは、並列化された操作(GPU など)に利点があるハードウェアで計算リソースをより効率的に使用できるようにします。
同じモデルに対する複数のリクエストが同時に到着した場合、メモリが許容範囲内であれば、Ollama はそれらをバッチとして処理できます。これにより、スループットが増加し、各リクエストのレイテンシーが減少します。モデルは、バッチ全体に対して最適化された行列操作を活用できるからです。
バッチ処理は、リクエストがサイズや複雑さが類似している場合に特に効果的です。これは、ハードウェア利用率を向上させるためです。
Ollama における 並列実行 とは、同じモデルまたは異なるモデルのリクエストを同時に処理することを意味します。これは、利用可能なメモリと設定に依存します。
Ollama は2つのレベルの並列性をサポートしています:
- 複数モデルのロード: 足りるメモリがある場合、複数のモデルをロードし、同時にリクエストを処理できます。
- モデルごとの並列リクエスト: 各ロードされたモデルは、
OLLAMA_NUM_PARALLEL
設定(メモリによってデフォルトは 1 または 4)によって制御されるように、複数のリクエストを並列して処理できます。
リクエストが並列性の制限を超える場合、FIFO(先着順)で OLLAMA_MAX_QUEUE
までキューイングされます。
要点
Ollama は、バッチ処理と並列実行を組み合わせて、複数のリクエストを効率的に処理します。バッチ処理はリクエストを同時に処理するためのグループ化を意味し、並列実行は複数のリクエスト(またはモデル)を同時に実行できるようにします。両方の 方法 はシステムメモリに依存し、最適なパフォーマンスのために設定可能です。