WWDC Quick Look 💓 By SwiftGGTeam
Control training in Create ML with Swift

Control training in Create ML with Swift

元の動画を見る

ハイライト

Create ML では、macOS Big Sur に非同期トレーニング、チェックポイント、および Combine Publisher API が導入されており、開発者はトレーニング メトリクスを観察し、長期トレーニングを一時停止および再開し、Swift の中間チェックポイントからモデルをエクスポートできます。

主要内容

機械学習モデルのトレーニングは待機状態になることがよくあります。以前は、Create ML でモデル コンストラクターを呼び出すと、コードはトレーニングが完了するまで待機してからモデルを返していました。数時間かかる物体検出 (物体検出) トレーニングに遭遇した場合、最大反復 (反復回数) に達した後も損失 (損失値) が減少している場合、開発者はトレーニング時間をより大きな数値にリセットして最初から開始することしかできません。 (02:54)

macOS Big Sur の Create ML フレームワークは、トレーニング プロセスを監視可能、中断可能、および回復可能なコンポーネントに分割します。MLJob。開発者は新しいと呼びますtrain非同期トレーニングを開始してから渡すメソッドresultprogressそしてcheckpoints3 つの発行者が最終モデル、トレーニング メトリック、中間チェックポイントを処理します。cancel()トレーニングを中止しても同じですsessionDirectory進行状況は次のトレーニング セッション中に復元されます。 (04:46)

スタイル転送では、この API の値は非常に直感的です。スタイル転送の品質は主観的な判断に左右されるため、組み込みの評価指標がいつ停止するかを必ずしも決定するとは限りません。 Session は、チェックポイントから様式化された検証画像を取り出し、SwiftUI を使用してそれを Playground Live View に配置します。トレーニングは継続しており、開発者はすでに数エポックごとにモデルの実際の効果を確認できます。 (16:02)

詳細

sessionParameters を使用してトレーニング セッションを定義する

(04:58) 新しいトレーニングへの参加を受け取りましたMLTrainingSessionParameters。トレーニング セッションが保存される場所、進捗状況が報告される頻度、チェックポイントが保存される頻度、およびトレーニング ラウンドの最大数がすべて同じパラメーター オブジェクトに配置されます。

// Session parameters can be provided to `train` method.
let sessionParameters = MLTrainingSessionParameters(
    sessionDirectory: sessionDirectory,
    reportInterval: 10,
    checkpointInterval: 100,
    iterations: 1000
)

let job = try MLStyleTransfer.train(trainingData: dataSource,
                                    parameters: trainingParameters,
                                    sessionParameters: sessionParameters)

キーポイント:

  • sessionDirectoryトレーニング状態の配置位置です。ディレクトリが存在する場合、Create ML はそれを使用して既存のセッションを復元します。 -reportInterval進捗状況レポートの頻度を制御します。間隔が小さいほどフィードバックの密度が高くなり、追加のオーバーヘッドが発生する可能性があります。 -checkpointIntervalチェックポイントの保存頻度を制御します。これにより、トレーニング プロセスをどの程度細かくレビューできるかが決まります。 -iterationsは、このラウンドのトレーニングの目標反復回数です。後続の通話trainこの数値を増やすと、トレーニングを継続して進めることができます。 -train戻るMLJob、トレーニングは同期待機から非同期タスクに変わります。

結合を使用して結果と進行状況を取得する

06:21MLJobresultパブリッシャーはトレーニングの終了時にモデルを返し、失敗した場合にはエラーを返します。セッションは結合を使用しますsink完了ステータスとモデル値を受信します。

// Register a sink to receive the resulting model.
job.result.sink { result in
    // Handle errors
}
receiveValue: { model in
    // Use model
}
.store(in: &subscriptions)

キーポイント:

  • result完了クロージャは、成功または失敗のステータスを処理します。 -receiveValueクロージャは最終的にトレーニングされたモデルを取得します。 -.store(in: &subscriptions)サブスクリプションを維持しないと、非同期トレーニングが完了する前にサブスクリプションが解放される可能性があります。

(07:07) トレーニングprogressまだ財団からProgress。 ML オファーを作成するMLProgressヘルパー タイプ (補助タイプ)。損失や精度などのモデル関連の指標を読み取るために使用されます。

// Observing progress details
job.progress.publisher(for: \.fractionCompleted)
    .sink { [weak job] fractionCompleted in
        guard let job = job, let progress = MLProgress(progress: job.progress) else {
            return
        }
        print("Progress: \(fractionCompleted)")
        print("Iteration: \(progress.itemCount) of \(progress.totalItemCount ?? 0)")
        print("Accuracy: \(progress.metrics[.accuracy] ?? 0.0)")
    }
    .store(in: &subscriptions)

