Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MLOps for Core ML #iOSDC 2022

shu223
September 10, 2022

MLOps for Core ML #iOSDC 2022

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

shu223

September 10, 2022
Tweet

More Decks by shu223

Other Decks in Programming

Transcript

  1. ࣗݾ঺հ • అमҰ • shu223 ʢGitHub / Twitter / noteʣ

    • ΤϯδχΞͱਓੜʢYouTube / Podcast / ίϛϡχςΟʣ
  2. iOSDCͷաڈͷొஃ • 2016: ւ֎ΧϯϑΝϨϯεʹొஃ͢Δ • 2017: ඈͼಓ۩Ͱ͸ͳ͍Metal • 2018: Depth

    in Depth • 2019: ࠓͦ͜watchOS • 2020: ػցֶशͷϒϧʔΦʔγϟϯ Core ML
  3. ͦͷଞͷMLOpsͷྫ • DVC (Data Version Control) • Feature Store •

    Model Registry • ࣮ݧ؅ཧ • CI/CD • etc...
  4. Core MLͷֶशϦιʔε ʮ ػցֶशͷϒϧʔΦʔγϟϯ Core ML ʯ • iOSDC 2020Ͱͷൃද

    • CoreML.framework͚ͩͰ͸ͳ͘ɺ Core MLΛ࣮຿Ͱѻ͏ͨΊʹඞཁͳ ٕज़ྖҬશମʹ͍ͭͯղઆ
  5. MLflow An open source platform for the machine learning lifecycle

    • 12.5k Stars • ϩʔΧϧ؀ڥͰܰྔʹར༻Ͱ͖Δ
  6. MLflowΛ༻ֶ͍ͨश ύΠϓϥΠϯ ϓϩδΣΫτͷϑΝΠϧߏ੒ Project ├─ MLproject ├─ conda.yaml ├─ main.py

    │ ├─ preprocess │ ├─ MLproject │ └─ src │ ├─ preprocess.py │ └─ ... ├─ train │ ├─ MLproject │ └─ src │ ├─ train.py │ └─ ... └─ evaluate ├─ MLproject └─ src ├─ evaluate.py └─ ...
  7. 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}
  8. 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}
  9. conda.yaml name: my_project channels: - defaults dependencies: - python=3.8 -

    ... - torchvision>=0.8.1 - pip - pip: - torch==1.10.2 - mlflow - ...
  10. 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": ..., }, ) ...
  11. ʮCore MLϞσϧ΁ͷม׵ʯ εςοϓΛ௥Ճ͢Δ • convertϑΥϧμΛ௥Ճ • MLproject • convert.py •

    ... Project ├─ MLproject ├─ conda.yaml ├─ main.py │ ├─ preprocess │ ├─ MLproject │ └─ ... ├─ train │ ├─ MLproject │ └─ ... ... │ └─ convert ├─ MLproject └─ src ├─ convert.py └─ ...
  12. 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}
  13. 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) ...
  14. 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 - ...
  15. ͦͷଞɺ࣮ݱͰ͖ͦ͏ͳʮMLOps for Core MLʯͷΞΠσΞ • Create MLʹΑΔϞσϧ࡞੒ϑϩʔͷࣗಈԽʗ࣮ݧ؅ཧ • ֶशʙม׵ʙσϓϩΠʢ৽Core MLϞσϧΛ૊ΈࠐΜͩΞϓ

    Ϧͷ഑෍ʣͷϑϩʔΛࣗಈԽ • Xcode 14ͷύϑΥʔϚϯεϨϙʔτ΍InstrumentsͰಘΒΕ ͨϝτϦΫεͷ؅ཧ • ΦϯσόΠεͰֶशͨ͠ personalized Ϟσϧͱಛ௃ྔͷ؅ཧ • etc...
  16. coremltoolsʹ͍ͭͯ ΋ͬͱֶͿ • ެࣜϦϙδτϦͷαϯϓϧ • ެࣜυΩϡϝϯτ • ॻ੶ʮCore ML Tools࣮ફ

    ೖ໳ʯ • ٯҾ͖Ϩγϐ͖ͭ Core ML Tools iOS × Deep Learning TensorFlow, Kerasͱ coremltools ʹΑΔΧελϜϞσϧߏங ࣮ફೖ໳
  17. MLproject ϑΝΠϧʢdocker_envΛࢦఆʣ name: my_project docker_env: image: xxxx:xxxx volumes: ["...", "..."]

    entry_points: preprocess: parameters: ... command: | python -m src.preprocess \ ...
  18. 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} \ .
  19. 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 \ ...