Scalability
スケーラビリティとは、リソースを追加して、より多くのデータ、ユーザー、計算を処理できるシステムの能力です。スケールアップとスケールアウト、アムダールの法則、マルチGPU AIを解説します。
スケーラビリティとは、リソースを追加し、性能と作業単位あたりのコストを許容範囲に維持しながら、データ、ユーザー、リクエスト、モデルの規模など、増加する作業量を処理するシステムの能力です。ハードウェアを2倍にしたとき、処理できる作業量もほぼ2倍になるシステムはスケーラビリティに優れています。追加したマシン同士が待ち時間に費やすシステムは、スケーラビリティに劣ります。人工知能では、スケーラビリティは3つの段階に関係します。すなわち、ビッグデータを取り込み、前処理するデータパイプライン、多数のアクセラレーターに処理を分散する学習ジョブ、そして推論レイテンシを増やさずに、より多くのリクエストに応答する推論サービスです。
垂直スケーリングと水平スケーリング#
垂直スケーリング(スケールアップ)は、より多くのCPUコア、RAM、または大容量メモリを備えたGPUなど、より大きなマシンにワークロードを移します。コード変更は不要ですが、利用可能な最大マシンで上限に達し、単一障害点も残ります。水平スケーリング(スケールアウト)は、マシンを増やして作業を分散します。固定の上限はありませんが、ソフトウェアに作業の分割、負荷分散、結果の調整が必要です。Webサービスや推論サービスは、ステートレスであれば簡単にスケールアウトできます。セッションとデータを共有ストアに置くことで、どのレプリカでも任意のリクエストに応答できます。データベースでは、キーに基づいてデータをマシン間で分割するシャーディングによってスケールアウトします。
クラウドプラットフォームは水平スケーリングを自動化します。Kubernetesでは、Horizontal Pod Autoscalerが現在のレプリカ数に、観測されたメトリクスと目標値の比率を掛け、切り上げた値をレプリカ数として算出します。たとえば、CPU使用率の平均が90%のレプリカ4つに対し目標値が60%の場合、レプリカ数は6になります。この自動化がクラウドコンピューティングでいう弾力性であり、サーバーレスコンピューティングでは、トラフィックが止まったときにレプリカ数をゼロにするところまで拡張されます。
スケーリングの限界#
次のバッチの読み込み、結果の同期、チェックポイントの書き込みなど、どの並列ジョブにも分割できない処理が含まれます。Gene Amdahl氏は1967年に、この逐次処理の割合によって、プロセッサーを何台追加しても高速化に上限が設けられることを示しました。現在、これはAmdahlの法則と呼ばれています。
# Amdahl's law: speedup on n workers when a fraction p of the work runs in parallel
p = 0.95 # parallel fraction; the other 5% runs on one worker
for n in (1, 8, 64, 512):
speedup = 1 / ((1 - p) + p / n)
efficiency = speedup / n # share of the added hardware doing useful work
print(f"{n:>4} workers: {speedup:5.1f}x speedup, {efficiency:4.0%} efficiency")
print(f"Limit with unlimited workers: {1 / (1 - p):.0f}x")処理の95%を並列化できる場合、ワーカー8台では74%の効率で5.9倍、64台では24%の効率で15.4倍、512台では4%の効率で19.3倍高速化します。ワーカー数をいくら増やしても20倍を超えることはできません。John Gustafson氏は1988年に、実際のユーザーはマシンの性能向上に合わせて問題の規模も大きくするため、並列処理部分が増え、逐次処理の割合が減ると指摘しました。固定された問題で高速化を測定する手法を強スケーリングと呼び、ハードウェアに合わせて問題を大きくする手法を弱スケーリングと呼びます。大規模な学習処理は、弱スケーリングの条件で実行されます。通信もさらなる制約となります。データ並列学習では、GPUを1台追加するたびに、各ステップで他のGPUと勾配を交換する必要があるため、ジョブをどこまでスケールできるかはネットワーク帯域幅で決まることがよくあります。
学習と推論のスケーリング#
分散学習では、モデルが1台のデバイスに収まるかどうかに応じて並列化戦略を選択します。データ並列では、各GPUがモデル全体のコピーを保持し、各バッチの一部を処理して、PyTorchのDistributedDataParallelのようにall-reduceで他のGPUと勾配を平均化します。1台のGPUに収まらないモデルは、フルシャードデータ並列、テンソル並列、またはパイプライン並列で分割します。勾配累積を使えば、より少ないデバイスで大きな実効バッチサイズを実現できます。
Ultralytics YOLOはマルチGPUトレーニングにデータ並列処理を使います。device=[0, 1]を渡すと、torch.distributed.run経由でDistributedDataParallelワーカープロセスを起動し、バッチを均等に分割します。そのため、2つのGPUでbatch=64を実行すると、各GPUにステップごとに32枚の画像が割り当てられます。
推論のスケーリング方法は異なります。各リクエストが小さく、独立しているためです。リクエストをバッチにまとめると、レイテンシがわずかに増える代わりに、GPUの利用率とスループットが向上します。連続バッチ処理は、トークンごとに生成するLLMにも同じ効果をもたらします。モデルサービングシステムでは、トラフィックの増加に応じてロードバランサーの背後にレプリカを追加します。モデル量子化とプルーニングによって各レプリカのコストを下げると、同じハードウェアでより多くのリクエストを処理できます。また、エッジAIでは、1つのデータセンターではなく、数千台のデバイスに推論を分散してスケーリングします。
スケーラビリティと関連用語の比較#
- パフォーマンス: 特定の負荷におけるシステムの速度や精度を指し、レイテンシ、スループット、精度で測定します。スケーラビリティは、負荷とリソースが増えたときに、これらの指標を維持できるかを表します。
- 弾力性: 一日の需要の変化に応じてリソースを自動的に追加・削除することです。多くの場合、水平スケーリングされたサービスのレプリカを増減します。
- スケーリング則: モデルの損失とパラメーター、学習データ、計算量の間に見られる経験的な関係です。モデル品質を予測し、システムのスケーラビリティによって、必要な計算資源を効率的に活用できるかが決まります。










