「BentoML入門:統合AIアプリケーションフレームワーク」
BentoML入門
機械学習(ML)モデルの構築から本番環境への展開までの道のりは、しばしば困難なものとなることがあります。データサイエンティストとエンジニアは、知識のギャップを埋める必要がある複雑なプロセスです。モデルの作成に長けたデータサイエンティストは、本番環境への展開につまずくことがあります。一方、エンジニアは、MLモデルの継続的なイテレーションに苦労し、効率の低いエラープローンな運用につながることがあります。
具体的なシナリオを考えてみましょう。テキスト要約のためのMLモデルを作成し、テストでは素晴らしいパフォーマンスを発揮しました。このモデルをチームと共有し、それを基にアプリケーションを構築する予定です。しかし、このモデルの配布には独自の課題があります。コードや環境の設定をいじらずにチームがモデルを使用できるようにすることです。
BentoMLの登場です。
BentoMLは、展開プロセスを効率化するために設計されたオープンソースのMLモデルサービングフレームワークです。このエンドツーエンドのフレームワークにより、データサイエンティストと開発者は、それぞれの得意なことに集中できます。これにより、これら2つの重要な役割のギャップを埋めることができます。その結果、モデルは迅速かつスケーラブルに展開され、より安定した本番サービスを提供します。
BentoMLフレームワークを使用して、本番用のモデルサービングエンドポイントを開発することができます。以下にBentoMLの手順を示します:
- モデルの指定:BentoMLを使用する前に、MLモデルまたは一連のモデルから始める必要があります。これらのモデルは、TensorFlowやPyTorchなどのさまざまなライブラリを使用してトレーニングすることができます。
- モデルの保存:モデルをトレーニングした後、BentoMLのローカルモデルストアに保存します。これは、すべてのモデルの管理ハブとなり、簡単なアクセスとシステム的な追跡を提供します。
- BentoMLサービスの作成:モデルをラップし、サービングロジックをレイアウトするために
service.py
ファイルを作成します。これには、モデル推論をスケーリングするためのRunner(BentoMLの抽象化)を指定し、外部に公開したいエンドポイントを構築します。 - Bentoのビルド:このステップでは、モデルとBentoMLサービスを構成YAMLファイルを介してBentoにパッケージ化します。Bentoは、モデルのコード、その依存関係、およびサービングロジックなど、すべての必要な要素を束ねた展開準備ができたアーティファクトです。後で具体的な例を示します。
- Bentoのデプロイ:Bentoの準備ができたら、デプロイの準備が整いました。BentoをDockerイメージにコンテナ化して、Kubernetes上で展開することができます。オールインワンのソリューションを希望する場合は、BentoMLエコシステムのオープンソースプラットフォームであるYataiにBentoを直接デプロイすることができます。完全管理型のサービスを希望する場合は、AIアプリケーションの構築と運用のためのサーバーレスソリューションであるBentoCloudを介してBentoをデプロイすることを検討してください。
BentoMLとそのワークフローの基本的な理解ができたので、モデルのサービングと展開がどのように簡素化されるかを見てみましょう。
環境の設定
このプロジェクトをローカルで実行するために、次のものが必要です:
- Python 3.8以上
pip
がインストールされていること
それから、service.py
を含むすべてのプロジェクトファイルを保存するディレクトリを作成します。以下のように一つずつ作成していきます。
mkdir bentoml-demo
cd bentoml-demo
依存関係の分離のために仮想環境を使用することをおすすめします。
python -m venv venv
source venv/bin/activate
必要なライブラリを含むrequirements.txt
ファイルを作成します。
bentoml
transformers
torch>=2.0
依存関係をインストールします:
pip install -r requirements.txt
モデルをローカルモデルストアにダウンロードする
このブログ記事では、Hugging Face Model Hubからのテキスト要約トランスフォーマーモデル(sshleifer/distilbart-cnn-12-6)を使用します。
前述のように、モデルをBentoMLモデルストアにダウンロードする必要があります。これはdownload_model.py
スクリプトを使用して行われます。このスクリプトはbentoml.transformers.save_model()
関数を使用します。以下にdownload_model.py
の例を示します。
import transformers
import bentoml
model= "sshleifer/distilbart-cnn-12-6"
task = "summarization"
bentoml.transformers.save_model(
task,
transformers.pipeline(task, model=model),
metadata=dict(model_name=model),
)
このスクリプトを実行すると、モデルがダウンロードされてローカルに保存されます。
python3 download_model.py
ダウンロードが成功した場合、モデルはモデルストアに表示されます。後でこのモデルを取得してBentoMLサービスを作成することができます。
$ bentoml models list
タグ モジュール サイズ 作成日時
summarization:5kiyqyq62w6pqnry bentoml.transformers 1.14 GiB 2023-07-10 11:57:40
注意: モデルストアにダウンロードされたすべてのモデルは、ディレクトリ/home/user/bentoml/models/
に保存されます。
BentoMLサービスを作成する
使用可能なモデルがある場合、以下のようにservice.py
ファイルを定義することで、BentoMLサービスを作成することができます。このスクリプトは、以前にダウンロードしたモデルからsummarizer_runner
インスタンスを作成し、bentoml.Service()
でラップします。 @svc.api()
でデコレートされたsummarize()
関数は、サービスのAPIエンドポイントと入出力の処理ロジックを指定します。
import bentoml
summarizer_runner = bentoml.models.get("summarization:latest").to_runner()
svc = bentoml.Service(
name="summarization", runners=[summarizer_runner]
)
@svc.api(input=bentoml.io.Text(), output=bentoml.io.Text())
async def summarize(text: str) -> str:
generated = await summarizer_runner.async_run(text, max_length=3000)
return generated[0]["summary_text"]
プロジェクトディレクトリで、bentoml serve
を使用して開発モードでBentoMLサーバーを起動します。
$ bentoml serve service:svc --development --reload
2023-07-10T12:13:33+0800 [INFO] [cli] "service:svc"からのHTTP BentoServerのPrometheusメトリクスは、http://localhost:3000/metricsでアクセスできます。
2023-07-10T12:13:34+0800 [INFO] [cli] "service:svc"からの本番用HTTP BentoServerの開始は、http://0.0.0.0:3000でリッスンしています (終了するにはCTRL+Cを押してください)
2023-07-10 12:13:34 circus[5290] [INFO] プラグインを読み込んでいます...
2023-07-10 12:13:34 circus[5290] [INFO] エンドポイント: 'tcp://127.0.0.1:61187'
2023-07-10 12:13:34 circus[5290] [INFO] Pub/sub: 'tcp://127.0.0.1:61188'
2023-07-10T12:13:34+0800 [INFO] [observer] ディレクトリを監視しています: ['/Users/sherlock/Documents/bentoml-demo', '/Users/sherlock/bentoml/models']
サーバーは現在、http://0.0.0.0:3000でアクティブになっており、Webユーザーインターフェースが提供されています。ウェブサイトにアクセスし、Service APIsまでスクロールし、Try it outをクリックします。
リクエストボディボックスにテキストを入力し、実行をクリックします。以下の例は、大規模言語モデルの概念について説明しています。
入力:
大規模言語モデル(LLM)は、人工ニューラルネットワークを用いて、巨大な量の「パラメータ」(つまり、その層にある「ニューロン」の「重み」の数十万から数十億に及ぶ)を使用して表されるコンピュータ化された言語モデルである。これらのパラメータは、WikipediaコーパスやCommon Crawlなどのコーパスによって提供される数兆のトークン(つまり、単語の一部)を含む大量の未ラベル化テキストを、大規模な並列処理による多数のGPUで(事前に)訓練することによって、自己教師あり学習または半教師あり学習を使用して、確率分布を持つトークン化された語彙を生成します。さらに、追加のGPUを使用して、さらに多くのパラメータでモデルを(事前に)トレーニングすることによって、LLMをアップグレードすることができます。
テキスト要約モデルの出力:
大規模言語モデル(LLM)は、人工ニューラルネットワークを用いて実現されたコンピュータ化された言語モデルであり、その層には数千万から数十億の「重み」を持つ無数の「パラメータ」が含まれています。LLMは、追加のGPUを使用してさらに大量の未ラベル化されたテキストに対してモデルを(事前に)トレーニングすることで、さらに多くのパラメータを使用してアップグレードすることができます。
Bentoの作成
モデルが正常に機能するようになったので、BentoMLの標準配布形式である「Bento」にパッケージ化する必要があります。Bentoには、サービスを実行するために必要なすべてのソースコード、モデルファイル、および依存関係が含まれています。Bentoを作成するには、プロジェクトディレクトリにbentofile.yamlファイルを作成します。このファイルでは、依存関係、Dockerイメージの設定、およびモデルなどのビルドオプションを定義します。ここでは、サービス、含めるPythonファイル、および依存関係の基本的な情報のみをリストアップしています。詳細については、BentoMLのドキュメントを参照してください。
service: 'service:svc'
include:
- '*.py'
python:
requirements_txt: requirements.txt
プロジェクトディレクトリでbentoml buildコマンドを実行してBentoをビルドします。作成されたすべてのBentoは、/home/user/bentoml/bentos/に見つけることができます。
$ bentoml build
Building BentoML service "summarization:ulnyfbq66gagsnry" from build context "/Users/sherlock/Documents/bentoml-demo".
Packing model "summarization:5kiyqyq62w6pqnry"
██████╗░███████╗███╗░░██╗████████╗░█████╗░███╗░░░███╗██╗░░░░░
██╔══██╗██╔════╝████╗░██║╚══██╔══╝██╔══██╗████╗░████║██║░░░░░
██████╦╝█████╗░░██╔██╗██║░░░██║░░░██║░░██║██╔████╔██║██║░░░░░
██╔══██╗██╔══╝░░██║╚████║░░░██║░░░██║░░██║██║╚██╔╝██║██║░░░░░
██████╦╝███████╗██║░╚███║░░░██║░░░╚█████╔╝██║░╚═╝░██║███████╗
╚═════╝░╚══════╝╚═╝░░╚══╝░░░╚═╝░░░░╚════╝░╚═╝░░░░░╚═╝╚══════╝
Successfully built Bento(tag="summarization:ulnyfbq66gagsnry").
次のステップ:
* Bentoを`bentoml containerize`でコンテナ化する:
$ bentoml containerize summarization:ulnyfbq66gagsnry
* Bentoを`bentoml push`でBentoCloudにプッシュする:
$ bentoml push summarization:ulnyfbq66gagsnry
利用可能なすべてのBentoを表示するには、次のコマンドを実行します:
$ bentoml list
Tag Size Creation Time
summarization:ulnyfbq66gagsnry 1.25 GiB 2023-07-10 15:28:51
Bentoのデプロイ
Bentoが準備できたら、bentoml serveを使用して本番環境でサービスを提供できます。同じモデルの複数のバージョンがある場合は、latestタグを対応するバージョンに変更できます。
$ bentoml serve summarization:latest
2023-07-10T15:36:58+0800 [INFO] [cli] Environ for worker 0: set CPU thread count to 12
2023-07-10T15:36:58+0800 [INFO] [cli] Prometheus metrics for HTTP BentoServer from "summarization:latest" can be accessed at http://localhost:3000/metrics.
2023-07-10T15:36:59+0800 [INFO] [cli] Starting production HTTP BentoServer from "summarization:latest" listening on http://0.0.0.0:3000 (Press CTRL+C to quit)
または、BentoをDockerでコンテナ化することもできます。Bentoを作成する際には、自動的にDockerfileが/home/user/bentoml/bentos/summarization/ulnyfbq66gagsnry/env/docker/
に作成されました。Dockerイメージを作成するには、以下を実行してください:
bentoml containerize summarization:latest
作成されたDockerイメージを表示します:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
summarization ulnyfbq66gagsnry da287141ef3e 7 seconds ago 2.43GB
Dockerイメージをローカルで実行できます:
docker run -it --rm -p 3000:3000 summarization:ulnyfbq66gagsnry serve
Dockerイメージを使用して、モデルをKubernetes上で実行し、Kubernetesサービスを作成して公開し、ユーザーがそれと対話できるようにすることができます。
モデルを展開するためのエンドツーエンドのソリューションをお探しの場合は、Bentosをデプロイし、Kubernetes上でスケールに対応したデプロイメントを管理するためのYataiを選択することができます。YataiはBentoMLエコシステムの重要なコンポーネントであり、詳細を説明するために独自のブログ投稿をする価値があります。興味がある場合は、YataiのGitHubリポジトリをご覧ください。
結論
機械学習モデルをトレーニングから本番環境へ展開することは容易なことではありませんが、それがBentoMLの真価が発揮されるところです。BentoMLを使用すると、モデルの構築に集中できる一方で、フレームワークが展開の複雑さを処理します。
MLモデルがビジネスオペレーションにますます不可欠な役割を果たすにつれて、BentoMLのようなスムーズなモデルサービングと展開のソリューションは不可欠になってきます。BentoMLはモデルの展開を簡単にするだけでなく、モデルの効率的な管理とニーズに合わせたスケーリングも保証します。興味がある場合は、今すぐBentoMLを使ってモデルの展開の簡単さを体験してみてください。Happy coding!
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