ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Core MLでのモデルの配布とセキュリティ
Appのバイナリ外でCore MLモデルをデプロイし、機械学習機能をAppに導入する際により柔軟で制御しやすくする方法について説明します。また、Core MLモデルデプロイメントによりAppのアップデートを行うことなく更新されたモデルを導入する方法についても学習します。さらに、暗号化を使用してカスタムの機械学習モデルを保護する方法や、Xcodeでモデルのパフォーマンスをプレビューする方法も一通り説明します。 TensorFlowやPyTorchなどの環境で学習済みのモデルを取り込む場合など、Core MLの使い方の詳細については、"Get your models on device using Core ML Converters”をご覧いただくことを推奨します。
リソース
関連ビデオ
WWDC20
-
ダウンロード
こんにちは WWDCへようこそ “Core MLでのモデルの展開と セキュリティの使用” 私 アニル・カティが Core MLの新しい機能をご紹介します Core MLはアプリケーションの機械学習での シームレスの統合を容易にし ユーザーへ素晴らしい体験をもたらします Core MLモデルはこのような体験を すべて可能とする中核です 今日は このモデルの新しい機能をご紹介します このセッションではモデルを展開する 新たな方法や暗号化する方法 そして Xcodeの機能拡張をご紹介します では 始めましょう アプリケーションの開発ワークフローを 念頭に置きCore MLは設計されました 準備したモデルをXcodeプロジェクトに ドラッグアンドドロップすると アプリケーションに モデルを統合することができます Xcodeはデバイスでの実行に 最適なフォーマットへモデルをコンパイルします アプリケーションをサブミットすると コンパイル済みモデルがバンドルされます それがApp Storeへ行った後に ユーザーのデバイスに行きます モデルとアプリケーションを バンドル化することをお勧めします それにより アプリケーションのインストール時に ユーザーはすぐにモデルを利用できます モデルの配信プロセスにおいて より柔軟性や コントロールが必要になるシナリオがあります 柔軟性を提供するための Core ML Model Deploymentを紹介します
Core ML Model Deploymentはアプリケーションに モデルを配信する新しい方法を提供します Model Deploymentダッシュボードを使い Appleクラウドでモデルを 保存 管理 展開することが可能です アップデートが入手可能になると デバイスは定期的にアップデートを取得します Model Deploymentが提供する機能は アップデート周期とは独立して モデルを開発し展開する機能 一緒に機能するモデルをグループ化機能 そして 特定のデバイス母集団に モデルのターゲットを絞るオプション機能です それぞれの機能を詳しく見ていきましょう まず 独立した開発機能を説明します
モデルを再トレーニングする際 モデルを次のアプリケーションのアップデートと バンドルするよう計画します
しかし モデルとアプリケーションで アップデートのペースが違っていたら?
従来は より新しいモデルを ユーザーに届けるためだけに より多くのアプリケーションのアップデートを プッシュする必要がありました 現在はModel Deploymentを使って アプリケーションそのものを更新することなく 簡単にモデルをアップデートすることができます 次はモデルコレクションです
アプリケーション内の機能に関連する1つか 複数のモデルのグループ化に適した方法です 例えば ゲームの作業をしていて そのレベルの内の1つが ある機能をサポートするために 一式のモデルを必要とした場合 1つのモデルコレクションにグループ化し それらのモデルを同期することが可能です モデルコレクションを展開する際は すべてのモデルを コレクション内に保持し アトミックにアプリケーションへ配信します デモに入る前に 私たちであれば この機能をどのように導入するかを説明します Model Deploymentを導入するには 3つの手順があります まず 新しいCore ML APIを使用し Model Deploymentをオプトインします 次に モデルアーカイブを作成して 展開のモデルを準備します これはXcodeで行うことが可能です
最後に 準備したモデルをアップロードして Model Deploymentダッシュボードに 展開します モデルを更新する際に ステップ2と ステップ3を繰り返す必要があります これらの手順をデモで詳しく見ていきましょう 花の画像をダブルタップすると美しい視覚効果を 適用する簡易アプリケーションがあります これは画像分類器とスタイル転送モデルの 2つのCore MLモデルを使用しています
Model Deploymentの統合を選択したので アプリケーションのアップデートプロセスから 更新モデルを切り離し モデルをイテレーションできました つまり 最初のステップは新しいAPIを使用して Model Deploymentのオプトインをすることです Xcodeで行う方法を説明します Xcodeプロジェクトが開いています このデモの中では 花の分類機能だけに 焦点を当ててお話しします 今日 実装するキーメソッドは ある特定の画像内の花を分類し クラスラベルでUIを更新します このメソッドを起動した時に 最初に行うのは FlowerClassifierのインスタンスを作成し 変数に保存することです これにより 後のコールで事前にロードされた モデルにアクセスすることができ モデルを毎回ロードする必要がなくなります 事前にロードされているケースの チェックから始めましょう
既に変数が設定されているかを確認し 設定されていれば それを使って画像を分類し すぐに返します 次にロジックを実装し モデルをロードします
モデルはコレクションに グループ化されています 後ほど 新しいダッシュボードで モデルコレクションを作成し 展開する方法をお見せします 既に展開された コレクションにアクセスするには MLModelCollectionで beginAccessingメソッドを呼び出します
このメソッドが識別子の付いた モデルコレクションに初めて呼び出された時 バックグラウンドキューでコレクション内の 全モデルをシステムがダウンロードします そして モデルへの 今後のアップデートのために登録します 進捗オブジェクトを使い ダウンロードを監視することも可能です
我々が使用するモデルコレクション識別子は “FlowerModels”です モデルコレクションの作成時に 必要となるので メモしておきましょう
MLModelCollectionのインスタンスも 結果タイプとして非同期に返します この結果からダウンロードされたモデルへの アクセス方法を見てみましょう
このオペレーションが正常に実行されると モデルコレクションエントリーを含む モデルコレクションのインスタンスを取得します モデルごとに1つのエントリーがあります モデル名をキーとして FlowerClassifierモデルの モデルコレクションエントリーへの アクセスが可能です エントリーの中には システムによってダウンロードされ アプリケーションのコンテナにコンパイル済みの モデルをポイントするモデルURLがあります モデルコレクションへのアクセスに 失敗する場合もあります 例えば 最初に呼び出される時に ネットワーク接続がなければ モデルのダウンロードは失敗します 失敗したケースの処理は重要です この例ではエラーをログし バンドルされた モデルの使用にフォールバックします 次に ロジックを実装し モデルをロードしましょう
モデルをロードするために 簡易的なヘルパーメソッドを実装しました オプションのmodelURLを インプットとして取得し FlowerClassifierモデルをロードします URLがニルの場合 フォールバックし アプリケーションと バンドルされているモデルをロードします
最後のステップでは 画像の分類に FlowerClassifierを使用します
これはそのコードです モデルのローディングが正常に実行されると ロードされたモデルを使って画像を分類し 分類リクエストのために それを変数内に保存します モデルのロードの失敗処理には 別のメソッドがあります このケースでは 適切なエラーメッセージを ユーザーに表示します
Model Deploymentのためのアプリケーションの 準備に必要なコードはこれだけです 展開のためのモデルを どのように準備するのでしょう? Xcodeでモデルをクリックすると Model Deploymentのセクションを持つ 新たなユーティリティタブが 導入されたことが分かります
モデルアーカイブを作成することで 展開のためのモデルが準備できます
XcodeがFlowerClassifier.mlarchiveを 作成し ディスク上に保存しました ここをクリックすると ファイルがあります
オリジナルのモデルファイルの すぐ横に配置されています 最後のステップは Model Deploymentダッシュボードで このモデルを展開することです XcodeはSafariの Model Deploymentダッシュボードに 導くボタンを提供します ダッシュボードで最初に気付くのは モデルコレクションの作成方法があることです 花のモデルに対して 新しいモデルコレクションを作成し “FlowerModels”と名付けます これはアプリケーションで指定されたものと 一致させる必要があります
次に 適切な説明を加えます “花の画像用に作成された モデルのコレクション”などと記載します
このコレクションの中で収集する予定の 2つのモデルを指定します 最初がFlowerClassfierで
もう1つがFlowerStylizerです そして 作成ボタンをクリックします 次に 新たな展開を作成して モデルを展開することが可能です これらのモデルをすべての デバイス上の アプリケーションに展開するので グローバル展開と呼びます
各モデル名に対して作成した モデルアーカイブのアップロードが可能です FlowerClassfierとStylizerを選び 右上の展開ボタンをクリックします
モデルコレクションページで 今作成した展開が アクティブ状態だと確認できます
これらは モデルコレクションを使用する すべてのデバイスで利用可能です アプリケーションを起動して 花を分類してみましょう
ダリアを選ぶと ダリアとして分類されていると分かります 次はハイビスカスを選びます こちらも正しく理解しているようです モデルは3つのクラスでトレーニングされ その中にバラは入っていません バラの画像を選ぶと どうなるでしょう
予想通り アプリケーションは バラを認知しないようです
バラを分類できるよう アプリケーションを拡張します アプリケーション内に導入済みの Model Deploymentを使って バラの画像で再トレーニングされた モデルを展開します デモ用に 更新されたモデルを 準備しておきました
展開ダッシュボードで 更新方法を見てみましょう 新たな展開を作成し 更新されたモデルを展開します スタイライザーと改善された分類器を選び 展開ボタンをクリックします
すべてのデバイス上のアプリケーションで 更新モデルの利用が可能となりますが 多少 時間がかかります 各デバイスがバックグラウンドでの ダウンロード時間を計算し アプリケーションは 次の起動時にモデルを入手します OSが更新モデルをデバイスに同期した後 何が起きるか見てみましょう 先程のバラの画像が 今回はバラとして分類されています コードを変更せず モデルを改善することで ユーザー体験を拡張できました 次は ターゲットを絞った 展開についてです アプリケーションが未熟な内は1つの モデルセットのみを使用する場合もあります しかし進化するにつれ 異なる母集団に 特化したモデルを使用するのが合理的でしょう すべてのモデルをバンドルし ランタイム時に 適切なものを使用することもできますが 効率的ではありません モデルが大きく アプリケーションの ダウンロードサイズを抑えたい場合もあります ターゲットを絞った展開であれば 各デバイスが必要なモデルのみを取得するよう ルールを定義できます 1つの設定例を見てみましょう 最近 FlowerClassifierの iPad専用の改善を実施しました iPadで取得される画像の カメラ角度とライトの設定が iPhoneとは若干異なっていたのです iPad以外のすべてのデバイスでは 既存のモデルはうまく動作しています 特有のモデルを iPadのみの 対象にする方法を見てみましょう
既存展開のクローン作成か 新規作成かを選択できます ここでは新しいものを作成し Targeting iPadsと呼びます
まず 展開の デフォルトモデルを選択します これらは ルールに一致しない すべてのデバイスで配信されます
次に ターゲティングルールを追加します 様々な基準があると分かるでしょう デバイスクラスでiPadを選択します ターゲティングルールには iPad特有のモデルを選びます
これで展開が可能です デバイスが適切なモデルを引き当てるので アプリケーションでの追加変更が必要ありません Core ML Model Deploymentの使用により 簡単にユースケースを支援できます 使用の際は 次のことにご注意ください まず 各モデルをアップロードする前に ローカルでテストすることを強くお勧めします ユーザーが動作しないモデルを 受け取らないようにするためです
次に 展開するモデルは デバイスですぐには利用できません 各デバイスが いつモデルを ダウンロードするかを決定します そのため モデルが利用できない時に 必ずフォールバックプランを持つべきです
最後に モデルコレクションでは モデルを体系化することができます アプリケーションの各機能を中心に モデルコレクションをグループ化しましょう つまり Core ML Model Deploymentは アプリケーションのアップデートとは独立して ユーザーにモデルを配信する新しい方法です モデルコレクションは モデルをグループ化する優れた方法です ターゲットを絞った展開は 異なる母集団に展開したい場合に有効です これらの機能によって ユーザーへの より柔軟なモデル配信が可能となるでしょう ここからはジョンが エキサイティングな別の機能を紹介します
ありがとう アニル ご参加いただきありとうございます 皆さんに これらの機能を提供でき 非常にうれしく思います モデルをより早く ユーザーに届ける方法を見てきました 次にモデルの暗号化についてです 暗号化することで 停止時や送信中も モデルを配信することが可能となります どのように機能するのか見てみましょう アプリケーションとバンドルされているか クラウドに展開されているかにかかわらず Xcodeが暗号化するのは コンパイルされたCore MLモデルです デバイスのアプリケーション内に存在するのは オリジナルの.mlmodelファイルではなく コンパイルされたモデルです コンパイルされたモデルを 暗号化するには Xcodeを使います 最初に必要となるのは暗号化キーです 後ほど作り方をお見せします モデルをビルド時に暗号化するよう Xcodeに伝えます 生成時にモデルアーカイブを 暗号化することも可能です いずれにせよ コンパイルされたモデルは 送信中も停止時も暗号化されたままです では ランタイムでどのように 使用するのでしょうか 使用方法は通常のモデルと同様です Core MLによって自動的に解読されたモデルは メモリ内にのみ存在します コンパイルされたモデルは 常時暗号化された状態です 最初に暗号化されたモデルをロードする際 OSがアプリケーションに代わって 解読キーをフェッチし 確実に保存します 再び同じモデルをロードするのに ネットワーク接続は必要ありません 暗号化の導入が いかに簡単であるかを見てみましょう 先程アニルが使っていたアプリケーションで 画像分類モデルを暗号化します 最初に暗号化キーを作成します モデルをXcodeで開いて ユーティリティタブに行き―
“Create Encryption Key”をクリックします
暗号化キーは チームと関連づけられているので アプリケーション作成に使用する チームアカウントを選びます Continueをクリックすると Appleクラウドにリクエストを送ります サーバーはキーを保存し Xcodeにコピーを送り返します
Xcodeが拡張子.mlmodelkeyの付いた 新しいファイルを作成したと分かります ここに.mlmodelと.mlmodelkeyがあります
完成した暗号化キーは チームのセキュアキーレポジトリ上で 他の開発者と共有できます
次は キーを使ってモデルを暗号化します Core ML Model Deploymentで モデルを展開したシナリオを見てみます 今回は モデルアーカイブを作成する時に― Xcodeが.mlmodelkeyを事前に選択します Continueをクリックします
コンテンツを暗号化して モデルアーカイブを作成するのが分かります 残りの手順は先程と同じです Core ML Model Deploymentダッシュボードに 暗号化されたモデルアーカイブを アップロードして展開します アプリケーションの中でモデルを バンドルする場合も暗号化は可能です このアプリケーションには FlowerStylizerと 呼ばれる2つ目のモデルがあります 再度アプリケーションを実行してみます 画像をダブルタップすると スタイル転送効果が適用されるのが分かります きれいですね このようなモデルを作成したい方は “Build Image and Video Style Transfer Models in Create ML”をご覧ください このモデルはアプリケーションのバンドルで パッケージ化されています ビルド時にモデルを暗号化するよう Xcodeに伝える必要があります まず モデルのキーを作成します
FlowerClassifier.mlmodelkeyが ディスクに保存されました
ビルド時にこのキーを使用するよう Xcodeに伝えます
これらのコンパイラフラグをグラブし プロパティのBuild Phasesの中にある Compile Sourcesでモデルを探します FlowerStylizer.mlmodelがありました Compiler Flagsに行き
--encryptと.mlmodelkeyファイルへの ポインターを貼り付けます
その後 再びビルドします
ビルドする度に Core ML Compilerがモデルをコンパイルし 暗号化キーで暗号化します これで 暗号化されたモデルが アプリケーションに組み込まれました 次はロード方法を見てみましょう
“Stylize the Image”という関数があります ローディングには 初回にネットワーク接続が必要なので 非同期のモデルローディングメソッドを 導入しました このFlowerStylizer.loadがそうです デフォルトのイニシャライザーは 非推奨にする予定なので 新しい.loadメソッドへの切り替えを 強くお勧めします
ロードは自動的にAppleクラウドから キーをフェッチします Core MLは 一度取得したキーを 再度フェッチする必要がありません 例えば アプリケーションを閉じ 再起動するとします OSがキーをローカルに保存したので Core MLはネットワークリクエストを 作成しません モデルを含む“T”の結果です 正常ケースではこれをアンラップでき 前と同様にスタイライジングを続けられます しかし 失敗のケースもあります その場合にはヘルパーメソッドがあり modelKeyFetchエラーにトラップをしかけます ネットワーク接続が必要だと ユーザーに知らせるといいでしょう モデルの暗号化を導入するのは こんなに簡単です 暗号化を使用する手順は 次のとおりです まず Xcodeで暗号化キーを作成します 次に 暗号化キーでモデルを暗号化します 最後に 暗号化されたモデルを デバイスにロードして使用します 作成し 暗号化し ロードする 簡単ですね
アプリケーションにバンドル化するか Model Deploymentで送るかにかかわらず モデルの暗号化はシームレスに動作します 皆さんが行う作業は キーの作成と モデルの暗号化と.loadの呼び出しだけです 残りは私たちが処理するので アプリケーションの作成に専念できます 最後に XcodeのCore MLの エキサイティングな最新情報をお伝えします デモの間 Xcodeが表示する情報量の多さに お気づきになったでしょうか モデルがサポートするOSバージョンや クラスラベル 内部ニューラルネットワークの詳細まで 一目で分かります 特に有用なもう1つの新機能が インタラクティブなモデルプレビューです
コードを書く前に Xcodeで直接 モデルを検討できるようになっています 広範囲にわたる 多数のモデルプレビューに対応しています 例えば 画像分割や姿勢検出 深度推定など Create MLでトレーニング可能な すべてのモデルが含まれます こちらがプレビュータイプの一覧です developer.apple.comで 入手可能なモデルを検討してみてください
また Core MLモデルはXcode Playgroundの 第一級メンバーになりました Core MLモデルをリソースフォルダに ドラッグ&ドロップすると Playgroundは自動生成された クラスインターフェイスを取得します これにより ライブのコーディングセッションで プログラム的にモデルを検討できます モデルのデモンストレーションを 友人や同僚と共有することもできます 今日の内容を振り返ってみましょう Core ML Model Deploymentを導入しました これによりアプリケーションとは独立して モデルを配信できます 迅速なモデルの配信や ターゲットの絞り込みが容易となります アプリケーションの開発プロセスや 機械学習の導入を大幅に加速させるでしょう
また 独自のホスティングや キー管理を設定することなく 送信中や停止中のモデルを保護する モデルの暗号化も導入しました 現在は アプリケーションと一緒の出荷でも Core MLモデルの暗号化が可能です 最後に より簡単にモデルを理解できるよう XcodeにCore MLの機能拡張を追加しました セッションをご視聴いただき ありがとうございました
-
-
4:34 - Flower Classifier using Core ML Model Deployment
private func classifyFlower(in image: CGImage) { // Check for a loaded model if let model = flowerClassifier { classify(image, using: model) return } MLModelCollection.beginAccessing(identifier: "FlowerModels") { [self] result in var modelURL: URL? switch result { case .success(let collection): modelURL = collection.entries["FlowerClassifier"]?.modelURL case .failure(let error): handleModelCollectionFailure(for: error) } let result = loadFlowerClassifier(from: modelURL) switch result { case .success(let model): classify(image, using: model) case .failure(let error): handleModelLoadFailure(for: error) } } } func loadFlowerClassifier(from modelURL: URL?) -> Result<FlowerClassifier, Error> { if let modelURL = modelURL { return Result { try FlowerClassifier(contentsOf: modelURL) } } else { return Result { try FlowerClassifier(configuration: .init()) } } }
-
20:03 - Compiler flag for encrypting a model
--encrypt "$SRCROOT/HelloFlowers/Models/FlowerStylizer.mlmodelkey" [Production note] or if we're tight for horizontal space we can use this: --encrypt "$SRCROOT/.../FlowerStylizer.mlmodelkey"
-
20:50 - Working with an encrypted model
func stylizeImage() { // If we already loaded the model, apply the effect if let model = flowerStylizer { applyStyledEffect(using: model) return } // Otherwise load and apply FlowerStylizer.load { [self] result in switch result { case .success(let model): flowerStylizer = model DispatchQueue.main.async { applyStyledEffect(using: model) } case .failure(let error): handleFailure(for: error) } } } func handleFailure(for error: Error) { switch error { case MLModelError.modelKeyFetch: handleNetworkFailure() default: handleModelLoadError(error) } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。