AIACC 2.0-AIACC Communication Speeding (AIACC-ACSpeed) は、Alibaba CloudがリリースしたAIモデルの分散トレーニング用の通信最適化ライブラリです。 AIACC-トレーニングV2.0としても知られています。 AIACC-トレーニングV1.5と比較して、AIACC-ACSpeedのモジュラー、分離設計は、より良い互換性、適用性、およびパフォーマンスを提供するように最適化されています。
概要
AIACC-ACSpeed (ACSpeed) は、Alibaba Cloudによって開発された社内AIトレーニングアクセラレータであり、モデルトレーニングのパフォーマンスを大幅に向上させます。 ACSpeedを使用して、分散通信を伴うジョブのパフォーマンスを最適化し、コンピューティング効率を向上させ、コストを削減できます。
ACSpeedは、AIフレームワーク層、集団アルゴリズム層、およびネットワーク層の主流のオープンソース分散フレームワークと完全に互換性があります。 これにより、ACSpeedはハードウェアとソフトウェアの両方の側面から最適化されたパフォーマンスを提供できます。
レイヤー | 説明 |
AIフレームワーク層 | AIフレームワーク層では、ACSpeedはPyTorchフレームワークと完全に互換性があり、aiacc-c10dプラグインを使用して、知覚できない方法で分散トレーニングのパフォーマンスを最適化します。 |
集団アルゴリズム層 | 集団アルゴリズム層では、ACSpeedは集団通信コンパイル技術を使用して、異なるモデルの適応トポロジーアルゴリズムを構築します。 ACSpeedはまた、知覚できない方法でNCCLランタイム互換であるように集合的通信トポロジを最適化する。 |
ネットワーク層 | ネットワーク層では、ACSpeedは、ネットワーク安定性に影響を与えることなく通信の最適化を達成するためにネットワークインフラストラクチャの最適化を実施する。 これらの最適化は、利用可能な最適化に基づいて、仮想プライベートクラウド (VPC) 、リモートダイレクトメモリアクセス (RDMA) 、またはAlibaba cloudのeRDMAで実行できます。 |
使用上の注意
ACSpeedが有効になっているトレーニングタスクのログをチェックすることで、aiacc-c10dプラグインが初期化されているかどうかを確認できます。 ログにAIACC-2.0 ACSpeed c10d-plugin initが含まれている場合、コンポーネントは初期化されます。 ログの出力例を次の図に示します。
NCCL_DEBUG
をINFOに設定すると、NCCLコンポーネントのログのAIACC-2.0-SocketフィールドにAIACC-2.0で始まるフィールドが表示されます。
次の表に、ACSpeedのトレーニングモード、サポートされている起動方法、および利点に関する情報を示します。
項目 | 注 |
トレーニングモード | ACSpeedのc10dコンポーネントは、PyTorch専用に最適化されています。 このコンポーネントを使用するには、トレーニングモードとしてネイティブDDP ( |
起動方法 | ACSpeedは起動方法に制限を課しません。 Torchのスクリプトの起動、実行、スポーンなど、任意のカスタム起動方法を選択できます。 ただし、CPU-Affinityが有効になっている場合は、トーチ1.8の公式torch.distributed.ru nまたはtorch.distributed.launchのみを使用してACSpeedを起動でき1.12。 |
メリット | ACSpeedは、分散タスクの通信パフォーマンスを向上させます。 現在の通信のボトルネックが大きいほど、ACSpeedが提供できるパフォーマンスの向上が大きくなります。 セットアップでマルチGPUインスタンスを使用している場合、またはクラスターの線形性が1に近い場合、通信のボトルネックはほとんどまたはまったくありません。 これらのような場合、ACSpeedは、顕著な性能利点を提供することができない。 |
次のセクションでは、ACSpeedの概念について説明します。
autotuner: 通信アルゴリズムの適応チューニングを可能にします。 次のメッセージは、約200〜400回の反復が実行されたときに印刷され、バケット調整が無効になった状態でAIACC調整が終了したことを示します。 この機能はデフォルトで無効になっています。
バケットチューニング機能は、ACSpeed v1.1.0ではデフォルトで有効になっています。 バケットチューニングを有効にしてオートチューニングを終了すると、次のメッセージが出力されます。
説明モデルトレーニングは、追加のコンテキストリソースを消費します。 したがって、パフォーマンステストの精度を確保するために、モデルトレーニングの
warmup_iteration
を400に設定することを推奨します。 上記の機能は、warmup_iterationが220に設定されているトレーニングタスクを示しています。これは、コスト220ステップ
のプリントアウトで示されます。perf_mode: ACSpeedは、自動調整プロセス中の各イテレーションのパフォーマンスを分析します。 さまざまな側面からパフォーマンス統計を提供するさまざまな方法をサポートしています。 デフォルトの方法はtimeです。 環境変数を使用してメソッドを切り替えることができます。 有効な値:
AIACC_AUTOTUNE_PERF_MODE=time:
このモードは、エンドツーエンドのデータ前処理、データロード、勾配累積などの追加操作があるシナリオに適しています。 デフォルト値です。AIACC_AUTOTUNE_PERF_MODE=filter:
perf_timeを安定して出力できるモードです。 チェックポイントやロギングなどの処理操作が追加されたシナリオに適しています。AIACC_AUTOTUNE_PERF_MODE=profile:
前の2つの方法と比較して、このモードを使用して、現在のモデルトレーニングの1回の反復での通信の割合を追加出力できます。
シングルインスタンス最適化: Torch 1.6 Torch 1.9にのみ適用されます。
CPU-Affinity: この機能はデフォルトで無効になっています。 CPU-Affinityを有効にする場合は、次の環境変数を設定して、一部のインスタンスタイプに対するACSpeedの効果を高めることができます。
AIACC_CPU_BINDING_ENABLE=1
負荷の不均衡によって引き起こされるパフォーマンスの変動など、プログラムに固有の欠陥がある場合、CPU-Affinity機能が有効になった後にパフォーマンスが低下する可能性があります。 したがって、この機能はオプションの最適化として提供されます。
バケットチューニング: この機能により、グラデーションブレンドのアダプティブチューニングが可能になり、コンピューティングと通信のオーバーラッププロセスでのパフォーマンスの最適化が向上します。 ただし、より多くのwarmup_step (約950ステップ) が必要です。 この機能はACSpeed v1.1.0で有効になっています。 この機能は、トーチ1.8トーチ1.13に適用されます。
説明次の環境変数を設定して、バケットのチューニングを無効にできます。
AIACC_BUCKET_TUNE_DISABLE=1
キャッシュメカニズム: この機能を使用すると、チューニングのウォームアップ時間を短縮し、同じ環境で同じモデルの自動チューニングが繰り返されるのを防ぐことができます。 キャッシュメカニズムは、モデル、モデル名、モデルサイズ、およびクラスターサイズなどのキー値に基づいて分類されます。
キャッシュメカニズムを有効にするには、
AIACC_CONFIG_CACHE_DISABLE
変数を0に設定します。 トレーニングで最適なパフォーマンスを提供する設定は、ランクが0のマシンに保存されます。説明トレーニングシナリオで同じキー値でキャッシュメカニズムが有効になっている場合、システムは保存された設定を自動的に読み取り、ロードし、自動調整ステップをスキップします。
キャッシュメカニズムを初めて有効にすると、次のメッセージが出力されます。
キャッシュが保存されると、次のメッセージが出力されます。
同じキー値のトレーニングを再度実行すると、次のメッセージが出力されます。
最適な設定が保存され、同じキー値が指定されているトレーニングシナリオでは、
AIACC_CONFIG_CACHE_UPDATE_DISABLE
変数を0に設定して、保存された設定のキャッシュ更新を有効にします。 キャッシュの更新が開始されると、次のメッセージが出力されます。
ACSpeedの仕組み
シナリオ
単一GPUインスタンスまたは複数のマルチGPUインスタンスをAIモデルの分散トレーニングに使用する場合、単一GPUトレーニングをマルチGPUに適用するときに、分散通信の線形性をパフォーマンス指標として使用できます。 線形性は次の式で計算されます。
1つのインスタンスのスケーラビリティ: Linearity=マルチGPUパフォーマンス /シングルGPUパフォーマンス /インスタンスあたりのGPU数
複数インスタンスのスケーラビリティ: Linearity=マルチインスタンスのパフォーマンス /シングルインスタンスのパフォーマンス /クラスター数
線形性の値は、0から1の範囲である。 線形性が1に近づくと、トレーニングジョブはピークパフォーマンスに近づきます。 線形性が0.8よりも低く、データI/OやCPUの影響を排除すると、分散通信のボトルネックが存在すると判断できる。 このシナリオでは、ACSpeedを使用して分散トレーニングを高速化し、全体的なパフォーマンスを向上させることができます。 元のベースラインの直線性が悪いほど、ACSpeedの改善が大きくなります。
シングルインスタンスの最適化
次のセクションでは、ACSpeedのしくみについて説明し、PCIe-topoおよびNVLink-topoサーバーを例にとることによるパフォーマンス改善効果を示します。
PCIe-topo
課題分析
例として、P2P相互接続のない8 GPUインスタンスのGPUトポロジを取り上げます。 GPU0とGPU7の接続を次の図に示します。 GPU間にP2P相互接続はなく、GPUは同じPCIe帯域幅を共有する。 したがって、マルチGPU通信を必要とする分散トレーニングシナリオでは、特にGPU間で大量の通信が必要とされるシナリオでは、物理的な帯域幅の制限によってパフォーマンスがボトルネックになります。
前の図に示すように、GPU0〜GPU3とGPU4〜GPU7は、PCIeブリッジ (PIX) で接続されています。 GPU0とGPU4とGPU7との間、GPU1とGPU4とGPU7との間、GPU2とGPU4とGPU7との間、および、GPU3とGPU4とGPU7との間には、ソケット間のQPI/UPIインタフェース (SYS) を介した接続が必要である。
最適化
ncclAllReduce
関数は、デフォルトでネイティブNCCL通信ライブラリの集団通信に使用されます。 PCIe-topoの帯域幅制限を考えると、トレーニングパフォーマンスをさらに向上させることができます。 ACSpeedは、集団通信プロセス中の通信のステップを削減することでパフォーマンスを向上させ、CPUとGPU間の非同期パイプライン通信を実現します。 重要な改善点の1つは、データに対するすべてのAllReduce操作がCPUで実行されることです。 この最適化はCPU-Reduceとも呼ばれます。改善効果
PCIe-topoタイプのシングルインスタンスを使用するトレーニングでは、CPU-Reduce最適化を有効にして、通信の割合が比較的高いことによる線形性の悪さを解決できます。 この方法では、トラフィックが4 MBを超えるシナリオで、ネイティブNCCLモードと比較してパフォーマンスが約20% 向上します。 また、トレーニングプロセスにおける勾配同期時間を短縮して、エンドツーエンドの性能改善を実現することもできる。 たとえば、Resnet50およびTransformerベースのモデルトレーニングでは、この方法を使用して10% を超えるパフォーマンスを向上させることができます。
NVLink-topo
課題分析
例として、V100 8 GPUインスタンスのGPUトポロジを取り上げます。 異なるGPU間に接続されるnvlinkチャネルの数は、NV1およびNV2など、異なる。 NCCLで一般的に使用されるアルゴリズムの1つは、バイナリツリー (2ツリーとも呼ばれます) です。これは、異なるインスタンストポロジで使用すると最適な状態を実現できません。
説明NCCLは、NVIDIA GPUの集団通信ライブラリです。 集団コミュニケーションとポイントツーポイントコミュニケーションを実装できます。 ほとんどすべてのオープンソースAIフレームワークは、通信にNCCLを使用します。
最適化
上記の問題を解決するために、ACSpeedは、高帯域幅のnvilnk相互接続をフルに活用して、図の例のGPU0とGPU3の間などのAllReduceアルゴリズムを実装します。 シングルインスタンス通信のボトルネックが発生した場合のパフォーマンスを向上させることができます。 ACSpeedは、単一のインスタンス内のバイナリーツリートポロジに基づいて、複数のインスタンス間でnツリーアルゴリズムのセットを実装し、トポロジ最適化を実現します。
改善効果
nツリーの指定された組み合わせを使用することにより、ACSpeedは複数のnvlinkチャネルのトランシーバ容量を最大限に活用できます。 このように、ACSpeedは、データトラフィックが128 MBを超えるシナリオで20% することにより、パフォーマンスを向上させます。
マルチインスタンスの最適化
ACSpeedは、AllReduceアルゴリズムとマルチストリーム通信最適化により、複数のインスタンス間の通信パフォーマンスを向上させることができます。
AllReduceアルゴリズム
課題分析
例としてV100インスタンスを取り上げます。 シングルインスタンスの場合、nvlinkはP2P通信をサポートするために使用され、最大300ギガバイト/秒の帯域幅を提供できます。 複数のインスタンスの場合、リングオールリダクションアルゴリズムのパフォーマンスは複数のインスタンス間で制限され、全体的なパフォーマンス低下につながります。 ネットワークパフォーマンスは100 Gbit/sより低く、スループットパフォーマンスは低いです。
最適化
従来のring-allreduceアルゴリズムと比較して、ACSpeedが提供するhybrid-allreduceアルゴリズムは、単一のインスタンスと複数のインスタンスの階層トレーニングを実装し、単一のインスタンスの高速帯域幅を最大限に活用し、複数のインスタンス間の低速ネットワークのトラフィックを削減します。 ネットワークインターフェイスコントローラーのトポロジ特性とAlibaba CloudのさまざまなインスタンスのGPU距離に基づいて、ps、ツリー、バタフライアルゴリズムなどのさまざまなアルゴリズムの組み合わせを活用して、さまざまなインスタンスのネットワークパフォーマンスを確保します。
改善効果
V100 16GBまたはV100 32GBインスタンスのパフォーマンスが大幅に向上しました。 たとえば、これら2つのタイプのインスタンスを使用してVGG16モデルを実行するパフォーマンスは、20% を超えて改善できます。
マルチストリーム通信の最適化
課題分析
ほとんどの場合、シングルストリーム通信は、iperfを使用して検証できるTCPネットワーク帯域幅を最大限に活用することはできません。 これにより、インスタンス間の集団通信アルゴリズムAllReduceのパフォーマンスが制限されます。
最適化
ACSpeedは、TCP/IPに基づくマルチストリーム機能を実装して、分散トレーニングの同時通信機能を改善し、ネットワーク帯域幅を最大限に活用します。
改善効果
マルチストリーム通信最適化を使用することにより、マルチインスタンス全体のパフォーマンスを20% に5% することで向上させることができます。
マルチインスタンスCPU-Reduce
課題分析
PCIe-topoの帯域幅制限を考えると、シングルインスタンスのCPU-Reduceメソッドは、ネイティブNCCLモードと比較して優れた改善を実現します。 したがって、PCIe-topoタイプの複数のインスタンスを使用するトレーニングジョブの場合、複数のインスタンスにCPU-Reduceを適用して、各インスタンスを最大限に活用できます。 この方法では、ソケット接続の数によって帯域幅が制限されるシナリオで、クロスインスタンス通信のパフォーマンスを向上させることもできます。
最適化
マルチインスタンスCPU-Reduceは、インスタンス間の非同期パイプライン通信を使用して、通信効率を向上させます。 また、CPUに格納された中間データがCPUとGPUとの間で繰り返し複製されることを防止する。 インスタンス間の通信パフォーマンスをさらに向上させるために、アイドルリソースを使用してインスタンス間パイプラインの数を増やすことができます。
改善効果
複数のPCIe topoインスタンスでのVGG16やTransformerベースのモデルのトレーニングなど、通信集約型のトレーニングジョブの場合、エンドツーエンドのパフォーマンスを20% 以上向上させることができます。
アーキテクチャの最適化
ACSpeedは、通信アルゴリズムの自動チューナ、適応cpuアフィニティ機能、およびエンドツーエンド最適化の観点から、アーキテクチャ層での通信性能を改善することができる。
Autotunerアルゴリズム
課題分析
異なるインスタンスおよびネットワーク環境は、最適な性能を達成するために異なる通信アルゴリズムを必要とする。 したがって、固定アルゴリズムでリアルタイムネットワーク環境の最適な性能を保証することは困難である。
最適化
ACSpeedは、自動チューナー機能を実装して、リアルタイムトレーニング中に特定のネットワーク環境に基づいて最適な通信アルゴリズムを選択し、最適なエンドツーエンドのパフォーマンスを保証します。 自動チューナー機能には、ウォームアップ、多次元perf_timeデータの出力、top_k_algo再調整メカニズムなどのメカニズムが含まれます。
改善効果
この機能により、複数のインスタンスで異なるモデルをトレーニングするときに最適なアルゴリズムが使用され、99% の場合でもパフォーマンスが低下することはありません。
Cpu-アフィニティ
課題分析
単一のインスタンス内の複数のプロセスは、不均一メモリアクセス (NUMA) アーキテクチャ、または異なるLinuxスケジューリングポリシーの影響により、リソースを求めて競合する可能性があります。 これにより、追加のスケジューリングコンテキストが消費され、単一のインスタンス内の複数のプロセス間でパフォーマンスの不一致が発生します。 分散トレーニングはほとんどが同期トレーニングであるため、これも全体的なパフォーマンスを低下させます。
最適化
ACSpeedは、CPU-Affinityメカニズムを導入して、トレーニングプロセスをCPUコアに関連付け、プロセスとCPUコアの間のアフィニティを制御します。 これにより、NUMAおよびスケジューリング消費の影響が排除される。
改善効果
この方法により、VGG16モデルを3% で実行する8 GPUシングルインスタンスのパフォーマンスが向上します。
エンドツーエンドの最適化
課題分析
モデルトレーニングには、コンピューティング、通信、およびパラメータ更新のプロセスが含まれます。 異なるモデルは、通信トラフィックによって示される異なる勾配を有し、異なる通信アルゴリズム間の性能差につながる。 コンピューティング、通信、およびパラメータ更新のプロセスの重複は、全体的なパフォーマンスの違いにつながります。 コンピューティングと通信の結合も全体的なパフォーマンスを低下させ、体系的かつ包括的な最適化が必要になります。
最適化
ACSpeedは、PyTorchフレームワークの包括的な最適化を提供し、フォワード、バックワード、およびオーバーラップ操作の全体的な調整をカバーします。 たとえば、バケットチューニングを使用して、10% に2% することでエンドツーエンドのパフォーマンスを向上させることができます。
改善効果
ACSpeedは、知覚できないプラグインを使用して全体的なパフォーマンスを最適化し、スムーズで合理化されたユーザーエクスペリエンスを保証します。
お問い合わせ
分散トレーニングのサポートが必要な場合は、DingTalkを使用してグループ番号33617640
を検索し、外部ユーザー向けのAlibaba Cloud AIACCサポートグループに参加します。 (DingTalkをダウンロード)