「枝は何も必要ありません:私たちの主観的なMLバージョニングフレームワーク」

「美容とファッションの専門家が語る:主観的なMLバージョニングフレームワークの秘訣」

Git ブランチを使用した機械学習プロジェクトのバージョン管理における実用的なアプローチ – ワークフローを簡素化し、データとモデルを整理する

まとめ

Git ブランチを使用した機械学習プロジェクトのバージョン管理を簡単にし、ワークフローを整理し、関連するプロジェクトの要素を結びつけるシンプルなアプローチ。

はじめに

機械学習ソリューションを管理する際には、ソリューションのさまざまな側面がしばしばGitHub(コード)、HuggingFace(モデル)、Weights and Biases(トラッキング)、S3(すべてのコピー)など、複数のプラットフォームと場所に分散しています。

データの面では、トレーニングデータ、処理済みデータ、トレーニングトラッキングデータ、モデルモニタリングデータがあります。推論のためのモデルを保存し、古いバージョンやオンラインテスト向けの実験的なモデルも含まれます。さらに、前処理、トレーニング、推論、実験、データサイエンス分析、および監視アラートのためのコードもあります。

これは簡単に手に負えなくなることがあります。

Image by author

さまざまなツール、環境、およびアセットアドレスを使用してMLライフサイクルのさまざまな部分を追跡することは、分散して調整されていない状態になる可能性があります。これはデータの損失、セキュリティ侵害、管理が慎重に行われる必要のある設定ミスにつながる可能性があります。

以前のプロジェクトでは、オンプレミスのソリューションでSageMakerを使用して日々のトレーニングを行っていました。これにより、顧客はモデルを毎日ダウンロードし、さまざまなクライアントのデータセットの組み合わせでトレーニングを行う必要がありました。

どのバイナリモデルがどのトレーニングコードでどのクライアントのどのデータでトレーニングされたかを管理する必要があり、どのモデルがどのクライアントでどの推論コードを使用して実行されるかなどを管理する必要がありました。

本記事では、Gitを使用してこれらの問題を解決するためのデータバージョニングツールの活用方法を紹介します。

データバージョニングツールを使用すると、サイズに関係なくデータとモデルファイルをコードと一緒にコミットできます。このようにすべてのファイルをバージョン管理することで、データとモデルのアセットの管理の手間を省くことができます。

理想的には、特定のタスクに必要なコード、データ、モデルのみを持つことができるはずです。MLのトレーニングを開発または実行したり、実験をトラッキングしたり、本番でモデルを監視したり、オンライン実験を行う場合でもです。

正しいピースを手動で(または自動で)接続する代わりに – 正しいデータを正しいコードに読み込み、それらを正しいHuggingFaceのモデルに接続し、正しい環境で実行する – ブランチをチェックアウトするたびに、すべてのピースがそろっているイメージを想像してみてください。

本記事では、ほとんどのMLチームが既に使用しているシステムであるGitを使用したツールの複雑さを取り除き、Gitによって管理されるシングルな場所にすべてを集約するフレームワークをご紹介します。

要件

  1. シンプルなワークフロー: 一時停止、再開、ビジネスおよび開発のニーズに対応するための調整が容易であり、再現性をサポートし、例えば「モデルのトレーニングに使用されたデータは何ですか?」などのクエリを可能にする。>
  2. データとコードの効率的な利用:連携、ガバナンス、および監査を重視します。可能な限りデータとコードを再利用し、コミット、イシュー、タグなどのGitの機能を活用することを目指します。
  3. MLソリューションのさまざまな側面を統合することは重要です。実験のトラッキング、本番でのモデル監視、オンラインおよびオフラインの実験は、ソリューションのトレーニングおよび推論の側面とは別々になることがよくあります。ここでは、それらを1つの枠組みで統一し、容易に切り替えられるようにすることを目指します。
  4. 早期共有可能なデータ分割、テスト、および異なるMLエンジニア向けの簡単なコラボレーションなど、GitとMLのベストプラクティスに従います。

キーコンセプト

すべての変更はGitのコミットです。これには、データのアップロード、特徴エンジニアリング、モデルの上書き、実験メトリクスの結果のマージ、モデルモニタリング、自然なコードの変更などが含まれます。

アクティブなブランチ:開発と本番用に異なるブランチを使用するのは一般的ですが、ここではさらに一歩進めます。つまり、ブランチをチェックアウトして必要なすべてのデータ、コード、モデル、ドキュメント、README、およびメトリクス付きのモデルカードを1つの場所に持つことができます。

🤯 リポジトリーはあなたのブロブストアです! ブランチは、ブロブストア内のバケットのように機能し、データとモデルをアップロード、ダウンロード、保存することができます。

これにより、異なる開発、実験、およびプロダクションのニーズに応じて異なるブランチを使用できます。異なるプラットフォームやツールに頼らずに済みます。

