Pipeline Parallelism
パイプライン並列化がGPU間でディープラーニングモデルを分割する方法を確認します。メモリ不足エラーを防ぎ、分散トレーニングを最適化する方法を学びます。
パイプライン並列処理は、モデルを深さ方向に分割し、GPUなどの複数のコンピューティングデバイスに大規模なニューラルネットワーク (NN)を分散させるための、高度な分散トレーニング手法です。最新のアーキテクチャでモデルの重みとオプティマイザーの状態が単一のアクセラレーターのメモリ容量を超える場合、エンジニアはネットワークのシーケンシャルな層を「ステージ」に分割します。たとえば、最初の10層をGPU 0に配置し、続く10層をGPU 1に配置できます。フォワードパスでは、データがあるデバイスから次のデバイスへ流れます。これらのデバイスを連結することで、研究者はハードウェアによる制約となるメモリ不足エラーに遭遇することなく、大規模なディープラーニング (DL)アルゴリズムをトレーニングできます。
パイプライン並列処理の仕組み#
デバイス間で層を分割する素朴な実装では、「パイプラインバブル」と呼ばれる深刻な非効率が発生します。層は順番に処理されるため、GPU 0が最初の層を処理している間、GPU 1は完全にアイドル状態になります。ハードウェアの使用率を最大化するため、最新のパイプラインスケジューラーは、グローバルなバッチサイズをより小さな「マイクロバッチ」に分割します。
バッチ全体の完了を待つのではなく、GPU 0は最初のマイクロバッチをGPU 1に渡すとすぐに、2番目のマイクロバッチの処理を開始します。Microsoft DeepSpeedやPyTorch分散パイプラインAPIなどのツールでは、一般的に1F1B(1回のフォワード、1回のバックワード)スケジューリング戦略が使用されます。この手法では、異なるマイクロバッチのフォワードパスとバックワードパスの計算を同時に交互に実行することで、パイプラインバブルとメモリ消費を大幅に削減します。2024年および2025年の最近の進展では、コンピューティングクラスター全体のアイドル時間をほぼ排除する、オプティマイザーを考慮した重み予測戦略であるZero Bubble Pipeline Parallelismも登場しています。
関連する並列化手法との違い#
パイプライン並列処理は、分散コンピューティング戦略のより広範なエコシステムの一部です。AIモデルを効果的にスケーリングするには、その違いを理解することが重要です。
- モデル並列処理: これは、モデルを複数のデバイスに分割するための包括的な用語です。パイプライン並列処理は、アーキテクチャを深さ方向に順番に分割する、モデル並列処理の非常に具体的な形態です。
- テンソル並列処理: パイプライン並列処理が深さ方向に分割するのに対し、テンソル並列処理では個々の行列演算をGPU間で水平方向に分割します。これら2つの手法は、スループットを最大化するために頻繁に組み合わせて使用されます。
- データ並列処理: データ並列処理では、すべてのGPUにモデル全体を複製し、トレーニングデータをGPU間で分散させます。単一デバイスのVRAMにネイティブに収まるUltralytics YOLO26モデルのような、コンパクトで高度に最適化された物体検出および画像セグメンテーションアーキテクチャでは、PyTorchの分散データ並列(DDP)によるデータ並列処理が、トレーニングを高速化するための推奨手法です。
AIおよびMLにおける実世界の応用#
複雑なインフラストラクチャのスケーリングは、最新の最先端AIシステムを構築するために不可欠です。
- 基盤モデルのトレーニング: 巨大な大規模言語モデル (LLMs)や、MetaのLlama 3のような基盤モデルを開発するには、テンソル並列処理、データ並列処理、パイプライン並列処理を組み合わせる必要があります。NVIDIA Megatron-LMのようなフレームワークは、これらの戦略を活用して、AWS SageMakerのようなクラウドプラットフォーム上で、数千のGPUにわたる大規模なMixture-of-Experts (MoE)アーキテクチャをトレーニングします。
- 高解像度の医療診断: ヘルスケアにおけるAIや科学的モデリングでは、3Dボリュームスキャンによって、1台のアクセラレーターでは処理できないほど大規模なアクティベーションが生成されることがあります。ネットワーク層をノード間でパイプライン化することで、研究病院は画像解像度を犠牲にすることなく、大規模なMRIデータセットでディープネットワークをトレーニングできます。
コード例: 層分割の概念#
従来、デバイス間で層を分散させるには、複雑なカスタムコードが必要でした。現在では、基本的なロジックによって、特定の層を異なるデバイス識別子に割り当てます。以下は、PyTorchでネットワークステージをデバイス間に分割する方法を概念的に示したもので、パイプライン並列処理の基盤となります。
import torch.nn as nn
class SimplePipelineModel(nn.Module):
def __init__(self):
super().__init__()
# Stage 1 is assigned to the first GPU
self.stage1 = nn.Sequential(nn.Linear(1024, 1024), nn.ReLU()).to("cuda:0")
# Stage 2 is assigned to the second GPU
self.stage2 = nn.Sequential(nn.Linear(1024, 1024), nn.ReLU()).to("cuda:1")
def forward(self, x):
# The forward pass seamlessly crosses device boundaries
x_out = self.stage1(x.to("cuda:0"))
return self.stage2(x_out.to("cuda:1"))基盤モデルの作成には複雑なオーケストレーションが必要ですが、高速でスケーラブルなコンピュータービジョン (CV)プロジェクトのデプロイは、一般的により簡単です。効率化されたモデルデプロイと自動化されたマルチGPU活用のため、開発者はワークロードを自動的にスケーリングするUltralytics Platformを信頼しています。堅牢なモデルのトレーニングに関するヒントを活用することで、プラットフォームがインフラストラクチャ管理を抽象化し、エンジニアはリアルタイム推論が可能な高精度AIソリューションの構築に完全に集中できます。









