BentoML入門:統合AIアプリケーションフレームワークの紹介
BentoML入門:AIアプリケーションフレームワーク紹介
機械学習(ML)モデルの構築から本番環境への展開への道は、しばしば困難な道のりとなることがあります。これは、データサイエンティストとエンジニアが知識のギャップを埋める必要がある、不可欠で複雑なプロセスです。モデルの作成に長けたデータサイエンティストは、本番環境の展開についてつまずくことがあります。一方、エンジニアは、MLモデルの継続的なイテレーションに苦労し、効率の悪いエラーの多い操作につながるかもしれません。
以下の具体的なシナリオを考えてみましょう。テキスト要約のためのMLモデルを作成し、テストで素晴らしい結果を出しました。このモデルをチームと共有し、それを基にアプリケーションを構築する予定です。しかし、このモデルの配布には独自の課題があります。コードや環境の設定をいじることなく、チームがモデルを使用できるようにすることです。
BentoMLの登場です。
BentoMLは、展開プロセスを効率化するために設計されたオープンソースのMLモデルサービングフレームワークです。このエンドツーエンドのフレームワークにより、データサイエンティストと開発者は、お互いの役割をつなぐことに集中できます。その結果、モデルは迅速かつスケーラブルに展開され、より安定したプロダクションサービスが提供されます。
BentoMLフレームワークを使用して、本番用のモデルサービングエンドポイントを開発することができます。以下はBentoMLの手順です:
- モデルの指定: BentoMLを使用する前に、MLモデルまたは複数のモデルを用意する必要があります。これらのモデルは、TensorFlowやPyTorchなどのさまざまなライブラリを使用してトレーニングすることができます。
- モデルの保存: モデルのトレーニングが完了したら、BentoMLローカルモデルストアに保存します。これは、すべてのモデルの管理ハブとして機能し、簡単なアクセスと追跡方法を提供します。
- BentoMLサービスの作成:
service.py
ファイルを作成し、モデルをラップし、サービングロジックをレイアウトします。これにより、モデルの推論を最適化するためのRunners(BentoMLの抽象化)が実行され、外部に公開したいエンドポイントが構築されます。 - Bentoのビルド: このステップでは、モデルとBentoMLサービスを構成YAMLファイルを介してBentoにパッケージングします。Bentoは、モデルのコード、依存関係、サービングロジックなど、すべての必要な要素をまとめた展開用のアーティファクトです。後ほど具体的な例を示します。
- Bentoの展開: Bentoの準備ができたら、展開のための準備です。BentoをDockerイメージにコンテナ化してKubernetes上で展開することができます。オールインワンのソリューションをお好みの場合は、BentoMLエコシステム内のオープンソースプラットフォームであるYataiにBentoを直接展開することもできます。完全に管理されたサービスをご希望の場合は、AIアプリケーションの構築と運用のためのサーバーレスソリューションであるBentoCloudを介してBentoを展開してください。
BentoMLとそのワークフローの基本的な理解ができたので、BentoMLがモデルのサービングと展開をどのようにシンプルにするかを見てみましょう。
環境のセットアップ
このプロジェクトをローカルで実行するために、次のものが必要です:
- Python 3.8+
pip
がインストールされていること。
その後、プロジェクトファイルを保存するディレクトリを作成します。上述のように、service.py
を含むすべてのプロジェクトファイルを保存するディレクトリを作成します。1つずつ作成していきます。
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からのテキスト要約Transformerモデル(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でアクティブです。このウェブユーザーインターフェイスを使用できます。ウェブサイトにアクセスし、Service APIsまでスクロールし、Try it outをクリックします。
Request bodyボックスにテキストを入力し、Executeをクリックします。以下の例は、大規模言語モデルの概念について説明しています。
入力:
大規模言語モデル(LLM)は、人工ニューラルネットワークによって具現化されたコンピュータ化された言語モデルであり、膨大な数の「パラメータ」(つまり、そのレイヤー内の「ニューロン」およびそれらの間の数十万から数十億の「ウェイト」)を使用して、相当量の未ラベルテキストを使って(前)トレーニングされることがあります。 Wikipedia CorpusやCommon Crawlなどのコーパスが提供する、数兆のトークン(つまり、単語の一部)を含む膨大な量の未ラベルテキストを、大量のGPUを使用して相対的に短時間で(前)トレーニングすることで、自己教師あり学習または半教師あり学習を使用して、トークン化された語彙と確率分布を持つモデルを生成します。 LLMは、追加のGPUを使用して、さらに多くのパラメータでさらに大量の未ラベルテキストでモデルを(前)トレーニングすることでアップグレードできます。
テキスト要約モデルによる出力:
大規模言語モデル(LLM)は、人工ニューラルネットワークを用いたコンピュータ化された言語モデルであり、その層には数千万から数十億の「重み」があります。LLMは、さらに多くのパラメータを未ラベルのテキストの非常に大量のデータでモデルを(事前)トレーニングすることで、追加のGPUを使用してアップグレードすることができます。
Bentoの構築
モデルが正常に機能しているため、BentoMLの標準配布形式である「Bento」にパッケージ化する必要があります。Bentoには、サービスを実行するために必要なすべてのソースコード、モデルファイル、および依存関係が含まれています。Bentoを構築するには、プロジェクトディレクトリに<bentofile.yamlファイルを作成します。このファイルでは、依存関係、Dockerイメージの設定、およびモデルなどのビルドオプションを定義します。ここでは、サービス、含めるPythonファイル、および依存関係など、Bentoを構築するために必要な基本情報のみをリストアップしています。詳細については、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").
次のステップ:
* `bentoml containerize`を使用してBentoをコンテナ化:
$ bentoml containerize summarization:ulnyfbq66gagsnry
* `bentoml push`を使用してBentoを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サービスを作成して公開し、ユーザーがそれと対話できるようにすることができます。
モデルの展開についてエンド・トゥ・エンドのソリューションをお探しの場合は、Yataiを選択してBentoを展開し、Kubernetes上でスケーリング可能に展開を管理することができます。YataiはBentoMLエコシステムの重要なコンポーネントであり、詳細を説明するために独自のブログ投稿が必要です。興味がある場合は、YataiのGitHubリポジトリをご覧ください。
結論
機械学習モデルをトレーニングから本番環境へ展開することは容易なことではありませんが、BentoMLはここで真価を発揮します。BentoMLを使用すると、モデルの構築に集中することができ、フレームワークが展開の複雑さを処理します。
機械学習モデルがビジネスの運用にますます不可欠な要素となるにつれて、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