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

DTD_ML開発で役立つ依存注入の基本

 DTD_ML開発で役立つ依存注入の基本

Avatar for BrainPad

BrainPad

May 29, 2025
Tweet

More Decks by BrainPad

Other Decks in Technology

Transcript

  1. ©BrainPad Inc. Strictly Confidential 2 佐藤瑞起(さとうみずき) ブレインパッド 機械学習エンジニア • 入社

    • 2023年新卒入社 • 趣味 • サッカー • 映画 • 興味 • MLOps • エッジ推論 自己紹介
  2. 7 ©BrainPad Inc. Strictly Confidential PoCの成功後に立ちはだかる壁 各フェーズで目的が違う 短期で結果が求められる • コードより報告結果が重要

    動作すれば良い • Notebookや関数が乱立 実験的 • 試行回数が多く、似たようなコードが多く存在 システム化 PoC 拡張性 • システムの成長を見込んだ設計が必要 保守性 • テストや例外処理など正常な動作以外もケア 運用可能性 • モニタリング、再学習 短期成果 複数回の実験 拡張性 保守性 運用可能性 最低限の動作保証
  3. 10 ©BrainPad Inc. Strictly Confidential PoCの成功後に立ちはだかる壁 PoCは上手くいったぞ! アプリ化してこう で、何から手をつければ 良いんだ?

    設計やテスト、例外処理、 などやらないと けど、一つ加えるだけで 全部が影響する〜 何から手をつければ良い んだ?
  4. 11 ©BrainPad Inc. Strictly Confidential PoCの成功後に立ちはだかる壁 PoCは上手くいったぞ! アプリ化してこう で、何から手をつければ 良いんだ?

    設計やテスト、例外処理、 などやらないと けど、一つ加えるだけで 全部が影響する〜 何から手をつければ良い んだ? とにかく、依存注入(DI)をしよう
  5. 13 ©BrainPad Inc. Strictly Confidential 依存注入(DI)とは メリットがたくさん 拡張容易性 • 既存の拡張、再利用が容易となる

    • 想定外の場合にも堅牢 並列開発 • 切り分けやすいため、複数人で同時 に開発ができる 保守容易性 • クラスの責務が明確に定義されるた め、保守が行いやすい テスト容易性 • 切り分けやすくなるため、テストが 行いやすくなる
  6. 14 ©BrainPad Inc. Strictly Confidential 初めの一歩としてのDI ここから始めると 「小さい労力で開発の高速化が行える」 ✓ 開発のしやすさが向上する

    ✓ 影響範囲が見えやすため、次の対応としてどの選択を取ってもスムーズに対応できる ✓ 依存を整理していくと感じることが増え、設計などを検討していく上でのキッカケになりやすい ✓ 把握がしやすくなる ✓ 各モジュールの関係性が見やすく、他の人でも理解しやすい ✓ 整理することでコードの理解が深まる
  7. 17 ©BrainPad Inc. Strictly Confidential クラスを作る まずは機能をまとめるレベルで良いので、クラスを作成していく ✓ 責務の分離や抽象化は意識しなくてもOK ✓

    ある程度の機能単位でクラスにまとめる ✓ よくある分類: 前処理、モデル、学習、推論、データ関連 ▼前処理と学習をまとめた例
  8. 19 ©BrainPad Inc. Strictly Confidential コンストラクタの注入 対象のクラスが必要とする依存を全てコンストラクタの引数として定義するパターン メリット ✓ 依存が注入されることが保証

    ✓ 実装が簡単 ✓ 依存を静的に宣言 使える場面 デフォルトの選択として利用できる ▼コンストラクタにモデルの機能が含まれる例
  9. 20 ©BrainPad Inc. Strictly Confidential メソッドの注入 メソッドを呼び出す際に必要とされる依存をそのメソッドの引数で定義するパターン メリット ✓ メソッドの呼び出しごとに異なる依存を提供

    ✓ 中間情報によって依存が変わる場合の注入が容易 使える場面 メソッドを呼び出すたびに依存が変化する場合 メソッドごとに依存が違う場合 ▼前処理が適用ごとに変わる例 ▼applyするタイミングで依存が注入される
  10. 21 ©BrainPad Inc. Strictly Confidential プロパティの注入 既定の依存(ローカルデフォルト)をプロパティとして公開し、Setterで置き換えられるようにするパター ン メリット ✓

    理解しやすい ✓ 事前に依存を容易する必要がない 使える場面 変更がほとんどないコンポーネントやライブラリなど ▼前処理をローカルデフォルトとして扱っている例
  11. 25 ©BrainPad Inc. Strictly Confidential 合成基点の実装例 合成基点 Trainer TrainData Preprocessi

    ng Filter Model 合成基点 ▼Trainerが何にどう依存しているかが一目でわかる
  12. 28 ©BrainPad Inc. Strictly Confidential DIコンテナ オブジェクト合成、介入、生存管理などさまざまなタスクを自動化するソフトウェア・ライブラリ 観点 概要 合成

    • 関連するモジュールを用いて階層を構築する • 先ほど見てきたもの 生存管理 • 依存がどのくらい生存することを意図しているのかを表現したもの • 管理が複雑化し始めた場合にDIコンテナを導入するか検討するとよい 介入 • 処理の追加、振る舞いの変更を行えるようにすること • 切り替えを前提にした設計
  13. 29 ©BrainPad Inc. Strictly Confidential DIコンテナにおける合成 ✓ 依存の構成がモジュールに一元化 ✓ デコレータで簡単に設定できる

    ✓ 柔軟な差し替えができる ✓ オブジェクトグラフを記述することなく、自動 で合成を行ってくれる ✓ 重複を削減 ▼合成基点の例をDIコンテナで書き換えた例
  14. 30 ©BrainPad Inc. Strictly Confidential DIコンテナにおける生存管理 ✓ 生存管理もデコレータで設定可能 ✓ カスタムのデコレータも作成可能

    ✓ 管理用のコードを用意する必要なく、DIコンテ ナが管理してくれる ▼生存戦略を利用する例
  15. 31 ©BrainPad Inc. Strictly Confidential DIコンテナにおける介入 ✓ 介入される側(Model、Trainer)を変更する ことなく、ロジックを組み込める ✓

    コード例はログを組み込んでいる ✓ モジュールで介入を設定する ▼クラスの定義(ModelとTrainerは変更なし) ▼モジュールで介入を設定
  16. 32 ©BrainPad Inc. Strictly Confidential まとめ PoCから開発へ進む際の壁 ✓ フェーズ間の目的の違いから、技術的負債が表面化 ✓

    想定以上の工数を要する場合が大半 三つのステップで依存注入(DI) ① クラスを作る ② 依存パターンを決める ③ 合成を行う 開発を加速させていこう!