$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DTD_ML開発で役立つ依存注入の基本
Search
BrainPad
May 29, 2025
Technology
0
76
DTD_ML開発で役立つ依存注入の基本
BrainPad
May 29, 2025
Tweet
Share
More Decks by BrainPad
See All by BrainPad
DTD_生成AIアシスタントのコスト最適化
brainpadpr
1
43
白金鉱業Vol.21【初学者向け発表枠】身近な例から学ぶ数理最適化の基礎 / Learning the Basics of Mathematical Optimization Through Everyday Examples
brainpadpr
1
430
三田データ_BrainPadAAA_AIエージェント元年を振り返る
brainpadpr
1
93
DTD_メタデータ管理とデータ品質管理の具体化
brainpadpr
0
130
DTD_これから始めるMCP基本のキ
brainpadpr
2
180
DTD_大規模開発を加速するAI活用術
brainpadpr
0
33
綺麗なデータマートをつくろう_データ整備を前向きに考える会 / Let's create clean data mart
brainpadpr
3
800
【新卒研修資料】LLM・生成AI研修 / Large Language Model・Generative AI
brainpadpr
27
23k
DTD_TerraformによるLLMチャットボット用Google Cloudインフラ構築
brainpadpr
0
160
Other Decks in Technology
See All in Technology
AI駆動開発における設計思想 認知負荷を下げるフロントエンドアーキテクチャ/ 20251211 Teppei Hanai
shift_evolve
PRO
2
220
re:Inventで気になったサービスを10分でいけるところまでお話しします
yama3133
1
120
AWS re:Invent 2025で見たGrafana最新機能の紹介
hamadakoji
0
210
re:Invent2025 コンテナ系アップデート振り返り(+CloudWatchログのアップデート紹介)
masukawa
0
320
【pmconf2025】PdMの「責任感」がチームを弱くする?「分業型」から全員がユーザー価値に本気で向き合う「共創型開発チーム」への変遷
toshimasa012345
0
280
小さな判断で育つ、大きな意思決定力 / 20251204 Takahiro Kinjo
shift_evolve
PRO
1
580
今年のデータ・ML系アップデートと気になるアプデのご紹介
nayuts
1
210
エンジニアリングをやめたくないので問い続ける
estie
2
570
Challenging Hardware Contests with Zephyr and Lessons Learned
iotengineer22
0
140
re:Invent 2025 ~何をする者であり、どこへいくのか~
tetutetu214
0
180
WordPress は終わったのか ~今のWordPress の制作手法ってなにがあんねん?~ / Is WordPress Over? How We Build with WordPress Today
tbshiki
1
580
チーリンについて
hirotomotaguchi
5
1.5k
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.3k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.2k
Context Engineering - Making Every Token Count
addyosmani
9
500
Code Reviewing Like a Champion
maltzj
527
40k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.4k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
The Invisible Side of Design
smashingmag
302
51k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.1k
Java REST API Framework Comparison - PWX 2021
mraible
34
9k
Transcript
ML開発で役立つ依存注入の基本 2025年 5月29日 DEU TECH DRIVE
©BrainPad Inc. Strictly Confidential 2 佐藤瑞起(さとうみずき) ブレインパッド 機械学習エンジニア • 入社
• 2023年新卒入社 • 趣味 • サッカー • 映画 • 興味 • MLOps • エッジ推論 自己紹介
©BrainPad Inc. Strictly Confidential 3 今日お話しすること 1 3 2 PoCの成功後に立ちはだかる壁
依存注入に注目することの利点 依存注入のポイント
4 ©BrainPad Inc. Strictly Confidential PoCの成功後に立ちはだかる壁 PoCは上手くいったぞ! エンジニアにコードを共有しよう まかせろ! DS
エンジニア
5 ©BrainPad Inc. Strictly Confidential PoCの成功後に立ちはだかる壁 大きい成果物 一つの変更が全てに影響する 可読性が高いとは言えないコード ドキュメントもないため、大変な作業となる
ビジネスロジックと密なコード 製品化する上で改修が行われるコード ばかり DS エンジニア
6 ©BrainPad Inc. Strictly Confidential PoCの成功後に立ちはだかる壁 思ったより大変な作業だぞ。。。(泣) DS エンジニア
7 ©BrainPad Inc. Strictly Confidential PoCの成功後に立ちはだかる壁 各フェーズで目的が違う 短期で結果が求められる • コードより報告結果が重要
動作すれば良い • Notebookや関数が乱立 実験的 • 試行回数が多く、似たようなコードが多く存在 システム化 PoC 拡張性 • システムの成長を見込んだ設計が必要 保守性 • テストや例外処理など正常な動作以外もケア 運用可能性 • モニタリング、再学習 短期成果 複数回の実験 拡張性 保守性 運用可能性 最低限の動作保証
8 ©BrainPad Inc. Strictly Confidential PoCの成功後に立ちはだかる壁 全部は難しいけど、どこをケアす ればより良い形になるかな どこから手を出すのが良さそうなんだろう DS
エンジニア
9 ©BrainPad Inc. Strictly Confidential PoCの成功後に立ちはだかる壁 PoCから開発へ進むのに必要なこと
10 ©BrainPad Inc. Strictly Confidential PoCの成功後に立ちはだかる壁 PoCは上手くいったぞ! アプリ化してこう で、何から手をつければ 良いんだ?
設計やテスト、例外処理、 などやらないと けど、一つ加えるだけで 全部が影響する〜 何から手をつければ良い んだ?
11 ©BrainPad Inc. Strictly Confidential PoCの成功後に立ちはだかる壁 PoCは上手くいったぞ! アプリ化してこう で、何から手をつければ 良いんだ?
設計やテスト、例外処理、 などやらないと けど、一つ加えるだけで 全部が影響する〜 何から手をつければ良い んだ? とにかく、依存注入(DI)をしよう
12 ©BrainPad Inc. Strictly Confidential 依存注入(DI)とは さまざまなソフトウェア設計の原則やパターンを 集めたものであり、コードが疎結合となるような 開発を行えるようにするものである。 引用:Dependency
Injection Principles, Practices, and Patterns
13 ©BrainPad Inc. Strictly Confidential 依存注入(DI)とは メリットがたくさん 拡張容易性 • 既存の拡張、再利用が容易となる
• 想定外の場合にも堅牢 並列開発 • 切り分けやすいため、複数人で同時 に開発ができる 保守容易性 • クラスの責務が明確に定義されるた め、保守が行いやすい テスト容易性 • 切り分けやすくなるため、テストが 行いやすくなる
14 ©BrainPad Inc. Strictly Confidential 初めの一歩としてのDI ここから始めると 「小さい労力で開発の高速化が行える」 ✓ 開発のしやすさが向上する
✓ 影響範囲が見えやすため、次の対応としてどの選択を取ってもスムーズに対応できる ✓ 依存を整理していくと感じることが増え、設計などを検討していく上でのキッカケになりやすい ✓ 把握がしやすくなる ✓ 各モジュールの関係性が見やすく、他の人でも理解しやすい ✓ 整理することでコードの理解が深まる
15 ©BrainPad Inc. Strictly Confidential 依存注入(DI)のポイント ①クラスを作る ②注入のパターンを決める ③合成を行う
16 ©BrainPad Inc. Strictly Confidential 依存注入(DI)のポイント ①クラスを作る
17 ©BrainPad Inc. Strictly Confidential クラスを作る まずは機能をまとめるレベルで良いので、クラスを作成していく ✓ 責務の分離や抽象化は意識しなくてもOK ✓
ある程度の機能単位でクラスにまとめる ✓ よくある分類: 前処理、モデル、学習、推論、データ関連 ▼前処理と学習をまとめた例
18 ©BrainPad Inc. Strictly Confidential 依存注入(DI)のポイント ②注入のパターンを決める
19 ©BrainPad Inc. Strictly Confidential コンストラクタの注入 対象のクラスが必要とする依存を全てコンストラクタの引数として定義するパターン メリット ✓ 依存が注入されることが保証
✓ 実装が簡単 ✓ 依存を静的に宣言 使える場面 デフォルトの選択として利用できる ▼コンストラクタにモデルの機能が含まれる例
20 ©BrainPad Inc. Strictly Confidential メソッドの注入 メソッドを呼び出す際に必要とされる依存をそのメソッドの引数で定義するパターン メリット ✓ メソッドの呼び出しごとに異なる依存を提供
✓ 中間情報によって依存が変わる場合の注入が容易 使える場面 メソッドを呼び出すたびに依存が変化する場合 メソッドごとに依存が違う場合 ▼前処理が適用ごとに変わる例 ▼applyするタイミングで依存が注入される
21 ©BrainPad Inc. Strictly Confidential プロパティの注入 既定の依存(ローカルデフォルト)をプロパティとして公開し、Setterで置き換えられるようにするパター ン メリット ✓
理解しやすい ✓ 事前に依存を容易する必要がない 使える場面 変更がほとんどないコンポーネントやライブラリなど ▼前処理をローカルデフォルトとして扱っている例
22 ©BrainPad Inc. Strictly Confidential 依存注入(DI)のポイント ③合成を行う
23 ©BrainPad Inc. Strictly Confidential 合成を行う 合成とは関連するモジュールを用いてアプリケーションを構築すること • 全てのモジュールをまとめて合成する •
そのため、全てのモジュールに依存する ここで合成を行う
24 ©BrainPad Inc. Strictly Confidential 合成基点 まとめて合成を行うところを合成基点と呼び、エントリポイントに可能な限り近くが良い • 依存関係が一目でわかり、手をつけやすくなる •
切り分けがしやすくなる 合成基点 Trainer TrainData Preprocessi ng Filter Model
25 ©BrainPad Inc. Strictly Confidential 合成基点の実装例 合成基点 Trainer TrainData Preprocessi
ng Filter Model 合成基点 ▼Trainerが何にどう依存しているかが一目でわかる
26 ©BrainPad Inc. Strictly Confidential 依存注入(DI)のポイント ①クラスを作る ②注入のパターンを決める ③合成を行う 3つのポイントを意識するだけで十分な効果を得られる
初めは機能単位で 良い 基本は コンストラクタ 合成基点はエント リーポイント
27 ©BrainPad Inc. Strictly Confidential その先のはなし
28 ©BrainPad Inc. Strictly Confidential DIコンテナ オブジェクト合成、介入、生存管理などさまざまなタスクを自動化するソフトウェア・ライブラリ 観点 概要 合成
• 関連するモジュールを用いて階層を構築する • 先ほど見てきたもの 生存管理 • 依存がどのくらい生存することを意図しているのかを表現したもの • 管理が複雑化し始めた場合にDIコンテナを導入するか検討するとよい 介入 • 処理の追加、振る舞いの変更を行えるようにすること • 切り替えを前提にした設計
29 ©BrainPad Inc. Strictly Confidential DIコンテナにおける合成 ✓ 依存の構成がモジュールに一元化 ✓ デコレータで簡単に設定できる
✓ 柔軟な差し替えができる ✓ オブジェクトグラフを記述することなく、自動 で合成を行ってくれる ✓ 重複を削減 ▼合成基点の例をDIコンテナで書き換えた例
30 ©BrainPad Inc. Strictly Confidential DIコンテナにおける生存管理 ✓ 生存管理もデコレータで設定可能 ✓ カスタムのデコレータも作成可能
✓ 管理用のコードを用意する必要なく、DIコンテ ナが管理してくれる ▼生存戦略を利用する例
31 ©BrainPad Inc. Strictly Confidential DIコンテナにおける介入 ✓ 介入される側(Model、Trainer)を変更する ことなく、ロジックを組み込める ✓
コード例はログを組み込んでいる ✓ モジュールで介入を設定する ▼クラスの定義(ModelとTrainerは変更なし) ▼モジュールで介入を設定
32 ©BrainPad Inc. Strictly Confidential まとめ PoCから開発へ進む際の壁 ✓ フェーズ間の目的の違いから、技術的負債が表面化 ✓
想定以上の工数を要する場合が大半 三つのステップで依存注入(DI) ① クラスを作る ② 依存パターンを決める ③ 合成を行う 開発を加速させていこう!
株式会社ブレインパッド 106-0032 東京都港区六本木三丁目1番1号 六本木ティーキューブ TEL:03-6721-7002 FAX:03-6721-7010 www.brainpad.co.jp
[email protected]
本資料は、未刊行文書として日本及び各国の著作権法に基づき保護されております。本資料には、株式会社ブレインパッド所有の特定情報が含まれており、これら情報に基づく本資料の内容は、貴社以外の第三者に開示されること、また、本資料を評価する以外の目的で、その 一部または全文を複製、使用、公開することは、禁止されています。また、株式会社ブレインパッドによる書面での許可なく、それら情報の一部または全文を使用または公開することは、いかなる場合も禁じられております。
©BrainPad Inc.
37 ©BrainPad Inc. Strictly Confidential 話しきれないこと