マージのワークフロー:ブランチを結合するために使用されます。コードは通常通りマージされ、モデルは通常既存のモデルを上書きします。データのマージでは通常追加されます。新しいデータを受け取るために、別のブランチからコピーして「プル」します。

マージデータは、単純にファイルのコピーまたはJSONリストへの追加として行われることがあります。より高度な場合では、SQLiteデータベースをマージすることもできます。

重複排除(デデュプリケーション)は、データバージョニングツールでよく使用される機能で、同じファイルを含む複数のブランチがある場合でも、複数のコピーを作成しないようにします。

ブランチの種類

Image by author

メインブランチ

まず、プロジェクトのメインブランチを使用して、問題の定義、ドキュメント、データの説明、およびプロジェクトの構造を保存します。これは協力と議論のためのスペースとして機能します。

ヒント:ビジネスの問題を明確に定義し、望ましい結果を決定し、目標値またはラベルを特定し、それらがどのように得られるかを確認し、評価基準と要件を確立することで、プロジェクトを成功させることができ、オンボーディングと協力の場を提供できます。

また、MLflowのmlrunsフォルダーなど、実験の結果が統合されるトラッキングにも使用できます。どのような協力者でもこのブランチをチェックアウトしてUIを実行できます。

また、トラッキングは別のブランチで行うこともできます。

この方法で始めるのは非常に簡単であり、必要に応じて時間の経過とともにMLflowサーバーやWeights and Biasesのようなトラッキングプラットフォームに最小限の変更でアップグレードすることも可能です。

データブランチ

これらはプロジェクトのブランチであり、主にデータファイル、ドキュメント、および変換スクリプトを含み、アクティブなままです。これはS3バケットのようなもので、アップロードやダウンロードではなく、ブランチをチェックアウトし、ファイルを利用できるようにします。

常にrawブランチにコミット(アップロード)することをお勧めします。これにより、データがどこから来ているか、どこを通過しているかを常に追跡することができます。また、新しいフローの作成や監査、ガバナンスも容易に行えます。

💡 データの取得元を示すコミットメッセージを追加すると、データに対するより細かい監視ができます。

クリーンなデータのみが存在する別のクリーンブランチを使用することもできます。たとえば、rawブランチにアップロードされた破損した画像や空のテキストファイルは、クリーンブランチに表示されません。

データがトレーニング、バリデーション、テストに分割される分割ブランチを使用することで、すべてのチームと協力者が同じ土俵で作業できるようになります。

このアプローチはデータ漏洩の防止に役立ち、より堅牢な特徴量エンジニアリングと協力を可能にします。テストセットの例がトレーニング段階に含まれる可能性を最小限に抑えることは、バイアスを導入するリスクを減らすことにつながります。さらに、すべての協力者が同じ分割を使用することで、実験結果が一貫性のある偏りのない結果をもたらします。

かつての分類プロジェクトでは、個々の貢献者のチームの一員であり、各人がゼロからパイプライン全体を実行したことがありました。各人が異なるデータの分割割合とシードを使用したため、バグやデータバイアスに基づいてプロダクションモデルの品質が低下しました。

Image by author

💡 機械学習のヒント:モデル開発の3つのフェーズのベストプラクティス「トレーニング」と「バリデーション」のデータセットを使用してモデルのハイパーパラメーターをトレーニングし最適化します。次に、トレーニングプラスバリデーションをトレーニングセットとして使用して調整済みモデルをトレーニングし、テストデータセットで評価します。1回だけテストデータセットで評価され、最後にすべてのデータでモデルをトレーニングし保存します。

安定したブランチ

これらのブランチは、トレーニングと推論のためのアクティブなブランチです。ここで、トレーニングを実行し、モデルやチェックポイント、モデルカードを保存し、テストを実行し、Dockerイメージをビルドしてテストし、トレーニングサイクルの終わりにすべてをコミットし、タグを付けることができます。これらのブランチは、新しいデータの取得と再学習を処理できる必要があります。ここで自動化が行われます。

⚠️ これらのブランチにはコードが書かれていません。

これにより、モデルはトレーニングに使用されたデータ、トレーニングと本番実行に使用されるコード(特徴エンジニアリングを含む)、および結果のメトリクスと結び付けられます。これらのコンポーネントは、単一の統合された「スナップショット」として組み合わせられます。タグをチェックアウトするたびに、そのモデルに必要なすべての要素が存在します。

💡 ヒント: 事前にタグ名を選択することで、トレーニング中に追跡情報をパラメータとして追加することができます。これにより、任意のトラッキングツールを使用して、トラッキングデータを使用してモデル-データ-コードの「スナップショット」を常に取得できるようになります。

トレーニング後、トラッキングデータのみが追跡用のメインブランチにマージ(コピー)されます。

最も単純な場合、ハイパーパラメータと評価結果を含むJSONテキストファイルです。このファイルは、メインブランチのリストに追加されます。MLflowの場合、mlrunsフォルダから実験をメインブランチにコピーする必要があります。

コーディングブランチ

