「BentoML入門:統合AIアプリケーションフレームワーク」

BentoML入門

機械学習(ML)モデルの構築から本番環境への展開までの道のりは、しばしば困難なものとなることがあります。データサイエンティストとエンジニアは、知識のギャップを埋める必要がある複雑なプロセスです。モデルの作成に長けたデータサイエンティストは、本番環境への展開につまずくことがあります。一方、エンジニアは、MLモデルの継続的なイテレーションに苦労し、効率の低いエラープローンな運用につながることがあります。

具体的なシナリオを考えてみましょう。テキスト要約のためのMLモデルを作成し、テストでは素晴らしいパフォーマンスを発揮しました。このモデルをチームと共有し、それを基にアプリケーションを構築する予定です。しかし、このモデルの配布には独自の課題があります。コードや環境の設定をいじらずにチームがモデルを使用できるようにすることです。

BentoMLの登場です。

BentoMLは、展開プロセスを効率化するために設計されたオープンソースのMLモデルサービングフレームワークです。このエンドツーエンドのフレームワークにより、データサイエンティストと開発者は、それぞれの得意なことに集中できます。これにより、これら2つの重要な役割のギャップを埋めることができます。その結果、モデルは迅速かつスケーラブルに展開され、より安定した本番サービスを提供します。

BentoMLフレームワークを使用して、本番用のモデルサービングエンドポイントを開発することができます。以下にBentoMLの手順を示します:

  1. モデルの指定:BentoMLを使用する前に、MLモデルまたは一連のモデルから始める必要があります。これらのモデルは、TensorFlowやPyTorchなどのさまざまなライブラリを使用してトレーニングすることができます。
  2. モデルの保存:モデルをトレーニングした後、BentoMLのローカルモデルストアに保存します。これは、すべてのモデルの管理ハブとなり、簡単なアクセスとシステム的な追跡を提供します。
  3. BentoMLサービスの作成:モデルをラップし、サービングロジックをレイアウトするためにservice.pyファイルを作成します。これには、モデル推論をスケーリングするためのRunner(BentoMLの抽象化)を指定し、外部に公開したいエンドポイントを構築します。
  4. Bentoのビルド:このステップでは、モデルとBentoMLサービスを構成YAMLファイルを介してBentoにパッケージ化します。Bentoは、モデルのコード、その依存関係、およびサービングロジックなど、すべての必要な要素を束ねた展開準備ができたアーティファクトです。後で具体的な例を示します。
  5. 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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AIニュース

イーロン・マスクのxAI企業は資金に関する憶測に直面しています

最近の出来事で、イーロン・マスクの人工知能ベンチャー、xAIが資金調達活動に関する噂で注目を浴びています。マスクの会社は...

機械学習

「AIブーム:小規模ビジネスのための生成AI実践ガイド」

近年、世界は人工知能(AI)の分野で驚くべき急速な発展を目撃していますこれは単なるテクノロジートレンドではなく、技術革...

AIニュース

「OpenAIやLM Studioに頼らずにAutoGenを使用する方法」

イントロダクション OpenAIやLMスタジオに頼らずに、あなた自身のAIチームを作成する準備はできていますか?もはや銀行を荒ら...

人工知能

「コンプライアンス自動化標準ソリューション(COMPASS), パート1 パーソナと役割」

「これは私たちのシリーズの最初の部分であり、組織やクラウドプロバイダが連続的なコンプライアンスを達成しようとする際に...

機械学習

「拡散を支配するための1つの拡散:マルチモーダル画像合成のための事前学習済み拡散モデルの調節」

画像生成AIモデルは、ここ数ヶ月でこの領域を席巻しています。おそらく、midjourney、DALL-E、ControlNet、またはStable dDif...

データサイエンス

『GPT-4を使用したパーソナライズされたAIトレーディングコンサルタントの構築』

はじめに 近年、人工知能(AI)を株式取引に統合することで、投資家の意思決定に革命が起きています。GPT-3やGPT-4などの大規...