「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論文では、「PolyID:高性能バイオベースポリマーの発見における機械学習の先駆者」として、ポリ-ンにおける機械学習を紹介しています

人工知能は生活のあらゆる側面で使用されています。AIは生活のあらゆる方面で使用され、化学やポリマーなどさまざまな分野で...

人工知能

ChatGPTのデジタル商品をオンラインで販売するプロンプト

ChatGPTは、オンラインでデジタル製品を販売して収益を上げたい人にとって、ありがたい存在です

機械学習

「NVIDIA、ワシントンのAIの安全性確保の取り組みを支援」

本日、ホワイトハウスで開催されたイベントで、NVIDIAはバイデン政権が策定した自発的な取り組みを支持することを発表し、高...

機械学習

「AIへの恐怖は迷信的なくだらないことだ」

「人工知能が私たちを皆殺しにすると恐れている人々は、200,000年にわたる宗教的な迷信のナンセンスと同じ間違いをしています」

人工知能

「両方の世界のベスト:人間の開発者とAIの協力者」

「これは、開発者を対象とした生成型AI生産性ツール(例:Github Copilot、ChatGPT、Amazon CodeWhisperer)が構造にどのよう...

機械学習

聴覚処理の解読:深層学習モデルが脳内の音声認識とどのように類似しているか

研究によると、聴覚データを言語的表現に変換する計算は、声の知覚に関与しています。誰かが音声を聞くと、聴覚経路が活性化...