キーポイント:

  • publisher(for: \.fractionCompleted)リスニング財団Progress完成率。 -[weak job]トレーニング タスクを長期間保持するためにサブスクリプションを終了することは避けてください。 -MLProgress(progress:)新しいセッションが作成されたばかりのとき、またはフェーズが切り替わったとき、初期化が失敗する可能性があるため、コードは早めに戻ります。 -itemCountトレーニング フェーズでは、現在の反復を表し、特徴抽出フェーズでは、処理されたファイルまたはレコードを表します。 -progress.metrics[.accuracy]タスク関連の指標を読み取ります。さまざまなトレーニング タスクにより、精度、損失、または検証セットのメトリクスが提供される場合があります。

長時間のトレーニングを一時停止して再開する

(12:04) トレーニングを停止するには、電話してください。cancel()。トレーニングを再開する場合は、同じモデル タイプを再度呼び出しますtrain、同じものを渡しますsessionDirectory

job.cancel()

let resumedJob = try MLStyleTransfer.train(
    trainingData: dataSource,
    parameters: trainingParameters,
    sessionParameters: sessionParameters)

resumedJob.progress
    .publisher(for: \.fractionCompleted)
    .sink { completed in
        _ = completed

        guard let progress = MLProgress(progress: resumedJob.progress) else { return }
        if let styleLoss = progress.metrics[.styleLoss] { _ = styleLoss }
        if let contentLoss = progress.metrics[.contentLoss] { _ = contentLoss }
    }
    .store(in: &subscriptions)

resumedJob.result.sink { result in
    print(result)
}
receiveValue: { model in
    try? model.write(to: sessionDirectory)
}
.store(in: &subscriptions)

キーポイント:

  • cancel()開発者が一定の反復に達する前にトレーニングを積極的に停止できるようにします。 -sessionParameters内部のディレクトリによって回復場所が決まります。新しいトレーニングを開始するには、古いディレクトリを削除するか、パスを変更します。
  • 回復後resumedJob進捗状況と結果のパブリッシャーは引き続き提供されます。 -styleLossそしてcontentLossスタイル転送タスクからは、メトリクスがモデル タイプに応じて変化することがわかります。 -model.write(to:)完成したモデルをセッション ディレクトリに書き込み、その後の検査や展開を容易にします。

チェックポイントからモデルを観察してエクスポートする

(14:26) 非同期トレーニングではチェックポイントが自動的に生成されます。checkpointsパブリッシャーは開発者に新しいチェックポイントを処理するためのエントリ ポイントを提供します。独自のルールに従って、カスタム指標を記録したり、モデルを生成したり、トレーニングを停止したりできます。

// Register for receiving checkpoints.
job.checkpoints.sink { checkpoint in
    // Process checkpoint
}
.store(in: &subscriptions)

キーポイント:

  • チェックポイントはセッション フォルダーに保存されます。
  • 新しいチェックポイントが生成されると、パブリッシャーがトリガーされます。
  • 特徴抽出チェックポイントとトレーニング チェックポイントの両方が表示される場合があり、後続の処理ではフェーズを区別する必要があります。

(14:50) トレーニング チェックポイントのみがモデルを直接生成できます。セッションは最初にコード内のフェーズをチェックし、次にチェックポイントを次のように変換します。MLActivityClassifier

// Generate a model from a checkpoint
guard checkpoint.phase == .training else {
    // Not a training checkpoint, can't create model yet.
    return
}

let model = try MLActivityClassifier(checkpoint: checkpoint)
try model.write(to: url)

キーポイント:

  • checkpoint.phase == .trainingモデルをエクスポートする前に必要な確認です。 -MLActivityClassifier(checkpoint:)中間のトレーニング状態からモデルを作成します。 -model.write(to:)中間モデルは、比較または初期の試用のために保存できます。
  • トランスクリプトには、トレーニング チェックポイントがアクション分類、オブジェクト検出、スタイル転送、およびアクティビティ分類に使用できることが明確に記載されています。

履歴セッションとチェックポイント スペースを管理する

15:40MLTrainingSessionチェックポイントとメタデータのコレクションです。開発者はセッションを復元し、作成時間、現在のフェーズ、反復、および履歴メトリックを表示できます。

let session = MLObjectDetector.restoreTrainingSession(sessionParameters: sessionParameters)

let losses = session.checkpoints.compactMap { $0.metrics[.loss] as? Double }

キーポイント:

  • restoreTrainingSession同じグループを使用するsessionParametersトレーニング セッションを取得します。 -session.checkpointsトレーニング履歴全体をオフラインで分析できます。 -metrics[.loss]これを使用して損失曲線を描き、トレーニングを延長する必要があるかどうかを判断できます。

(15:48) チェックポイントがディスクを占有します。 Create ML では、不要になったチェックポイントを条件付きで削除できます。

let session = MLObjectDetector.restoreTrainingSession(sessionParameters: sessionParameters)

