View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

WWDC19に戻る

ストリーミングはほとんどのブラウザと
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
      • HDビデオ
      • SDビデオ
    • プレゼンテーションスライド(PDF)

    関連ビデオ

    Tech Talks

    • A14 BionicのMetal性能の向上について

    WWDC20

    • Metal Performance Shaders GraphでカスタムMLモデルを構築する

    WWDC19

    • プロフェッショナル向けのAppのためのMetal
    • 機械学習における新機能
    • Metalによるレイトレーシング
    • Metalによる最新のレンダリング
    • MetalのAppとゲームを最適化する
    • OpenGL AppをMetalに移行する
  • このビデオを検索

    (音楽)

    (拍手) こんにちは 私はジャスティン 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をご覧ください ありがとう (拍手)

Developer Footer

  • ビデオ
  • WWDC19
  • 機械学習のためのMetal
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン