---
title: MLOps for Core ML #iOSDC 2022
tags:  #ios #coreml #iosdc #mlops #mlflow #ml  
author: [Shuichi Tsutsumi](https://www.docswell.com/user/shu223)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/8EDW389N7G.jpg?width=480
description: 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
published: September 10, 22
canonical: https://www.docswell.com/s/shu223/KEDPQZ-mlops-for-coreml
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/8EDW389N7G.jpg)

MLOps for Core ML


# Page. 2

![Page Image](https://bcdn.docswell.com/page/V7P948ZNJ8.jpg)

自己紹介
• 堤修一
• shu223 （GitHub / Twitter / note）
• エンジニアと人生（YouTube / Podcast / コミュニティ）


# Page. 3

![Page Image](https://bcdn.docswell.com/page/2JVMXNWYJQ.jpg)

iOSエンジニア@フリーランス
→ R&amp;Dマネージャー@Sansan
記事： 12年間iOSだけやってきたエンジ
ニアのキャリアチェンジ


# Page. 4

![Page Image](https://bcdn.docswell.com/page/5EGGVKDWEL.jpg)

著書
• 商業出版 4冊：「iOS×BLE Core Bluetoothプログラミング」
他
• 個人出版 多数 @BOOTH
• Metal, ARKit, デプス, coremltools, etc...


# Page. 5

![Page Image](https://bcdn.docswell.com/page/4JQX6N1QEP.jpg)

iOSDCの過去の登壇
• 2016: 海外カンファレンスに登壇する
• 2017: 飛び道具ではないMetal
• 2018: Depth in Depth
• 2019: 今こそwatchOS
• 2020: 機械学習のブルーオーシャン Core ML


# Page. 6

![Page Image](https://bcdn.docswell.com/page/K7464GRYE1.jpg)

MLOpsとは
• Machine Learning Operationsの略
• DevOpsのML版


# Page. 7

![Page Image](https://bcdn.docswell.com/page/LJ1V4DQNEG.jpg)

MLOpsの定義
ウィキペディアのMLOpsの項：


# Page. 8

![Page Image](https://bcdn.docswell.com/page/GJWLXYLME2.jpg)

• 定義は各社様々
• 手法、方法論、システム、基盤、体制、姿勢、考え方、文
化、概念、etc...


# Page. 9

![Page Image](https://bcdn.docswell.com/page/4EZM6XMMJ3.jpg)

機械学習を実戦投入する際に
いい感じに運用
していくための諸々


# Page. 10

![Page Image](https://bcdn.docswell.com/page/Y76N24N57V.jpg)

MLOpsの例：
モデルの継続的トレーニング


# Page. 11

![Page Image](https://bcdn.docswell.com/page/G7552Q5G74.jpg)

学習パイプライン
• 各ステップの実行も、ステップ間の移行も自動化
• → 実験を迅速に繰り返すことが可能に


# Page. 12

![Page Image](https://bcdn.docswell.com/page/9J2N4PNDER.jpg)

パイプライン実行を自動化
課題： 時間とともにモデルの推論精度が劣化
• → パイプライン実行を自動化
• 精度を監視してトリガー実行
• バッチによる定期実行
• モデルの継続的トレーニング / Continuous Training（CT）


# Page. 13

![Page Image](https://bcdn.docswell.com/page/DEYPM5PMEM.jpg)

その他のMLOpsの例
• DVC (Data Version
Control)
• Feature Store
• Model Registry
• 実験管理
• CI/CD
• etc...


# Page. 14

![Page Image](https://bcdn.docswell.com/page/VJN5WN5378.jpg)

MLOps
&quot;for Core ML&quot;


# Page. 15

![Page Image](https://bcdn.docswell.com/page/YE9YXRYPJ3.jpg)

そもそもCore MLとは？
オンデバイスで推論・学習を行う機械学習フレームワーク


# Page. 16

![Page Image](https://bcdn.docswell.com/page/GE862W6X7D.jpg)

Appleデバイスの性能を最も
活かせるのはCore ML
• PyTorch Mobile（LibTorch） -&gt; CPU
• Tensor Flow Lite -&gt; CPU, GPU
• Core ML -&gt; CPU, GPU, Neural
Engine


# Page. 17

![Page Image](https://bcdn.docswell.com/page/LEL92N9NJR.jpg)

Core MLの学習リソース
「 機械学習のブルーオーシャン Core
ML 」
• iOSDC 2020での発表
• CoreML.frameworkだけではなく、
Core MLを実務で扱うために必要な
技術領域全体について解説


# Page. 18

![Page Image](https://bcdn.docswell.com/page/4JMZ8XZQEW.jpg)

実プロダクトにおけるCore ML


# Page. 19

![Page Image](https://bcdn.docswell.com/page/PJR65N6K79.jpg)

TensorFlowモデルから
Core MLモデルに変換
• → 約300%の高速化
（18fps -&gt; 55fps）
!


# Page. 20

![Page Image](https://bcdn.docswell.com/page/PEXMKNM57X.jpg)

Core MLの世界ではMLOpsの考え方はまだ広
がっていない
• 一度学習したモデルを利用し続ける
• モデルの学習・変換は手運用


# Page. 21

![Page Image](https://bcdn.docswell.com/page/3EKG5NGRJD.jpg)

Core MLモデル運用にMLOps的考え方を導入
できないか？
Core MLのさまざまな機能や、MLOpsツールを利用して、
&quot;MLOps for Core ML&quot;のパターンを検討してみます。
1
1
ここからは私個人の検討です。所属する企業での取り組みではありません。


# Page. 22

![Page Image](https://bcdn.docswell.com/page/L73NKVNG75.jpg)

パターン1: 学習パイプライン


# Page. 23

![Page Image](https://bcdn.docswell.com/page/87DW38WNJG.jpg)

学習パイプライン + Core MLモデルの変換
データの取得〜モデルの学習〜評価〜Core MLモデルへの変換
のフローをパイプライン化


# Page. 24

![Page Image](https://bcdn.docswell.com/page/VJP9489NE8.jpg)

パイプライン化のメリット
• 各ステップの処理もステップ間の移行も自動実行
• イテレーションが迅速になる
• モデルの継続的な更新（CT）
• 各ステップを個別のリソース（サーバ、コンテナ、ワーカー
等）に分割できる
• ステップ間の依存をファイル入出力に制限することで、ス
テップ単位で開発・テストできる


# Page. 25

![Page Image](https://bcdn.docswell.com/page/2EVMXNMYEQ.jpg)

Core MLモデルの作成フロー
このフローをパイプライン化します。


# Page. 26

![Page Image](https://bcdn.docswell.com/page/57GGVKGW7L.jpg)

MLflow
An open source platform for the
machine learning lifecycle
• 12.5k Stars
• ローカル環境で軽量に利用できる


# Page. 27

![Page Image](https://bcdn.docswell.com/page/4EQX6NXQ7P.jpg)

MLflowを用いた学習
パイプライン
プロジェクトのファイル構成
Project
├─ MLproject
├─ conda.yaml
├─ main.py
│
├─ preprocess
│
├─ MLproject
│
└─ src
│
├─ preprocess.py
│
└─ ...
├─ train
│
├─ MLproject
│
└─ src
│
├─ train.py
│
└─ ...
└─ evaluate
├─ MLproject
└─ src
├─ evaluate.py
└─ ...


# Page. 28

![Page Image](https://bcdn.docswell.com/page/KJ464G6Y71.jpg)

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}


# Page. 29

![Page Image](https://bcdn.docswell.com/page/LE1V4DVN7G.jpg)

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}


# Page. 30

![Page Image](https://bcdn.docswell.com/page/GEWLXY3M72.jpg)

conda.yaml
name: my_project
channels:
- defaults
dependencies:
- python=3.8
- ...
- torchvision&gt;=0.8.1
- pip
- pip:
- torch==1.10.2
- mlflow
- ...


# Page. 31

![Page Image](https://bcdn.docswell.com/page/47ZM6XVME3.jpg)

Pythonコード
トップフォルダ/main.py
def main():
...
with mlflow.start_run() as r:
preprocess_run = mlflow.run(
uri=&quot;./preprocess&quot;,
entry_point=&quot;preprocess&quot;,
backend=&quot;local&quot;,
)
...
train_run = mlflow.run(
uri=&quot;./train&quot;,
entry_point=&quot;train&quot;,
backend=&quot;local&quot;,
parameters={
&quot;epochs&quot;: args.epochs,
&quot;batch_size&quot;: ...,
&quot;learning_rate&quot;: ...,
},
)
...


# Page. 32

![Page Image](https://bcdn.docswell.com/page/YJ6N2455JV.jpg)

「Core MLモデルへの変換」
ステップを追加する
• convertフォルダを追加
• MLproject
• convert.py
• ...
Project
├─ MLproject
├─ conda.yaml
├─ main.py
│
├─ preprocess
│
├─ MLproject
│
└─ ...
├─ train
│
├─ MLproject
│
└─ ...
...
│
└─ convert
├─ MLproject
└─ src
├─ convert.py
└─ ...


# Page. 33

![Page Image](https://bcdn.docswell.com/page/GJ552QYGJ4.jpg)

convert/MLproject
name: my_project
conda_env: ../conda.yaml
entry_points:
convert:
parameters:
upstream: {type: string, default: &quot;&quot;}
downstream: {type: string, default: &quot;&quot;}
command: |
python -m src.convert \
--upstream {upstream} \
--downstream {downstream}


# Page. 34

![Page Image](https://bcdn.docswell.com/page/LE3NKV5PE5.jpg)

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


# Page. 35

![Page Image](https://bcdn.docswell.com/page/8EDW38D37G.jpg)

conda.yaml に coremltools を追加
name: my_project
channels:
- defaults
dependencies:
- python=3.8
- ...
- torchvision&gt;=0.8.1
- pip
- pip:
- torch==1.10.2
- coremltools==5.2.0
- mlflow
- ...


# Page. 36

![Page Image](https://bcdn.docswell.com/page/V7P948XPJ8.jpg)

パイプライン実行
$ mlflow run .


# Page. 37

![Page Image](https://bcdn.docswell.com/page/2JVMXNLVJQ.jpg)

デモ


# Page. 38

![Page Image](https://bcdn.docswell.com/page/5EGGVKX1EL.jpg)

パターン2: 実験管理


# Page. 39

![Page Image](https://bcdn.docswell.com/page/4JQX6N8NEP.jpg)

モデル作成時のペイン
• どんなパラメータで実行したか？
• どのデータを使用したか？
• どんな結果だったか？
• それらの条件で作成したモデルはどれ？
→ 実験管理


# Page. 40

![Page Image](https://bcdn.docswell.com/page/K7464G23E1.jpg)

MLflowで実験管理
• log_param(s) ・・・パラメータを記録
• log_metric(s) ・・・メトリクスを記録
• log_artifact(s) ・・・アーティファクト（生成物）を記録
• log_model ・・・モデルを記録


# Page. 41

![Page Image](https://bcdn.docswell.com/page/LJ1V4DMZEG.jpg)

MLflow UI 1/3


# Page. 42

![Page Image](https://bcdn.docswell.com/page/GJWLXY36E2.jpg)

MLflow UI 2/3
• 各実験のパラメータ、メトリクス、モデルをUIで確認できる
• メトリクスの変化をグラフ表示


# Page. 43

![Page Image](https://bcdn.docswell.com/page/4EZM6XVRJ3.jpg)

MLflow UI 3/3
• アーティファクト（生成物）へのアクセスも提供


# Page. 44

![Page Image](https://bcdn.docswell.com/page/Y76N24517V.jpg)

パターン3: 実機での新モデルの検証


# Page. 45

![Page Image](https://bcdn.docswell.com/page/G7552QYL74.jpg)

テスターにだけ新モデルを配布する
ケース：
新モデルの検証として、ステージング版アプリを持っているテ
スターに新モデルを配布したい。
（リリース版ユーザーにはまだ配布しない。）


# Page. 46

![Page Image](https://bcdn.docswell.com/page/9J2N4PG3ER.jpg)

クラウド経由でモデルを更新
Core ML Model Deployment
• アプリ側の更新不要で
モデルを更新できる


# Page. 47

![Page Image](https://bcdn.docswell.com/page/DEYPM5V8EM.jpg)

事前準備
• [iCloud] ステージング用とリリース用で別々のModel
Collectionを用意しておく
• [App] ステージング／リリースビルドで利用するModel
Collectionを分けるよう実装
• 更新されたら通知が届くようにしておく
• [App] テスターにステージング版をTestFlightで配布


# Page. 48

![Page Image](https://bcdn.docswell.com/page/VJN5WNM978.jpg)

新モデル検証時
• [iCloud] ステージング用のModel Collectionに新モデルを登
録
↓
• ステージング版アプリに通知が届く
• アプリを起動するとモデルが更新される


# Page. 49

![Page Image](https://bcdn.docswell.com/page/YE9YXRN3J3.jpg)

その他、実現できそうな「MLOps for Core ML」のアイデア
• Create MLによるモデル作成フローの自動化／実験管理
• 学習〜変換〜デプロイ（新Core MLモデルを組み込んだアプ
リの配布）のフローを自動化
• Xcode 14のパフォーマンスレポートやInstrumentsで得られ
たメトリクスの管理
• オンデバイスで学習した personalized モデルと特徴量の管理
• etc...


# Page. 50

![Page Image](https://bcdn.docswell.com/page/GE862WKL7D.jpg)

まとめ
Core MLモデル運用にMLOps的考え方を導入できないか検討し
てみました。
- パイプライン化
- 実験管理
- 実機での新モデル検証


# Page. 51

![Page Image](https://bcdn.docswell.com/page/LEL92NZQJR.jpg)

coremltoolsについて
もっと学ぶ
• 公式リポジトリのサンプル
• 公式ドキュメント
iOS × Deep Learning
Core ML Tools
実践入門
• 書籍「Core ML Tools実践
入門」
• 逆引きレシピつき
TensorFlow, Kerasと coremltools
によるカスタムモデル構築


# Page. 52

![Page Image](https://bcdn.docswell.com/page/4JMZ8X4KEW.jpg)

iOSのGPU/Metalに
ついて学ぶ
• スライド「飛び道具ではな
いMetal」 （iOSDC
2017）
• 書籍「Metal入門」


# Page. 53

![Page Image](https://bcdn.docswell.com/page/PJR65NW679.jpg)



# Page. 54

![Page Image](https://bcdn.docswell.com/page/PEXMKNPD7X.jpg)

ご清聴ありがとうございました！


# Page. 55

![Page Image](https://bcdn.docswell.com/page/3EKG5NDDJD.jpg)

補足


# Page. 56

![Page Image](https://bcdn.docswell.com/page/L73NKVRP75.jpg)

MLproject ファイル（docker_envを指定）
name: my_project
docker_env:
image: xxxx:xxxx
volumes: [&quot;...&quot;, &quot;...&quot;]
entry_points:
preprocess:
parameters:
...
command: |
python -m src.preprocess \
...


# Page. 57

![Page Image](https://bcdn.docswell.com/page/87DW38Y3JG.jpg)

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} ./ &amp;&amp; \
docker build \
-t &quot;xxxx:xxxx&quot; \
-f ./Dockerfile \
--build-arg model_filename={model_filename} \
--build-arg model_directory={model_directory} \
.


# Page. 58

![Page Image](https://bcdn.docswell.com/page/VJP9486PE8.jpg)

MLproject ファイル（ビルドしたDocker イメージを利用）
name: my_project
conda_env: conda.yaml
entry_points:
evaluate:
parameters:
...
dockerimage: {type: string, default: &quot;xxxx:xxxx&quot;}
container_name: {type: string, default: test}
command: |
docker run \
-it -d \
--name {container_name} \
-p xxxx:xx {dockerimage} &amp;&amp; \
python -m src.evaluate \
...


