Slide 1

Slide 1 text

機械学習のプログラムを レビューする 2022/10/12 しぶい

Slide 2

Slide 2 text

自己紹介 shibui yusuke ● いろいろ → Launchable(いまここ) ● MLOpsとかいろいろエンジニア ● たまにセールスとかPRとか ● もともとクラウド基盤の開発、運用 ● ここ6年くらいMLOpsとバックエンドとインフラとたまに データ分析とAndroidで仕事 ● Github: @shibuiwilliam ● Meety: https://meety.net/matches/OPJgijxiEMHE ● 最近の趣味:猫と副業と自宅勤務改善 cat : 0.55 dog: 0.45 human : 0.70 gorilla : 0.30 物体検知 2

Slide 3

Slide 3 text

● 2022年11月14日発売予定! ● https://www.amazon.co.jp/dp/4798173401/ ● 発売中! ● https://www.amazon.co.jp/dp/4798169447/

Slide 4

Slide 4 text

今日話すこと ● 機械学習開発におけるコードレビュー ○ 方針を合意する ○ Jupyter Notebookとの闘い ○ 確率的な機械学習のプログラムをレビューする ○ まとめ ● https://speakerdeck.com/shibuiwilliam/reviewing-machine-learning-program

Slide 5

Slide 5 text

考えてるものが違う ● ユーザから見たAI ● MLエンジニアから見たML ● ソフトウェアエンジニアから見た MLシステム ネコを 描いて!

Slide 6

Slide 6 text

方針を合意する ● Jupyter Notebookの位置付け ● データサイエンティスト、機械学習エンジニアに求めるアウトプット ● 本番システムに導入するコード品質 いきなり出 てきたコー ド いきなり依頼された コードレビュー コード 合意した方針 方針に沿った開発

Slide 7

Slide 7 text

Jupyter Notebookとの闘い

Slide 8

Slide 8 text

Jupyter Notebook WebブラウザでPythonを 書いて実行、可視化できる 開発環境。

Slide 9

Slide 9 text

Jupyter Notebook ● 利点 ○ 書いてすぐ実行できる。 ○ 部分実行や途中実行もできる。 ○ テーブルやグラフを可視化できる。 ○ データサイエンスや機械学習開発のデファクトスタンダードになってる。 ● 難点 ○ リントもフォーマットもできない。 ○ レビューコメントを書けない。 ○ 部分実行や途中実行されていると、プログラムの実行順序がわからない。 ○ 適当に作って適当に放置される(レポジトリで管理されない)。 ○ ファイルサイズが大きい。

Slide 10

Slide 10 text

DSやMLエンジニアに求めるアウトプット ● 学習が正しく動き、学習の評価と推論の評価で矛盾が生じないこと。 取得したデータが正しい→ ←この処理が正しい 動くモデルができてる→ ←要件を満たす 評価と推論が乖離しない→ データ分析 前処理 学習 評価 推論 ←損失関数が下がる ←動く 安定して動かせる 第3者に理解できる ←説明・納得できる

Slide 11

Slide 11 text

● 目的が大事 ○ 多くの場合、Jupyter Notebookは中間成果物。 ○ 分析や機械学習の正しさを証明、検証するためのツール。 Jupyter Notebookが本番システムに組み込まれることはない。 ○ プログラムと考えるよりもレポートやドキュメントとして扱うと精神衛生上健全。 ● レビュー対象 ○ データ!!! ○ 分析や機械学習の正しさ ○ 前処理、後処理、評価の正しさ ○ 可視化 ○ 説明 ● 非レビュー対象 ○ コード品質 Jupyter Notebookをレビューする

Slide 12

Slide 12 text

● レビュー会 ○ Jupyter Notebookを通して実行した状態でレビューする。 ■ レビュー会(30〜60分)でJupyter Notebookに書いた分析や機械学習をレビューする。 ■ レビュー対象のJupyter NotebookはColabやクラウド(Vertex AIやSagemaker等)の 共通開発環境にデータとともに保存する。ローカル環境禁止。 ■ レビュー会ではJupyter Notebookを上から下まで順番に実行した結果を報告する (部分実行や途中実行は禁止)。 ■ 分析・テスト結果は必ず全て可視化する。 ○ コード品質は諦める。 ○ ただし、最低限読めるプログラムを書く。 Jupyter Notebookをレビューする

Slide 13

Slide 13 text

このツールを使えばもっと便利になるかも ● https://github.com/marketplace/actions/diff-notebooks ● GitHub ActionsでJupyter Notebookの変更を可視化してレビューするツール。

