ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Core MLモデルのチューニング
Core MLによって、機械学習のパワーを直接Appに取り込むことができます。CPU、GPU、Neural Engineをどのように活用すれば、デバイスから離れることなく、プライバシーを保護しながら、最大限のパフォーマンスを発揮できるかを紹介します。Swiftで多次元データを簡単に扱うことができるMLShapedArray、Core MLのML ProgramsをサポートしたML Packageについて詳しく説明します。機械学習に対するこの最新のプログラム的なアプローチは、型指定された実行を可能にして、驚異的な柔軟性を提供します。また、モデルのパフォーマンスを分析する方法や、ML Programsを使ってモデル内の各演算の実行をチューニングする方法も紹介します。
リソース
関連ビデオ
WWDC23
Tech Talks
WWDC20
-
ダウンロード
こんにちは WWDCへようこそ 僕はジョン Appleの 機械学習フレームワークである Core MLに取り組んでいます 同僚のブライアンと一緒に あなたのモデルをチューンする 方法をご紹介して 機械学習の魔法を Appにもたらす 初めに見せるのは 機械学習APIの強化だ その後新しい可能性の幅を開く フォーマット改善に続き その後ブライアンが ML Programを 内容について紹介する Typed Executionと どう使用するか モデルの精度やスペックを 微調整する これらの改善を ワークフローに流し MLによる経験を さらに高みに押し上げる APIの改善点から 始めよう Core MLは シンプルなAPIを提供し ユーザーのデバイスで モデルを操作します これらのモデルは 文字列やプリミティブ値など さまざまな入力と出力 または画像やMultiArrayなどの より複雑な入力で 機能するように設計できます MultiArrayについて 詳しく説明しましょう Core MLにより 作業が簡単になります MLMultiArrayを使用した 多次元データ これは単純なAPIですが データを操作するために 作成する必要のあるコードは Swiftでは 自然に感じられる とは限りません たとえば 整数の束で マルチ配列を初期化するには 実行時に型を渡す 必要があります さらに 通常の整数の代わりに NSNumberを使用します これはタイプセーフではなく エレガントなSwiftには 見えません Core MLは 多次元データの 操作を容易にするために MLShapedArrayを 導入しています MLShapedArrayは 通常の配列に似ていますが 複数の次元をサポートする 純粋なSwift型です 配列と同様に これは値型であり、 コピーオンライト セマンティクス MLMultiArrayで 簡単に機能する豊富な スライス構文を備えています 2次元のMLMultiArrayを 初期化するには 通常 2つのネストされた 「for」ループを使用します MLShapedArrayを 使用すると、 同じ2D配列を1行で 初期化できます MLShapedArrayはSwiftに 自然に適合し コードの記述とレビューを はるかに簡単にします 別の例を示します 2番目の行にスライスとして アクセスするには 次のようにインデックスを 作成します。 複数の行と列にスライスとして アクセスするには 各ディメンションに範囲を 使用できます MLShapedArrayと MLMultiArrayは 互いに完全に 互換性があります 他のタイプを取得する 初期化子を使用すると タイプを簡単に変換できます 変換初期化子を使用して データ型を変換することも できます。 たとえばこのコードは doubleのMultiArrayを FloatのShapeArrayに 変換します 整形された配列は 多次元データを 操作する必要があるときに いつでも役立ちます たとえば YOLO オブジェクト検出モデルは オブジェクトを検出し 2次元配列を出力します この表は 1つの予測からの データを示しています 各行はバウンディング ボックスを表し 各列の値の範囲は 0〜1です 各値は バウンディングボックスに 人 自転車 車などが 含まれているという モデルの信頼度を 表します 各バウンディングボックスの 最も可能性の高い ラベルを選択するコードを 記述したいと思います これを行う方法の例を 次に示します コードは出力の 信頼性プロパティで始まります これは2次元の MultiArrayです この関数は 各行をループして その行で最高の 信頼スコアを見つけます NSNumberに頻繁にキャスト するようご注意ください このコードは代わりに MLShapedArrayを使用し 読みやすい少ない行で 同じジョブを実行します モデルの予測結果により 信頼値を含む ShapedArrayプロパティが 得られることにご注意ください MLShapedArrayと そのスカラーは 標準のSwiftプロトコルに 準拠していて 単純です これにより強く型付けされた 優れた使用感が提供され より読みやすくSwiftでの 作業が楽しくなります 次に Core MLモデルと それらがファイルシステムで どのように表されるか について説明します Core MLを使用すると ユーザー向けに機械学習を 活用したリッチな 使用感を提供できます MLモデルは これらの体験を 実現するエンジンです .mlmodelファイル形式は モデルの機能をエンコード および抽象化するため 心配する必要はありません このフォーマットには モデルのすべての実装の 詳細と複雑さが格納されます 開発者は それが ツリーアンサンブルか 数百万のパラメータを持つ ニューラルネットワークか 気にする必要はありません MLモデルは 他のAPIと同じように Xcodeプロジェクトに 追加して 動作するコードを記述する だけの単一ファイルです 各Core MLモデルファイルは 複数のコンポーネントがあり メタデータには 作成者 ライセンス バージョン 簡単な説明などの 情報が格納されます インターフェースはモデルの 入力と出力を定義します アーキテクチャは モデルの内部構造を定義します たとえばニューラル ネットワークの場合 アーキテクチャ セクションでは モデルのレイヤーとその間の 接続を説明します 最後のセクションには モデルがトレーニングで 学習した大量の値の 配列が格納されています MLモデルファイルは これらすべてのセクションを protobufバイナリ形式に エンコードします この形式はファイルシステムが 単一ファイルと見なし ソース管理ソフトウェアはこの バイナリモデルファイルが実際には 複数の異なるコンポーネントの 組み合わせであることを認識できません このためCore MLは macOSのファイルパッケージ機能で これらのコンポーネントを 個別のファイルに 分割する新しい モデル形式を追加します これで新しいCore MLモデル パッケージが実現します これは モデルの 各コンポーネントを 独自のファイルに格納し アーキテクチャ 重み メタデータを 分離するコンテナです これらのコンポーネントを 分離することにより モデルパッケージを 使用すると メタデータを簡単に編集し ソース管理で変更も把握でき また コンパイルがより 効率的になり モデルの読み取りと 書き込みを行う ツールの柔軟性が 向上します Core MLとXcodeは 元のMLモデル形式を 引き続き 完全にサポートします ただしモデルパッケージに 更新することで より拡張可能な形式に移行し 効率的なコンパイルが可能です Xcodeでこれを 試してみましょう これはオブジェクト検出モデルを 使用して 画像内の動物を識別する 簡単なAppです メタデータフィールドが 空であることに注意してください メタデータが入力されて いないモデルに 出くわすのは かなり一般的です 以前はXcodeでのこれらの フィールドの編集は不可能でした しかし今はモデルパッケージを サポートするため可能です 現在 モデルのファイル タイプはMLモデルですが ボタンをクリックすると Xcodeから モデルファイルをパッケージ に更新するよう求められます Xcodeは new.mlpackageとあるように 元のモデルファイルへの ワークスペースの 参照を更新しようと していると通知します 先に進みを クリックします
XcodeのUIは モデルが MLパッケージ形式で あることを示します これで欠けた値をXcodeに 直接入力できます 先に進み 「animals」という言葉で 説明を更新します このモデルは同僚の Josephのものなので フィールドに 彼の名前を入力します MITライセンス バージョン2.0とします
追加のメタデータ フィールドを追加 変更 および削除 することもできます WWDCでこのモデルを 使用した年を示す 新しいメタデータ アイテムを追加します つまり 2021です 現在UIのサポートに加えて 実行時 Core MLのMLModel DescriptionAPIを使用し この情報に アクセスすることもできます タブでモデルの 入力と出力の 説明を変更する こともできます ここで この入力の 説明を変更します 「of an animal.」を 追加します ここで ハイフンを追加して タイプミスを修正します さて 良いメタデータを 持つモデルは 良いコメントを持つ コードによく似ています これはモデルの意図を 理解するのに役立ちます そのためモデルの入力と 出力について 適切な説明を書くことを 確認することが 特に重要です をクリックして 変更を保存します ここで、 の順にクリックすると Xcodeは変更を差分 ビューに表示します
メタデータは独自の.json ファイルに含まれるようになり 変更を簡単に確認 できるようになりました 同様に 機能の 説明には独自の separate.json ファイルがあります 62メガバイトのバイナリ MLモデルファイルの 数バイトを変更した場合 62メガバイトの バイナリ差分があります ただしモデルパッケージは 特に小さなテキストの 変更の場合 はるかに 効率的で操作が簡単です Xcodeは モデルパッケージと モデルファイルの両方を 同等にサポートします たとえば タブを使用して モデルパッケージを テストできます 2つのクマの画像を 取り込むと1つずつ バウンディングボックスが 二つ表示されます 同様に タブに移動し MLモデルファイルの 場合と同じように モデルパッケージの 暗号化キー またはMLアーカイブを 生成できます これがXcodeの モデルパッケージです パッケージはモデル メタデータの編集など モデルファイルで実行できる すべてのことを実行できます 最後に示したいのは プロジェクトに追加する モデルごとに Xcodeが自動的に 生成するコードです このアイコンをクリックして 生成されたコードを確認します 以前MLMultiArrayと それに対応する 新しいSwift MLShapedArray について見てきました Xcodeは ラッパークラスの MultiArray出力ごとに 新しくシェイプされた配列 プロパティを追加するように たとえば 生成された クラスには モデルの出力用の confidenceShapedArrayがあります 必要に応じて 信頼のMLMultiArray プロパティも 引き続き使用できます 新しいシェイプされた 配列プロパティを利用するには Deployment Targetがこれらの OSバージョンのいずれか (macOS12やiOS15)でなければ ならないことにご注意を これらすべての動作を 確認したので MLモデルとMLパッケージを 並べて見てみましょう MLパッケージは ツリー SVM ニューラルネットワーク等 MLモデルファイルを すべてサポートします これに加えMLパッケージは ML Program 強力な新しいタイプも サポートします ML Programは ニューラルネットワークを よりコード指向の形式で 表すモデルタイプです ML Programと それらが有効にする 新機能について 詳しく説明するために ブライアンに 引き渡します ありがとう ジョン 私の名前は ブライアン・キーンです ML Programと 型指定の 実行で精度を細かく制御する パフォーマンスの向上法の お話ができうれしく思います 機械学習モデルに 触れたことがある方は 多くの業界に いらっしゃることでしょう 機械学習コースを 受講している場合や 論文を読んでいる場合は 数学 統計の定式化に関して 説明しているモデルに 遭遇する可能性があります ただしこれらの数式は 抽象化されていることが多く 代わりに計算グラフまたは ネットワークの形式で 表示されます 真ん中の2つの図に 示されている図解は データが一連の レイヤーをどのように 流れるかを示しています 各レイヤーは 独自の特定の変換を適用します 機械学習ソフトウェア ライブラリでは モデルは代わりにコード内の 操作として表現されます 機械学習エンジニアは、 ブロック 関数 制御フロー の一般的な プログラム構造を ますます活用しています Core MLの新しい ML Programモデルタイプは この最後の表現と一致します これは代表的な ML Programです 人間が読める形式の テキスト形式ですが 自分で書く必要はありません ML Programは Core MLの コンバーターによって 自動的に生成されます ML Programはメイン関数で 構成されています この主な機能は 一連の操作または 操作で構成されます 各操作は変数を生成し この変数は 強く型付けされます 線形演算や畳み込み演算などの 重みを持つ操作の場合 重みは通常 個別のバイナリファイルに シリアル化されます これは ML Programと ニューラルネットワークの 比較の概要です ニューラルネットワークにはレイヤ ML Programにはopsが ニューラルネットワーク モデルの重みは レイヤーの説明に 埋め込まれていますが ML Programは重みを 個別にシリアル化します また ニューラルネットワークは 中間テンソルタイプを 指定しません 代わりに計算ユニットは 実行時にこれらの タイプを決定します 一方 ML Programでは 強い型のテンソルがあります 今日は ML Programの 強く型付けされた構文と 型付け中間テンソルが ML Programを使用した デバイス上の機械学習に 与える影響に焦点を当てます しかしまず プログラムは どう 習得するのでしょう Core MLは以前に統合 コンバーターAPIを導入し この統合コンバーターAPIは モデルをTensorflow またはPyTorchから Core MLニューラルモデルに 1回の関数呼び出しで 取得するための便利な 手段を提供します 最小のデプロイターゲット としてiOS15を 選択することで 同じAPIを使用して ML Programに 変換できるようになりました 内部的には Core MLコンバーターは 変換時に モデルのディスク上 の表現を選択します ML Programの場合 ディスク上の中間表現は WWDC2020で 導入された機能である モデル中間言語 によって提供されます 統合コンバーターAPIは モデルをML Programとして デプロイできます 今後 プログラムは ニューラルネットワークよりも 好まれる形式になります また ML Programは iOS 15 と macOS Monterey 以降でも利用できます Core MLは ニューラルモデルの MLモデルとパッケージ形式の 両方をサポートしますが ML Programは アーキテクチャとは別に 重みを保存するため MLパッケージにします Core MLは 将来の基盤として ML Programに 投資しています ニューラルネットワークの サポートは継続されますが ML Programは新機能の 中心になります ではML Programが 未来であるなら 今日ML Programを 採用することの利点は? これにより 型指定された 実行が始まることです ML Programの型付き実行 の利点を示すために 最初に ニューラルネットワークは どんな仕組みか 説明しましょう ここに示されているのは 入力テンソル 出力テンソルに Float32を指定する Core MLニューラルモデル への入力と出力の例です 入出力はdoubleまたは 32ビット整数型にすることも したがって ニューラルモデルは これらの入出力テンソルを 強く型付けします 中間テンソルの 種類はどうかというと ニューラルネットワークは その中間テンソルは 強く型付けしません オンディスクモデルの これらの テンソルのタイプに関する 情報はありません 代わりにモデルを実行する 計算ユニットは Core MLがロードした後 テンソルのタイプを推測します Core MLランタイムが ネットワークをロードすると ネットワークグラフが 自動的かつ動的に セクションに分割されます ニューラルエンジン GPU CPUに対応しています 各コンピューティング ユニットは ネイティブタイプを使用して ネットワークセクション実行 モデルの全体的な パフォーマンスを最大化します GPUとニューラルエンジンは どちらもFloat16を使用し CPUはFloat32を 使用します 開発者はcomputeUnits プロパティを使用して all cpuAndGPU または cpuOnly を使用すれば この実行スキームを ある程度制御できます このプロパティの デフォルトは.allです これは 実行時にモデルを ニューラルエンジン GPU CPUに分割して Appに可能な限り 最高のパフォーマンスを提供 するようCore MLに指示します また cpuOnlyに設定すると Core MLはニューラル エンジンもGPUも使用せず モデルはCPUで Float32精度のみを 実行します ニューラルネットワークには 中間テンソルがあり それらの生成を担当する 計算ユニットによって 実行時に自動的に 入力されることになります 許可された計算単位の セットを構成することにより 精度をある程度 制御できますが そうすることはモデルの グローバル設定であり パフォーマンスを犠牲にする 可能性があります ML Programは どうですか? ここに示されている ML Programでは 入出力テンソルが 強く型付けされており 中間テンソルも 強く型付けされています CPUやGPUなどの単一の 計算ユニット内で 精度サポートを組み合わせる ことができます タイプはモデル変換時に 明確に定義されていて これは Core MLを使用して モデルをロードして実行する ずっと前のことです ML Programは ニューラルエンジン GPU およびCPUに作業を 分散するのと同じ 自動パーティション スキームを使用します ただし 型の制約が 追加されます Core MLは テンソルをより 高い精度にする機能があり Core MLランタイムは ML Program指定の精度よりも 低い精度に中間テンソルを キャストすることはありません 型付き実行の この新しいサポートは GPUとCPUの両方での 拡張されたopサポート 特にGPU上のFloat32opsと CPU上のFloat16の選択された opsによって可能になりました この拡張されたサポートで ML ProgramでFloat32精度が 指定されている場合でも GPUのパフォーマンス上の 利点を確認できます 統合コンバーターAPIを試して 複数の精度のML Programを 作成しましょう 今はJupyterノートブックを 使用しています これはPythonコードを インタラクティブに 実行するのに便利です モデルを新しい ML Program形式に 変換するプロセスに ついて説明します 今日使用するモデルは スタイル転送モデルです 事前にトレーニングされた Tensorflowモデルを オープンソースにて ダウンロード このモデルは画像を取り込み 定型化した画像を生成します 最初に必要なのは インポートステートメントです Pythonイメージライブラリ Core ML toolsをインポート また コードを簡潔に保つために いくつかのヘルパー ライブラリと 単純なヘルパー 関数もあります
次に スタイル転送 モデルのパスと スタイル設定する画像への パスを指定します 変換の入力タイプ これも設定します この場合モデルにより トレーニングされた 画像のサイズを指定が なされる画像入力タイプで 最後にCore MLモデルの 変換後の実行に 使用する入力辞書を 準備するための 追加のセットアップが いくつかあります これで入力がロードされ ソースモデルが利用可能に なりました この時点で すべての外部リソースを ML Programに変換 する準備ができています
変換にはUnified ConverterAPIを使用 最初の引数は ソースモデルのパスです 次に 入力タイプの 配列を渡します ここに1つだけあります 最後に最小展開 ターゲット引数は Core MLがニューラル ネットワークを生成するか ML Programを生成 するかを決定します デフォルトはiOS13で ネットワークを生成 今すぐML Programを 取得したいので Deployment Targetを iOS15に設定します 最終的にこのモデルを iOS Appにデプロイしたい ターゲットデバイスが Macの場合は 代わりにmacOS12の ターゲットを指定することも Shift-Enterを押して モデルを変換します 変換が完了しました 変換中にML Programに対して 自動的に行われる グラフ変換があります これはFP16Compute Precisionパスといいます このグラフパスは 元のTensorflowグラフの 全Float32テンソルを ML Programの Float16テンソルに キャストします 変換が完了したので 次のステップは ML Programのチェック 両方のモデルで 同じ画像を使用して 予測を呼び出すことで 出力数値を元のモデルと 比較できます ML Programは 注目に値します 予測 モデルの保存 その他のユーティリティで 以前と同じCore ML Tools API を使用しています 比較を行うために 私はすでに _get_Core ML_tensorflow_outputという ユーティリティを作成済みです Tensorflowからの出力 Core MLからの出力を 評価するために 複数のエラーメトリックを出力
これは画像であるため 最も適切なエラーメトリックは 信号対雑音比(SNR)で ある可能性があります 実際には20または30を 超えるSNRは 通常良好な結果を示します 私は71のSNRがあるので 良好ですね 他にもいくつかの指標が あります 最大絶対誤差 平均絶対誤差などです 興味はあるが Float16を使用する場合の 精度の低下は どの程度か そう思われる方も いらっしゃるかも 調べるために、 Float16変換を無効にして 再度変換します 同じconvertコマンドを 使用しますが 今回はcompute_precision引数を 指定しFloat32に設定します これによりコンバーターは これらのFloat16キャストを 注入しないように 指示されるため Core MLToolsコンバーターは Float32 ML Programを生成します では このFloat32 ML Programを 元のTensorflowプログラムと 比較します
SNRは100以上に増加しました 最大絶対誤差は 約1から0.02に 減少しました では 以前にFloat16モデルで 発生したエラーが 認識できる影響を 及ぼしたかどうかは? これはスタイル転送 モデルであるため 出力画像の単純なプロットに 基づき判定ができます
Float16 ML Program Float32 ML Program Tensorflowモデルの3つの モデルすべてのソース画像と 定型化されたバージョンを プロットします
モデル出力の間に 違いは実際には 見られませんね もちろん 単一の画像の この評価は いくつかのメトリックと 目視検査を使用していますが 実際には単なる スモークテストです 大丈夫に見えますね 実際には 大規模なデータセット全体で 多くのエラーメトリックを 使用して評価し 機械学習モデルで 使用するうパイプライン内の 障害ケースを評価して トリアージします 小さなデータセットが 手元に残ります この例をさらに 一歩進めるために データセット内の 各画像について 2つのML Programを Tensorflowモデルと比較します Float32 ML Programと TensorflowのSNRは Xが付いた赤い線で示され Float16 ML Programは 円が付いた青い線です Float32 ML Programの 平均SNRは約100のようで Float16 ML Programは 約70のままです Float16の精度は 数値にわずかな 影響を及ぼしますが このユースケースでは 重要ではないようです ただし この131枚の画像は 小さなデータセットで いくつかの外れ値があります 全体として モデルは期待どおりに かなりうまく 機能しています そしてこれは大多数の 深層学習モデルに 当てはまります Float16の精度でも 通常は問題なく動作する 傾向があります そのため Core MLコンバーターでは Float16トランスフォームが 既成設定でオンになっています Float16タイプの ML Programは ニューラルエンジンで 実行できるようになります これでパフォーマンスが向上し 消費電力が削減されます ランタイムは実行時に テンソルのタイプを 最小精度として扱うため Float32 ML Programは GPUとCPUのみの 組み合わせで実行されます この実演はML Programが 変換時に実行される 最小精度を制御することが いかに簡単であるか を示しています またニューラルネットワーク のCore MLモデルとは異なり モデルでより高い精度が 必要な場合も 計算単位の設定をcpuOnlyに 変更する必要はありません 最後に このデモノートブックは Core ML Toolsの ドキュメントサイトで 例として入手できます 要約すると ML Programを取得するには 変換関数を使用し 追加の引数を渡して 展開ターゲットを指定し 少なくともiOS 15 またはmacOS 12に設定します デフォルトでは Core MLコンバーターは ニューラルエンジンでの 実行に最適化された Float16モデルを生成します 場合によっては モデルがFloat16の精度に 敏感である場合は 代わりに精度をFloat32に 設定するのが簡単です 実際 Core ML Tools APIには より高度な オプションがあります 使用すると特定のopsを選択 Float32で実行し 残りをFloat16で保持し 混合型ML Programが完成 これらの例については ドキュメントにもあります 要約すると Core MLには モデルの調整と 操作を容易にする 新しい拡張機能があります 新しいMLShapedArray タイプを使用すると 多次元データを簡単に 操作できます MLパッケージ形式を 使用すると Xcodeでメタデータを 直接編集できます 新しいML Programモデル タイプのMLパッケージは Float32サポートを使用した 型付き実行をサポートし モデルのパフォーマンスと 精度を調整するときに より多くのオプションを 使用できるようにします モデルをMLパッケージに アップグレードし ML Programを使用する ことをお勧めします ご閲覧ありがとうございます 残りのWWDCもお楽しみを! [音楽]
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。