Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Testing machine learning development
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
shibuiwilliam
March 17, 2022
Technology
1
160
Testing machine learning development
code testing for machine learning development
shibuiwilliam
March 17, 2022
Tweet
Share
More Decks by shibuiwilliam
See All by shibuiwilliam
2026年はチャンキングを極める!
shibuiwilliam
9
2k
R&Dチームを起ち上げる
shibuiwilliam
1
140
AIエージェント開発と活用を加速するワークフロー自動生成への挑戦
shibuiwilliam
5
970
プロンプトやエージェントを自動的に作る方法
shibuiwilliam
17
18k
生成AIシステムとAIエージェントに関する性能や安全性の評価
shibuiwilliam
2
540
AIエージェントによるエンタープライズ向けスライド検索!
shibuiwilliam
4
1.3k
実践マルチモーダル検索!
shibuiwilliam
3
980
生成AI時代のデータ基盤
shibuiwilliam
7
5.2k
LLM時代の検索とコンテキストエンジニアリング
shibuiwilliam
3
2k
Other Decks in Technology
See All in Technology
CDK対応したAWS DevOps Agentを試そう_20260201
masakiokuda
1
210
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
4.9k
ブロックテーマでサイトをリニューアルした話 / 2026-01-31 Kansai WordPress Meetup
torounit
0
450
予期せぬコストの急増を障害のように扱う――「コスト版ポストモーテム」の導入とその後の改善
muziyoshiz
1
1.6k
プロポーザルに込める段取り八分
shoheimitani
1
180
GSIが複数キー対応したことで、俺達はいったい何が嬉しいのか?
smt7174
3
150
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
2
610
レガシー共有バッチ基盤への挑戦 - SREドリブンなリアーキテクチャリングの取り組み
tatsukoni
0
210
Bill One急成長の舞台裏 開発組織が直面した失敗と教訓
sansantech
PRO
2
300
ZOZOにおけるAI活用の現在 ~開発組織全体での取り組みと試行錯誤~
zozotech
PRO
5
4.9k
Frontier Agents (Kiro autonomous agent / AWS Security Agent / AWS DevOps Agent) の紹介
msysh
3
150
15 years with Rails and DDD (AI Edition)
andrzejkrzywda
0
180
Featured
See All Featured
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
910
Are puppies a ranking factor?
jonoalderson
1
2.7k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.3k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
730
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
350
The Curious Case for Waylosing
cassininazir
0
230
AI Search: Where Are We & What Can We Do About It?
aleyda
0
6.9k
Faster Mobile Websites
deanohume
310
31k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Between Models and Reality
mayunak
1
180
Transcript
機械学習の開発を テストする 2021/06/26 shibui yusuke
自己紹介 shibui yusuke • 自動運転スタートアップのティアフォー所属 • MLOpsエンジニア & インフラエンジニア &
データエンジニア • もともとクラウド基盤の開発、運用。 • ここ5年くらいMLOpsで仕事。 • Github: @shibuiwilliam • Qiita: @cvusk • FB: yusuke.shibui • 最近やってること: IstioとGoとデータ分析 cat : 0.55 dog: 0.45 human : 0.70 gorilla : 0.30 物体検知
本を出版しました! • AIエンジニアのための 機械学習システムデザインパターン • 2021年5月17日発売 • https://www.amazon.co.jp/dp/4798169447/ • 機械学習と銘打ってるのに
KubernetesとIstioに 詳しくなれる一冊です! • Amazon.co.jp 情報学・情報科学部門 1位! 人工知能部門 1位! • 増刷決定! • 韓国語版と中国語版(台湾)も出るらしい!
今日話すこと • 機械学習の開発をテストする
機械学習のプログラミングの課題 • 機械学習はプログラミングとデータによって開発する。 • つまりプログラミングとデータが正しくないと機械学習のモデルも正しくなくなる。 • しかし機械学習のモデルの正確さを開発中に評価することは難しい。 データ分析、取得 前処理 学習
評価 リリース 例:リリース後にデータが間違っていることが判明 データまで戻る
「学習を自動化したい」は簡単ではない • 研究、開発中のコード =毎日読んで書くコード。 =一箇所修正して依存箇所を直すことは容易。 • 自動実行するコード =毎日実行するけど、毎日読まないし書かないコードになる。 =忘れてしまうコードになる。 =開発時に記録されていない情報は失われる。
◦ 失われるものの例:学習時に使ったデータ。特に中間データ
モデル開発のテスト • ソフトウェア開発ではプログラムを通してロジックをテストする • 機械学習ではコードを通してデータで確率をテストする YES or NO 0 ~
1 ソフトウェア開発のテスト 機械学習のテスト 入力 正解 出力 assert 関数 指標 推論 evaluate モデル 関数 テスト通過率:95/100 Accuracy:99% Precision:95% Recall:60% 7 データ
モデル開発のテスト • ソフトウェア開発ではプログラムを通してロジックをテストする • 機械学習ではコードを通してデータで確率をテストする YES or NO 0 ~
1 ソフトウェア開発のテスト 機械学習のテスト 入力 正解 出力 assert 関数 指標 推論 evaluate モデル 関数 テスト通過率:95/100 Accuracy:99% Precision:95% Recall:60% 8 データ
「学習が正しく動いている」 取得したデータが正しい → ←この処理が正しい 動くモデルができてる → ←基準以上の評価 評価と実用が乖離しない → 止めずに安定して
動かせる データ分析、取得 前処理 学習 評価 リリース ←損失関数が下がる 動く→
汎用的っぽい関数が汎用的とは限らない • 前処理は扱うデータに応じて書く必要がある。 ◦ 例:細長い画像が入る可能性のある データをどうリサイズ、クロップ する? ▪ パディングしてからリサイズ ▪
最初にリサイズ ▪ クロップしたリサイズ ▪ ある程度リサイズして パディングしてリサイズ • Utilityとして作った前処理関数が汎用的に 使えるとは限らない。 • Utilityの変更→他のモデル開発に影響。 データ取得 テンソル化 リサイズ クロップ 標準化 学習 このあたりを 汎用的に使う 共通の関数に することは多い
いろいろなリサイズ リサイズ リサイズ リサイズ リサイズ パディング パディング
データに依存するならデータとともにテスト • ユニットテスト: 個々のタスクをテストする ◦ 対象:コード品質やロジック • 接続テスト: 少量データを用いた短い Epochで
学習パイプラインをテストする ◦ 対象:学習パイプラインとモデル開発 • 機械学習としてのテスト: テストデータでモデルを評価する ◦ 対象:モデルの品質 • 受け入れテスト: 推論器の稼働をテストする ◦ 対象:本番システム データ取得 前処理 学習 評価 リリース 少量データ
データに依存するならデータとともにテスト • 接続テスト: 少量データを用いた短い Epochで 学習パイプラインをテストする ◦ 対象:学習パイプラインとモデル開発 ◦ サンプルデータでコードが動くことを
E2E にテストする ◦ 学習が進むこと(損失関数が下がる こと)を確認する ◦ 学習済みモデルを読み込んで 評価コードが動くことをテストする ◦ 大量のGPUを使う前にコードをテストし たい データ取得 前処理 学習 評価 リリース 少量データ
ユニットテストの例 def resize_image( img: np.ndarray, width: int, height: int, )
-> np.ndarray: resize_img = cv2.resize(img, (width, height)) return resize_img a = np.random.randint(0, 255, (2, 4, 3)) @pytest.mark.parametrize( ("img", "width", "height"), [(a, 20, 30)], ) def test_resize_image( img: np.ndarray, width: int, height: int, ): resize_img = resize_image(img, width, height) assert resize_img.shape = (width, height, 3) • 普通のユニットテストを書く。
接続テストの例 # 仮のコードです def make_dataloader(data_path: str) -> DataLoader: return dataloader(data_path)
def train(model: nn.Module, epochs: int, trainloader: DataLoader) -> List[float]: losses = [] for epoch in range(epochs): average_loss = train_once(model, trainloader) losses.append(average_loss) model.save() return losses def evaluate(model_path: str, testloader: DataLoader) -> List[float]: predictor = Model(model_path) evaluations = predictor.evaluate(testloader) return evaluations • 少量データで動かす。 @pytest.mark.parametrize( (“model”, "train_path", “test_path” “epochs”), [(model, “/tmp/small_train/”, “/tmp/small_test/”, 10)], ) def test_train( model: nn.Module, train_path: str, test_path: str, epochs: int, ): trainloader = make_dataloader(train_path) testloader = make_dataloader(test_path) init_accuracy = evaluate(model, testloader) losses = train(model, epochs, trainloader) assert losses[0] > losses[-1] trained_accuracy = evaluate(model, testdata) assert init_accuracy < trained_accuracy
データの正しさを残す • 非構造化データの前処理や Augmentationが 想定通りのアウトプットを出していることを 網羅的にテストすることは難しいが、 想定外のデータが混入することは避けたい。 • ランダムサンプリングになるが、 1st
epochで 前処理された学習データだけ保存しておいて 学習が異常なときに確認できるようにしておく だけでもトラブルシューティングに役立つ。 前処理 学習 1st epochのみ保存
DVCとCML • Data Version Control • データ分析や機械学習で使ったデータを バージョン管理する • Gitみたいに使う
• https://dvc.org/doc • Continuous Machine Learning • 機械学習のためのCI/CD • GitHub ActionとDVCと組み合わせて データを管理したCI/CDが可能 • https://github.com/iterative/cml
DVCとCML データ取得 前処理 学習 評価 リリース 少量データ コード CI/CD
まとめ • 機械学習はデータに依存するため、データとともにテストする • 機械学習とプログラム両方のテストを書く • データの正しさを残す
宣伝 • MLOpsコミュニティを運営してます。 ◦ https://mlops.connpass.com/ • 毎月勉強会開催中! ◦ 7/14はメルカリUSがKubeflow +
Polyaxonによる 機械学習基盤を説明! ◦ https://mlops.connpass.com/event/215133/ • MLOpsコミュニティ公式ツイッター ◦ @MlopsJ ◦ https://twitter.com/MlopsJ