Ollamaが並列リクエストを処理する方法

オラマを並列リクエストの実行に設定する。

目次

Ollama サーバーが同時に2つのリクエストを受け取った場合、その動作は設定と利用可能なシステムリソースに依存します。

LLMの性能に関する throughput、latency、VRAM、ベンチマークについて、ランタイムとハードウェアにわたる詳細な情報は、LLM Performance: Benchmarks, Bottlenecks & Optimization をご参照ください。

five awesome llamas are standing in the field

並行リクエスト処理

  • 並列処理: 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つは処理され、2つ目は最初が完了するまでキューに追加される
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数または3(CPUの場合)

管理者はメモリ使用状況を監視し、ハードウェアの能力に応じてこれらのパラメータを調整する必要があります。メモリ不足の処理は、より大きなモデル(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はそれらをバッチで処理できます。これにより、throughput が向上し、各リクエストの latency も低下する可能性があります。モデルは、バッチ全体に対して最適化された行列演算を使用できるためです。

バッチ処理は、リクエストがサイズや複雑さにおいて類似している場合に特に効果的です。これは、ハードウェア利用率を向上させるためです。

Ollamaにおける 並列実行 とは、同じモデルまたは異なるモデルに対して、利用可能なメモリと設定に応じて、複数のリクエストを同時に処理することを意味します。

Ollamaは2つのレベルの並列性をサポートしています:

  • 複数モデルのロード: 足りるメモリがあれば、複数のモデルをロードし、同時にリクエストを処理できます。
  • モデルごとの並列リクエスト: 各ロードされたモデルは、OLLAMA_NUM_PARALLEL 設定(デフォルトはメモリに応じて1または4)によって制御されるように、複数のリクエストを並列で処理できます。

リクエストが並列性の制限を超える場合、FIFO(先着順)で最大 OLLAMA_MAX_QUEUE までキューイングされます。

結論

Ollama は、バッチ処理と並列実行の両方を活用して、複数のリクエストを効率的に処理します。バッチ処理は、リクエストを同時に処理するためのグループ化を行い、並列実行は、複数のリクエスト(またはモデル)を同時に実行できるようにします。どちらの方法も 方法 は、システムメモリに依存し、最適なパフォーマンスのために設定可能です。

ベンチマーク、並列性の調整、パフォーマンスのガイドラインについては、LLM Performance: Benchmarks, Bottlenecks & Optimization ハブをご覧ください。

有用なリンク