「より良いMLシステムの構築-第4章 モデルの展開とその先」
「美しさとファッションの専門家による魅力的な記事を書く」
デプロイ、監視、データの分布の変化、モデルの更新、本番でのテストについて
モデルのデプロイと本番でのサポートは、機械学習よりもエンジニアリングに関連するものです。
MLプロジェクトが本番に近づくと、ますます多くの人々が関与します。バックエンドエンジニア、フロントエンドエンジニア、データエンジニア、DevOps、インフラエンジニア…
彼らはデータストレージを選択し、ワークフローとパイプラインを導入し、サービスをバックエンドとUIのコードベースに統合し、リリースを自動化し、バックアップとロールバックを作成し、コンピューティングインスタンスを設定し、監視とアラートを設定します… 今日では、誰もデータサイエンティスト/MLエンジニアがすべてを行うことを期待していません。たとえ小規模なスタートアップでも、専門家がいることが一般的です。
「なぜデータサイエンティスト/MLエンジニアが本番について知っている必要があるのか?」と思うかもしれません。
- 「複雑さを排除したデータレイクテーブル上のデータアクセスAPI」
- ネットワークXによるソーシャルネットワーク分析:優しいイントロダクション
- 「もし私たちが複雑過ぎるモデルを簡単に説明できるとしたらどうだろう?」
ここに私の答えがあります:
モデルを本番に持っているだけでは、すべてのML関連のタスクが完了したわけではありません。はい!到底近くにもありません。これからは、新たな一連の課題に取り組む時です。モデルを本番で評価し、その精度がまだ満足であるかを監視する方法、データの分布の変化を検出して処理する方法、モデルの再トレーニングの頻度、新たにトレーニングされたモデルがより良いことを確認する方法など、さまざまなアプローチがあります。これらについて詳しく議論していきます。
この投稿では、意図的にMLのトピックに焦点を当て、多くのエンジニアリングコンセプトを省略したり、高レベルでカバーしたりしています。これにより、さまざまな経験レベルを持つ人々にとって、シンプルで理解しやすくなっています。
これは「より良いMLシステムの構築」シリーズの最終回です。このシリーズでは、マシンラーニングシステムの設計と構築の芸術、科学、そして(時には)魔法を習得するのに役立つことを目指しています。前の章では、プロジェクト計画とビジネス価値について既に話しました(第1章);データの収集、ラベリング、検証について話しました(第2章);モデルの開発、実験の追跡、オフライン評価について話しました…(第3章)。前の投稿を見逃した場合は、この投稿を読む前または後に目を通すことをお勧めします。
デプロイ
モデルを本番にデプロイする際には、次の2つの重要な質問を考える必要があります:
- モデルはリアルタイムで予測を返すべきですか?
- モデルはクラウドにデプロイできますか?
最初の質問は、リアルタイム対バッチ推論の間で選択する必要があることを示しています。2つ目の質問は、クラウド対エッジコンピューティングの間で選択する必要があります。
リアルタイム対バッチ推論
リアルタイム推論は、モデルと直感的に連携する方法です。入力を与えると、予測が返されます。このアプローチは、予測が即座に必要な場合に使用されます。例えば、銀行は取引を確定する前に詐欺でないかどうかをリアルタイム推論を使用して確認するかもしれません。
一方、バッチ推論は実行コストが安く、実装が容易です。以前に収集された入力データを一括して処理します。バッチ推論は、評価(静的なテストデータセット上で実行する場合)、特定のキャンペーン(メールマーケティングキャンペーンの顧客選択など)、または即時の予測が必要でない状況に使用されます。バッチ推論は、リアルタイム推論のコストや速度を最適化するための方法でもあります。事前に予測を計算し、要求された時に返すことができます。
リアルタイム推論を実行することは、バッチ推論よりもはるかに困難で高コストです。なぜなら、モデルは常に動作して低レイテンシで予測を返す必要があるからです。適切なインフラストラクチャと監視セットアップが必要であり、同じ会社内でも異なるプロジェクトに対してそれぞれ固有のものである場合があります。したがって、ビジネスにとって予測を即座に取得することが重要でない場合は、バッチ推論を使って満足しましょう。
しかし、多くの企業にとって、リアルタイムの推論は精度と収益に大きな違いをもたらします。これは、検索エンジン、推薦システム、広告クリック予測に当てはまりますので、リアルタイムの推論インフラへの投資は十分に正当化されています。
リアルタイムとバッチ推論の詳細については、以下の記事を参照してください:- Microsoftによる本番環境での機械学習モデルの展開– Luigi Patrunoによるバッチ推論とオンライン推論
クラウド vs エッジコンピューティング
クラウドコンピューティングでは、データは通常インターネット経由で転送され、集中型サーバーで処理されます。一方、エッジコンピューティングでは、データは分散型のデバイス上で生成された場所で処理されます。エッジデバイスの例には、電話、ノートパソコン、車などがあります。
NetflixやYouTubeなどのストリーミングサービスでは、通常推奨システムをクラウドで実行しています。彼らのアプリやウェブサイトはユーザーデータをデータサーバーに送信して推薦を取得しています。クラウドコンピューティングは比較的簡単に設定でき、計算リソースをほぼ無制限にスケーリングできます(少なくとも経済的に合理的な範囲内で)。ただし、クラウドインフラは安定したインターネット接続に依存しているため、機密性の高いユーザーデータはインターネット経由で転送されるべきではありません。
エッジコンピューティングはクラウドの制約に対処するために開発され、クラウドコンピューティングができない場所で動作することができます。自動運転エンジンは車上で動作しているため、安定したインターネット接続がなくても高速に動作できます。スマートフォンの認証システム(iPhoneのFaceIDなど)はスマートフォン上で動作します。なぜなら、機密性の高いユーザーデータをインターネット経由で転送するのは良いアイデアではなく、ユーザーはインターネット接続なしで電話をアンロックする必要があるからです。ただし、エッジコンピューティングが有効であるためには、エッジデバイスが十分にパワフルであるか、またはモデルが軽量で高速である必要があります。これにより、ランクが低い近似、知識蒸留、剪定、量子化などのモデル圧縮手法が生まれました。モデル圧縮についてもっと学びたい場合は、こちらを参照してください。
エッジとクラウドコンピューティングの詳細については、以下の記事を読んでください:- NVIDIAによるエッジコンピューティングとクラウドコンピューティングの違いは何ですか?– Mounika Narangによるエッジコンピューティングとクラウドコンピューティングの主な違い
簡単なデプロイとデモ
「プロダクションはスペクトラムです。一部のチームにとって、プロダクションはノートブックの結果からビジネスチームに示すための素晴らしいプロットを生成することを意味します。他のチームにとっては、プロダクションは1日に何百万人ものユーザーに向けてモデルを稼働させ続けることを意味します。」Chip Huyen, データサイエンティストがKubernetesを知らなくてもいい理由
数百万人のユーザーにモデルを提供するためのデプロイは、大規模なチームのタスクですので、データサイエンティスト/MLエンジニアとしては一人で取り組むことはありません。
ただし、時には一人でデプロイする必要があります。ペットプロジェクトや学習プロジェクトに取り組んでいてデモを作成したい場合や、会社で最初のデータサイエンティスト/MLエンジニアであり、会社がデータサイエンスチームをスケーリングする前に何らかのビジネス価値を提供する必要がある場合、または同僚が忙しすぎていてサポートを待つことができない場合など、自分自身でデプロイする方法が必要なことがあります。これらの課題に直面するのはあなただけではありません。幸い、あなたをサポートするための解決策があります。
モデルをデプロイするためには、モデルが実行されるサーバー(インスタンス)、モデルとやり取りするためのAPI(入力を送信し、予測を取得する)、および必要に応じてユーザーインターフェイス(ユーザーからの入力を受け入れ、予測を表示する)が必要です。
Google Colaboratoryは、Jupyter Notebookの進化版です。デモを作成して共有するのに最適なツールです。特定のインストールはユーザー側で必要ありませんし、コードを実行するためのGPU付きの無料サーバーを提供しています。また、ユーザーからのさまざまな入力(テキストファイル、画像、ビデオ)を簡単に受け入れるようにカスタマイズすることもできます。学生や機械学習研究者の間で非常に人気があります(DeepMindの研究者がどのように使用しているかはこちらをご覧ください)。Google Colaboratoryについてもっと詳しく学びたい場合は、こちらから始めてください。
FastAPIはPythonでAPIを構築するためのフレームワークです。おそらくFlaskについて聞いたことがあるかもしれませんが、FastAPIはコーディングがより簡単で、APIに特化しており、より高速です。詳細については、公式ドキュメントをご覧ください。実用的な例については、Goku MohandasによるAPIs for Model Servingを読んでみてください。
Streamlitは、ウェブアプリケーションを作成するための簡単なツールです。本当に簡単です。そして、アプリケーションは画像、プロット、入力ウィンドウ、ボタン、スライダーなどを備えた素敵でインタラクティブなものになります。StreamlitはCommunity Cloudも提供しており、無料でアプリを公開することができます。始めるには、公式チュートリアルを参照してください。
クラウドプラットフォーム。GoogleとAmazonは、展開プロセスを簡単でアクセス可能なものにするために素晴らしい仕事をしています。彼らはモデルのトレーニングと展開に対して有料のエンドツーエンドのソリューションを提供しています(ストレージ、コンピュートインスタンス、API、モニタリングツール、ワークフローなど)。これらのソリューションは簡単に始めることができ、特定のニーズをサポートするための幅広い機能も備えているため、多くの企業がクラウドプロバイダとともに本番インフラを構築しています。
さらに学びたい場合は、次のリソースをご覧ください:- Alex Olivierによるスケールでサイドプロジェクトを展開する– Amazonによる推論用モデルの展開– Googleによるモデルをエンドポイントに展開する
モニタリング
MLシステムも、本番環境でのすべてのソフトウェアシステムと同様にモニタリングする必要があります。これにより、バグの迅速な検出とローカライズ、および致命的なシステムの障害を防ぐことができます。
技術的には、モニタリングとはログの収集、これらのメトリックの計算、Grafanaなどのダッシュボードでのこれらのメトリックの表示、およびメトリックが予想範囲外になったときのアラートの設定を意味します。
どのメトリックをモニタリングすべきか? MLシステムはソフトウェアシステムの一部であるため、まずは運用メトリックから始めましょう。例えば、マシンのCPU/GPUの利用率、メモリとディスクスペースの使用状況、アプリケーションへの送信リクエストの数とレスポンス遅延、エラーレート、ネットワーク接続などです。運用メトリックのモニタリングについて詳しくは、Justin Ellingwoodの投稿メトリック、モニタリング、アラートの紹介をご覧ください。
運用メトリックはマシン、ネットワーク、およびアプリケーションの健全性に関するものですが、ML関連のメトリックではモデルの正確性と入力の一貫性をチェックします。
正確性は最も重要なことです。これは、モデルが予測を返すかもしれないが、その予測が完全に外れる可能性があり、評価されるまでそれに気づかないかもしれないことを意味します。自然なラベルが迅速に利用可能になるドメイン(推薦システムなど)で働いている場合は、単にこれらのラベルを収集し、モデルを評価し、常に収集し続けることができます。ただし、多くのドメインでは、ラベルが到着するまで時間がかかるか、まったく到着しない場合があります。そのような場合、正確性の低下を間接的に示す可能性のある何かをモニタリングすることが有益です。
なぜモデルの正確性が低下する可能性があるのですか?最も広範な理由は、本番データがトレーニング/テストデータから変化したためです。コンピュータビジョンの場合、データが変化したことを目視で確認することができます:画像が暗くなったり、明るくなったり、解像度が変化したり、屋内の画像が屋外よりも多くなったりします。
データのドリフト(または「データ分布の変化」とも呼ばれる)を自動的に検出するには、モデルの入力と出力を継続的に監視します。モデルへの入力はトレーニング時に使用したものと一致している必要があります。表形式のデータの場合、これは列名および特徴量の平均と分散が同じであることを意味します。また、モデルの予測の分布をモニタリングすることも価値があります。分類タスクの場合、それぞれのクラスに対する予測の比率を追跡することができます。以前はクラスAとして5%のインスタンスを分類していたモデルが、現在はそれを20%として分類するようになった場合、明らかに何かが起こった証拠です。データドリフトについて詳しくは、Chip Huyenの素晴らしい投稿データ分布の変化とモニタリングをご覧ください。
モニタリングについてはまだ語ることが多くありますが、先に進む必要があります。もっと情報が必要な場合は、これらの投稿をチェックしてください:- Goku MohandasによるMonitoring Machine Learning Systems – Stephen OladeleによるA Comprehensive Guide on How to Monitor Your Models in Production
モデルの更新
モデルを本番環境にデプロイして何もせずに放置すると、その正確性は時間とともに低下します。ほとんどの場合、データの分布変化により説明されます。入力データの形式が変わることがあります。ユーザーの行動は、何の理由もなく常に変化します。流行病、危機、戦争が突然発生し、以前に機能したルールや仮定を打ち破ることがあります。 「変化こそが唯一の定数である」- ヘラクレイトス。
それがなぜ、本番モデルは定期的に更新される必要があるのです。更新には、モデルの更新とデータの更新の2種類があります。モデルの更新では、アルゴリズムやトレーニング戦略が変更されます。モデルの更新は定期的に行われる必要はありません。通常は、ビジネスのタスクが変更された場合、バグが見つかった場合、またはチームが研究に時間を割く場合に行われます。一方、データの更新は、同じアルゴリズムが新しいデータでトレーニングされることを指します。定期的なデータの更新は、どんなMLシステムにおいても必須です。
定期的なデータの更新の前提条件は、自動データフロー、モデルのトレーニング、評価、展開をサポートするインフラストラクチャを設定することです。
データの更新は、できるだけ少ない手動介入で行われる必要があります。手動の努力は主にデータの注釈づけにほぼ予約されるべきであり(データの注釈づけのチームへのデータフローが完全に自動化されることを確保しながら)、最終的な展開の決定をするかもしれません。モデルのトレーニングと展開のフェーズで浮上する可能性のあるバグに対処するための手動介入も行われるかもしれません。
インフラストラクチャが設定されたら、更新の頻度は設定ファイルで調整する必要がある値となります。新しいデータでモデルをどのくらいの頻度で更新するべきですか?答えは、可能な限り頻繁にかつ経済的に妥当な範囲で更新することです。更新の頻度を増やすことがコスト以上の価値をもたらす場合は、積極的に増やすことが推奨されます。ただし、モデルが人間の注釈に依存している場合、毎時のトレーニングは実現しないかもしれません。
ゼロからトレーニングするか、新しいデータでファインチューニングするか?これは二者択一ではなく、その両方の組み合わせです。モデルのファインチューニングは、コスト効果が高く、学習からの時間も短いため、合理的な選択です。ただし、場合によってはゼロからトレーニングする必要もあります。ファインチューニングは、コストと時間の最適化です。通常、企業は最初にゼロからトレーニングという簡単なアプローチから始め、プロジェクトが拡大し進化するにつれて、ファインチューニングを取り入れていきます。
モデルの更新について詳しく知りたい場合は、この投稿をチェックしてください:モデルの更新について分析的に考える:リトレーニングするかしないか – Emeli Dral et al.による投稿
本番でのテスト
モデルを本番環境にデプロイする前に、徹底的に評価する必要があります。前回の投稿でオフラインでの評価についてすでに説明しました(セクション「モデルの評価」を参照)。しかし、デプロイして初めてモデルのパフォーマンスがわかります。これが本番でのテスト、またはオンライン評価と呼ばれるものです。
本番でのテストは、確認もせずに信頼性のある既存のモデルを新しくトレーニングしたモデルと交換して、最初の予測を待ち構え、最小の問題が起きたら元に戻すという無謀なことではありません。お金や顧客を失うリスクを冒さずに、本番環境でモデルをテストするためのより賢明で安全な戦略があります。
A/Bテストは、業界で最も人気のあるアプローチです。この方法では、トラフィックを既存のモデルと新しいモデルの間で一定の割合でランダムに分割します。既存と新しいモデルは実際のユーザーのために予測を行い、予測は保存され、後で注意深く検査されます。モデルの正確性だけでなく、コンバージョンや収益など、ビジネスに関連するメトリクスを比較することも有用です。これらのメトリクスは、正確性と負の相関関係を持つことがあるかもしれません。
A/Bテストは統計的仮説検定に大きく依存しています。詳細を学びたい場合は、この投稿をご覧ください:A/Bテスト:統計的テストの完全ガイド – Francesco Casalegnoによる投稿。A/Bテストのエンジニアリング実装については、オンラインABテストパターンをチェックしてください。
影の展開はモデルをテストする最も安全な方法です。アイデアは、すべてのトラフィックを既存のモデルに送り、通常の方法でエンドユーザーに予測結果を返すと同時に、新しい(シャドウ)モデルにもすべてのトラフィックを送ることです。シャドウモデルの予測はどこにも使用されず、将来の分析のためにのみ保存されます。
カナリアリリース。これは「ダイナミックな」A/Bテストと考えることができます。新しいモデルは既存のモデルと並行して展開されます。最初の段階では、新しいモデルへのトラフィックはわずか1%などの小さな割合でしか送られません。残りの99%は既存のモデルによって提供され続けます。新しいモデルのパフォーマンスが十分に良い場合、トラフィックの割合は徐々に増加し、再評価され、再増加され、最終的にはすべてのトラフィックが新しいモデルによって提供されるようになります。ただし、新しいモデルのパフォーマンスが悪い場合は、本番環境から削除され、すべてのトラフィックが既存のモデルに向けられます。
以下は、これについて詳しく説明している記事です:Shadow Deployment Vs. Canary Release of ML Models by Bartosz Mikulski(英語)。
結論
この章では、モデルが本番環境に展開されると、新たな課題が生じることを学びました。モデルの運用およびMLに関連するメトリクスは、連続的に監視する必要があります。バグが発生した場合には迅速に検出し修正する必要があります。モデルは定期的に新しいデータで再トレーニングする必要があります。データの分布が変わるため、精度が時間とともに低下します。モデルを展開する前に行うべき高レベルの意思決定について話しました。リアルタイム vs. バッチ推論、クラウド vs. エッジコンピューティングのいずれかを選択することによる利点と制約について説明しました。簡単に展開およびデモを行うためのツールについても触れました。そして、静的データセットでのオフライン評価に加えて、モデルは本番環境で評価される必要があることを学びました。実際にリリースするまで、モデルが本番環境でどのように機能するかはわかりません。この問題から、「安全な」制御された本番テストであるA/Bテスト、シャドウ展開、およびカナリアリリースが生まれました。
これは「Building Better ML Systems」シリーズの最終章でもありました。最初から一緒にいてくれた方々には、MLシステムは単なる素敵なアルゴリズム以上のものであることをご理解いただけたことを願っています。このシリーズが役に立ち、視野を広げ、より良いMLシステムを構築する方法を学ぶことができたことを願っています。
お読みいただき、ありがとうございました!
以前の章を見逃した場合は、以下に完全なリストがあります:
Building Better ML Systems. Chapter 1: Every project must start with a plan.
MLプロジェクトのライフサイクル、ドキュメントのデザイン、ビジネス価値、および要件について。小さい規模で始めて失敗を学ぶことについて。
towardsdatascience.com
Building Better ML Systems. Chapter 2: Taming Data Chaos.
データ中心のAI、トレーニングデータ、データラベリングとクリーニング、合成データ、および一部のデータエンジニアリングについて。
towardsdatascience.com
Building Better ML Systems — Chapter 3: Modeling. Let the fun begin
ベースライン、実験のトラッキング、適切なテストセットとメトリクスについて。アルゴリズムを機能させる方法について。
towardsdatascience.com
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles