並列コンピューティングの量子化モデルとディープラーニングエンジンへの応用

並列コンピューティングの量子化モデルとディープラーニングエンジンへの応用

この世で唯一負けない武術はスピードだ。ディープラーニング モデルをより速くトレーニングする方法は、常に業界の焦点となっています。業界の各社は、専用のハードウェアを開発するか、ソフトウェア フレームワークを開発して、それぞれ独自の機能を披露しています。

もちろん、これらの法則は、「コンピュータ アーキテクチャ: 定量的アプローチ」などのコンピュータ アーキテクチャに関する教科書や文献に記載されていますが、この記事の価値は、最も基本的な法則をターゲットに選択し、ディープラーニング エンジンと組み合わせて理解することにあります。

1. 計算量に関する仮定

並列コンピューティングの定量モデルを検討する前に、まずいくつかの設定を行います。特定のディープラーニングモデルのトレーニングタスクでは、計算量の合計 V が一定であると仮定すると、この桁の計算が完了すれば、ディープラーニングモデルのトレーニングは完了すると大まかに想定できます。

この GitHub ページ (https://github.com/albanie/convnet-burden) には、一般的な CNN モデルで画像を処理するために必要な計算量がリストされています。このページには、フォワード フェーズでの計算量がリストされていることに注意してください。トレーニング フェーズでは、バックワード フェーズでの計算も必要です。通常、バックワード フェーズでの計算量は、フォワード フェーズよりも多くなります。この論文 (https://openreview.net/pdf?id=Bygq-H9eg) では、トレーニング フェーズ中に画像を処理するために必要な計算量を直感的に視覚化しています。

ResNet-50 を例にとると、トレーニング フェーズで 224X224x3 の画像を処理するには 8G-Ops (約 80 億回の計算) が必要です。ImageNet データセット全体には約 120 万枚の画像があります。トレーニング プロセスでは、データセット全体を 90 回 (エポック) 処理する必要があります。大まかに見積もると、トレーニング プロセスには合計 (8*10^9) *(1.2*10^6)* 90 = 0.864*10^18 回の演算が必要です。つまり、ResNet-50 トレーニング プロセスの合計計算量は約 10 億回 x 10 億回の演算になります。これらの計算が完了していれば、モデル操作は完了していると単純に想定できます。 ディープラーニング コンピューティング エンジンの目標は、与えられた量のコンピューティングを可能な限り短時間で完了することです。

2 コンピューティングデバイスに関する前提

この記事は、下の図に示すプロセッサ中心のコンピューティング デバイスに限定されています。メモリ中心のコンピューティング デバイスは業界で検討されてきましたが、まだ主流ではありません。

上図に示すコンピューティング デバイス内のコンピューティング ユニットは、CPU、GPGPU などの汎用プロセッサ、または TPU などの専用チップになります。コンピューティングユニットが汎用チップの場合、プログラムとデータは通常、メモリユニットに保存されます。これも最も一般的なフォンノイマン構造のコンピュータです。

コンピューティング ユニットが専用チップである場合、通常はデータのみがメモリ ユニットに保存されます。通信ユニットは、メモリユニットから計算ユニットにデータを転送してデータのロード(ロード)を完了する役割を担います。データを受信した後、計算ユニットは計算(データ形式の変換)を完了し、その後、通信ユニットは計算結果をメモリユニットに転送してデータの保存(ストア)を完了します。

通信ユニットの伝送容量は通常、メモリ アクセス帯域幅ベータ (1 秒あたりに転送できるバイト数) で表されます。これは通常、ケーブルの数と信号の周波数に関係します。コンピューティング ユニットのコンピューティング能力は、通常、スループット π で表されます。これは、1 秒あたりに実行できる浮動小数点演算 (フロップ) の数です。これは通常、コンピューティング ユニットに統合されている論理演算デバイスの数とクロック周波数に関係しています。

ディープラーニング エンジンの目標は、ハードウェアとソフトウェアの共同設計を通じてコン​​ピューティング デバイスに最強のデータ処理機能を持たせること、つまり、与えられた量のコンピューティングを可能な限り短時間で完了することです。

3 ルーフラインモデル: 実際のコンピューティングパフォーマンスを記述する数学モデル

コンピューティング デバイスがタスクを実行するときに達成できる実際のコンピューティング パフォーマンス (1 秒あたりに完了する操作の数) は、コンピューティング ユニットのメモリ アクセス帯域幅ベータと理論上のピーク pi だけでなく、現在のタスク自体の演算強度 (または操作強度) にも関連しています。

タスクの計算強度は、データの各バイトに必要な浮動小数点計算の数、つまりバイトあたりのフロップ数として定義されます。簡単に言えば、計算負荷の低いタスクとは、通信ユニットによって移動されたバイトに対してコンピューティング ユニットが実行する必要がある操作が少ないことを意味します。この状況でコンピューティング ユニットをビジー状態に維持するには、通信ユニットがデータを頻繁に移動する必要があります。

計算負荷の高いタスクとは、コンピューティング ユニットが通信ユニットによって移動される 1 バイトに対してより多くの操作を実行する必要があり、通信ユニットはコンピューティング ユニットをビジー状態に維持するためにデータをそれほど頻繁に移動する必要がないことを意味します。

まず、実際の計算性能は、計算ユニットの理論上のピーク pi を超えることはありません。次に、メモリ アクセス帯域幅 beta が非常に小さい場合、1 秒間にメモリからコンピューティング ユニットに移動できるのは beta バイトだけです。現在のコンピューティング タスクで各バイトに必要な操作数を I で表すと、beta * I は 1 秒以内に移動されるデータに実際に必要な操作数を表します。beta * I < pi の場合、コンピューティング ユニットは飽和しません。これは、コンピューティング ユニットの使用率が 100% 未満であることも意味します。

ルーフライン モデルは、メモリ アクセス帯域幅、コンピューティング ユニットのピーク スループット、およびタスク コンピューティング強度の関係に基づいて実際のコンピューティング パフォーマンスを推測する数学モデルです。これは、2008 年に David Patterson のチームによって Communications of ACM で公開された (https://en.wikipedia.org/wiki/Roofline_model)、簡潔でエレガントな視覚化モデルです。

図1: ルーフラインモデル

図 1 の横軸の独立変数は、さまざまなタスクの計算強度、つまり 1 バイトあたりに必要な浮動小数点演算の数を表します。垂直軸の従属変数は、実際に達成可能なコンピューティング パフォーマンス、つまり 1 秒あたりに実行される浮動小数点演算の数を表します。上の図は、それぞれ計算強度 I_1 と I_2 を持つ 2 つのタスクによって達成できる実際の計算パフォーマンスを示しています。I_1 の計算強度は pi/beta より低く、これはメモリ制限タスクと呼ばれます。実際の計算パフォーマンス beta * I_1 は、理論上のピーク pi より低くなります。

I_2 の計算強度は pi/beta よりも高く、計算制限タスクと呼ばれます。実際の計算パフォーマンスは理論上のピーク値 pi に達し、メモリ アクセス帯域幅は pi/(I_2*beta) のみを利用します。図中の斜線の傾きはベータであり、斜線と理論ピークπ水平線の交点は稜線点と呼ばれます。稜線点の水平座標はπ/ベータです。タスクの計算強度がπ/ベータに等しいとき、通信ユニットと計算ユニットはバランスの取れた状態にあり、どちらも無駄になりません。

「与えられた計算量をできるだけ短時間で完了する」というディープラーニングエンジンの目標を振り返ると、システムが実際に達成可能な計算性能を最大化することが必要になります。この目標を達成するために、いくつかの戦略が利用可能です。

図 1 の I_2 は計算上の制約があるタスクであり、計算ユニットの並列性を高めて理論上のピーク値を高めることで、実際の計算パフォーマンスを向上させることができます。たとえば、計算ユニットにさらに多くの算術論理ユニット (ALU) を統合します。特にディープラーニングのシナリオでは、同時コンピューティングのために 1 つの GPU から複数の GPU に GPU を追加することを意味します。

図 2 に示すように、コンピューティング ユニットに並列処理を追加すると、理論上のピーク値はベータ * I_2 よりも高くなるため、I_2 の実際のコンピューティング パフォーマンスは高くなり、かかる時間も短くなります。

図2: コンピューティングユニットの理論上のピーク値を改善して実際のコンピューティング性能を向上させる

図1のI_1はメモリ制限タスクです。通信ユニットの伝送帯域幅を改善することで、実際の計算性能とデータ供給能力を向上させることができます。図3に示すように、斜線の傾きは通信ユニットの伝送帯域幅を表しています。斜線の傾きが大きくなると、I_1はメモリバウンドタスクから計算バウンドタスクに変わり、実際の計算性能が向上します。

図3: 通信ユニットのデータ供給能力の向上による実際の計算性能の向上

ハードウェアの伝送帯域幅や理論上のピーク値を向上させることで実際の計算性能を向上させるだけでなく、タスク自体の計算強度を向上させることで実際の計算性能を向上させることもできます。同じタスクをさまざまな方法で実装することができ、実装によって計算の強度が異なります。計算強度が I_1 から pi/beta 以上に変化すると、計算制限タスクとなり、実際の計算パフォーマンスは pi に達し、元の beta*I_1 を超えます。

実際のディープラーニングエンジンでは、上記 3 つの方法 (並列性の向上、伝送帯域幅の改善、計算強度の優れたアルゴリズムの使用) が使用されます。

4 アムダールの法則: スピードアップを計算するには?

図 2 の例では、コンピューティング ユニットの並列性を高めることで実際のコンピューティング パフォーマンスが向上します。タスクの実行時間はどのくらい短縮できるでしょうか。これは加速比の問題であり、効率が数倍向上することを意味します。

議論の便宜上、(1)現在のタスクは計算的に制約されており、Iが計算強度を表すものとする、つまりI*beta>piとする。計算ユニットの計算ユニット数を s 倍に増やした後、理論上の計算ピークは s * pi です。タスクの計算強度 I が十分に高く、理論上のピークが s 倍に増えた後も計算限界にあると仮定します。つまり、I*beta > s*pi です。(2) パイプラインは使用せず、通信ユニットと計算ユニットは常に順番に実行されると仮定します (パイプラインの影響については後で詳しく説明します)。タスク実行効率が何倍になったか計算してみましょう。

理論上のピーク値が pi である初期ケースでは、通信ユニットは 1 秒間に beta バイトのデータを移動し、コンピューティング ユニットは計算を完了するために (I*beta)/pi 秒を必要とします。つまり、I*betaの計算は1+(I*beta)/pi秒以内に完了するので、単位時間あたりに(I*beta)/(1+(I*beta)/pi)の計算を完了することができます。計算の総量をVとすると、合計t1=V*(1+(I*beta)/pi)/(I*beta)秒かかります。

並列度を上げて理論上の計算ピークを s 倍に増やした後でも、通信ユニットが beta バイトのデータを移動するのに 1 秒かかり、計算ユニットが計算を完了するには (I*beta)/(s*pi) 秒かかります。計算の総量がVであると仮定すると、タスクを完了するにはt2=V*(1+(I*beta)/(s*pi))/(I*beta)秒かかります。

t1/t2 を計算すると、スピードアップ率は 1/(pi/(pi+I*beta)+(I*beta)/(s*(pi+I*beta))) となります。この式は読みにくいので申し訳ありません。自分で推測できますが、非常に簡単です。

理論上のピークが pi の場合、データ転送に 1 秒、計算に (I*beta)/pi 秒かかります。この場合、計算時間の割合は (I*beta)/(pi + I*beta) です。この割合を p で表すと、(I*beta)/(pi + I*beta) に等しくなります。

p を t1/t2 のスピードアップ比に代入すると、スピードアップ比 1/(1-p+p/s) が得られます。これは有名なアムダールの法則です (https://en.wikipedia.org/wiki/Amdahl%27s_law)。ここで、p は並列化できる元のタスクの割合を表し、s は並列化倍数を表し、1/(1-p+p/s) は得られた高速化率を表します。

簡単な計算をしてみましょう。通信ユニットがデータを転送するのに 1 秒かかり、コンピューティング ユニットが計算するのに 9 秒かかると仮定すると、p = 0.9 になります。コンピューティング ユニットの並列処理を増やし、理論上のピーク値を 3 倍 (s=3) に増やすとします。この場合、コンピューティング ユニットは計算を完了するのに 3 秒しかかかりません。高速化率はどのくらいでしょうか。アムダールの法則を使用すると、高速化率は 2.5 倍であり、これはコンピューティング ユニットの並列係数 3 よりも小さいことがわかります。

コンピューティング ユニットの並列処理を増やすことのメリットを実感しました。並列処理をさらに増やすことで、さらに高速化率を高めることができるでしょうか?できる。たとえば、 s = 9 に設定すると、5 倍の高速化が得られ、並列処理を増やすことによるメリットがますます小さくなっていることがわかります。

s を無限に増やすことによってスピードアップを高めることはできますか?はい、しかしコスト効率はどんどん悪くなってきています。s が無限大に近づき (つまり、コンピューティング ユニットの理論上のピーク値は無限大)、p/s が 0 に近づき、最大スピードアップ率が 1/(1-p)=10 であると想像してください。

システム内に非並列部分(通信ユニット)がある限り、高速化率は 1/(1-p) を超えることはできません。

上記の分析では計算強度 I が無限であると仮定しており、計算ユニットの並列度が増加すると、通信ユニットの伝送帯域幅が通常減少し、p が小さくなり、1/(1-p) が大きくなるため、実際の状況は高速化率の上限 1/(1-p) よりも悪くなる可能性があります。

この結論は非常に悲観的です。通信オーバーヘッド (1-p) がわずか 0.01 であっても、何万もの並列ユニットを使用しても、最大 100 倍の高速化しか得られないことを意味します。スピードアップ率を向上させるために、p をできるだけ 1 に近づける、つまり 1-p を 0 に近づける方法はありますか?万能薬があります。それは組立ラインです。

5. パイプライン:万能薬

アムダールの法則を導出する際には、通信ユニットと計算ユニットが連続して動作することを前提としました。通信ユニットは常に最初にデータを移動し、次に計算ユニットが計算を行います。計算が完了すると、通信ユニットは再びデータを移動し、次に計算を行います。

通信ユニットとコンピューティングユニットを同時に動作させて、データの移動と計算を同時に実行することは可能ですか?コンピューティング ユニットが各データの計算後すぐに次のデータ バッチの計算を開始できる場合、p はほぼ 1 となり、並列度 s を何倍に増やしても線形の高速化率が得られます。線形高速化が達成できる条件を調べてみましょう。

図4: (図1と同じ) ルーフラインモデル

図 4 の I_1 は、通信制約タスクです。通信ユニットは、1 秒間に beta バイトのデータを移動できます。コンピューティング ユニットがこれらの beta バイトを処理するために必要な計算量は、beta*I_1 操作です。理論上の計算ピークは pi で、計算を完了するには合計 (beta*I_1)/pi 秒かかります。

通信制約のあるタスクの場合、beta*I_1<pi となるため、コンピューティング ユニットの計算時間は 1 秒未満になります。つまり、1 秒未満で完了する計算では、データの移動に 1 秒かかるため、計算時間でデータの移動時間をカバーすることはできません。p が到達できる最大値は (beta*I_1)/pi であり、最大加速率は 1/(pi-beta*I_1) です。

図 4 の I_2 は計算上の制約があるタスクです。通信ユニットは 1 秒間に beta バイトのデータを移動できます。コンピューティング ユニットがこれらの beta バイトを処理するために必要な計算量は、beta*I_2 操作です。理論上の計算ピークは pi であり、計算を完了するには合計 (beta*I_2)/pi 秒かかります。計算的にバインドされたタスクの場合、beta*I_2>pi となるため、コンピューティング ユニットの計算時間は 1 秒を超えます。

これは、移動するデータの 1 秒ごとに計算に数秒かかり、計算時間中に次のデータ バッチを移動するのに十分な時間があることを意味します。言い換えると、計算時間はデータ転送時間をカバーできます。p の最大値は 1 です。I が無限である限り、高速化率は無限大になります。

通信ユニットと計算ユニットが作業を重ねることを可能にする技術は、パイプラインと呼ばれます(Pipelinging:https://en.wikipedia.org/wiki/Pipeline_(computing))。コンピューティングユニットの使用率を効果的に向上させ、加速率を高める技術です。

6 ディープラーニングエンジンにおける並列コンピューティングの量子化モデルのインスピレーション

上で説明したさまざまな量子化モデルは、ディープラーニング エンジンの開発にも適用できます。たとえば、計算量が制限されているタスクの場合、並列度を上げる (グラフィック カードを追加する) ことで高速化できます。同じハードウェアを使用している場合でも、異なる並列方法 (データ並列、モデル並列、パイプライン並列) を使用すると、計算強度 I に影響し、実際の計算パフォーマンスに影響します。分散型ディープラーニング エンジンには、多くの通信オーバーヘッドと実行オーバーヘッドが含まれます。これらのオーバーヘッドをどのように削減またはマスクするかが、高速化効果にとって重要です。

プロセッサ中心のコンピューティング デバイスの観点から GPU ベースのディープラーニング モデルのトレーニングを理解することで、読者はより優れた加速率を達成するためにディープラーニング エンジンをどのように設計するかについて考えることができます。

1 台のマシンと 1 枚のカードの場合、データ転送と計算パイプラインを完了するだけで、GPU 使用率を 100% にすることができます。実際の計算パフォーマンスは、最終的には基礎となる行列計算の効率、つまり CUDN の効率に依存します。理論的には、シングル カード シナリオでは、さまざまなディープラーニング フレームワーク間にパフォーマンスの差はないはずです。

同じマシン内に GPU を追加して高速化を図る場合、シングル カードのシナリオと比較して GPU 間のデータ転送の複雑さが増し、タスクのセグメンテーション方法によって計算強度 I が異なる場合があります (たとえば、データ並列処理は畳み込み層に適しており、モデル並列処理は完全接続層に適しています)。通信オーバーヘッドに加えて、実行時スケジューリングのオーバーヘッドも高速化率に影響します。

マルチマシンおよびマルチカードのシナリオでは、GPU間のデータ転送の複雑さがさらに高まります。ネットワークを介したマシン間のデータ転送の帯域幅は、通常、PCIeを介したマシン内のデータ転送の帯域幅よりも低くなります。これは、並列度が向上することを意味しますが、データ転送帯域幅が減少し、ルーフラインモデルの対角線の傾きが小さくなったことを意味します。データ並列化に適したシナリオであるCNNは通常、比較的高いコンピューティング強度Iを意味しますが、RNN / LSTMなどの一部のモデルではコンピューティング強度Iがはるかに低く、パイプラインの通信オーバーヘッドをカバーするのがより困難になることも意味します。

7 結論

分散型ディープラーニングエンジンを使用したことがある読者は、ソフトウェアフレームワークの加速率を実際に体験しているはずです。基本的に、データ並列処理に適した(計算強度Iが比較的高い)畳み込みニューラルネットワークなどのモデルをGPUを追加することで加速する効果はかなり満足のいくものです。ただし、モデル並列処理を使用すると計算強度が高くなるニューラルネットワークのクラスはまだ大きく、モデル並列処理を使用した場合でも、その計算強度は畳み込みニューラルネットワークよりもはるかに低くなります。これらのアプリケーションをGPU並列処理の増加によってどのように加速するかは、業界がまだ解決していない問題です。

以前のディープラーニングの評価では、複数の GPU を使用して RNN をトレーニングすると、単一の GPU を使用してトレーニングするよりも遅くなることがわかっています (https://rare-technologies.com/machine-learning-hardware-benchmarks/)。ディープラーニング エンジンの効率問題を解決するためにどのようなテクノロジが使用されるかに関係なく、基本原理は同じです。加速率を向上させるには、実行時のオーバーヘッドを削減します。適切な並列モードを選択して計算強度を高め、パイプラインを介して通信オーバーヘッドをカバーすることは、すべてこの記事で説明した基本法則の範囲内です。

<<:  人工知能の将来の動向

>>:  2021年以降の人工知能について何かお考えはありますか?

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

パーソナライズされた推奨事項は、馴染みのあるものに偏っていますか?アルゴリズムは公平性を侵害できない

北京日報によると、異なる消費者が同じ電子商取引プラットフォーム上で同じキーワードを使用して商品を検索...

人工知能アプリケーションのための6つの主要技術、ついに誰かがわかりやすく説明

[[338620]]画像はPexelsよりこの記事はWeChatの公開アカウント「Big Data ...

Google のアルゴリズムにどんな恥ずかしいことが起こったのでしょうか?

ここには Google が意図的に行ったジョークがあると思われます。周知のとおり、Google の柱...

...

...

あまり知られていないがプライバシーを保護するトレーニング方法:フェデレーテッドラーニング

[[261420]]ビッグデータダイジェスト制作出典: MITテクノロジーレビュー編集者: stat...

...

2020年以降のAIとデータのトレンド

2019 年は、データ、分析、機械学習、人工知能の市場において継続的な発展が見られた年でした。 Sa...

ChatGPTはまたしても「おばあちゃんの抜け穴」に騙されました! PS おばあちゃんの遺物、Bing を騙して認証コードを完全に識別させる

「Granny Loophole」が戻ってきました!このミームを知らない人のために、数か月前にインタ...

人工知能も「ペンを手に取る」とき、人間に残される領域はどれほどになるのでしょうか?

「暗闇が私たちの光を引き立てる/そして私は漠然とした幻想しか見ることができない/孤独の瞬間のあなた...

マシンビジョンについて知っておくべきこと

マシンビジョンは急速に発展している人工知能の分野です。簡単に言えば、マシンビジョンとは、測定と判断の...

...

データ構造とアルゴリズム: リンクリストの交差、交差点を見つける

[[441326]]リンクリストの交差LeetCode の問題へのリンク: https://leet...

AIリップリーディング、騒音環境でも最大75%の音声認識精度

人は話者の唇の動きを聞いて観察することで会話を認識します。では、AI も同じことができるのでしょうか...

デザイナーがAIについて語る:「デザインは最終的に完全に消滅するだろう」

デザイン界では有名なブランド、フィリップ・スタルク。国際宇宙ステーションの居住モジュールからスティー...