これらのブランチは、コード開発とデータ探索、サンプリングされたデータまたは小さなデータでのトレーニングを行うためのものです。開発中は、すべてのGitのベストプラクティスを利用できます。ただし、追加のデータが取り込まれても、コードの変更が必要ない場合にのみ安定ブランチに分岐してください。これらのブランチには、推論コード、サーバー、Dockerfile、およびテストが含まれています。

常にアクティブな開発ブランチが少なくとも1つ存在します。そのブランチには、すべての新機能、バグ修正、およびその他の変更がマージされます。

💡 MLおよびMLOpsエンジニアはトレーニングと推論の両面で共同作業ができます。

たとえば、dev/modelブランチを作成し、ベースラインモデルを開発することができます。これは、分類の場合は最も人気のあるクラス、回帰の場合は平均値/中央値などが考えられます。重点はコードの設定に置かれ、データを徹底的に理解することです。

安定したモデルになり、テストが合格したら、モデル、コード、データをリモートにトレーニングしてコミットし、タグを付けるためにstable/modelにブランチアウトします。これは、DevOps、バックエンド、フロントエンドのチームが開発を開始し、フィードバックを交換するために素早く簡単に共有できるようにし、早期に新たに発見された要件の実世界環境での検証を容易にします。

次に、dev/modelブランチでモデルを簡単なモデル(例:線形回帰)に開発し、準備ができたら、テストが合格したら、stable/modelにマージしてリリースのトレーニング、コミット、およびタグ付けを行います。

このアプローチにより、モデルの内容を完全に保存しながら、モデルを段階的に改善する自由が得られます。

Image by author

この時点から、3つのオプションがあります:

  • データが到着した場合、より多くのデータを安定ブランチに取り込むことで再トレーニングを行うことができます。
  • dev/linear-regressionブランチで特徴エンジニアリングを使用して実験を開始することができます。
  • より高度なモデルのために新しいdev/new-approachブランチを作成することができます。

モニタリングブランチ

モデルのモニタリングでは、データの分布、外れ値、および予測分布に注意が必要です。

モニタリングブランチでは、問い合わせられたデータをファイルとして保存し、本番の結果とモデル予測をコミットしタグ付けします。

💡 各環境ごとに複数のモニタリングブランチを使用できます – dev、stable、およびprod。

データコミットに対してアラートを設定することで、特徴の分布におけるドリフト、外れ値、キャリブレーションのサニティテストなどをテストすることができます。また、アラートコードを保存することもできます。これにより、外れ値検出モデルなどの高度なソリューションが可能になり、このブランチにモデルを保存することもできます。

作者による画像

このブランチは通常、モニタリングログの作成に責任を持つコードや、それらを生成したデータとモデルと切り離された別のプロジェクトに属する可能性があります。

解析ブランチ

データサイエンスと解析は、しばしば別のプロジェクトに分離されるプロジェクトの別の側面です。ここには、データサイエンティストの解析コードと非トレーニングデータが集められます。

データサイエンティストは、解析、A/Bテスト、オンラインおよびオフラインの実験の実行のために、モニタリングブランチからデータをチェックアウトして取得することができます。これらの目的のために、生のブランチからもデータを使用することができます。

オンラインの例では、各実験グループが1つのブランチに対応するため、シンプルです。

💡 ヒント:よくあるオンラインの実験:

フォワードテスト – 現在のモデル99%対候補モデル1%の比較。

バックテスト – 新しいモデルをマージした後、以前のモデルに1%を残して、逆方向の期待効果を検証します。

モニタリングデータでモデルタグをパラメータとして持つことで、メトリックにおける変更のポテンシャル原因を特定するのに役立ちます。

要約

作者による画像

この記事では、Gitブランチを使用してバージョン管理された機械学習プロジェクトのフレームワークを紹介しています。このフレームワークは、ワークフローを簡素化し、データとモデルを整理し、プロジェクトの関連する部分を結びつけることを重視しています。各ブランチには、特定のタスクに必要なデータ、コード、モデル、およびドキュメントが含まれます。また、異なるアクティブなブランチカテゴリの使用など、主要な概念についても説明しています。全体として、このフレームワークは機械学習プロジェクトにおけるワークフローの効率性、ガバナンス、およびコラボレーションを向上させることを目的としています。

もし話をしたり、もっと学びたい場合は、私たちのdiscordに参加するか、私たちのブログをフォローしてください。

エピローグ

オンプレミスの課題に関して、関連するトレーニングコードとデータセットの組み合わせごとに「stable」ブランチを維持しました。トレーニングが完了した後、適切なタグ(<クライアントID>-<インクリメンタルバージョン>)でコミットにタグを付けました。クライアントは、他のリリースと同様に、最新のタグをプルすることができます。

クライアントの「デバッグ」時には、特定の瞬間のタグを参照してコードと対応するデータを確認します。また、モニタリングデータにも同じタグが追加されるため、モニタリングデータを一致させることもできます。解析ノートブックは、ds/client-idブランチにあります。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more