
LLM であるか VLM であるかにかかわらず、鮮やかなニューラル ネットワークを実践する上での主要な課題のいくつかと見なされているのは、それらが鮮やかすぎて単一の GPU に収まらないことです。 . この分野に取り組むために、彼らの練習はおそらく複数の GPU で並列化されるでしょう。 このプロットは、知識またはマネキンを並列化して、計算を複数のデバイスに分散させます。 この記事では、ほとんどの場合情報並列処理と呼ばれるバッチ分割と、複数のデバイス間で計算を並列化するために JAX の pmap 機能を利用するレベルについて説明します。
300M GPT マネキンの並列化 実例から始めましょう。 8 個の Tesla V100 GPU を搭載したマシンで 3 億個のパラメーターを持つ GPT マネキンを練習しているとします。 GPU 間でマネキンを並列化して、最大限に効率的なランタイムを得るにはどうすればよいでしょうか? マネキンには 3 億個のパラメーターがあるため、そのパラメーターを保存するには 1.2 GB の RAM を消費します (ここで認識します (ブランドオリジナルタブで開きます))。 一方、トランスフォーマー マネキンを練習するための回想フットプリントは、アクティベーションによって支配されます。 させて た, D T、D T
,D は、マネキンのシーケンスの長さと隠れた寸法を示します。 と仮定するとた≫ D T gg D T≫ D、変圧器の回想フットプリントは
おおよそ (ブランドオリジナルタブで開きます):
)B T2 4 んD 2 M approx M_{マネキン} frac{BT^2} {4ND^2} M≒
Mm ode
んD 2 B た2 どこ B B
B ) はそのバッチ サイズであり、ん N んはアテンションヘッドの違いです。 では交流しましょう た =
1024, ん= 8 N=8 ん= 8、D=128 D=128 D= 128 の場合、式M ≒1.2⋅8 B= 9.6 B M 約 1.2 cdot 8 B=9.6 B M≒ 1.2⋅8B = 9.6B
つまり、アクティベーションを保存するには 10
10 10 )バッチ コンポーネントごとに GB のマネキンを準備する必要があります。 最新の Tesla V100 GPU は 32GB の RAM を使用するため、このマネキンをすべてのプランで 3 のバッチ サイズに合わせる必要があることを意味します。 最適な実践状況は、のバッチサイズを満たすことですB=24 B=24 B =24 刺して8 つのデバイスにわたるミニバッチ。 最終的なマネキンを RAM に保存する戦略を紹介しますが、制限要素はバッチ サイズです。 これが、この並列化の公式が情報並列化と呼ばれる理由です。すべての計画でマネキンを複製しますが、知識を並列化します。 Jax でのレコードデータ並列化 線形レイヤーのフォワード パスを並列化することを試みて、JAX の情報の並列化の簡単な例を見てみましょう。 最初にレイヤーを介して単一の情報レベルを渡すようにレベルを設定し、次に 1 つのプランで複数のポイントを渡し、複数のデバイスで間接的に複数のポイントを渡します。
線形レイヤー
まず、説明を提示しましょう 簡単な線形層のためのション.
1 つの情報レベル では、線形層を介して 1 つの情報レベルを渡しましょう。
出力は完全にスカラー
1 つのプランで複数の情報ポイントをうまく渡すには、vmap 機能を使用して、機能を並行して調べることができます。
出力は、単一のプランに保存された長さ 16 のベクトルです。
複数のデバイス間でこの操作を並列化すると機能します。 を使用して)pmap と同じベクトル化された効率が得られます) vmap それにもかかわらず、複数のデバイスで.
出力は形状の行列です (8, 2)
8 つのデバイスに保存されています。 この行列を平坦化すると、 から取得した長さ 16 のベクトルを思い起こさせます。 vmap 。 この状況の非常に厄介な部分は、すべてのデバイスで重みを複製したことです。 in_axes の中に pmap 特徴:
Recordsdata の並列化された線形回帰
書き出すことができるようになりました情報並列処理の練習方法の例。 すべてのミニバッチについて、すべてのプランがパラメーターに関する勾配を計算し、それらを中央サーバーに送信します。 サーバーは勾配を平均化し、結果サポートをすべての計画に送信します。 それぞれの計画は、毎日の勾配を使用してパラメーターの再現を更新します。 これにより、すべての計画が最新のパラメーターを使用してマネキンを実践していることを確認できます。 colab (ブランドオリジナルタブで開きます)ここで、おそらく完全に機能するインスタンスを取得することもできます.
ここでは、functools.partial デコレータは アップデート 機能 pmap と axis_name='num_devices'
を への入力引数としてpmap。 このプロット アップデート
機能は、すべてのデバイスに並行して適用されます。
pmean 機能は、すべてのデバイスで共通のグラデーションにエージングされます。 pmean 機能は を彷彿とさせますnp.imply 反対側には も必要です軸名
口論。 この引数は、共有する軸を指定するためにエージングされます。 この場合、num_devices 軸ですが、この名前は完全にプレースホルダーです。任意の文字列に置き換えることができます (例: '私'
また '情報'
であり、これは同じように機能します)何 pmap フードの下で行います
pmap 操作はマジカルです。情報を自動的に並列化します。 ボンネットの下で jax.pmap は を利用します) XLA (ブランドオリジナルタブで開きます)
(Accelerated Linear Algebra) は、JAX が構築される線形代数演算用のドメイン固有コンパイラです。 XLA は、計算を一連の低段階の機械方向にコンパイルします。これは、基盤となるハードウェアで正常に実行されます。
XLA を使用して情報の並列処理を実行するには、jax.pmap が生成されますすべての計画を同時に処理する一連の XLA 計算。 次に、これらの計算は、通信プロトコルを使用して調整され、すべての計画がその計算を作成するための単純な情報を持っていること、およびその意味が正確にブレンドされていることがわかります。 jax.pmap が計算の先端ですべてのデバイスの出力を 1 つの変数に混合するために利用するプロトコルは、All-Minimize
All-Minimize と呼ばれます。複数のデバイスが情報を交換し、総価格を計算できるようにする分散型コンピューティングで確立された通信プロトコルです。 jax.pmap の場合、All-Minimize プロトコルは、すべてのプランからの出力を単一の出力に混合するために熟成されます。
All-Minimize プロトコルは、最初にすべてのプランでローカル合計を計算し、次にすべてのデバイス間で部分合計を交換し、すべての部分合計の国際合計を間接的に計算します。 これにより、組み合わせ価格を計算する際に、各デバイスが最新の情報にアクセスできるようになります。
つまり、jax.pmap の場合、すべての計画はそのネイティブの結果を計算し、その結果を中央サーバーに送信します。中央サーバーは、All-Minimize プロトコルを適用して組み合わせ価格を計算します。 その後、結果はすべての計画にサポートをブロードキャストし、結果のネイティブの再現を更新できます。
𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺
どこ
つまり、アクティベーションを保存するには
線形レイヤーのフォワード パスを並列化することを試みて、JAX の情報の並列化の簡単な例を見てみましょう。 最初にレイヤーを介して単一の情報レベルを渡すようにレベルを設定し、次に 1 つのプランで複数のポイントを渡し、複数のデバイスで間接的に複数のポイントを渡します。
線形レイヤー
まず、説明を提示しましょう 簡単な線形層のためのション.
1 つの情報レベル
では、線形層を介して 1 つの情報レベルを渡しましょう。
出力は完全にスカラー
1 つのプランで複数の情報ポイントをうまく渡すには、vmap 機能を使用して、機能を並行して調べることができます。
出力は、単一のプランに保存された長さ 16 のベクトルです。
複数のデバイス間でこの操作を並列化すると機能します。 を使用して)pmap と同じベクトル化された効率が得られます) vmap それにもかかわらず、複数のデバイスで.
出力は形状の行列です (8, 2)
8 つのデバイスに保存されています。 この行列を平坦化すると、 から取得した長さ 16 のベクトルを思い起こさせます。 vmap 。 この状況の非常に厄介な部分は、すべてのデバイスで重みを複製したことです。 in_axes の中に pmap 特徴:
Recordsdata の並列化された線形回帰
書き出すことができるようになりました情報並列処理の練習方法の例。 すべてのミニバッチについて、すべてのプランがパラメーターに関する勾配を計算し、それらを中央サーバーに送信します。 サーバーは勾配を平均化し、結果サポートをすべての計画に送信します。 それぞれの計画は、毎日の勾配を使用してパラメーターの再現を更新します。 これにより、すべての計画が最新のパラメーターを使用してマネキンを実践していることを確認できます。 colab (ブランドオリジナルタブで開きます)ここで、おそらく完全に機能するインスタンスを取得することもできます.
ここでは、functools.partial デコレータは アップデート 機能 pmap と
pmean 機能は、すべてのデバイスで共通のグラデーションにエージングされます。 pmean 機能は を彷彿とさせますnp.imply 反対側には も必要です軸名axis_name='num_devices'
を への入力引数としてpmap。 このプロット アップデート
機能は、すべてのデバイスに並行して適用されます。
num_devices 軸ですが、この名前は完全にプレースホルダーです。任意の文字列に置き換えることができます (例: '私'
また '情報'
であり、これは同じように機能します)何 pmap フードの下で行います
pmap 操作はマジカルです。情報を自動的に並列化します。 ボンネットの下で jax.pmap は を利用します) XLA
(Accelerated Linear Algebra) は、JAX が構築される線形代数演算用のドメイン固有コンパイラです。 XLA は、計算を一連の低段階の機械方向にコンパイルします。これは、基盤となるハードウェアで正常に実行されます。
XLA を使用して情報の並列処理を実行するには、jax.pmap が生成されますすべての計画を同時に処理する一連の XLA 計算。 次に、これらの計算は、通信プロトコルを使用して調整され、すべての計画がその計算を作成するための単純な情報を持っていること、およびその意味が正確にブレンドされていることがわかります。 jax.pmap が計算の先端ですべてのデバイスの出力を 1 つの変数に混合するために利用するプロトコルは、All-Minimize
All-Minimize と呼ばれます。複数のデバイスが情報を交換し、総価格を計算できるようにする分散型コンピューティングで確立された通信プロトコルです。 jax.pmap の場合、All-Minimize プロトコルは、すべてのプランからの出力を単一の出力に混合するために熟成されます。
All-Minimize プロトコルは、最初にすべてのプランでローカル合計を計算し、次にすべてのデバイス間で部分合計を交換し、すべての部分合計の国際合計を間接的に計算します。 これにより、組み合わせ価格を計算する際に、各デバイスが最新の情報にアクセスできるようになります。
つまり、jax.pmap の場合、すべての計画はそのネイティブの結果を計算し、その結果を中央サーバーに送信します。中央サーバーは、All-Minimize プロトコルを適用して組み合わせ価格を計算します。 その後、結果はすべての計画にサポートをブロードキャストし、結果のネイティブの再現を更新できます。