機械学習がユーザーに真の価値をもたらすためには、それを本番システムに導入する必要があります。 AI セールス ソフトウェア開発会社 Toucan AI の ML エンジニアである Marifel 氏が、生成機械学習を構築する際に考慮した問題のいくつかを共有してくれました。これらの経験が皆さんの仕事に役立つことを願っています。
近年、データとコンピューティング技術の発展に伴い、「機械学習」と「ディープラーニング」が注目の研究分野となっています。企業が機械学習を利用するのは流行していますが、まずは自社のビジネスが機械学習から利益を得られるかどうかを評価する必要があります。会社の次の発展に機械学習が必要であると判断した場合、機械学習エンジニアとして、本番環境向けの機械学習プロセスを構築する方法について考える必要があります。この記事が、考慮すべき事項のいくつかを明確にするのに役立つことを願っています。 注: この記事で言及されている「スタートアップ企業」はすべてソフトウェア「製品」を持つ企業であり、ソフトウェア「サービス」を提供する企業については特に言及します。ソフトウェア製品会社は自社のソフトウェア製品の開発に注力しますが、ソフトウェア サービス会社 (代理店やコンサルティング会社など) はクライアント向けのソフトウェアを開発します。この記事は、初期段階のソフトウェア製品スタートアップ企業で機械学習エンジニアとして働いていた著者の経験に基づいていますが、ここでの考慮事項の一部は、他の段階や他の種類の企業にも当てはまります。
この記事の著者である Marifel は、Toucan AI の ML エンジニアです。 自分に合ったツールを見つける機械学習ソフトウェアには、PyTorch、TensorFlow、scikit-learn などのオープンソース ツールをはじめ、さまざまな選択肢があります。また、Google AI Platform、Amazon SageMaker、Azure Machine Learning など、企業が提供する機械学習サービスもあります。 PyTorch と TensorFlow だけでも、製品開発の出発点として使用できる、すぐに使用できるモデルを備えたオープンソース ソフトウェア ライブラリが数多くあります。 また、さまざまな分野で機械学習の研究論文が毎年多数発表されており、オープンソース形式でコードを提供している研究者もいます。 https://paperswithcode.com/ このウェブサイトでは、コード付きの論文リソースを見つけることができます。 適切なツールを選択する際に考慮すべき重要な要素は次のとおりです。
私の意見では、初期段階のスタートアップであれば、これらすべての要素を把握する必要はありません。強力なツールを選択して、そこから始めることができます。また、投資額を上回るメリットがあると判断した場合は、最初は企業が提供する機械学習サービスを使用することも全く問題ありません。 機械学習を行うタイミングと機械学習を中心とした開発プロセス開発を開始するときは、単純なベースライン モデルを使用することをお勧めします。より単純なモデルから始めると、ワークフローの問題を特定し、より時間のかかるソリューションが価値があるかどうかを判断するのに役立ちます。では、シンプルなベースライン モデルをどのように選択すればよいのでしょうか? まず第一に、「シンプル」というのは相対的なものです。場合によっては、シンプルとは、直感的に理解できる結果をハードコーディングするなど、モデルがシンプルであることを意味します。他のケースでは、モデル自体は複雑でも適用が簡単な場合があります。広く使用されているデータセットの中には、オープン ソースの現在のベスト モデルがいくつかあり、研究論文やリーダーボードで見つけることができます。たとえば、Stanford Question Answering Dataset (SQuAD) にはそのようなリーダーボードがあります。現在の最先端のソリューションをいくつか探し、その研究論文に関連するコードを探すことができます。これは良い出発点となるでしょう。 初期段階のスタートアップでは、機械学習プロセスをすぐに開発する時間がないかもしれません。通常、投資家や顧客に見せるために、何かを早期に動作させることに重点が置かれます。通常、プロセスの最適化についてはあまり関心がありません。したがって、最初の展開が完璧かどうかを心配する必要はありません。有効な結果、つまり実際の目に見える最終製品が生成されればよいのです。基本的な製品を構築した後で機械学習プロセスを検討することができ、機械学習プロセスに小さな段階的な改善を適用するための自由な時間が増えます。 逆に、代理店の場合は、すでに完成品をさまざまなクライアントに提供しており、すべてのバグを事前に修正しているため、エラーが発生する余地は少なくなります。製品を顧客に出荷した後は、次の顧客契約に移行するため、通常はさらなる改善を行うためのリソースがありません。それでも、代理店としては迅速に行動しなければなりません。これをより速く行うには、よりきめ細かい機械学習ワークフローが役立ちます。したがって、代理店のモデルでは、事前に改良と自動化に多くの時間を費やすと、長期的なビジネスのための時間を節約できる可能性があります。 実験管理で考慮すべきこと機械学習の作業では、実験の管理は簡単ではありません。できるだけ多くの実験を実行すると、プロジェクトのワークスペースが乱雑になりやすくなります。しかし、初期段階のスタートアップでは、何百もの実験を実行するために何ヶ月も費やす余裕はありません。より良いものに集中し、できるだけ早く更新する必要があります。いずれにせよ、実験管理に関しては、何もしないよりは何かやったほうが間違いなくいいです。機械学習の実験を管理する際に考慮すべき事項をいくつか示します。 モデルのバージョン管理 Toucan AI では、さまざまなバージョンのコードを保存するために GitHub を使用しています。 GitHub は素晴らしいですが、大きなデータ ファイルのバージョン管理には適していません。コード リポジトリは最大 100 GB まで拡張できますが、GitHub ではコード リポジトリのサイズを 1 GB 未満に抑えることを推奨しています。また、1 つのファイルのサイズは 100 MB を超えることはできません。 Google Cloud Storage や Amazon S3 などの他のクラウド ストレージ サービスを使用することもできます。クラウド プロバイダーのコマンド ライン ツールまたは Web ユーザー インターフェイスを使用すると、ターゲット (ファイルまたはフォルダー) のバージョン管理を有効にするために、ストレージ スペース (フォルダー) を作成するだけで済みます。ただし、クラウド ストレージを GitHub プロジェクト リポジトリと同期する場合は、追加の手動作業が必要になります。 そのため、私たちは Git プラットフォームの最高の機能と他のクラウド ストレージ オプションの利点を組み合わせた最も自然な統合ソリューション、データ バージョン コントロール (DVC、https://dvc.org/) を選択しました。このプロジェクトのスローガンは、「機械学習プロジェクト向けのオープン ソース バージョン コントロール システム」です。 DVC は、Git サブコマンドに非常によく似たサブコマンドを備えたコマンドライン ツールです。 Git プラットフォームとクラウド ストレージを設定したら、DVC の add コマンドと push コマンドを実行して、さまざまなバージョンをファイルまたはフォルダーの形式でクラウド ストレージに保存できます。同時に、DVC ファイルの参照機能を通じて、Git プロジェクト コード ベース内のより大きなデータ ファイルを追跡することもできます。 DVC の大きな利点は、Git のようなコマンドが少数しか必要ないため、既存の Git ワークフローとの接続が失われないことです。 実験の記録 ハイパーパラメータを調整する場合、特定の時間に実行した特定のモデルの特定の設定を忘れてしまうことがあります。このモデルのデータセットを準備または前処理するために、以前の作業を確認する必要がある場合もあります。 Jupyter Notebook には、中身を大まかに表すファイル名が付いているかもしれませんが、その時点で何をしたか (最初に A を実行したのか、それとも B を実行したのか) を把握するには、まだ時間がかかります。 この問題の解決策の 1 つは、ノートのファイル名にシーケンス番号を追加することです (私はステップ 01_ を使用するのが好きです)。後でいつでも順序を並べ替えることができます。ノートブック ファイルに明確な命名規則と並べ替えスキームを使用すると、チーム (および将来の自分) が実験の実行方法をすぐに理解するのに大いに役立ちます。実際にノートブック ファイルをソートするだけでなく、実験的なハイパーパラメータとメトリックの結果を表示するための Web インターフェイスを提供するオープン ソース プラットフォーム MLflow (https://mlflow.org (https://mlflow.org/)) も使用します。 さらに、実験を文書化するときは、論理的な構造と簡潔さに重点を置く必要があります。各モデルのノートブックやトレーニングスクリプトについては、フォルダー構造のコマンドルールを駆使して整理・管理する必要があります。読者があなたのノートを読んでいると仮定すると、通常は上から下へ読むので、急いで追加されたセクションは削除する必要があります。経験則として、モデルとデータセットごとに 1 つのノートブックを作成し、現在のノートブックが長すぎる場合は新しいノートブックを作成する必要があります。最終的なノートブックには、トレーニングと推論の手順のコードを含めないでください。これらは、ノートブックから呼び出せる別のスクリプトに配置する必要があります。最後に、MLflow などのソフトウェアを使用して実験記録を生成する場合、実行中の実験のメモを生成された実験出力ファイルに自動的に参照するようにすることができます。 テストフレームワーク 特定のメトリックでより良いスコアを獲得しても、必ずしもモデルが実際の例でより良い推論結果を達成することを意味するわけではありません。さらに、実稼働レベルの機械学習システムでは、機械学習モデルは通常、単独では動作しません。たとえば、ワークフローには、メソッドの探索、前処理、結果のキャッシュが含まれる場合があります。したがって、既存の機械学習モデルを改善しようとするときは、現実世界の推論例を作成するのに多くの時間がかかることに注意してください。 大規模な本番環境のコードを深く理解し、改善したいモデルが実際の状況でいつ呼び出されるかを理解する必要があります。モデル自体を理解するには、入力と出力を確認するだけでは不十分で、機械学習システムの動作プロセス全体を確認する必要があります。改善されたモデルはシステム全体にどのような影響を与えますか?効果は良くなりましたか、それとも悪くなりましたか? モデルを実際に改善するには、単に新しい推論例を考え出したり、運用環境で何かを変更したりするのではなく、自動化システムまたはエンドツーエンドのテスト フレームワークを設定する必要があります。 Toucan AI の主力製品は AI セールス エージェントであるため、ロジックの主要な分岐をカバーするサンプル会話をテストするだけで十分であり、回帰テストの形式も提供しています。現在、一連のサンプルダイアログに基づいて pytest テストを実行できるコマンドライン インターフェイス (CLI) を開発しています: https://docs.pytest.org/en/latest/。すべての会話は 1 行のコマンドでテストでき、テストが失敗した場合は、手動でテストを更新するか、「より良い」モデルが実際に本番環境に適しているかどうかを評価します。 つまり、現在の実験モデルが実稼働の機械学習システムでどのように機能するかを理解するために、テスト フレームワークを導入することが非常に重要です。優れたテスト フレームワークを使用すると、モデル改善ワークフローをより効率的に実行でき、以前よりも多くの実験を実行できるようになります。 急速に進化するツールを活用する 当社の実稼働システムでは、古いコード ベースの修正バージョンを使用することが多いため、このコード ベースが急速に進化している場合、新しい改善点を実稼働システムに統合することが困難になる可能性があります。では、急速に進化するコード ベースを、ニーズに合わせて変更し、最新の更新をできるだけ効率的に適用するにはどうすればよいでしょうか。 この質問には唯一の正しい答えはなく、むしろさまざまな道があると思います。 1 つの方法は、相手のコードと自分のコードを組み合わせて、使用可能なシステムを作ることです。もう 1 つの方法は、相手のコードを取得して、自分の古いバージョンを完全にアップグレードすることですが、これには時間がかかります。 つまり、再開発にどれくらいの時間が必要か、何を優先するかを慎重に検討する必要があります。優先事項に焦点を当て、完全なリファクタリングは後で検討してください。これは、独自のコードベースと急速に進化するツールがより安定した後に実行できます。 実験のクリーンアップ 結果を得ることに集中していると、整頓を忘れてしまいがちです。次に実行する一連の実験とそのハイパーパラメータ設定について考えます。エラーが発生しましたか?問題ありません。出力フォルダーのタイムスタンプを変更して、実験を再度実行してください。しかし、最終的に得られるのは、不完全な実験によって生成された単なるファイルまたはフォルダーのセットです。その後、実験ログを閲覧する人は、完了まで実行された実験を探すために MLflow の長いリストを調べなければならないため、頭を悩ませることになります。 解決策は簡単です。保存したくない実験実行を自動的に削除します。たとえば、最初のトレーニング反復の前に失敗した実験を削除することをお勧めします。チームの将来のために、実験記録をきちんと整理して保存するよう最善を尽くすべきです。 孤立の問題 モデルを改善するためにさまざまな機械学習プロジェクトを調査して試してみると、矛盾する Python パッケージ要件に遭遇することになります。最初は、2 人の開発者間で共有されるクラウド サーバーを使用するかもしれませんが、自分のインストールによってチームのインストールが上書きされる可能性があるため、これは不便であることがすぐにわかります。 Docker を使いましょう!これは、プロジェクト環境と依存関係を管理するために使用できる軽量のコンテナ化されたソフトウェア プラットフォームです。 「これは自分のマシンでしか動作しない」という問題を積極的に減らし、プロジェクト間の依存関係の競合を防ぐために、機械学習モデルとアプリケーション サービスごとに異なる Docker コンテナを使用する必要があります。開発サーバーをさらにセットアップする代わりに、あなたとあなたのチームがそれぞれ同じ共有サーバー上に独自の Docker コンテナをセットアップすることができ、一般的にコスト効率が高くなります。 また、Conda では異なるソフトウェア バージョンで異なる環境を作成できるため、なぜ Conda ではなく Docker を選択するのか疑問に思うかもしれません。 Docker を選んだのは、Docker が提供するツールが、本番環境やクラウド上での運用に適しているからです。リモート マシンで Conda を使用する場合は、まずそのマシンに接続し、ファイル転送の問題に対処する必要があります。 Docker を使用する場合、ローカル ファイルの変更をリモート マシン上の Docker コンテナーに同期するには、数行のコマンドだけが必要です。 さらに、プロジェクトを実行するために必要なものはすべて、Dockerfile または Docker Compose ファイルに記述されています。 Conda を使用する場合、README を参照しないと追加の手順が必要かどうかはわかりません。 最後に、Docker Compose を使用すると、機械学習プロジェクトで他のサービスを実行する必要がある場合、これらの追加サービスを他の Docker コンテナーで実行し、Docker Compose ファイルの設定に基づいてこれらのコンテナーが通信するようにすることができます。私の知る限り、Conda を使用して環境間の通信を行うことはできません。 必要に応じて拡張できるように準備する スタートアップがまだ初期段階にあるときは、規模を拡大する必要はありませんが、規模拡大を実現するために使用するテクノロジーについて考える必要があります。その 1 つが Celery です: http://www.celeryproject.org/。これは、タスクを複数のワーカーに分散して処理できる非同期タスク キュー システムです。現在、サービス タイプ (サーバー、クライアント、組み込みモデル) ごとに 1 つのワーカーを使用していますが、必要がない限り、同じサービスに対して複数のワーカーを設定するために多くの労力を費やす必要はありません。 ここで質問ですが、埋め込みによるキャッシュがスケーリングのボトルネックになっているのでしょうか?問題ありません。別の埋め込み Celery ワーカーを作成するか、現在のワーカーの同時実行性を高めて、複数の子プロセスを並行して実行することができます。当社の Toucan AI 構成では、Docker コンテナ内で単一の Celery ワーカーが実行され、分離も考慮されています。 Celery は、運用システムを拡張するだけでなく、機械学習モデルの推論タスクなどの長時間実行されるタスクにも適しています。サーバー応答を保留にできるだけでなく、サーバー応答 (エージェントの返信) を Toucan AI エージェントと会話しているエンド ユーザーにすぐに返すことができ、非同期タスク (キャッシュ メカニズムなど) はバックグラウンドで静かに実行できます。 さらに、Celery beat を使用して、毎日スケジュールされた分析ワーカー タスクを実行します。 Celery beat は、cron を使用してワーカー タスクをスケジュールするのに役立ちます。 チームや将来の自分と協力する 機械学習の研究論文は急速に発表されており、機械学習エンジニアとしては、自分のチームがどのようなモデルや手法を開発し、実験しているかを知る必要があります。それで、あなたは何をすべきでしょうか?彼らの知識、経験、洞察力を得るための近道はありませんが、彼らとコミュニケーションをとり、たくさんコミュニケーションをとることはできます。 常にコミュニケーションを取り、特に書面でコミュニケーションを取ってください。多くの場合、あなたは自分のプロジェクトに取り組んでおり、現在行っていることはチームが行っていることとはまったく関係がない可能性があります。それでも、将来のある時点で、実装した内容を見直したり拡張したりする必要が生じる可能性があります。おそらく、その課題を完了してから数か月後に、自分のプロジェクトに何らかの変更を加える必要が生じ、その頃には自分が行ったことを忘れているかもしれません。したがって、文書化、文書化、文書化を忘れないようにしてください。 3 回繰り返します。これでドキュメントの重要性がお分かりいただけたと思います。 また、メモだけでは不十分な場合があることにも注意してください。自分の仕事をチームに知らせる必要があります。確信が持てないとき、正直な意見が必要なとき、または口頭でのコミュニケーションの方が効率的だと感じるときは、プロジェクトの方向性について話し合うことができます。誤解、時間の無駄、心配、後悔を防ぐために、最初からコミュニケーションを明確にしておくことが非常に重要です。 機械学習エンジニアの内なる葛藤機械学習エンジニアとして、自分の考え方を調整し、ギャップを埋めることや、実際に必要なことよりも優れたことをすることばかり考えるのをやめる必要があります。不完全さを受け入れ、最も緊急なタスクを完了することに時間を集中することを学ばなければなりません。たとえば、私はサードパーティのトレーニング/評価コードの改善に時間を費やすのが好きですが、この時点では推論結果が改善されたかどうかをできるだけ早く知る必要があるかもしれません。 私はウェブ開発のバックグラウンドを持っており、ほとんどすべてのコードを自分で書かなければなりませんでしたが、機械学習エンジニアリングでは、他の人のコードを適用する方法を学ばなければなりませんでした。他の人のコード(学生や研究者が数か月、あるいは数年かけて開発したコード)を頻繁に使用している場合、特にそのコードのあらゆる側面を理解することに執着している場合は、途方に暮れたり、自分の作業が不完全なように感じたりしないでいるのは難しいでしょう。ただし、これは必須ではありません。必要なのは、モデルを本番システムに正常にデプロイすることだけです。 結局のところ、私たちは本質的に好奇心旺盛な生き物であり、実際に必要なこと以上に理解したいと望むのは自然なことです。調査を行いたい場合は、チームにその旨を伝えるのが最善です。目標の仕事を期限内に完了できれば、相互理解のある職場環境によって、より多くのことを学ぶ機会が得られます。自分の優先事項がわかっている限り、あまり心配せず、探索を楽しんでください。 要約する生産システム向けの機械学習プロセスを構築するのは簡単ではありません。ここに挙げたすべての考慮事項にもかかわらず、時には決断を下すだけで済むこともあります。道が違う場合は、別の道を選んでください。そうは言っても、この投稿が、考慮すべきいくつかの事項を理解するのに役立つことを願っています。 |
<<: 分析技術は、2019-nCoVの潜在的な感染を追跡し予測するのに役立っています。
>>: 2020年に注目を集めるグラフ機械学習の研究動向とは?
最近、OpenAI は ChatGPT の新バージョンのリリースを発表し、音声入力と画像入力という ...
[51CTO.com クイック翻訳]ディープニューラルネットワークは、視覚情報を処理する強力な能力で...
「エネルギー自己教師学習っていったい何?」と多くのRedditネットユーザーがコメントした。ちょう...
[[435127]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...
2020年まで残り1ヶ月となりました。最近、オンライン教育ウェブサイトのUdemyは、受講生のコース...
[[437285]]この記事はLeiphone.comから転載したものです。転載する場合は、Leip...
旅行を計画していると想像してください。 数十年前であれば、旅行先や宿泊施設の選択肢を調べたり、航空券...
21 世紀において、伝統的な教育は人生において必要な段階ではなく、選択肢となっています。インターネ...
Jupyter は、機械学習とデータサイエンスの分野でよく知られるようになりました。メモ、コード、...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
世界有数のバイオ医薬品企業であるノボ ノルディスクとマイクロソフトは、第3回中国国際輸入博覧会で、ノ...