Slide 14

Slide 14 text

確率的な機械学習の プログラムをレビューする

Slide 15

Slide 15 text

.ipynb -> .py へ書き直す データ分析 前処理 学習 評価 推論 ここは書き直す 必要がある。 ここは書き直さない 場合もある

Slide 16

Slide 16 text

前処理と推論だけ書き直す場合 ● レビュー対象 ○ コードの可読性とメンテナンス性 ○ データ検証で不明点を減らす ■ コードだけだと想定しているデータがわからないことが多い ■ データ検証やコメントで扱っているデータの例や構造を定義することを推奨 ■ テーブルデータであればpanderaやTensorFlow data validationが有効 ○ テスト ■ ユニットテストと結合テスト ■ 推論結果もテストする

Slide 17

Slide 17 text

データ検証例 import pandas as pd import pandera as pa schema = pa.DataFrameSchema({ "gender": pa.Column(str, checks=pa.Check(lambda x: x in _genders , element_wise=True, error=f"gender must be {_genders}"), ), "height_cm": pa.Column(float, checks=[ pa.Check(lambda x: 130 <= x <= 210 , element_wise=True, error=f"height must be between [130, 210]", ), pa.Hypothesis.two_sample_test( sample1="male", sample2="female", groupby="gender", relationship="greater_than", alpha=0.01, equal_var=True, ), ], ), }) df = pd.DataFrame(data = {"gender": genders, "height_cm": heights}) df = schema(df) ● Pythonのpandasとpanderaによるデータ検証 ● カラムごとにdata schemaを定義し、 チェックを挟むことで取得したデータの 正しさを検証する ● Hypothesis testingを活用することで 複数カラム間の妥当性をテストすることが 可能

Slide 18

Slide 18 text

学習や評価も書き直す場合 ● レビュー対象 ○ コードの可読性とメンテナンス性 ○ 責任分界を明確にし、可能な限りSOLID原則を守る ■ 少なくとも単一責任の原則は守る ■ 他は努力目標 ○ 学習と評価の結果を記録するコードを追加する ■ 各種機械学習サービスやライブラリ(Vertex AI、Sagemaker、MLflow等)で 提供されているものを使う ○ データ検証 ○ テスト

Slide 19

Slide 19 text

機械学習のフローと単一責任の原則 データ取得 前処理 学習 評価 推論 モデル定義 評価指標 データ元 class CoolML(): def __init__(self) def load_data(self) def __load_user_data(self) def __load_item_data(self) def preprocess_train_evaluate(self) def predict(self) def run_all(self) ● 機械学習のコードをまとめたクラス ● 一箇所の変更で他も変更する必要が あり、メンテナンスが難しい ● 可読性も低くなりがち

Slide 20

Slide 20 text

機械学習のフローと単一責任の原則 データ取得 前処理 学習 評価 推論 モデル定義 評価指標 データ元 class CoolML(): def __init__(self) def load_data(self) def __load_user_data(self) def __load_item_data(self) def preprocess_train_evaluate(self) def predict(self) def run_all(self) class DataWarehouseAccessor() class UserDataLoader() class ItemDataLoader() class Normalize() class CoolModel() def define_model(self) class EvaluationMetrics() class ModelTrainer() def train(self) def evaluate(self) -> EvaluationMetrics class Predictor() class Pipeline() def __init__(self, data_loader:DataLoader, preprocess:Preprocess, model:CoolModel, predictor:Predictor) データアクセスと データロートを 分ける 前処理と学習を分ける 定義と実行を分ける 推論を処理含めて クラスにまとめる パイプラインにする

Slide 21

Slide 21 text

まとめ

Slide 22

Slide 22 text

まとめ ● 異なるスキルセット、異なるチームで開発することが多い機械学習プロジェクト ● 互いに開発とレビューの方針を合意し、その合意に沿って開発しレビューする ● Jupyter Notebookはレポートやドキュメントのつもりで作り、レビューする ● 本番コードは不明点の削減と可読性の向上を目指す

Slide 23

Slide 23 text

● 機械学習を実用化する方法論や事例を学ぶ勉強会 ● 次回は10/25(火)18:00開催。ぜひご参加ください! ○ 株式会社プレイド ML Tech Lead 春日 瑛 様 KARTEにおけるMLOpsの変遷 ○ 株式会社DeNA データ本部副本部長 加茂 雄亮 様 DeNAにおける AI Project Management Flow and Build Trap Review ● https://mlops.connpass.com/event/261097/ MLOps勉強会 第24回は10/25 (火) 18:00-!!