ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Swiftを使用したCreate MLでのトレーニング管理
Create MLフレームワークを使用することで、これまで以上にモデルを簡単に開発し、ワークフローを自動化できます。ここでは、より良いモデルを素早く得るために、機械学習モデルをトレーニングしながら、機械学習モデルを管理する方法について説明します。Create MLにおけるトレーニング管理によって、チェックポイントAPIを使用してトレーニングワークフローをカスタマイズして、トレーニングプロセスを一時停止、保存、再開、および拡張する方法を紹介します。また、Combine APIを使用して、プログラムで進捗をモニターする方法についても学びます。 まだCreate MLに精通しておらず、トレーニング機械学習モデルに興味がある場合は、必ず “Introducing the Create ML App”をご視聴ください。
リソース
関連ビデオ
WWDC21
WWDC20
WWDC19
-
ダウンロード
こんにちは WWDCへようこそ “Swiftを使用したCreate MLでの トレーニング管理” 私の名前はリジー Create MLのMachine Learingマネージャーです Create MLでのチェックポイントや 非同期トレーニングの新しいAPIを紹介します Create MLアプリケーションと そのフレームワークについて説明します Create MLアプリケーションでコードを書かずに モデルを作成できます
使いやすいAPI Create MLで アプリケーションがパワーアップします macOS Big Surには ワークフロー管理のための パワフルで柔軟なAPIがあり 機械学習モデル作成のカスタマイズをし アプリケーション作動と同じ技術で利用可能です トレーニングプロセスのおさらいです
モデルをトレーニングするなら まず データ収集です
トレーニングオプションを 閲覧して下さい もちろん デフォルトの設定は可能ですが オプションの知識も無駄にはなりません
前処理で 特徴抽出や適切な構造への データ変換が必要な場合があります 音声をスペクトログラムで変換したり ビデオはフレームごとに 抽出したキーポイントでしょう
そして トレーニングですが 後ほど 詳しく説明したいので 一旦 次に進みます
新しいデータを提示し モデルを評価します モデルがトレーニング中に表示しない データセットを使用すれば トレーニング例の記憶ではなく モデルの一般化を決定できます この時点で データが少ないので 期待はずれに感じる方々は 別のパラメータや トレーニング時間が必要なのかも モデル開発は反復的なプロセスで 要求を満たすまで設定やトレーニングをします
トレーニング済みのモデルで 予測を実行し デプロイの準備は完了
では 管理について説明します トレーニング管理には 一時停止や再開の機能があり
プロセスの監視や変更の機能もあります
いつでもトレーニングの中止が可能です
機械学習モデルのトレーニングは 時間がかかります オブジェクト検出モデルには 5時間かかる場合もあります 例えば トレーニング開始後 最大イテレーション値に到達します
損失減少していて モデルの収束値に まだ余裕がある場合 ゼロから始めて 最大値を選択する必要がありましたが これからは 中止した地点から再開できます
目的に対して結果が 限定されていることが重要で 埋め込み式で数値を決める場合 最善の結果は必要はありません 例えば 性質が独特なStyle Transferで 魚のモザイクをダンサーの写真に 適用しようとしています ユーザーの判断で 中止を決めることができ その選択は必要に応じて特定できます プロトタイプが必要で 時間をかけたくない人や 最高の結果を求め トレーニングする人もいるでしょう トレーニング管理により 停止条件を定義でき イテレーション回数を制限する必要はありません 画像分類でターゲットの精度が必要な人や 時間に余裕のない人もいるでしょう
トレーニング管理はCreate MLアプリケーションか カスタマイズもできるAPIで利用可能です ご説明します
以前は モデルコンストラクタを呼び出し トレーニング後 返却しました
新しい非同期APIでは ジョブ返却の メソッドの呼び出しが可能です
通常のパラメータと セッションパラメータを受け取り 報告の流れと イテレーションの合計値を指定します 変数を省略し デフォルト使用も可能です
sessionParametersの最初の変数は sessionDirectoryです 既存のものがなければ ディレクトリが作成され セッション再開のために そのコンテンツが使用されます 新しいセッションを希望する場合は 削除するか 新しい場所を選択します
進行報告とチェックポイントの頻度を 制御する変数が 小さければ 更新は頻繁ですが コストパフォーマンスは良くないでしょう
最後の変数はイテレーションの合計値で この値で停止します この値は 呼び出しの際に増やしたり 到達する前に停止したりできます
返却されるジョブは 有効なジョブを示す MLJobのインスタンスで 進行状況やチェックポイントや 結果のパブリッシャーなどが含まれます
WWDC19の“Introducing Combine”と “Combine in Practice”で参照できる― Combineフレームワークの 知識を深めます
キャンセルメソッドで 簡単にトレーニングを中止できます トレーニング済みのモデルの取得に 結果パブリッシャーを使用します まず sinkを記録すると 完了時に 最初のクロージャが呼び出され 結果が分かります エラーとなった場合は ここで解決する必要があります
完了したら 次のクロージャで 最終モデルを受け取り
サブスクリプションを保存します
完成したフラクションや 進行中のイテレーションやその合計値― それに カスタム指標などの 進行状況を監視できます
MLJobの進行状況パブリッシャーで 確認や印刷が可能です これがファンデーションからの 進行状況の標準インスタンスです カスタム指標にアクセスするため sinkクロージャを記録します 予防措置として ジョブをわずかにキャプチャし 保存サイクルを回避します
ジョブを確認しMLProgressの インスタンスを作成します ヘルパータイプがインスタンスから カスタム指標へのアクセスを可能にします 新しいセッションが作成されたり 新しいフェーズが始まる時は 初期化できない可能性もあります しかし すぐに返却し解決します
そして 最新のアイテムや合計数などの 進行情報にアクセスできます 特徴抽出において アイテムとは 現在処理中のファイルやレコードのことで トレーニングでは 現在のイテレーション値を指します 最後に受け取る トレーニング指標は トレーニングフェーズでのみ利用可能で 各タスクに特有のものです タスクは精度が高いものや 減損や他の指標を持つものもあります 検証データを提供すれば 検証指標にアクセスできるでしょう さあ 新しいAPIを使用した モデルのトレーニング法を紹介します
Create MLでの スタイル転送モデルについての動画を見て モデル作成ワークフローの設定を Playgroundsで始めました リソースバンドルで使用できる スタイルの画像と 様式化したいアーティストの 認識画像もあります
まず 希望するスタイルや認識画像に URLを指定します
Playgroundsでは データインラインを可視化できます 指定したスタイルや 使用する認識画像を確認できます
次に トレーニングデータの定義のため dataSourceを指定し styleImageURLと contentDirectoryを渡します
そして セッションを設定する パラメータを初期化します
sessionDirectoryの取得に MLTrainingSessionParametersとします reportIntervalで進行報告の回数と checkpointIntervalで回数を指定し iterationsでトレーニングの延長をします
次に モデルパラメータを設定します
トレーニングの準備ができました
まず 作りたいモデルタイプに trainメソッドを呼び出します
データソースを指定します
trainingParametersと
sessionParametersを設定します
これをMLJobインスタンスに戻します MLJobには結果パブリッシャーがあり トレーンング中のエラー受信や 実行したモデルへのアクセスが可能です
実行中の制御や監視に ジョブを使うことも可能です 進行状況のパブリッシャーで 計画的に確認することもできます Foundation Progressのインスタンスなので キーパスにプロパティを提供することで fractionCompletedを定義します
次にsinkを呼び出し subscription終了のため cancellableを戻します fractionCompleted以外にも MLモデル特有の メトリクスにアクセス可能で Foundation Progressから MLProgressのインスタンスを初期化します イテレーションによる スタイルやコンテンツの 損失など 特定のメトリクスにアクセスできます
XcodeのPlaygroundを利用し trainで 実行中の進行状態を視覚化できます
トレーニング進行状況の最新値やグラフを 確認できるのは大変便利です
一時停止や再開や延長により トレーニング進行の制御可能で 停止には ジョブのcanceを呼び出すだけです
再開には 同じセッションのディレクトリで trainを呼び出すくらい簡単で
ほとんど自動です 新しい非同期APIを使った モデルトレーニング方法の説明には チェックポイントについてもあります チェックポイントで 時間をかけて モデルの状態をキャプチャでき トレーニングの進行状況や 過去の結果との比較を確認できます まだトレーニングが必要なら 停止した時点から再開できます
MLCheckpointは トレーニングか特徴抽出を表す構造で
他のフレームワークと違い 新しい非同期APIを使うと自動的に構築されます
再開が簡単です 新しいセッションか既存のセッションに sessionDirectoryを設定します Playgroundsのような環境で 進行を失わずに反復できるのは優秀です
トレーニングプロセスに戻りましょう 前処理とトレーニングに注目します チェックポイントが生成した場所に 2つのフェーズがあります
まず 前処理です
個別ファイルや何行ものデータ要素を取得し それぞれに処理します 進行状況は要素の処理数で計測されます
数個の要素ごとに チェックポイントとして進行状況を蓄積し 厳密に付加され 最後の前処理の チェックポイントだけを保持します
トレーニングフェーズは 反復プロセスでもあります イテレーションという個別の段階で モデルは改良され ネットワークのデータ使用量や損失計算や 重量を更新して構成されます トレーニングのチェックポイントは 特定のイテレーションでのモデルの状態で 前処理と違い 作成するすべての チェックポイントを保存します 進行すると 損失や精度などの メトリクスも取得でき 特定できるように チェックポイントと一緒に保存されます
コードを見ましょう チェックポイントの パブリッシャーの使用例です チェックポイントは自動的に セッションフォルダに保存されますが カスタム指標やモデルの生成 またはトレーニングの完全停止を可能にします 新しいチェックポイントで 実行する機会となります
これはチェックポイントから モデルを生成する方法で ディスクへの保存や予測も可能です
モデル作成可能なのは 特徴抽出ではなく トレーニングのチェックポイントからなので 確認するのはトレーニングフェーズです
画像や音声や動作の分類用の特徴抽出 フェーズ中にチェックポイント作成が可能で 動作分類や物体検知や画風変換 そして活動分類で利用できます そして セッションはチェックポイントと メタデータの集計と考えましょう MKTrainingSessionタイプにより 表示されます セッション作成日やトレーニングフェーズや イテレーション数などの照会が可能です
直接のアクセス希望なら モデルタイプに restoreTrainingSessionメソッドが使え
損失値へのアクセスなども可能です 不必要なチェックポイントの 削除もできます では 動作中の チェックポイントを見ましょう
PlaygroundsでMLJobのインスタンスから 進行や結果の監視方法を確認しました MLJobにチェックポイント監視用の パブリッシャーがあるか確認できます StyleTransfer用に 進行状況を視覚化するため 各チェックポイントで 定型化した認証画像にアクセスします
compactMapを使い チェックポイントを必要な形式に変換し imageURLをNSImageにマップします sinkを呼び出し パブリッシャーに subscriberを貼り付けたり subscriptionリストに AnyCancellableタイプを保存します
トレーニング中に 定型化した認証画像を 埋め込み型で見ることができます
できることは まだあります SwiftUIを使いPlayground Live Viewで 簡単にレンダリングできます まず 新しいビューオブジェクトを見つけ スタイルの画像や定型化した認証画像や オリジナル認証に渡します モデルの機能性を 時間をかけて比較できます UIの使用により メインキューからの 受け取りが可能です Playground Live Viewを設定すれば 結果を蓄積することができます
モデルを視覚化できるのは 参照スタイルや 認証画像に加えてトレーニングしたからで 新しいチェックポイントや APIのおかげです
では 確認しましょう CreateMLの新しい非同期APIで モデルのトレーニング方法を学びました チェックポイントやモデルの生成 トレーニングの再開 それから― 進行レポートや結果処理のための Combineパブリッシャーの使用法です トレーニングワークフローのカスタマイズが 必要なら この新しいツールを利用して下さい トレーニング管理はモデルの性能も 進行状態も制御でき モデルの開発やワークフローの自動化や macOSアプリケーションに応じた モデルを作成できます ご視聴ありがとうございました
-
-
4:39 - Synchronous training
let model = try MLActivityClassifier(...)
-
4:47 - Asynchronous Training
let job = try MLActivityClassifier.train(..., sessionParameters: sessionParameters)
-
4:58 - Setting up training parameters
// Session parameters can be provided to `train` method. let sessionParameters = MLTrainingSessionParameters( sessionDirectory: sessionDirectory, reportInterval: 10, checkpointInterval: 100, iterations: 1000 ) let job = try MLActivityClassifier.train(..., sessionParameters: sessionParameters)
-
6:21 - Register a sink to receive model
// Register a sink to receive the resulting model. job.result.sink { result in // Handle errors } receiveValue: { model in // Use model } .store(in: &subscriptions)
-
7:07 - Getting training progress
// 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)
-
8:55 - Demo 1: Setup
let style = NSImage(byReferencing: styleImageURL) let validation = NSImage(byReferencing: validationImageURL) var iterations = 500 var progressInterval = 5 var checkpointInterval = 5 let sessionDirectory = URL(fileURLWithPath: "\(NSHomeDirectory())/\(experimentID)") let sessionParameters = MLTrainingSessionParameters(sessionDirectory: sessionDirectory, reportInterval: progressInterval, checkpointInterval: checkpointInterval, iterations: iterations) let trainingParameters = MLStyleTransfer.ModelParameters( algorithm: .cnn, validation: .content(validationImageURL), maxIterations: iterations, textelDensity: 416, styleStrength: 5)
-
10:03 - Demo 1: Training
var subscriptions = [AnyCancellable]() let job = try MLStyleTransfer.train(trainingData: dataSource, parameters: trainingParameters, sessionParameters: sessionParameters) job.result.sink { result in print(result) } receiveValue: { model in try? model.write(to: sessionDirectory) } .store(in: &subscriptions)
-
10:51 - Demo 1: Progress
job.progress .publisher(for: \.fractionCompleted) .sink { completed in _ = completed guard let progress = MLProgress(progress: job.progress) else { return } if let styleLoss = progress.metrics[.styleLoss] { _ = styleLoss } if let contentLoss = progress.metrics[.contentLoss] { _ = contentLoss } } .store(in: &subscriptions)
-
12:04 - Demo 1: Cancel & Resume
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)
-
14:26 - Observing checkpoints
let job = try MLActivityClassifier.train(..., sessionParameters: sessionParameters) // Register for receiving checkpoints. job.checkpoints.sink { checkpoint in // Process checkpoint } .store(in: &subscriptions)
-
14:50 - Generating a model from a checkpoint
// 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)
-
15:40 - Working with a session
let session = MLObjectDetector.restoreTrainingSession(sessionParameters: sessionParameters) let losses = session.checkpoints.compactMap { $0.metrics[.loss] as? Double }
-
15:48 - Removing checkpoints from a session
let session = MLObjectDetector.restoreTrainingSession(sessionParameters: sessionParameters) // Save space by removing some checkpoints session.removeCheckpoints { $0.iteration < 500 }
-
16:13 - Demo 2: Visualizing Style Transfer Checkpoints
job.checkpoints .compactMap { $0.metrics[.stylizedImageURL] as? URL } .map { NSImage(byReferencing: $0) } .sink { image in let _ = image } .store(in: &subscriptions)
-
16:24 - Demo 2: Visualizing Checkpoints with SwiftUI + 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)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。