ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
機械学習のためのMetal
Metal Performance Shaders(MPS)には、機械学習およびGPUのパワフルな性能を活用するために不可欠な、データ並列処理プリミティブの厳選されたライブラリが収められています。iOS 13とmacOS Catalinaでは、MPSによってパフォーマンスが向上し、より多くのニューラルネットワークを活用できるようになりました。しかも、これまでより簡単に使用できるようになっています。このセッションでは、MPSのこうした向上点と、スタイル変換のような革新的なテクニックを実装するための実践的な方法について説明します。
リソース
- Metal
- Metal Performance Shaders
- Training a Neural Network with Metal Performance Shaders
- プレゼンテーションスライド(PDF)
関連ビデオ
Tech Talks
WWDC20
WWDC19
-
ダウンロード
(音楽)
(拍手) こんにちは 私はジャスティン GPUソフトウェア担当です ようこそ Metal for Machine Learningへ
Metal Performance Shaders フレームワークと 機械学習の新機能を紹介します
MPSは GPUで加速化した プリミティブのコレクションで GPU内のMetalの能力を最大化します MPSは画像処理や線形代数 レイトレーシングや機械学習用の カーネルを提供します
このカーネルは 推論と訓練をサポートし iOS Mac OS tvOS用に 最適化されています
MPSはグラフAPIを介して ニューラルネットワークの 構築法も示します
これはエコシステム内の MPSの役割を表したものです 上位層に Core MLとCreate MLがあり ネットワークの実装が容易になります 更に柔軟性と制御性を 持たせたい場合は MPSのようなフレームワークが有用です
私たちは今年 機械学習に新機能を追加しました ネットワークをよりサポートする カーネルを加え
既存ネットワークの性能も改善しました MPS自体も使いやすくしました
機械学習において 推論と訓練がどのように機能するのか お話します まずは概要からです
推論という過程では 入力された情報に基づき この例のように 推論結果を出力します このネットワークは畳み込みや ニューロン活性化など 様々な機能から成ります これらのレイヤはパラメータに 依存しており 推論の段階では パラメータは固定されています そして 訓練過程で値が決定されます
訓練の過程では ネットワークに多数の画像を 読み込ませます 画像分類を繰り返し行うことで パラメータが更新されます 各ネットワークの パラメータ機能が向上し 画像分類に最適なパラメータが 生成されるのです
こうして推論で用いるパラメータが 完成します
では MPSの使い方を見ていきましょう 実際には 推論と訓練は もっと奥が深いので 過去のセッションで 詳細をご覧ください
今回 推論と訓練のネットワークの サポート対象を広げました まず 暗黙的な作成機能により ネットワークのグラフ作成を シンプルにしました
Separable lossレイヤと乱数生成に カーネルを追加し 多くのネットワークを対象にしました 更に Predicationという機能を追加し MPSのコミット性能も向上させました
では 暗黙的グラフ作成を説明します
推論グラフから訓練グラフを 暗黙的に作るものです まずネットワーク用の グラフ作成について復習しましょう こちらは推論ネットワークです その構成は 畳み込み層と プーリング層 そして全結合層です
グラフ作成のために 各層のノードを用意します 畳み込み層用の 畳み込みノードや プーリング層用の プーリングノードです 全結合層には 全結合ノードを設定します
推論グラフが定義されたので 訓練グラフに拡張します
まず 推論グラフの最後に 損失ノードを置きます
続いて勾配ノードを追加し 推論グラフと逆順に設定します
こちらがコードです 初めに損失ノードを設定し
勾配ノードを順番に追加していきます
勾配ノードは容易に作れることが 分かりましたが 暗黙的グラフ作成では より簡単になります
損失ノードで勾配画像を初期化すれば 推論グラフに対応する 訓練グラフが作れます
また損失ノードを設定し
コードを1行作れば 訓練グラフの完成です
これは損失ノードを元に作りました SourceGradientに nil引数を用いると 損失ノードにより 勾配画像が初期化されます 別の画像でも可能です
更にノードハンドラもnilとします ハンドラに備わっているブロックで ノードを構成する カスタムコードを実行できます
もう1つの便利な機能が Stop gradientプロパティです 通常 訓練シーケンスを生成すると 訓練可能なレイヤが重みを更新します ここでは 畳み込み層と 全結合層が該当しますが 一部のみを更新したい場合も あるでしょう 例えば転移学習です 多くのレイヤに 訓練済みの重みを用いますが 一部を訓練したい場合があります 全結合層だとしましょう
暗黙的グラフ作成は このようなネットワーク用の グラフ作成をサポートします
では Stop gradientプロパティを 該当する1つ目の層に設定します 全結合層で試しましょう
グラフが作成されても 続く勾配ノードは作られません
このように 暗黙的グラフ作成を用いると 容易に 訓練グラフを生成できます
次の新しい機能を紹介しましょう Separable lossカーネルです
先ほど MPS CNN損失を用いた 損失ノードの使い方を説明しました softmaxレイヤの結果のような 最終画像やデータを基に 誤差逆伝播法を行うための 勾配値を計算します しかし 複数の中間損失値を用いる ネットワークもあります そこで 前方と勾配の 損失カーネルを追加しました 前方損失ノードから 2つの損失値が出たので 双方の結果を加算して 最終損失を算出します そして…
誤差逆伝播法を行うため 勾配値を初期化します
その前に 初期勾配カーネルを 設定しておきます これにより勾配画像が作られ 最終損失の結果により サイズが決定されます
勾配値が初期化されたので 誤差逆伝播法を用います Addition勾配を 前方のカーネルと― 各損失カーネルに使います
次に Separable lossを用いる ネットワークの中から スタイル変換を紹介しましょう
元の画像とスタイル画像を 組み合わせた画像を作るものです
このモデルはMPSで 実装できるものです
推論のネットワークは 変換ノードを含み 畳み込み層や 正規化層で構成されています その重みは訓練された パラメータを作ります そしてスタイルが取り込まれます 訓練過程で パラメータが学習するのです 実際に見てみましょう
これはネットワークの概要です
画像をスタイル変換するため 推論段階で変換器を用います こちらは ネットワークが 現段階で最適だと推測した― スタイル変換後の画像です
目的は2つの画像の合成なので 2種類の損失値が必要です
1つ目はスタイル損失ネットワークから 算出される値です この損失値はネットワークが 理想の変換画像を作るのに役立ちます 完成した画像が 元の画像の要素を含むことも 確実にしたい点です そこで コンテンツ損失ネットワークを使います
ここで用いるのが 新しい前方損失カーネルです
まず スタイル損失ネットワークの 詳細を説明します スタイル損失を算出するため スタイルの測定が必要です そこで 画像の中間特徴表現に対して グラム行列を計算します
グラム行列はMPSにおいて 前方と勾配のカーネルで サポートされています では グラム行列と計算方法を 見てみましょう グラム行列は特徴ベクトル間の 相互相関を表します 特徴ベクトルは特徴チャネルの画像を 空間的に平坦化したものです
グラム行列を作るため ベクトル間の内積を計算します ネットワークに戻りましょう グラム行列の前に もう1点あります スタイルとスタイル化された画像からの 特徴抽出には VGG画像分類ネットワークを使います
グラム行列は 特徴ベクトル間の相関を表します スタイル画像から 特徴ベクトルを取り出すと 利用したいスタイルの グラウンドトゥルースが得られます 理想のスタイル化画像についても 同様の処理をします そして これら2つの値で スタイル損失を算出します
続いて コンテンツ損失ネットワークです
先ほどのように VGGで特徴を抽出し スタイル化画像の特徴も含めて 損失値を算出します 最終的に コンテンツ損失と スタイル損失を合算します 次は MPSで値を計算し 勾配を初期化する方法です
まず VGGが生成した 特徴表現があるとします グラム行列の計算ノードを追加し スタイル画像とスタイル化画像を 計算させます
得られた結果を損失ノードに渡して 損失値を算出させます ここでのソース画像は スタイル化画像用の グラム行列の計算結果です
参照スタイル画像のグラム行列は ラベル引数で使います
これは前方損失カーネルの 重要な機能です 以前は MPSステートオブジェクトで ラベルを渡しましたが 今は MPS画像が使えます
元の画像と スタイル化画像の特徴により コンテンツ損失用の 損失ノードを追加できます それらを合算したのが損失値です
次は 誤差逆伝播法を行うため 最終損失勾配を初期化します
初期勾配ノードを使いましょう
損失ノードの結果が 訓練グラフの生成に使えるのは 初期勾配を生成するからです ここでは Separable lossカーネルで 初期勾配ノードを使って実行します このノードを使って 訓練グラフを作ります
では実際に ネットワークの動作を 見てみましょう
スタイル変換ネットワークが GPU上でMPSを使って稼働しました MacBook Pro上で Radeon Pro 560 グラフィックス・カードを使用しました
こちらはスタイル変換訓練の イテレーションの過程です スタイルが徐々に組み込まれつつも 元の要素は保たれています 訓練の過程を分かりやすくするため イテレーションのスピードは 実際より速くしています
続いて紹介する新しい機能は 乱数生成です
MPSに2種類の乱数生成器を加えました Mersenne Twisterの1つである MTGP32と Philoxと呼ばれる カウンタベースの発生器です いずれも アルゴリズムが GPUの構造に合っていますし 良質の統計的性質を持つ乱数列を 提供してくれます
これらのカーネルがあれば バッファとGPUメモリを使って 大きな乱数列を生成できます 結果は GPUメモリで利用できるので CPUと情報を同期させる必要が ありません 乱数生成は機械学習の アプリケーションにおいて重要です ネットワークの重みを 訓練用に初期化したり GANのような敵対的生成ネットワークの 訓練に有用です GANは特に重要な事例です 訓練のイテレーションでは 様々なデータが必要です
CPUの数字配列を 同期する必要があれば イテレーションの度に 膨大なコストがかかります
では 乱数生成の方法を 見ていきましょう
GANは2つのネットワークから成ります 生成器ネットワークと 識別器ネットワークです これは 生成器が作った 手書きの数字の画像です
ネットワークに多数の 手書きの数字の画像を与えても 画像分類は行いません ランダムなデータセットから 訓練用の画像に似た画像を 新たに生成するのです
この訓練プロセスを実行するには 類似した画像を判断する方法が 必要でした 2つ目の識別器ネットワークです
名前が示すように 訓練画像と 生成器が作った似ている画像を 識別します 画像分類ネットワークとして 機能するので 入力データが本物か または偽物か識別します
このように 識別器が数字の画像を読み 本物かどうか判断します
生成器と識別器は 同時に訓練します 生成器は より現実的な画像を作り 識別器はその精度を高めるよう 訓練しました
これは訓練ネットワークの ハイレベルな概要です
識別器訓練ネットワークは 2つの損失計算から成ります ここで Separable lossノードを使えます 1つ目の損失により 作られた画像が偽物だと 識別できるようになっています 2つ目の損失では 画像が本物かどうか分かるように 訓練しました
損失値を計算したら 初期勾配ノードを用いて 訓練グラフを初期化します
続いて 生成器訓練ネットワーク こちらは損失値が1つです この場合は“本物”という ラベルを用いて 識別器が本物と見なす画像を 生成器が作ります お伝えしたように 生成器ネットワークは 乱数生成で使う ランダムなデータから始めます では 乱数生成について見てみましょう
乱数生成カーネルは MPSMatrixのサブフレームワークに属し Randomクラスを通して アクセスされます つまりMetalバッファで 動作することになります
乱数生成をサポートし― 一様分布で浮動小数点値の 生成も可能です
ここで作成するのが分布記述子で 0から1までの値を 一様に分布させます
そして生成器を作り―
適切なデータ型をテストして 初期値を与えます
最後に 結果を保持する行列を作り その操作をコマンドバッファに エンコードします ネットワーク図で確認しましょう
生成器ネットワークの詳細です 畳み込み層 ReLu層 双曲線正接ニューロンがあります
入力画像は 乱数生成器の出力になります 乱数生成器は行列を処理しますが ニューラルネットワークカーネルと グラフには画像が必要です そのため MPSのコピーカーネルで データを行列から画像にコピーします
まず ランダムな値の行列を作ります
ネットワークに入力される 画像も作成します
コピーカーネルを初期化して コピーを実行したら―
乱数生成器をエンコードして 値を生成します それを画像にコピーさせたら 次はその画像を使って ネットワークをエンコードします
今のネットワークにや 乱数生成カーネルの詳細は オンラインの資料をご覧ください
私たちはMPSを使って ネットワークの動作と効率を向上する 機能も追加しました Predicationです
MPSカーネルを条件付きで 実行できる機能です カーネルの実行は GPUメモリの値に基づいており 実行時に参照されます
ネットワークを見てみましょう 画像キャプショニングです これは数年前のもので CNNとRNNを使って キャプションを生成します
CNNは分類ネットワークで ここで使うInception v3は 画像から特徴を抽出します
次に特徴マップを取り出し LSTMネットワークに送ると 特徴からキャプションが作られます これを繰り返し 画像キャプションを作成します
ここで注意すべきは LSTMネットワークを 何度もイテレーションする 必要があるということです キャプション生成に十分な回数を 反復して行います このケースでは 20回稼働させました
イテレーションごとに単語を追加し 最適なキャプションを生みます
5文字までという制限がある場合は より多く稼働させる必要があります
Predicationを用いると 速く実行できます 5文字を生成すれば実行終了です 次は MSPにおける使い方です その前に MPSコマンドに 述語値を提供する方法を説明するため MPSCommandBufferを紹介します
MTLCommandBufferプロトコルに 準拠したクラスですが より柔軟性があります Metalのコマンドバッファを用いる所で 使えますし MTLCommandQueueから 構築されています
また 重要なメリットもあります MPSカーネルを 実行させることができます また MPSの機能をエンコードする際 CommitAndContinueを使って 中間コミットを簡単に実行できます まずは MPSカーネルに 述語を提供するために MPSCommandBufferを使う方法です
MPS述語オブジェクトには 32ビット整数の述語値を含む Metalバッファがオフセットにあります そこにある値を 実行の述語とします 0の値はカーネルを 実行しないということ 0以外の値は実行することを 意味します ここでは オフセットの値を0に設定して カーネルの実行を回避しました MPSの述語オブジェクト間で Metalバッファを共有し 複数のカーネルに送れます 述語値はそれぞれ 異なるオフセットで参照されます
述語値を使うために MPSCommandBufferにアタッチすると コマンドバッファにエンコードした MPSカーネルが述語値を認識します 次は 述語を作成しMPSCommandBufferに 設定する方法です
まず MPSPredicateオブジェクトを作り―
MPSCommandBufferに 述語をアタッチします そして述語値を変える操作を エンコードします Metalバッファで結果を出す カーネルが必要だからです 手元にあるものでも MPSMatrixカーネルでも構いません まず MPSMatrixオブジェクトで 述語をラップしたら 述語値を修正するため カーネルをエンコードします
ここでは 線形ニューロンカーネルを用いて 述語値を減らす シンプルな作業をします
実行前に述語の値を読むため 最後に CNNカーネルをエンコードします
MPSCommandBufferで述語を使うと ネットワーク内の 余分な作業を排除できます 回避可能なカーネルがあれば 作業負荷も減らせます カーネルが複数ある場合は 複数の述語を使い オフセット値を設定して 単一のバッファを使うことができます
続いて CommitAndContinueを紹介しましょう
作業時のGPUの利用を 容易に向上できる機能です
まずは通常の作業負荷を 確認しましょう MPSカーネルを実行する時 コマンドバッファにエンコードしてから コミットします こちらは 単一のコマンドバッファで 作業をエンコードした後に実行されます 実際は CPUのエンコード時間は GPUより短いですが スロットリングなど時間の浪費 避けたいところです
このように CPUとGPUの間で 待機状態になっています
ダブルバッファリングを使うと 解決できます
コマンドバッファを2つ確保し エンコードと実行を別々に行います そのため無駄な時間を省けますが 幾つか制約もあります コマンドバッファが2つ必要なので 作業を別々の作業負荷に 分けることが必須です その分 メモリ容量も 大幅に増えます
CommitAndContinueで 作業負荷を小さく分けることで 性能を向上できます そこで 各コマンドバッファ内の 作業を細分化したら ダブルバッファリングを用いて 実行します
するとCommitAndContinueが 細分化された処理を実行 コマンドバッファに 割り当てたオブジェクトも 次のエンコードのために有効なままです
CPUでエンコードしながら GPUで作業を実行できます 作業負荷を分割することで メモリを増設せずにすみますし GPU使用率も向上できます コードを確認しましょう
MTLCommandBufferにエンコードする MPSカーネルが4つあります
最後に作業を実行します お伝えしたように 待機状態になってしまいます
ただし MPSCommandBufferと CommitAndContinueを使うと 改善できます そこで MPSCommandBufferを 生成します 2つのカーネルをエンコードし―
CommitAndContinueを呼び出します
エンコードした作業がコミットされ
次の2つのカーネルのエンコードを 続行できます 最後に残りの作業をコミットします
CommitAndContinueで コード変更は ほぼ要りません グラフを利用する場合は更に簡単です MPSCommandBufferを使って グラフ内でMPSをエンコードすると CommitAndContinueが使われ 定期的に作業が提示されます MTLCommandBufferの代わりに MPSCommandBufferを使えばいいのです
CommitAndContinueと ダブルバッファリングを組み合わせると 更に機能が向上します わずかな待機状態さえも 除けるのです
複数の選択肢がそろいました 単一のコマンドバッファでも 作業を実行できますし ダブルバッファリングなら 作業能力を向上できます
MPSCommandBufferを使えば CommitAndContinueと同じ 結果を出せます
CommitAndContinueと ダブルバッファリングなら 更に効率がアップします
実際に ネットワークで どう機能するか見てみます CIFAR-10データセットで実行した ResNet-50の例です 使用したのはAMDの Radeon Pro Vega 64のGPUです ネットワークが多くのレイヤを持つので CommitAndContinueが有用でしょう
単一バッファを基準にします 縦軸は作業能力と メモリ使用量を示します ダブルバッファリングでは― 作業能力の向上とともに メモリ使用量も上昇しました その間の作業量が2倍になるためです 次はCommitAndContinueです 作業能力は同程度ですが メモリ使用量は低いままです
CommitAndContinueと ダブルバッファリングでは 能力は高まりますが メモリ使用量が上がります
CommitAndContinueを使うと 能力を高めつつ メモリ使用を抑えられます
ではこれらの手法を使って ノイズ除去を試してみましょう
画像からノイズを除去し クリアな画像を生成します
これをレイトレーシングの観点で 見ていきます
1つ前のセッションでは ノイズ除去の 画像処理技術を紹介しました ここでは 機械学習に基づく方法を話します
3つの段階があります オフラインの訓練工程を作り 訓練ネットワークを実行し 推論グラフを展開して 新しい画像をフィルタリングします
初めにグラフ作成です 構造を見てみましょう
ここで入力する画像は
レイトレーサーで出力した ノイズの多いものです
この画像をエンコーダに渡します エンコーダは小さなサブネットで ハイレベルの特徴を抽出しつつ 画像を圧縮します
このデータをデコーダに渡すと 逆の工程段階を経て 画像を再構築します
スキップ接続も用いると エンコーダからの 画像特徴の送信が促されます デコーダに結果が転送されるのです そして ノイズ除去された画像が 完成します では エンコーダを詳しく見てみます
エンコーダ段階では 特徴を学習しながら画像を圧縮します 構成は 畳み込み層とReLu層 プーリング層です こちらがコードです 各ノードはネットワークと 同順に構成されています
デコーダの構造も同じです まず アップサンプリング層 次に スキップ接続を使い エンコーダ結果を加えます
続いて 畳み込み層とReLu層があります
また 各層にノードを挿入し―
エンコーダとデコーダをまとめます
まず エンコーダノードを接続します
ここで ボトルネックというノードを 1つ追加します エンコーダの工程と プーリング層以外は同じです
その後 デコーダノードに接続します エンコーダノードから結果の画像を渡し スキップ接続を成立させます
推論グラフの次は訓練です
まずは損失値を計算します ノイズ除去された画像で ネットワークが推測した結果を 訓練のイテレーションで使います
クリアなRGB画像を 損失値の計算に使います 2番目の損失を計算するには エッジ検出を行います Laplacian of Gaussianフィルタを 使います ネットワークに ノイズ除去を学習させるためと 元の画像のエッジを維持するためです
畳み込みを使い Laplacian of Gaussianを実装します
こうして作られた 1つ目のRGB損失と 2つ目のLoG損失を合わせて 最終損失とします
より詳しく見てみましょう 推論グラフの結果と グラウンドトゥルースRGB画像で RBG損失ノードを作ります
Separable lossカーネルを使えますので 画像をソースとラベルに渡します
LoG損失の場合も 対象のRBG画像にフィルタを適用します
畳み込みノードで LoGフィルタを実装します
その結果を基に LoG損失を計算して
双方の値を合計すると 最終損失を算出できます
最終損失が準備できたので 訓練グラフに進みます 先ほどと同様に 初期勾配を計算し 訓練グラフを構築します
まず加算用の勾配ノードと 損失の勾配ノードがあり エンコーダとデコーダへと続きます 各レイヤにノードを実装すると コードの量も増え エラーも発生しやすくなります しかし暗黙的グラフ作成では すべてをグラフに任せられます
こちらが訓練グラフのコードです
損失結果に基づき 勾配ノードを設定して―
暗黙的グラフ作成で 残りの勾配ノードを作ります
これで訓練が実行できます
まず 理想的な結果が出るような 画像を入力します ノイズの多い画像と クリアな画像があります いずれもレイトレーサーを使って 生成しました ノイズの多い画像は 短時間で完成しましたが クリアな画像は時間をかけて作りました
クリアな画像に近づくよう ネットワークを学習させます 入力データを増やすため 他のレイトレーサーの画像も使います 表面法線とアルベドです アルベド画像は 反射光量に対する値を含む― 3チャネルの画像です
表面法線も3チャネル画像で 各チャネルは 表面法線ベクトルの要素を含みます
訓練の前に前処理をしましょう
いずれも 3チャネルにデータを含みます
しかし MPSネットワークと MPS CNNカーネルは 画像を4チャネルとして扱います そのため 3つを結合させます
1つのMetalテクスチャ配列に まとめる必要があるのです 特徴チャネルは 4の倍数で要求されるためです それを可能にするカーネルがあります Metal計算シェーダを用いて結合します
まず画像を4チャネルピクセルの グリッドに分けます
引数は 結合した画像や RGB画像 アルベド画像 通常の画像の要素を持つ 結果となります
そこで スレッドに グリッド内のピクセルを読ませます
これらの値を結合させて 残りの未使用チャンネルに 0を充てます
グリッドの同位置に 結果を反映させて完成です 値を結合して MPS画像にするシェーダができたので グラフを見てみましょう その前にエンコードの方法です これは MPS画像に結果を含める例です データを含む画像を入力し―
結果をグラフに入れるため MPS画像を作ります テクスチャで 結合カーネルの結果を保持します
次に 引数を適切な位置に固定します スレッドを実行して ネットワークに渡るよう 最後に画像を戻します 続いて訓練グラフの実行についてです 訓練中はグラフを何度も実行します 各訓練セット内で複数のバッチを実行し 次に エポックごとに バッチを実行します
訓練グラフの1つのイテレーションです バッチ内の各画像以外を カーネルで連結します
グラフはソース画像用とラベル用に 画像が要るため これらを配列にまとめます
MPSCommandBufferを使うのは GPU使用率の改善するからです 最後に グラフをエンコードして コミットさせます
各エポックも詳しく見ましょう ここでは 訓練データを処理し コンバージェンスを向上します 今回は100エポックごとに 訓練セットを更新して ネットワーク検証も実行します そして1000エポックごとに オプティマイザの学習率を下げます まずエポックごとに 訓練セットを処理します
100エポックごとに訓練セットを更新し 検証を行い― 1000エポックごとに 学習率を半分にします
訓練が完了したので ノイズ除去を実行します MPSは多くの環境で利用可能なので 訓練ネットワークを 様々なデバイスで展開できます 例えば Macで訓練を実行していて iPadで画像を処理するため ネットワークを使いたい場合などです
MPSのシリアライズのサポートを 見てみましょう グラフやMPSカーネルは セキュアコーディングに対応しています おかげで ネットワークの 保存や復元が可能です ソースから重みをつける ネットワークの場合は 自分でセキュアコーディングを 実装する必要があります
これはsupportsSecureCodingやinit encodeWithCoderメソッドが必要です データソースが セキュアコーディングに適合したら グラフをシリアライズして保存できます まず グラフをエンコードする コーダーを作り encodeWithCoderをコール この時 各カーネルがシリアライズされ データソースを持つ場合も 同様にシリアライズされます アーカイブ結果には グラフの復元と初期化に― 必要な情報が含まれます 最後に データをファイルに保存します
次はローディングです
カーネルがMetalデバイスで 初期化されるよう MPSKeyedUnarchiverを置きます これはMetalで初期化されており デバイスを全カーネルに提供します データをロードした後 Unarchiverを作成します グラフを復元し ネットワークが初期化されたら 画像のノイズ除去が可能です 実際に動かしてみましょう
ノイズ除去を適用したシーンです 一番上の領域がノイズの多い画像で 中央がノイズ除去の結果です 下がグラウンドトゥルースの画像です 中央と下の領域は 同じようにクリアです レイトレーサーをフル稼働せずに 実現できました
MPSを用いると ノイズ除去や スタイル変換が簡単です
今回 推論と訓練のサポートを拡張し Separable lossや 乱数生成機能を含めました また MPSCommandBufferにより PredicationやCommitAndContinueで 性能や使用率を改善しました 暗黙的グラフ作成で 全機能が使いやすくなりました
MPSとMetalについては オンライン資料もご覧ください MPSとレイトレーシングについては Metal for Ray Tracingをご覧ください ありがとう (拍手)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。