WWDC Quick Look 💓 By SwiftGGTeam
Use model deployment and security with Core ML

Use model deployment and security with Core ML

元の動画を見る

ハイライト

Core ML は 2020 年にモデル デプロイメント (モデル デプロイメント) メカニズムを導入し、開発者がモデルをアプリケーション バイナリにコンパイルすることなく、クラウドを通じてオンデマンドで ML モデルを配信できるようにしました。セッションでは、Apple が提供するモデルを使用してインフラストラクチャを展開する方法について詳しく説明します。MLModelクラウドでホストされ、アップデートはデバイスによって定期的に、またはシステムが選択した時間にバックグラウンドで取得され、次回アプリを起動したときに新しいモデルが利用可能になります。

主要内容

これまで Core ML を統合する最も直接的な方法は、.mlmodelそれを Xcode にドラッグし、Xcode でデバイス上で実行できる形式にコンパイルしてから、アプリと一緒に App Store に送信します。この方法は安定しており、ユーザーはインストール後すぐにモデルを利用できるようになります。この問題はモデルの反復速度が速くなった後に発生しました。チームは認識結果をより正確にするためにモデルを再トレーニングしましたが、それでも次のアプリの更新を待つ必要がありました。 (00:44)

Model Deployment が処理するのはこのリリース リンクです。開発者は、Apple クラウドによって管理されるモデル展開ダッシュボードにモデルを配置すると、デバイスは利用可能なアップデートを定期的に取得します。アプリ コードは、新しい Core ML API を介してモデル コレクションにアクセスするだけで済み、システムがバックグラウンドでのダウンロード、キャッシュ、およびその後の更新登録を処理します。 (01:29)

このデモでは、花認識アプリを使用してプロセスを説明します。アプリで利用可能FlowerClassifierそしてFlowerStylizer2つのモデル。デモンストレーションでは、ダリアとハイビスカスは正常に認識されましたが、バラは旧モデルの 3 つのトレーニング カテゴリに含まれていなかったため失敗しました。再トレーニングされた分類器がダッシュボードからリリースされました。次回のデバイス同期後、同じアプリはコード行を変更せずに Rose を認識できるようになります。 (04:00)

展開は前半だけでした。後半ではモデル自体の安全性について説明します。 Xcode 2020 で生成できるのは、.mlmodelkey、ビルド時にコンパイルされた Core ML モデルを暗号化するか、モデル アーカイブの作成時にアップロードされたコンテンツを暗号化するために使用します。通常のモデルは実行時に引き続き使用され、Core ML がキーの取得とメモリ内での復号化を担当します。ファイル システム内のコンパイルされたモデルは暗号化されたままになります。 (16:08)

最後に、Core ML モデルを表示および実験する Xcode の機能が強化されました。モデル パネルには、システム バージョン、クラス ラベル、およびいくつかのニューラル ネットワークの詳細が表示されます。インタラクティブなモデル プレビューでは、コードを記述する前にモデルを直接テストできます。 Playgrounds には、Core ML モデルの自動生成インターフェイスもあり、入力と出力の迅速な検証が容易になります。 (22:28)

詳細

MLModelCollection を使用してクラウド モデルにアクセスする

(04:34) モデルのデプロイメントにアクセスする最初のステップは、アプリを通過させることです。MLModelCollectionダッシュボードでデプロイされたモデル コレクションにアクセスします。デモでのコレクション名は次のとおりです。"FlowerModels"、コレクション内のモデル名を使用します"FlowerClassifier"ダウンロードしたコンパイル済みモデルの URL を見つけます。

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()) }
    }
}

キーポイント:

  • flowerClassifierこれはローカル キャッシュであり、モデルが分類されるたびに再ロードされるのを避けるために、モデルがロードされたときに直接再利用できます。 -MLModelCollection.beginAccessing(identifier:)コレクションへの最初のアクセス時にバックグラウンド ダウンロードがトリガーされ、その後のモデルの更新が登録されます。 -collection.entries["FlowerClassifier"]?.modelURLシステムが App コンテナーに配置するコンパイル済みモデルを指します。
  • 障害時の直接の割り込み機能はありませんが、割り込み機能が引き継がれます。loadFlowerClassifier(from:)バンドル内モデルを使用して確認してください。 -FlowerClassifier(contentsOf:)クラウド配信モデルをロードします。FlowerClassifier(configuration:)アプリにパッケージ化されたモデルをロードします。