// Save space by removing some checkpoints
session.removeCheckpoints { $0.iteration < 500 }

キーポイント:

  • removeCheckpointsジャッジメントクローズを受ける。 -$0.iteration < 500古いチェックポイントは削除されます。
  • 主要なノードを保持し、初期のノードを削除して、トレーサビリティとディスク使用量の間でトレードオフを行います。

トレーニング結果をプレイグラウンドで視覚化

(16:24) スタイル転送チェックポイントは、stylizedImageURL。セッションで変換するNSImageを選択し、SwiftUI を使用して Playground Live View を作成します。

job.checkpoints
    .compactMap { $0.metrics[.stylizedImageURL] as? URL }
    .receive(on: DispatchQueue.main)
    .map { NSImage(byReferencing: $0) }
    .sink { image in
        let _ = image

        let view = VStack {
            Image(nsImage: image)
                .resizable()
                .aspectRatio(contentMode: .fit)
            Image(nsImage: style)
                .resizable()
                .aspectRatio(contentMode: .fit)
            Image(nsImage: validation)
                .resizable()
                .aspectRatio(contentMode: .fit)
        }.frame(maxHeight: 1400)

        PlaygroundSupport.PlaygroundPage.current.setLiveView(view)
    }
    .store(in: &subscriptions)

キーポイント:

  • .compactMap保管するだけstylizedImageURLチェックポイント。 -.receive(on: DispatchQueue.main)UI の更新をメインスレッドに戻します。 -VStack同時に、現在のスタイル化結果、スタイル画像 (スタイル画像) と検証画像 (検証画像) が表示されます。 -setLiveViewトレーニング プロセスを Xcode Playground で直接実行します。

重要ポイント

トレーニング進捗パネル

対処方法: 完了部分、反復、損失、精度、検証セットのメトリクスを表示するリアルタイム進行状況パネルを内部モデル トレーニング ツールに追加します。

やる価値がある理由: セッションショーMLJob.progressそしてMLProgress、トレーニング インジケーターはトレーニング中に読み取ることができ、品質を判断する前に最終モデルが生成されるのを待つ必要はありません。

開始方法: 電話をかけるときtrain後で購読するjob.progress.publisher(for: \.fractionCompleted)、使用MLProgress(progress:)読むmetrics、データをログ、チャート、または SwiftUI インターフェイスに書き込みます。

再開可能な長期訓練ミッション

機能: トレーニングを一時停止、再開、延長する機能を、オブジェクト検出、スタイル転送、またはアクティビティ分類トレーニングに追加します。

実行する価値がある理由: トランスクリプトには、物体検出のトレーニングには最大 5 時間かかる場合があると記載されています。それでも損失が減少している場合は再利用するsessionDirectory既存のトレーニングの進行状況を継続できます。

開始方法: 置くsessionDirectory実験用ディレクトリに固定して作成します。MLTrainingSessionParameters、停止時に呼び出されますjob.cancel()、復元時に同じディレクトリを使用して再度呼び出します。train

チェックポイント モデル比較ライブラリ

何をすべきか: トレーニング プロセス中の主要なチェックポイントを複数の候補モデルにエクスポートし、チームに中間バージョンの実際の効果を比較させます。

実行する価値がある理由: Create ML はトレーニング チェックポイントを自動的に保存し、パスを通過できるようにしますMLActivityClassifier(checkpoint:)このタイプのイニシャライザはモデルを生成します。

開始方法: 購読するjob.checkpoints、まず確認してくださいcheckpoint.phase == .training、チェックポイントからモデルを作成し、反復番号を使用してディレクトリにそれを書き込みます。

トレーニング履歴クリーニングツール

対処方法: セッション ディレクトリをスキャンし、キーの反復を保持し、初期のチェックポイントまたは価値のないチェックポイントを削除するスクリプトを作成します。

実行する価値がある理由: トレーニング チェックポイントは継続的に保存され、長期的な実験はディスクを消費します。MLTrainingSessionセッションを復元し、チェックポイントを削除するための API を提供します。

開始方法: 電話するrestoreTrainingSession(sessionParameters:)、 読むsession.checkpointsでの損失または反復の場合は、使用しますremoveCheckpoints古いチェックポイントをクリーンアップします。

遊び場の視覚実験ベンチ

対処方法: スタイル転送のチェックポイント画像をリアルタイムで Playground Live View に配置し、スタイル画像、元の検証画像、および現在の出力を比較します。

実行する価値がある理由: スタイル転送の品質は主観的な判断に左右されるため、セッションのデモンストレーションは合格します。stylizedImageURL中間効果を直接観察します。

開始方法: チェックポイント メトリックから取得する.stylizedImageURL、に変換NSImage、メインスレッドで SwiftUI を使用するVStack3枚の写真を見せます。

関連セッション

コメント

GitHub Issues · utterances