ホームページ > 記事 > テクノロジー周辺機器 > Flying Paddle は、異種シナリオでの自動並列処理のために設計および実践されています。
自動並列処理を導入する前に、なぜ自動並列処理が必要なのかを考えてみましょう。一方では、異なるモデル構造があり、他方では、さまざまな並行戦略があり、通常、両者の間には多対多のマッピング関係が存在します。さまざまなタスク要件を満たすために統合モデル構造を実装できると仮定すると、並列戦略はこの統合モデル構造に収束するでしょうか?
#答えは「いいえ」です。並列戦略はモデル構造だけに関係するわけではないからです。だけでなく、モデルのサイズと使用される実際のマシン リソースも密接に関係しています。これは自動並列処理の価値を反映しており、その目標は、ユーザーにモデルと使用されるマシン リソースが与えられた後、ユーザーが効率的に実行するためのより適切な、または最適な並列戦略を自動的に選択できるようにすることです。
個人的に興味のある仕事のリストをいくつか挙げます。完全ではないかもしれません。自動化の現状と歴史についてお話したいと思います。あなたとの並行性。それは大まかにいくつかの次元に分かれています: 最初の次元は自動並列度であり、完全自動と半自動に分けられます; 2 番目の次元は並列粒度で、各レイヤーまたは各オペレーターに並列戦略を提供します。並列戦略を提供するテンソル、3 番目は表現能力で、SPMD (Single Program Multiple Data) 並列処理とパイプライン並列処理の 2 つのカテゴリに単純化されています。4 番目は特性であり、ここに個人的により優れていると思う関連研究のリストを示します。 5 番目はサポート ハードウェアで、主に関連作業でサポートされる最大の種類と量のハードウェアを作成します。このうち、赤字で示した部分が主にフライングパドルの自動並行開発のための啓発ポイントとなります。
完全自動並列処理の場合、並列粒度は粗い開発によって決定されることがわかります。粒度から粒度までのプロセス; 表現機能は比較的単純な SPMD から非常に一般的な SPMD およびパイプラインまで; サポートされるモデルは単純な CNN から RNN、さらに複雑な GPT まで; 複数のマシンと複数のカードをサポートしますが、全体的な規模は特に大きくありません。
#半自動並列処理の場合、並列粒度は基本的に演算子に基づきます。表現機能は単純な SPMD から完全な SPMD に Pipeline の並列戦略を加えたものまで多岐にわたり、モデルのサポート規模は数千億、数兆に達し、使用されるハードウェアの数はキロカード レベルに達します。フレームワークの観点から見ると、既存のフレームワークは基本的には準自動モードはサポートされているか、サポートされる予定であり、並列粒度もオペレーター粒度に発展しており、表現機能は基本的に SPMD と Pipeline の完全な表現を使用しており、さまざまなモデルおよびさまざまなハードウェアを指向しています。
個人的な考えをいくつか要約します:
① 最初のポイントは、分散戦略が基礎となる表現で徐々に統合されるということです。
② 2 番目のポイントは、半自動は徐々にフレームワークの分散プログラミング パラダイムになる一方、完全自動は特定のシナリオと経験に基づいて検討され実装されることになります。ルールです。
③ 3 番目のポイントは、究極のエンドツーエンドのパフォーマンスを達成することです。これには、並列戦略と最適化戦略の共同調整が必要です。 通常、完全な分散トレーニングには 4 つの特定のプロセスが含まれます。 1 つ目はモデルの分割です。手動並列化でも自動並列化でも、モデルを並列化できる複数のタスクに分割する必要があります。2 つ目はリソースの取得です。トレーニングに必要な機器リソースは、自分で構築するか、または構築することで準備できます。プラットフォームから適用します。次に、タスク配置 (またはタスク マッピング) があり、これは分割されたタスクを対応するリソースに配置することを意味します。最後に分散実行があり、これは各デバイス上のタスクが並行して実行され、同期され、メッセージを通じて対話されることを意味します。コミュニケーション。 現在の主流のソリューションにはいくつかの問題があります。一方で、 分散トレーニングの一部のプロセスのみを考慮するか、一部のプロセスのみに焦点を当てている可能性があります。もう 1 つは、分散トレーニングに依存していることです。専門家の経験に依存しすぎていること、モデルのセグメント化やリソースの割り当てなどのルール、最後に、トレーニング プロセス全体におけるタスクとリソースの認識の欠如。 2. アーキテクチャ設計
上図の水色枠部分が今回のレポートで紹介する自動並列化関連の作業です。
# #1 つ目は、統合分散コンピューティング グラフです。統合の目的は、既存のさまざまな並列戦略を統一された方法で表現しやすくすることであり、これにより処理の自動化が容易になります。ご存知のとおり、逐次計算グラフはさまざまなモデルを表現できます。同様に、逐次計算グラフに基づいて、各演算子とテンソルに分散属性を追加して分散計算グラフを形成します。このようなきめ細かいアプローチにより、既存のモデルを表現できます。セマンティクスはより豊富でより一般的になり、新しい並列戦略を表すこともできます。分散コンピューティング グラフの分散属性には主に 3 つの情報の側面が含まれます: 1) テンソルを分割する方法または演算子を分割する方法を示す必要がある; 2) 分散コンピューティングにどのリソースが使用されるかを示す必要がある; 3) どのように分割するかを示す必要がある結果として得られるテンソルまたは演算子がリソースにマッピングされます。シリアル コンピューティング グラフと比較すると、分散コンピューティング グラフには 3 つの基本概念があります: シリアル テンソルに似た分散テンソル、シリアル オペレータに似た分散オペレータ、分散コンピューティング グラフに特有の分散再配置。 #(1) 分散テンソル
① シリアル テンソル情報:
主に含まれるものテンソル形状、dtype などのメタ情報。一般に、実際の計算ではシリアル テンソルのインスタンス化は必要ありません。 ② ProcessMesh: プロセスのカルテション トポロジ表現は DeviceMesh とは異なります。ProcessMesh を使用する理由は主に、論理プロセスが物理デバイスに接続できるデカップリングにより、より効率的なタスク マッピングが容易になります。 ③ ShardSpec: は、シリアルの各次元を分割するために ProcessMesh のどの次元が使用されるかを示すために使用されます。 tensor 、詳細については、以下の例を参照してください。
##分散演算子 表現は以下に基づいています。分散テンソルであり、シリアル オペレーター情報、入力テンソルと出力テンソルの分散プロパティが含まれます。同様に、分散テンソルは複数のスライス方法に対応する場合があり、分散演算子の分散属性は異なり、異なるスライス方法に対応します。矩形乗算 Y=X*W 演算子を例にとると、入力と出力の分散属性が異なる場合、それらは異なる分散演算子の実装に対応します (分散属性には ProcessMesh と ShardSpec が含まれます)。分散オペレーターの場合、入力テンソルと出力テンソルの ProcessMesh は同じです。 # (3) 分散再配置
不一致の主な理由は 3 つあります: 1) データと計算の分離をサポートしているため、それを使用するテンソルと演算子には異なる要件があります。分散属性; 2) 分散属性のユーザー定義のマーキングをサポートします。ユーザーは、テンソルとそれらを使用する演算子の異なる分散属性をマークできます。3) 分散演算子の基礎となる実装は制限されています。入力または出力の分布がある場合、式が属性はサポートされていないため、分散再配置も必要です。
#2. 統合分散リソース マップ
例として、上の図に示すように、2 つの GPU マシンと 2 つの XPU マシンを含む 4 つのマシンがあります。 2 つの GPU マシンの場合は 1 つの同型 DeviceMesh が使用され、2 つの XPU マシンの場合は別の同型 DeviceMesh が使用されます。固定クラスターの場合、その DeviceMesh は固定されており、ユーザーは DeviceMesh を抽象化したものとして理解できる ProcessMesh を操作します。ユーザーは自由に形状を変更したりスライスしたりすることができ、最終的に ProcessMesh プロセスは DeviceMesh デバイスに均一にマッピングされます。
# は、テンソルと演算子に基づいたきめの細かい分散コンピューティング グラフによって表されます。既存の並列戦略だけでなく、将来登場する可能性のある新しい並列戦略もカバーできます。データ並列処理は、データ テンソルの Batch 次元を分割することです。モデルは、重量関連のディメンションを並行してセグメント化します。パイプラインの並列処理は、さまざまな ProcessMesh によって表され、より柔軟な Pipeline 並列処理として表現できます。たとえば、Pipeline Stage は複数の Pipeline Stage を接続でき、異なる Stage で使用される ProcessMesh の形状は異なる場合があります。他の一部のフレームワークのパイプライン並列処理は、ステージ番号または配置によって実現されますが、柔軟性や汎用性が十分ではありません。ハイブリッド並列処理は、データ並列処理、テンソル モデル並列処理、およびパイプライン並列処理を組み合わせたものです。
前面は、フライングパドルの自動並列アーキテクチャの設計であり、いくつかの抽象的な概念の導入。前の基礎に基づいて、レイヤー 2 FC ネットワークの例を通じてフライングパドルの自動並列化の内部実装プロセスを紹介しましょう。
上の図はフライングパドルの全自動並列フローチャートです。まず、シリアル順方向計算グラフに基づいて逆方向生成を実行し、順方向、逆方向、および更新サブグラフを含む完全な計算グラフを取得します。次に、ネットワーク内の各テンソルと各演算子の分散特性を明らかにする必要があります。半自動導出方法または全自動検索方法のいずれかを使用できます。このレポートでは、少数のユーザーラベルに基づいて他のラベルなしテンソルや演算子の分散プロパティを導出する半自動導出手法を主に説明します。分散プロパティによる導出後、シリアル計算グラフ内の各テンソルと各演算子は独自の分散プロパティを持ちます。分散属性に基づいて、シリアル計算グラフは、まず自動分割モジュールによって SPMD 並列処理をサポートする論理分散計算グラフに変換され、その後、分散再配置によってパイプライン並列処理をサポートする論理分散計算グラフが実現されます。生成された論理分散コンピューティング グラフは、物理マッピングを通じて物理分散コンピューティング グラフに変換されます。現在、1 つのプロセスと 1 つのデバイスの 1 対 1 マッピングのみがサポートされています。最後に、物理分散コンピューティング グラフは実際のタスク依存関係グラフに変換され、実際の実行のために非同期エグゼキューターに渡されます。分散属性の導出には、次の条件が与えられます。計算グラフ内の一部のテンソルと演算子の分散プロパティは、他のすべてのテンソルと演算子の分散プロパティが自動的に完成されます。この例は 2 つの Matmul 計算です。ユーザーは 2 つのパラメーター分散属性をマークしただけです。これは、W1 がプロセス 0 と 1 で列カットを実行し、W2 がプロセス 2 と 3 で行カットを実行することを意味します。2 つの異なる ProcessMesh があります。異なる色を使用することを示します。
分散属性の導出は 2 つのステップに分かれています: 1) 最初に ProcessMesh 送信を実行してパイプライン セグメンテーションを実装します; 2) 次に ShardSpec 送信を実行してステージ内で SPMD セグメンテーションを実装します。 ProcessMesh の導出では、フライング パドル線形プログラム lR を使用し、最も近い選択戦略を使用して、静的なプログラム順序に従って導出を実行します。包括的な計算をサポートしています。つまり、2 つの ProcessMesh があり、1 つは大きく、もう 1 つは小さい場合、大きい方が最終的な ProcessMesh として選択されます。 ShardSpec 導出では、フライング パドル SSA Graph IR を使用して、前方および後方データ フロー解析を実行して導出します。データ フロー解析が使用できる理由は、ShardSpec セマンティクスがデータ フロー解析のセミラティス特性を満たすためです。データフロー解析は理論的に収束を保証することができ、前方解析と後方解析を組み合わせることで、計算グラフ内の位置マーク情報を一方向にのみ伝播させるのではなく、計算グラフ全体に伝播させることができます。
#分散属性導出に基づいて、グラフ内の各テンソルの合計がシリアルに計算されます。 各演算子には独自の分散属性があるため、分散属性に基づいて計算グラフを自動的にセグメント化できます。この例によれば、単一マシンの逐次計算グラフは、Rank0、Rank1、Rank2、Rank3 の 4 つの計算グラフに変換されます。
# 簡単に言うと、各演算子が走査され、出力の合計が除算されます。をテンソルに変換し、各演算子が計算されて分割されます。 Tensor セグメンテーションは Distributed Tensor オブジェクトを使用して Local Tensor オブジェクトを構築しますが、演算子セグメンテーションは Distributed Operator オブジェクトを使用して、実際の入力と出力の分散属性に基づいて対応する分散実装を選択します。単一マシンのフレームワークをカーネルプロセスに適用します。
#前述の自動セグメンテーションでは、SPMD をサポートする分散コンピューティング グラフのみを取得できます。平行度パイプラインの並列処理をサポートするには、分散再配置によって処理する必要もあります。これにより、適切な Reshard 操作を挿入することで、例の各ランクが独自の真に独立した計算グラフを持つようになります。左図のRank0のYはRank2のYと同じでセグメンテーションは同じですが、異なるProcessMesh上にあるため、生産と消費の分布属性が一致しないため、Reshardも挿入する必要があります。
Flying Paddle は現在、2 種類の分散再配置をサポートしています。最初のカテゴリは、同じ ProcessMesh 上のより一般的なソース テンソル分布とターゲット テンソル分布ですが、ソース テンソル分布とターゲット テンソル分布は異なるスライス方法を使用します (つまり、ShardSpec が異なります)。 2 番目のカテゴリは、ソース テンソル分布とターゲット テンソルが異なる ProcessMesh 上に分散されており、図のケース 2 の 0 ~ 5 プロセスと 6 ~ 9 プロセスのように、ProcessMesh サイズが異なる場合があります。通信を可能な限り削減するために、Flying Paddle は Reshard 操作に関連する最適化も実行します。
分散再配置後、論理的な分散計算グラフが得られますが、現時点ではまだその処理は決まっていません。および特定のデバイスのマッピング。論理分散コンピューティング グラフと事前に統合されたリソース表現グラフに基づいて、物理マッピング操作が実行されます。これは、複数のマッピング ソリューションから最適なマッピング ソリューション (プロセスが具体的にどのデバイスにマッピングされるか) を見つけるランク マッピングです。
ここでは、貪欲なルールに基づいた比較的単純な実装を示します。まず、プロセスとプロセス間通信間の隣接テーブルを作成します。エッジは通信量を表し、ノードはデバイス要件を表します。次に、デバイス間の隣接テーブルを作成します。エッジは通信帯域幅を表し、ノードはデバイスのコンピューティングとノードを表します。メモリ。プロセス R をランダムに選択し、ニーズを満たすデバイス D に配置し、配置後、R との通信量が最も多いプロセスを選択し、D が配置されているマシンの他のデバイスに配置します。すべてのプロセス マッピングが完了するまで、このメソッドが使用されます。マッピング処理では、選択したデバイスがプロセスグラフで必要なデバイスタイプ、必要な計算量、メモリと一致するかどうかを判断する必要があります。
物理マッピングを通過した後、取得した実際のデータに基づいて物理分散ネットワークを構築します。タスクの依存関係グラフ。図の例では、計算グラフの前方、後方、更新の役割に基づいてタスクの依存関係グラフを構築しており、同じ役割を持つオペレーターがタスクを形成します。マイクロバッチ最適化をサポートするために、タスク依存関係グラフは複数のタスク インスタンス依存関係グラフを生成します。各インスタンスは同じ計算ロジックを持ちますが、異なるメモリを使用します。現在、Flying Paddle は計算グラフの役割に基づいてタスク グラフを自動的に構築しますが、ユーザーは適切な粒度に従ってタスクの構築をカスタマイズできます。各プロセスはタスクのマルチインスタンス依存関係グラフを持った後、アクターモードに基づいて非同期に実行され、メッセージ駆動方式により1F1B実行スケジューリングを自動的に実現できます。
上記のプロセス全体に基づいて、比較的完全な機能を備えた自動並列化を実装しました。 。ただし、並列戦略だけではエンドツーエンドのパフォーマンスを向上させることはできないため、対応する最適化戦略も追加する必要があります。フライング パドルの自動並列化では、自動セグメンテーションの前とネットワーク セグメンテーションの後にいくつかの最適化戦略を追加します。これは、一部の最適化はシリアル ロジックで実装する方が自然であり、一部の最適化はセグメンテーション後の実装が容易であるためです。管理メカニズムにより、フライングパドルの自動並列化において並列戦略と最適化戦略を自由に組み合わせることができます。
応用演習を以下に紹介します。
最初はインターフェイスです。実装方法に関係なく、ユーザーは最終的に使用することになります。インターフェースを通じて得られるもの、自動並列機能が提供されます。ユーザーの分散要件を分解すると、モデル ネットワークのセグメンテーション、リソース表現、分散データ ロード、分散実行プロセス制御、分散保存と回復などが含まれます。これらのニーズを満たすために、使いやすさと柔軟性を兼ね備えた Engine クラスを提供します。使いやすさの点では、高レベルの API が提供され、カスタマイズされたコールバックをサポートでき、分散プロセスはユーザーに対して透過的です。柔軟性の点では、分散データローダー構築、自動並列グラフ切断と実行、その他のインターフェイスを含む低レベル API を提供し、ユーザーがよりきめ細かい制御を行うことができます。この 2 つは、shard_tensor、shard_op、save、load などのインターフェイスを共有します。
#
shard_op と shard_tensor という 2 つのラベル付きインターフェイスがあります。このうち、shard_op は、単一の演算子または関数式であるモジュール全体をマークできます。上の図は非常に簡単な使用例です。まず、Flying Paddle の既存の API を使用してシリアル ネットワークを実行します。このネットワークでは、非侵入型の分散属性マーキングに shard_tensor または shard_op を使用します。次に、自動並列エンジンを構築し、モデル関連の情報と構成を渡します。このとき、ユーザーには 2 つのオプションがあり、1 つは Fit /evaluate/predict 上位インターフェイスを直接使用する方法、もう 1 つはデータローダーの準備実行インターフェイスを使用する方法です。 Fit インターフェイスを選択した場合、ユーザーはデータセットを渡すだけで、フレームワークが自動的に分散データセットをロードし、並列プロセスを自動的にコンパイルし、分散トレーニングを実行します。データローダーの実行準備インターフェイスを選択すると、ユーザーは分散データのロード、自動並列コンパイル、および分散実行を分離して、単一ステップのデバッグを向上させることができます。
PaddleFleetX は、使いやすさと使いやすさを備えたエンドツーエンドのワンストップ ソリューションです。高性能 自動並列化機能をサポートする大規模なモデル スイート。ユーザーがフライング パドルの自動並列エンドツーエンド機能を使用したい場合は、シリアル ダイナミック グラフ モデル ネットワークを提供するだけで済みます。ユーザーの動的グラフ シリアル ネットワークを取得した後、内部実装はフライング パドル動的静的モジュールを使用して動的グラフ シングルカード ネットワークを静的グラフ シングルカード ネットワークに変換し、自動的に並列コンパイルし、最後に分散実行します。トレーニング。 。推論生成中に使用されるマシン リソースは、トレーニング中に使用されるものとは異なる場合があります。内部実装では、パラメーターの適応的なパラメーター セグメンテーションとネットワーキングも実行されます。現在、PaddleFleetX の自動並列処理は、一般的に使用される並列戦略と最適化戦略をカバーしており、その 2 つの任意の組み合わせをサポートしており、生成されたタスクについては、 While 制御フローの自動セグメント化もサポートしています。
自動パドル並列処理に関しては、まだ多くの作業が行われていますが、現在の機能は次の点に要約できます。分散コンピューティング グラフは、SPMD とパイプラインの完全な分散戦略をサポートできます。ストレージと計算の分離された表現をサポートできます。
#第 2 に、統合された分散リソース グラフは、次のことができます。異種リソースのモデリングと表現をサポートします。
##第三に、並列戦略と最適化戦略の有機的な組み合わせをサポートします。
##第 4 に、比較的完全なインターフェイス システムを提供します。最後に、主要なコンポーネントとして、エンドツーエンドのサポートを提供します。飛行プロペラの自動操作、分散アーキテクチャへの適応。
並列処理は、一般に 2 つの分野に分けることができます (明確な境界線はありません)。1 つは従来の分野です。分散コンピューティングと従来のハイパフォーマンス コンピューティングには、どちらにも独自の長所と短所があります。従来の分散コンピューティングをベースにした代表的なフレームワークは TensorFlow であり、MPMD (Multiple Program-Multiple Data) 並列モードに焦点を当てており、弾力性と耐障害性を十分にサポートすることができ、分散コンピューティングのユーザー エクスペリエンスが向上し、プログラミングがより簡単になります。一般に、シリアル グローバルの観点からプログラミングを使用しますが、従来のハイパフォーマンス コンピューティングをベースにした代表的なフレームワークは、SPMD (Single Program-Multiple Data) モードに重点を置き、究極のパフォーマンスを追求する PyTorch です。プログラミングを担当し、モデル自体をセグメント化する責任を負い、適切な通信を挿入することで、ユーザーの要件はより高くなります。自動並列処理または適応型分散コンピューティングは、この 2 つの組み合わせと見なすことができます。もちろん、アーキテクチャが異なれば設計の優先順位も異なるため、実際のニーズに応じて比較検討する必要がありますが、フライングパドル適応型アーキテクチャが両方の分野の利点を考慮できることを期待しています。
以上がFlying Paddle は、異種シナリオでの自動並列処理のために設計および実践されています。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。