ダッシュボードでモデルのコレクションとデプロイを作成する

(08:15) コードの準備ができたら、モデル自体を Xcode で作成する必要があります。モデルのアーカイブ。デモで生成された XcodeFlowerClassifier.mlarchiveをクリックし、ボタンからモデル展開ダッシュボードを開きます。

ダッシュボードの基本構造は 2 層です。最初のレベルは、次のようなモデル コレクションです。"FlowerModels"、それは置きますFlowerClassifierそしてFlowerStylizerこのような同じ機能に属するモデルをまとめます。 2 番目の層はデプロイメントです (デモにあるものなど)。"Global Deployment"これにより、モデル アーカイブのどのセットがどのデバイスに送信されるかが決まります。

(11:23) モデルを更新するとき、開発者は新しいデプロイメントを作成し、再トレーニングされた分類子とまだ使用されているスタイライザーをアップロードします。デバイスはすぐには同期しません。システムは適切なタイミングでバックグラウンドでそれらをダウンロードし、次回アプリを起動したときに新しいモデルを利用できるようにします。

キーポイント:

  • Xcode によって提供されるモデル アーカイブ.mlmodel準備を整えてお越しください。
  • モデル コレクションは、花の認識や様式化に必要なモデルなど、アプリの機能ごとにグループ化するのに適しています。
  • コレクション内のモデルはまとめてリリースされるため、一貫したバージョンを維持する必要があるモデルの組み合わせに適しています。
  • 最初のダウンロードでネットワークがないなどの障害が発生する可能性があるため、アプリはバンドル内モデルまたはエラー処理パスを保持する必要があります。

ターゲットを絞った展開を使用してデバイス数を制御する

(12:18) アプリが成長するにつれて、同じ機能でもデバイスの人口に応じて異なるモデルが必要になる場合があります。デモの例では、iPad で花を撮影する際のカメラアングルや照明環境が iPhone とは異なるため、チームは iPad 固有の分類器をトレーニングしました。

ダッシュボードは、展開時のターゲティング ルールの設定をサポートしています。デモの選択条件はデバイス クラスであり、iPad 固有のモデルが iPad に送信されます。デフォルトのモデルは他のデバイスで引き続き使用されます。アプリ側に追加の選択ロジックは必要ありません。デバイスはルールに従って対応するモデルをプルします。

キーポイント:

  • ターゲットを絞ったデプロイメントは、「すべてのモデルをアプリに配置し、実行時に自分で選択する」という非効率性を軽減するために使用されます。
  • デフォルトモデルはルールに一致しないすべてのデバイスを対象とし、専用モデルは条件に一致するデバイスにのみ発行されます。
  • この機能はコレクションと連携して、モデルのセットのアトミックな公開を維持します。

暗号化された導入モデルと組み込みモデル

(16:31) Core ML は、元のモデルではなくコンパイルされたモデルを暗号化します.mlmodel。 Xcode が生成する.mlmodelkey、このキーは開発チームのアカウントに関連付けられています。同じチームのメンバーは、モデルの構築またはアーカイブに同じキーを使用する必要があります。ダッシュボードを通じて公開されたモデルの場合、モデル アーカイブを作成するときに Xcode が選択する.mlmodelkey、暗号化されたアーカイブを生成してアップロードします。

(20:03) アプリ バンドルにパッケージ化されたモデルの場合、ビルド フェーズのソースのコンパイルでモデルに Core ML コンパイラ フラグを追加できます。

--encrypt "$SRCROOT/HelloFlowers/Models/FlowerStylizer.mlmodelkey"

キーポイント:

  • --encryptCore ML コンパイラーに、ビルド時にモデルを暗号化するように指示します。
  • パラメータ値は生成された Xcode を指します。.mlmodelkey書類。
  • 暗号化されたコンパイル済みモデルはアプリにパッケージ化され、送信中およびデバイス上の静的保存中に暗号化されたままになります。

非同期ロード方式を使用して暗号化モデルをロードします。

(20:50) 暗号化モデルは、システムが復号キーを安全に取得する必要があるため、初めてロードされるときにネットワークが必要です。したがって、Core ML では非同期が導入されますload方法;デモンストレーションFlowerStylizer.load戻るResult、成功したらメインスレッドに戻って様式化された効果を適用します。

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)
    }
}

