10.3K Views
September 10, 22
スライド概要
iOSDC 2022での発表です。
---
■ CfP
MLOpsはML Operationsの略で、データ収集・前処理・学習・デプロイ・監視といった機械学習のライフサイクルの継続的な運用を効率化するための考え方や手法を総称してこう呼ばれています。たとえば、蓄積したデータを用いたモデルの再学習を定期的に自動実行し最新データに合うようモデルを改善し続ける仕組み、モデルを本番システムに自動デプロイする仕組み等が含まれます。機械学習をビジネスで本番運用するために不可欠な考え方として昨今ホットなトピックとなっています。
一方で、Core MLモデルの世界ではMLOpsという考え方はまだそれほど広がっていないように思います。多くの場合は一度学習したモデルを利用し続けるか、手運用で再学習等を行っているのではないでしょうか。Core MLにMLOpsの考え方を導入しするとどのように継続的な運用を効率化できるのか、そのパターンを解説します。
------------------------------------------------------------
■ 関連書籍
・「Core ML Tools実践入門 - iOS × DEEP LEARNING」
https://booth.pm/ja/items/1723495
・「Metal入門」
https://booth.pm/ja/items/826318
------------------------------------------------------------
■ その他関連リンク
・本トークの動画
https://youtu.be/hxSzBXtNmWc
・堤のTwitter
https://twitter.com/shu223
フリーランスiOSエンジニア 「エンジニアと人生」コミュニティ主宰
MLOps for Core ML
自己紹介 • 堤修一 • shu223 (GitHub / Twitter / note) • エンジニアと人生(YouTube / Podcast / コミュニティ)
iOSエンジニア@フリーランス → R&Dマネージャー@Sansan 記事: 12年間iOSだけやってきたエンジ ニアのキャリアチェンジ
著書 • 商業出版 4冊:「iOS×BLE Core Bluetoothプログラミング」 他 • 個人出版 多数 @BOOTH • Metal, ARKit, デプス, coremltools, etc...
iOSDCの過去の登壇 • 2016: 海外カンファレンスに登壇する • 2017: 飛び道具ではないMetal • 2018: Depth in Depth • 2019: 今こそwatchOS • 2020: 機械学習のブルーオーシャン Core ML
MLOpsとは • Machine Learning Operationsの略 • DevOpsのML版
MLOpsの定義 ウィキペディアのMLOpsの項:
• 定義は各社様々 • 手法、方法論、システム、基盤、体制、姿勢、考え方、文 化、概念、etc...
機械学習を実戦投入する際に いい感じに運用 していくための諸々
MLOpsの例: モデルの継続的トレーニング
学習パイプライン • 各ステップの実行も、ステップ間の移行も自動化 • → 実験を迅速に繰り返すことが可能に
パイプライン実行を自動化 課題: 時間とともにモデルの推論精度が劣化 • → パイプライン実行を自動化 • 精度を監視してトリガー実行 • バッチによる定期実行 • モデルの継続的トレーニング / Continuous Training(CT)
その他のMLOpsの例 • DVC (Data Version Control) • Feature Store • Model Registry • 実験管理 • CI/CD • etc...
MLOps "for Core ML"
そもそもCore MLとは? オンデバイスで推論・学習を行う機械学習フレームワーク
Appleデバイスの性能を最も 活かせるのはCore ML • PyTorch Mobile(LibTorch) -> CPU • Tensor Flow Lite -> CPU, GPU • Core ML -> CPU, GPU, Neural Engine
Core MLの学習リソース 「 機械学習のブルーオーシャン Core ML 」 • iOSDC 2020での発表 • CoreML.frameworkだけではなく、 Core MLを実務で扱うために必要な 技術領域全体について解説
実プロダクトにおけるCore ML
TensorFlowモデルから Core MLモデルに変換 • → 約300%の高速化 (18fps -> 55fps) !
Core MLの世界ではMLOpsの考え方はまだ広 がっていない • 一度学習したモデルを利用し続ける • モデルの学習・変換は手運用
Core MLモデル運用にMLOps的考え方を導入 できないか? Core MLのさまざまな機能や、MLOpsツールを利用して、 "MLOps for Core ML"のパターンを検討してみます。 1 1 ここからは私個人の検討です。所属する企業での取り組みではありません。
パターン1: 学習パイプライン
学習パイプライン + Core MLモデルの変換 データの取得〜モデルの学習〜評価〜Core MLモデルへの変換 のフローをパイプライン化
パイプライン化のメリット • 各ステップの処理もステップ間の移行も自動実行 • イテレーションが迅速になる • モデルの継続的な更新(CT) • 各ステップを個別のリソース(サーバ、コンテナ、ワーカー 等)に分割できる • ステップ間の依存をファイル入出力に制限することで、ス テップ単位で開発・テストできる
Core MLモデルの作成フロー このフローをパイプライン化します。
MLflow An open source platform for the machine learning lifecycle • 12.5k Stars • ローカル環境で軽量に利用できる
MLflowを用いた学習 パイプライン プロジェクトのファイル構成 Project ├─ MLproject ├─ conda.yaml ├─ main.py │ ├─ preprocess │ ├─ MLproject │ └─ src │ ├─ preprocess.py │ └─ ... ├─ train │ ├─ MLproject │ └─ src │ ├─ train.py │ └─ ... └─ evaluate ├─ MLproject └─ src ├─ evaluate.py └─ ...
MLproject ファイル(トップフォルダ / main モジュール実 行) name: my_project conda_env: conda.yaml entry_points: main: parameters: epochs: {type: int, default: 1} batch_size: {type: int, default: 32} learning_rate: {type: float, default: 0.001} command: | python -m main \ --epochs {epochs} \ --batch_size {batch_size} \ --learning_rate {learning_rate}
MLproject ファイル(train ステップ / train モジュール実 行) name: my_project conda_env: ../conda.yaml entry_points: train: parameters: epochs: {type: int, default: 1} batch_size: {type: int, default: 32} learning_rate: {type: float, default: 0.001} command: | python -m src.train \ --epochs {epochs} \ --batch_size {batch_size} \ --learning_rate {learning_rate}
conda.yaml name: my_project channels: - defaults dependencies: - python=3.8 - ... - torchvision>=0.8.1 - pip - pip: - torch==1.10.2 - mlflow - ...
Pythonコード トップフォルダ/main.py def main(): ... with mlflow.start_run() as r: preprocess_run = mlflow.run( uri="./preprocess", entry_point="preprocess", backend="local", ) ... train_run = mlflow.run( uri="./train", entry_point="train", backend="local", parameters={ "epochs": args.epochs, "batch_size": ..., "learning_rate": ..., }, ) ...
「Core MLモデルへの変換」 ステップを追加する • convertフォルダを追加 • MLproject • convert.py • ... Project ├─ MLproject ├─ conda.yaml ├─ main.py │ ├─ preprocess │ ├─ MLproject │ └─ ... ├─ train │ ├─ MLproject │ └─ ... ... │ └─ convert ├─ MLproject └─ src ├─ convert.py └─ ...
convert/MLproject
name: my_project
conda_env: ../conda.yaml
entry_points:
convert:
parameters:
upstream: {type: string, default: ""}
downstream: {type: string, default: ""}
command: |
python -m src.convert \
--upstream {upstream} \
--downstream {downstream}
convert.py ... import mlflow import torch import coremltools as ct def main( upstream_directory: str, downstream_directory: str ): ... # PyTorchモデル(.pth)をロード model.load_state_dict(torch.load(model_path)) ... # Core MLモデルに変換 mlmodel = ct.convert(traced_model, ...) # 保存 mlmodel.save(mlmodel_file_path) ...
conda.yaml に coremltools を追加 name: my_project channels: - defaults dependencies: - python=3.8 - ... - torchvision>=0.8.1 - pip - pip: - torch==1.10.2 - coremltools==5.2.0 - mlflow - ...
パイプライン実行 $ mlflow run .
デモ
パターン2: 実験管理
モデル作成時のペイン • どんなパラメータで実行したか? • どのデータを使用したか? • どんな結果だったか? • それらの条件で作成したモデルはどれ? → 実験管理
MLflowで実験管理 • log_param(s) ・・・パラメータを記録 • log_metric(s) ・・・メトリクスを記録 • log_artifact(s) ・・・アーティファクト(生成物)を記録 • log_model ・・・モデルを記録
MLflow UI 1/3
MLflow UI 2/3 • 各実験のパラメータ、メトリクス、モデルをUIで確認できる • メトリクスの変化をグラフ表示
MLflow UI 3/3 • アーティファクト(生成物)へのアクセスも提供
パターン3: 実機での新モデルの検証
テスターにだけ新モデルを配布する ケース: 新モデルの検証として、ステージング版アプリを持っているテ スターに新モデルを配布したい。 (リリース版ユーザーにはまだ配布しない。)
クラウド経由でモデルを更新 Core ML Model Deployment • アプリ側の更新不要で モデルを更新できる
事前準備 • [iCloud] ステージング用とリリース用で別々のModel Collectionを用意しておく • [App] ステージング/リリースビルドで利用するModel Collectionを分けるよう実装 • 更新されたら通知が届くようにしておく • [App] テスターにステージング版をTestFlightで配布
新モデル検証時 • [iCloud] ステージング用のModel Collectionに新モデルを登 録 ↓ • ステージング版アプリに通知が届く • アプリを起動するとモデルが更新される
その他、実現できそうな「MLOps for Core ML」のアイデア • Create MLによるモデル作成フローの自動化/実験管理 • 学習〜変換〜デプロイ(新Core MLモデルを組み込んだアプ リの配布)のフローを自動化 • Xcode 14のパフォーマンスレポートやInstrumentsで得られ たメトリクスの管理 • オンデバイスで学習した personalized モデルと特徴量の管理 • etc...
まとめ Core MLモデル運用にMLOps的考え方を導入できないか検討し てみました。 - パイプライン化 - 実験管理 - 実機での新モデル検証
coremltoolsについて もっと学ぶ • 公式リポジトリのサンプル • 公式ドキュメント iOS × Deep Learning Core ML Tools 実践入門 • 書籍「Core ML Tools実践 入門」 • 逆引きレシピつき TensorFlow, Kerasと coremltools によるカスタムモデル構築
iOSのGPU/Metalに ついて学ぶ • スライド「飛び道具ではな いMetal」 (iOSDC 2017) • 書籍「Metal入門」
ご清聴ありがとうございました!
補足
MLproject ファイル(docker_envを指定) name: my_project docker_env: image: xxxx:xxxx volumes: ["...", "..."] entry_points: preprocess: parameters: ... command: | python -m src.preprocess \ ...
MLproject ファイル(Docker イメージのビルドを行う場合)
name: my_project
conda_env: conda.yaml
entry_points:
build:
parameters:
model_filename: {type: string, default: xxxx.onnx}
model_directory: {type: string, default: ./mlruns/0/xxxx}
command: |
cp ../{model_directory}/{model_filename} ./ && \
docker build \
-t "xxxx:xxxx" \
-f ./Dockerfile \
--build-arg model_filename={model_filename} \
--build-arg model_directory={model_directory} \
.
MLproject ファイル(ビルドしたDocker イメージを利用)
name: my_project
conda_env: conda.yaml
entry_points:
evaluate:
parameters:
...
dockerimage: {type: string, default: "xxxx:xxxx"}
container_name: {type: string, default: test}
command: |
docker run \
-it -d \
--name {container_name} \
-p xxxx:xx {dockerimage} && \
python -m src.evaluate \
...