ハイライト
MPSGraph は、メタル パフォーマンス シェーダーを多次元テンソル計算に拡張し、開発者がグラフ、テンソル、変数、自動微分を使用して、カスタムの機械学習推論とトレーニング プロセスを GPU 上で実行できるようにします。
主要内容
これまで、カスタム機械学習オペレーターを GPU に実装したい開発者は、データ構造、メモリ フロー、メタル カーネルの間を行き来する必要がありました。活性化関数は、単なる乗算、加算、誤差関数のように見えます。 GPU に到達すると、各ステップがグローバル メモリに書き戻され、次のステップで読み取られることがあります。パフォーマンスの損失は推論ループに直接押し込まれます。
このセッションで Apple が出した答えは MPSGraph です。計算は有向非巡回グラフとして記述されます。操作はノード、テンソルはエッジ、プレースホルダーは実行時に入力を受け取り、ターゲット テンソルは返す結果を指定します。開発者は数学的関係を記述し、MPSGraph は最適化のためにグラフをコンパイラーに渡す役割を果たします。
このモデルの価値は、GeLU 活性化関数の例で明らかです。開発者は、MPSGraph を使用して定数、平方根、乗算、誤差関数、加算、乗算を組み合わせてカスタム GPU 計算関数を取得します。その後、コンパイラーは隣接する操作をよりコンパクトな Metal シェーダー領域につなぎ合わせ、セッションによって得られる GeLU アクセラレーションは 10 ~ 50 倍近くになります。
MPSGraph の範囲にはトレーニングも含まれます。このセッションでは、数値分類子と敵対的生成ネットワークを使用した変数、自動微分、オプティマイザーの更新、非同期実行、および単一実行呼び出しをデモンストレーションします。重要なのは、モデルをブラック ボックスに隠すことではなく、開発者が推論、損失関数、勾配、パラメーターの更新を直接表現できるようにすることです。
詳細
01:30 MPS が初めて機械学習の基本機能を完成
セッションの初めに、MPS の基本的な変更点について説明します。 MPS は EDLines エッジ検出プリミティブを追加しました。これにより、Measure アプリが 10 倍高速化されました。距離変換フィルターも最適化され、Final Cut Pro の機能の中で 15 倍の高速化を達成しました。機械学習部分では、畳み込みと完全に接続されたプリミティブによって完全な FP32 サポートが追加され、開発者はそれをデータ ソース プロバイダーに実装できます。kernelWeightsDataTypeそしてに設定しますfloat32これにより、精度が維持され、ハイパーパラメーターの再計算やコードのリファクタリングの労力が軽減されます。
キーポイント:
- FP32 サポートは、畳み込みと完全に接続されたプリミティブに適用されます。
- セッションによって明示的に指定されたアクセス ポイントは、データ ソース プロバイダーです。
kernelWeightsDataType。 - この部分は、モデル構造の表現の問題ではなく、精度の移行の問題を解決します。
02:05 MPSNDArray は MPS に多次元テンソルをもたらします
MPSNDArray は、最大 16 次元をサポートする新しい MPS プリミティブです。データがメモリに収まる限り、ディメンション サイズに追加の制限はありません。作成プロセスは 2 つのステップに分かれています。MPSNDArrayDescriptor形状と要素のデータ型を指定し、記述子と Metal デバイスをイニシャライザに渡します。
キーポイント:
- MPSNDArray は、機械学習および科学技術コンピューティングにおける多次元データを対象としています。
- 既存のものに追加することができます
MTLTexturebasedMPSImageBatch型間で変換します。 - 既存の Metal データ チャネルへのアクセスを容易にするために、Metal バッファを介してデータをインポートおよびエクスポートすることもできます。
03:00 MPSGraph はグラフを使用してテンソル データ フローを記述します
MPSGraph は MPS フレームワークの最上位に位置し、Metal の計算機能を多次元テンソルに拡張するために使用されます。 macOS、iOS、iPadOS、tvOS のサポートを提供します。 Metal Performance Shaders Graph フレームワークは、Xcode のビルド フェーズからプロジェクトに追加する必要があります。
キーポイント:
MPSGraph演算とテンソルで構成される DAG を表します。- 演算は、乗算、加算、減算などの計算ノードです。
- テンソルは、テンソルを作成する形状、データ型、操作参照を含むデータ フロー エッジです。
- グラフは、独自のメソッドを通じて作成されたテンソルと操作の所有権を取得します。
07:22 プレースホルダー、オペレーション、ターゲットを使用して GeLU を実行する
GeLU の例では、カスタム計算を 3 つのステップに分割しています。最初のステップは、プレースホルダーを使用して入力テンソルを作成することです。特定のディメンションが実行時にのみ決定される場合は、そのディメンションを次のように記述します。-1; 次元数さえ不明な場合は、プレースホルダ形状を渡すことができますnil, MPSGraph は実行時に形状を伝播します。 2 番目のステップは、定数を含む MPSGraph 操作のセットとして GeLU を作成することです。squareRoot、乗算、誤差関数、加算。 3 番目のステップは、グラフの実行時にフィード ディクショナリを渡し、ターゲット テンソルを指定し、オプションでターゲット操作を指定することです。
キーポイント:
- プレースホルダーは、呼び出し元によって提供されるランタイム データ エントリです。
MPSGraphTensorData交換する。 - フィード辞書はプレースホルダーを入力データにマップします。
- ターゲット テンソルは、グラフがどの結果を計算して返すかを決定します。
MPSGraphTensorDataメタルバッファーで構成できます。MPSImageBatch、MPSVector、MPSMatrixまたはMPSNDArray初期化。
13:00 ステッチングにより隣接する操作が自動的に融合されます
GeLU の例では、従来の実装では、各操作でその出力がメモリに書き戻され、次の操作で読み取れるようになります。 MPSGraph コンパイラは隣接する操作を識別し、それらを Metal コンパイラに渡して単一の最適化されたシェーダーに融合します。畳み込み、行列乗算、リダクションなどの手動調整された MPS カーネルの場合、MPSGraph は周囲のステッチ可能な数学演算を領域として識別し、それらをこれらの手動調整されたカーネルに統合することもできます。
キーポイント:
- ステッチングは、MPSGraph コンパイラと Metal コンパイラによって自動的に行われます。
- -session によって得られる GeLU の結果は 10 ~ 50 倍近く高速になり、大幅なメモリ節約がもたらされます。
- 開発者は、この最適化のために追加のコードを記述する必要はありません。
15:17 推論グラフで循環テキスト生成を表現できる
テキスト生成デモでは、長期短期記憶ベースのテキスト ジェネレーター モデルを使用します。生成ループは文字インデックスから開始され、埋め込み層の収集操作を通じてランク 1 テンソルを取得し、それを LSTM 層に送信します。 LSTM の結果は、行列乗算演算によって実装される非埋め込み層に入ります。次に、結果に温度の逆数が乗算され、MPSGraph はスカラーをベクトルの長さに自動的にブロードキャストし、ソフトマックス層に入り、次の文字の確率分布を形成します。
キーポイント:
- トレーニングされたパラメーターは推論段階で固定され、定数で表すことができます。
- ギャザリング、行列乗算、ブロードキャスト、ソフトマックスはすべて MPSGraph 演算で表現されます。
- 温度はソフトマックス前の分布形状に影響を与えます。温度が高いほどランダムになり、温度が低いほどトレーニング データに近くなります。
20:21 トレーニング グラフは変数と自動微分を使用してパラメーターを更新します
デジタル分類器のトレーニング プロセスでは、まず入力ラベルとターゲット ラベルのプレースホルダーを定義し、-1可変長のバッチ サイズを表します。トレーニング可能なパラメータはグラフの一部であり、変数を通じて保存されます。変数はグラフ実行全体にわたって値を保持するため、各ラウンドでフィードとして渡す必要はありません。畳み込み層は、最初に畳み込み記述子を作成し、次にグラフ上で畳み込みメソッドを呼び出します。レイアウトが渡されましたMPSGraphTensorNamedDataLayoutNCHW、NHWC、OIHW、HWIO などの一般的な形式をサポートする式。
キーポイント:
- 変数は、初期値、形状、要素のデータ型を含む、グラフの変数メソッドを使用して作成されます。
readVariable現在の実行ポイントにおける変数のテンソル値を返します。変数テンソルをオペレーションに直接渡すと、グラフは暗黙的に readVariable を追加します。- ソフトマックス軸は次のように設定されます
-1、最も速く変化する軸を指します。 - 損失 Softmax Cross Entropy を使用し、その後
reductionSum単一のスカラー損失に集約します。
25:47 グラデーション メソッドはバックワード パスを自動的に書き込みます
トレーニングでは、重みとバイアスの損失の勾配を計算する必要があります。 MPSGraph は、テンソルとターゲット テンソルのセットを受け取り、そのテンソルを勾配の辞書に返す勾配メソッドを提供します。 Session では例として対数を使用し、グラフが偏導関数として逆数演算を生成し、無駄な演算を削除し、定数を折り畳むことを示します。
キーポイント:
- 自動微分は自動的に逆方向パスを書き込みます。
- 数値分類器の場合、勾配法を使用して、重みとバイアスに関する損失テンソルの勾配を計算します。
- 確率的勾配降下法オプティマイザーは、学習率、元の重み値、および勾配を使用して更新テンソルを取得します。
assign variable操作は更新テンソルを変数に書き込みます。
27:28 トレーニングの実行時にキャッシュ、非同期で既存の Metal ワークフローにプラグインできます
トレーニング ループは、各ラウンドで入力画像とラベルのバッチを取得し、フィードを通じてグラフに渡し、ターゲットとして損失テンソルを要求し、重みとバイアスが更新されるようにターゲット操作に代入操作を入れます。グラフは、入力および出力タイプの一意のセットに最初に遭遇したときに 1 回コンパイルされ、その後の反復ではキャッシュされた実行可能ファイルが自動的に再利用されます。非同期実行メソッドはすぐに戻ります。executionDescriptor完了ハンドラーを登録できます。このセッションでは、セマフォを使用して CPU エンコーディングと GPU 実行のオーバーラップを制御する方法も示します。
キーポイント:
- トレーニングの各ラウンドのパラメータ更新は、ターゲット操作によってトリガーされます。
- キャッシュされた実行可能ファイルにより、繰り返しのコンパイル コストが削減されます。
- 非同期実行は、CPU エンコーディングと GPU 実行のオーバーラップに適しています。
- 既存の Metal ワークフローは独自のワークフローを渡すことができます
MTLCommandQueue、グラフをエンコードすることもできますMPSCommandBuffer。
31:21 単一の MPSGraph でジェネレーターとディスクリミネーターの両方をトレーニングできます
最後の GAN デモでは 2 つのネットワークをトレーニングします。ジェネレーターはランダムなシードから手書きの数字を生成し、畳み込み転置を使用して出力サイズを拡張し、平均、分散、ガンマ、およびベータを使用してバッチ正規化を形成します。弁別器は実際の画像または生成された画像を受け取り、現実性を出力し、ドロップアウトを使用して入力値の一部をランダムにゼロにし、レートの逆数に従って残りの値を増やします。
キーポイント:
- 畳み込み転置は、対応する畳み込み記述子と予想される出力形状によって記述されます。
- バッチ正規化では、軸を選択することでバッチ、高さ、幅などの正規化された寸法が決定されます。
- discriminator pass は、discriminator 変数の勾配のみを要求します。
- ジェネレーター パスにより、MPSGraph は 2 つのネットワーク間で自動的に区別しますが、ジェネレーター変数の勾配のみを返します。
- 2 つのネットワークの損失と更新操作は 1 回の実行呼び出しで実行でき、グラフは 2 つのネットワーク全体でコンパイルおよび最適化されます。
重要ポイント
-
温度を調整できるローカル テキスト ジェネレーターを作成: MPSGraph を使用して埋め込み、LSTM、行列乗算、ブロードキャスト、ソフトマックスを表現し、ユーザーがスライダーを使用して温度を調整できるようにします。この機能はセッションのシェイクスピア デモから直接得られたもので、エントリ ポイントはプレースホルダー フィード、トレーニングされた定数パラメーター、およびターゲット テンソルの実行です。
-
デバイス側の手書き数字トレーニング サンドボックスを作成: キャンバス入力をプレースホルダー、畳み込み、バイアス加算、ReLU、reshape、softmax、Softmax Cross Entropy として使用します。
reductionSumトレーニング グラフを作成します。自動微分を使用して重みとバイアスの勾配を取得し、SGD 更新を通じてパラメーターを更新し、変数を割り当てます。 -
カスタム活性化関数実験パネルの作成: GeLU から始めて、定数、単項演算、二項演算、誤差関数を MPSGraph ヘルパーに結合します。このパネルには、隣接する数学演算に対するステッチングの最適化効果の検証に重点を置き、さまざまな入力形状での出力と消費時間が表示されます。
-
小さな GAN ビジュアル トレーナーを作成します: ジェネレーターを使用してデジタル画像を生成し、ディスクリミネーターを使用して現実性を判断し、2 つのネットワークを同じ MPSGraph に配置します。インターフェイスには、ジェネレータ損失、ディスクリミネータ損失、および生成された結果が表示されます。トレーニング中に、ターゲット操作を使用して両方のネットワークの更新を同時にトリガーします。
-
Metal データ チャネル ブリッジング ツールの作成: 既存の Metal バッファを結合し、
MPSImageBatchまたはMPSNDArrayにパッケージ化されたMPSGraphTensorDataこれにより、すべてのデータ ソースを一度に変更することなく、既存の画像処理または科学計算パイプラインを段階的に MPSGraph に移行できます。
関連セッション
- Metal で Apple GPU を利用する - まず Apple GPU と Metal の実行モデルを理解してから、MPSGraph がどのようにテンソル計算を GPU に引き渡すかを見てみましょう。
- Metal アプリを Apple シリコン Mac に導入する — Apple シリコン Mac 上の Metal アプリの移植と GPU アーキテクチャに関する考慮事項を補足します。
- Core ML Converters を使用してデバイス上のモデルを取得する — TensorFlow、PyTorch、および Apple のデバイス上の機械学習の間の関係をモデルのインポートの観点から理解します。
- Swift を使用した Create ML でのトレーニングの制御 — Create ML のトレーニング制御プロセスを比較し、高レベルのトレーニング ツールがどのようにチェックポイントと進行状況を整理するかを理解します。
- Create ML での画像およびビデオ スタイル転送モデルの構築 — Create ML のビジュアル モデル トレーニングから始まり、エンドサイドの機械学習機能の製品化シナリオを補完します。
コメント
GitHub Issues · utterances