キーポイント:

  • flowerStylizerすでに存在する場合は、繰り返しロードしたりキーを取得したりすることを避けるために、それを直接再利用します。 -FlowerStylizer.loadこれは非同期エントリであり、初めてロードするときにネットワーク依存関係を処理するのに適しています。
  • 成功したブランチはモデルをキャッシュし、メインスレッド上の UI 効果を更新します。 -MLModelError.modelKeyFetch特にキーの取得が失敗する状況をカバーするために、アプリはユーザーにインターネットに接続するか、後で再試行するように促す必要があります。
  • キーが取得されると、システムによって安全に保存されます。同じモデルを後からロードする場合、ネットワーク接続は必要ありません。

Xcode で Core ML モデルをプレビューして実験する

(22:34) このセッションの最後の更新セットはすべて Xcode で発生しました。モデル ファイル ビューには、サポートされている OS バージョン、クラス ラベル、および一部のネットワークの詳細が表示されます。インタラクティブなモデル プレビューは、画像セグメンテーション、姿勢検出、深度推定、および ML トレーニング可能なマルチクラス モデルの作成をサポートしています。プレイグラウンドでは、Core ML モデルをドラッグして、Xcode プロジェクトと同じ自動生成された Swift インターフェイスを取得することもできます。

キーポイント:

  • 導入前にモデルをローカルでテストすると、不正なモデルがユーザー デバイスに公開されるリスクが軽減されます。
  • プレビューは、統合コードを作成する前にモデルの入力と出力をすばやく確認するのに適しています。
  • プレイグラウンドは、モデルのデモを同僚と共有したり、小さなサンプルでの動作を検証したりするのに適しています。

重要ポイント

1. 認識アプリのモデルのホット アップデートを実行します。

作業内容: 花、製品、欠陥検出などの分類モデルを App Bundle から抽出してモデルのデプロイメントに追加します。

実行する価値がある理由: セッションのデモでのバラ認識の失敗は、分類器を再トレーニングして公開することで修正でき、App コードも App Store のバージョンも変更する必要はありません。

開始方法: アプリにパッケージ化された基本モデルを保持します。コード内で使用しますMLModelCollection.beginAccessing(identifier:)クラウド モデルを取得します。失敗した場合は、バンドル内のモデルにフォールバックします。

2. 同じ関数のグループ モデルを公開する

手順: 分類子、スタイライザー、後処理モデルなど、機能に必要な複数のモデルを同じモデル コレクションに入れます。

実行する価値がある理由: デモのコレクションは、FlowerClassifierそしてFlowerStylizer機能の依存関係によるモデルのバージョンの不一致を避けるために、それらをまとめて管理します。

開始方法: 機能に従ってコレクションに名前を付けます。ダッシュボード内の各モデル名に対応するアーカイブをアップロードします。アプリはコレクション エントリのモデル名を通じてそれを取得しますmodelURL

3. デバイスグループに応じた特別モデルを提供

何をすべきか: iPad、iPhone、またはその他の対象となるデバイスの母集団に対して専用のモデルをトレーニングし、一致するデバイスにのみ公開します。

実行する価値がある理由: iPad のカメラの角度とセッション中の光は異なります。同じモデルがすべてのデバイスをカバーする場合、専用の分類器により精度の問題を解決できます。

開始方法: 最初にデフォルト モデルをトレーニングし、次にターゲット デバイス モデルをトレーニングします。ダッシュボードの展開にターゲティング ルールを追加します。アプリが同じコレクションを通じてモデルにアクセスし続けるようにします。

4. 商業的に機密性の高いモデルを保護する

対処方法: プライベート データ トレーニング結果またはビジネス戦略を含む Core ML モデルの Xcode モデル暗号化を有効にします。

実行する価値がある理由: 暗号化されたコンパイル済みモデルは、転送中およびデバイス上での保存中も暗号化されたままとなり、実行時に Core ML によってメモリ内でのみ復号化されます。

開始方法: Xcode で作成する.mlmodelkey;モデルをデプロイするときに暗号化されたモデル アーカイブを生成します。組み込みモデルをコンパイルソースに追加します。--encryptコンパイラ フラグを設定して非同期に移行するload

関連セッション

コメント

GitHub Issues · utterances