Running Multi-Modal Models in Databricks | by Sriharsha Tikkireddy | Mediumの翻訳です。
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
Databricksは、整備された道とあなたが必要とすることを行うための柔軟性の両方を提供する素晴らしいプラットフォームであり続けています。モデルサービングにおいて舗装された道においては、スループットがプロビジョンされたモデルを使うことができますが、ビジョンベースのモデルや音声ベースの言語モデル用によりカスタムされた何かをデプロイしたいと思うかもしれません。
これを行うために、我々は標準的なサーバレスGPUサービングを提供しています。GPUにデプロイするには、mlflowを用いてモデルを登録する必要があります。この作業は、huggingfaceのtransformersを使うとすぐにうまくいきます。エンジニアが行うように、私のゴールはこれをさらに簡単にする抽象化レイヤーを構築し、SGLang、vLLM、ollamaのようなすっきりとしたフレームワークを活用することです。
私の成功の定義は以下のようなものでした:
- デプロイメントをシンプルに保つ
- すべてのモダリティ(テキスト、音声、画像、などなど)をサポートする
- 手元のタスクにフォーカスする(インフラやフレームワークの動作原理を気にしない)
このため、私はこちらを作りました: https://github.com/stikkireddy/mlflow-extensions
このブログ記事のゴールは、モデルサービングのデプロイメントとサービングの機能にフォーカスすることです。しかし、完全なデプロイメントを実施することなしに、登録されたモデルをテストするような便利なユーティリティがいくつか存在します。今後のブログ記事でそれらをカバーするつもりです。
LLMのデプロイに関してのmlflow-extensionsのゴールは、3つの簡単なステップでサポートされるtransformerをデプロイする手助けをすることです。
- ダウンロード
- 登録
- デプロイ
新たなphi-3.5ビジョンモデルをデプロイするのをクイックに見てみましょう。
from mlflow_extensions.databricks.deploy.ez_deploy import EzDeploy
from mlflow_extensions.databricks.prebuilt import prebuilt
deployer = EzDeploy(
config=prebuilt.vision.vllm.PHI_3_5_VISION_INSTRUCT_12K,
registered_model_name="main.default.phi_3_5_vision_instruct_12k"
)
# download model from hf
deployer.download()
# register model in UC and experiment
deployer.register()
# deploy model into model serving
endpoint_name = "my-endpoint-name"
deployer.deploy("my-endpoint-name")
デフォルトはスマートであり、お使いのGPUのサイズなどを特定するEzDeployの設定をベースとしています。これらを上書きしたり、自身の設定を作成することができます。詳細はreadmeをご覧ください。
サポートされるすべてのモデルの一覧に関してはこちらをご覧ください: https://github.com/stikkireddy/mlflow-extensions?tab=readme-ov-file#ez-deploy
これによって、当該モデルに必要となる適切なGPUサービングエンドポイントを特定しますが、さまざまなコンテキスト長をサポートするさまざまなモデルのフレーバーが存在しています。
モデルをクエリーするために互換性のあるクライアントが存在しています:
- openai sdk
- langchain
- sglang sdk
from mlflow_extensions.serving.compat.openai import OpenAI
from mlflow_extensions.databricks.prebuilt import prebuilt
from mlflow.utils.databricks_utils import get_databricks_host_creds
model_name = prebuilt.vision.vllm.PHI_3_5_VISION_INSTRUCT_12K.engine_config.model
workspace_host = spark.conf.get("spark.databricks.workspaceUrl")
endpoint_name = f"https://{workspace_host}/serving-endpoints/{endpoint_name}/invocations"
token = get_databricks_host_creds().token
client = OpenAI(
base_url=endpoint_name,
api_key=token
)
response = client.chat.completions.create(
model=model_name,
messages=[
{
"role": "user",
"content": "Hi how are you?"
}
],
)
print(response)
これによって、データを容易にクエリーすることができます。
音声モデルに対しては、以下のようなことを行うことができます:
from mlflow_extensions.serving.compat.openai import OpenAI
from mlflow_extensions.databricks.prebuilt import prebuilt
from mlflow.utils.databricks_utils import get_databricks_host_creds
import requests
import base64
model_name = prebuilt.audio.vllm.FIXIE_ULTRA_VOX_0_4_64K_CONFIG.engine_config.model
workspace_host = spark.conf.get("spark.databricks.workspaceUrl")
endpoint_name = f"https://{workspace_host}/serving-endpoints/{endpoint_name}/invocations"
token = get_databricks_host_creds().token
def encode_audio_base64_from_url(audio_url: str) -> str:
"""Encode an audio retrieved from a remote url to base64 format."""
with requests.get(audio_url) as response:
response.raise_for_status()
result = base64.b64encode(response.content).decode('utf-8')
return result
audio_data = encode_audio_base64_from_url("https://www2.cs.uic.edu/~i101/SoundFiles/gettysburg.wav")
chat_completion_from_base64 = client.chat.completions.create(
messages=[{
"role":
"user",
"content": [
{
"type": "text",
"text": "What is the user talking about?"
},
{
"type": "audio_url",
"audio_url": {
"url": f"data:audio/ogg;base64,{audio_data}"
},
},
],
}],
model=model_name,
max_tokens=64
)
print(chat_completion_from_base64)
次の記事では、厳密に構造化されたアウトプットを提供するために、これらのEzDeployモデルを用いて、テキスト、画像、音声から構造化データを抽出する方法の詳細を説明します。
これは基本的に実験段階であることに注意してください。問題に直面したら、githubのイシューを作成してください。私は、openaiやlangchainによる標準セットとインタフェースが互換性を保つように多大なる注意を払っているので、動作しない場合には他のモデルに簡単に切り替えることができます。
diffusionモデルなどの機能リクエストがある場合には教えてください。
ジャーニーを通じてのテストや公開に向けた動機づけをしてくれたSathish Gangichettyに感謝しています。また、設定の問題をデバッグしてくれたSGLangチームにも感謝します!