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

BentoML入門:AIアプリケーションフレームワーク紹介

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

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

BentoMLの登場です。

BentoMLは、展開プロセスを効率化するために設計されたオープンソースのMLモデルサービングフレームワークです。このエンドツーエンドのフレームワークにより、データサイエンティストと開発者は、お互いの役割をつなぐことに集中できます。その結果、モデルは迅速かつスケーラブルに展開され、より安定したプロダクションサービスが提供されます。

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

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

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

『Qwen Large Language Models(LLMs)Seriesについて知っておくべきすべて』

大型言語モデル(LLM)は、登場以来、人工知能(AI)の領域を大きく変えました。これらのモデルは、厳しい推論や問題解決の問...

人工知能

「死ぬ前に試してみる必要がある9つの最高のAIウェブサイト」

「これらのAIウェブサイトで生産性を倍増させましょう」

データサイエンス

特定のドメインに特化した物体検出モデルの最適化方法

物体検出は、学術界から産業分野まで、広範な領域で広く採用されていますその理由は、低い計算コストで素晴らしい結果を提供...

データサイエンス

データセットシフトのフレームワークを整理する

私たちはモデルを訓練し、それらを使用して特定の結果を予測します入力のセットが与えられた場合に、それが機械学習のゲーム...

機械学習

「大規模な言語モデルの探索-パート3」

「この記事は主に自己学習のために書かれていますしたがって、広く深く展開されています興味のあるセクションをスキップした...

機械学習

「SDXL 1.0の登場」

機械学習の急速に進化する世界では、新しいモデルやテクノロジーがほぼ毎日私たちのフィードに押し寄せるため、最新情報を把...