趣味で機械学習のインフラ周りを触っている個人開発エンジニアです。
個人学習で、YOLOのファインチューニングモデルをCloudflare R2で管理し、k8s環境のバックエンドサーバーが起動時にそれをダウンロードして推論を行うシステムを運用しています。
モデルファイルとイメージの切り離しや、k8sによるオートスケーリングが効く良い構成なのですが、Google Colabでの手動学習に限界を感じました。
データの蓄積をトリガーにして自動でモデルが進化していく、MLOpsのCTパイプラインへとアップデートしたいため、自分の備忘録として設計案をまとめます。
現在の構成
- モデル管理:Cloudflare R2
- 推論インフラ:Kubernetes
k8s上のバックエンドPodが起動時にR2から最新のYOLOモデルをダウンロードする構成です。イメージをビルドし直さずにデプロイできて気に入っています。
課題:Google Colabによる手動学習の限界
本番運用で新しい画像データが溜まるたび、手動でGoogle Colabを立ち上げて学習を回し、R2へアップロードしていました。
Colabは実験には最高ですが、インスタンスをイベント駆動で自動起動しにくく、運用の自動化には向いていません。
解決策:SageMaker × Step FunctionsによるCTの自動化
S3へのデータ蓄積をトリガーに、裏で自動的にGPUサーバーが立ち上がり、学習完了後にモデルをR2へ同期する完全自動のパイプラインを設計しました。
アーキテクチャ図
[ユーザー] ──> [Amazon S3]
│ ファイル数トリガー
▼
[Amazon EventBridge]
│
▼
[AWS Step Functions]
│
▼ [SageMaker Training Job]
(GPUサーバーが自動起動・学習後に自動消滅)
│
▼
[Cloudflare R2]
各コンポーネントの役割
-
Amazon S3 + Amazon EventBridge
新しい教師データをS3に溜めていき、ファイル数が規定値を超えたイベントをEventBridgeで検知してパイプラインをキックします。 -
AWS Step Functions
SageMakerの学習ジョブ作成から、完了後のR2同期までの一連のワークフロー管理を担当します。 -
Amazon SageMaker Training Job
Step Functionsから指示を受けると、学習を実行する瞬間だけGPUインスタンスを自動起動します。学習スクリプトを実行し終えると、成果物を吐き出してサーバーは自動消滅するため、コストを最小限に抑えられます。 -
Cloudflare R2 への自動デプロイ
SageMakerが吐き出した最新のモデルファイルを、Step Functionsの最終ステップでR2へ自動的に上書きアップロードします。
まとめ
このCTの仕組みが繋がることで、データ蓄積からSageMakerでの再学習、R2への自動デプロイ、k8sでの最新モデル読み込みまでがすべて自動で自律駆動するようになります。
個人開発のインフラとしてはかなり面白い構成になりそうなので、少しずつ実装を進めていこうと思います。