本番環境向け、スケーラブルでフォールトトレラントな生成型AIソリューションを構築するには、信頼性の高いLLMの利用可能性が必要です。あなたのLLMエンドポイントは、専用の計算をあなたのワークロードのために持つことで需要を満たす準備ができている必要があります。必要に応じて容量をスケーリングし、一貫したレイテンシを持ち、すべてのインタラクションをログに記録する能力、そして予測可能な価格設定を持つことが求められます。このニーズを満たすために、Databricksはプロビジョニングされたスループットエンドポイントを、各種の高性能基盤モデル(全ての主要なラマモデル、DBRX、ミストラルなど)で提供しています。しかし、最新で最も性能の高い微調整されたLlama 3.1と3.2のバリアントを提供することはどうでしょうか?NVIDIAのNemotron 70Bモデルは、Llama 3.1の微調整されたバリアントで、多様なベンチマークで競争力のあるパフォーマンスを示しています。Databricksの最近の革新により、顧客はプロビジョニングされたスループットを使用して、Llama 3.1およびLlama 3.2の多くの微調整されたバリアントを簡単にホストできるようになりました。
次のシナリオを考えてみましょう:ニュースウェブサイトが、ニュース記事の要約を生成するためにNemotronを使用して、社内で強力な結果を達成しました。彼らは、毎日の始まりにすべての新しい記事を取り込み、要約を生成する本番グレードのバッチ推論パイプラインを実装したいと考えています。ここでは、Databricks上でNemotron-70Bのためのプロビジョニングスループットエンドポイントを作成し、データセットに対してバッチ推論を実行し、MLflowを使用して結果を評価し、高品質の結果のみが公開されるようにする簡単なプロセスを説明します。
モデルのプロビジョニングスループットエンドポイントを作成するには、まずモデルをDatabricksに取り込む必要があります。モデルをDatabricksのMLflowに登録するのは簡単ですが、Nemotron-70Bのようなモデルをダウンロードすると大量のスペースが必要になるかもしれません。このような場合、ディスクスペースが必要になると自動的にサイズが拡大するDatabricks Volumesを使用するのが理想的です。
nemotron_model = "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF"
nemotron_volume = "/Volumes/ml/your_name/nemotron"
tokenizer = AutoTokenizer.from_pretrained(nemotron_model, cache_dir=nemotron_volume)
model = AutoModelForCausalLM.from_pretrained(nemotron_model, cache_dir=nemotron_volume)
モデルがダウンロードされた後、それを簡単にMLflowに登録することができます。
mlflow.set_registry_uri("databricks-uc")
with mlflow.start_run():
mlflow.transformers.log_model(
transformers_model={
"model": model,
"tokenizer": tokenizer
},
artifact_path="model",
task="llm/v1/chat",
registered_model_name="ml.your_name.nemotron"
)
タスクパラメータは、プロビジョニングスループットにとって重要であり、これによりエンドポイントで利用可能なAPIが決まります。プロビジョニングされたスループットは、チャット、補完、または埋め込みタイプのエンドポイントをサポートできます。registered_model_name引数は、MLflowに新しいモデルを登録し、そのモデルのバージョンを追跡するよう指示します。プロビジョニングスループットエンドポイントを設定するためには、登録名を持つモデルが必要です。
モデルがMLflowに登録完了したら、エンドポイントを作成できます。エンドポイントはUIまたはREST APIを通じて作成できます。UIを使用して新しいエンドポイントを作成するには:
“ml.your_name.nemotron”
を入力します。これでモデルが提供され、使用準備が整いましたので、毎日のニュース記事のバッチを作成したプロンプトを使用してエンドポイントを通じて要約を取得する必要があります。バッチ推論のワークロードを最適化することは複雑な場合があります。典型的なペイロードに基づいて、新しいnemotronエンドポイントに最適な並行性は何ですか?pandas_udfを使用するか、カスタムのスレッドコードを書くべきですか?Databricksの新しいai_query
機能により、複雑さから抽象化し、結果だけに焦点を当てることができます。ai_query
機能は、個々またはバッチの推論をプロビジョニングされたスループットエンドポイントでシンプルで最適化されたスケーラブルな方法で処理できます。
ai_queryを使用するには、SQLクエリを作成し、最初のパラメータとしてプロビジョニングされたスループットエンドポイントの名前を含めます。プロンプトを追加し、それを適用したい列を2番目のパラメータとして連結します。||
またはconcat()
を使用して単純な連結を行うことができます。または、format_string()
を使用して、複数の列と値でより複雑な連結を行うことができます。
ai_query
の呼び出しはPyspark SQLを通じて行われ、SQLまたはPyspark pythonコードで直接行うことができます。
%sql
SELECT
news_blurb,
ai_query(
'nemo_your_name',
CONCAT('次のニュースの要約を1文でまとめてください。要約のみを提供し、導入文/先行文は提供しないでください。ブラーブ: ', news_blurb)
) as sentence_summary
FROM users.your_name.news_blurbs
LIMIT 10
同じ呼び出しはPySparkコードでも行うことができます:
news_summaries_df = spark.sql("""
SELECT
news_blurb,
ai_query(
'nemo_your_name',
CONCAT('次のニュースの要約を1文でまとめてください。サマリーのみを提供し、導入部/前置きのテキストは提供しないでください。要約: ', news_blurb)
) as sentence_summary
FROM users.your_name.news_blurbs
LIMIT 10
""")
display(news_summaries_df)
それほど簡単です! 複雑なユーザー定義関数を作成したり、厄介なSpark操作を扱う必要はありません。 データがテーブルまたはビューにある限り、これを簡単に実行できます。そして、これはプロビジョニングされたスループットエンドポイントを利用しているため、自動的に分散して並行に推論を実行し、エンドポイントの指定された容量まで処理します。これは一連の逐次的なリクエストよりもはるかに効率的です!
ai_query
は、戻り値の指定、エラーステータスの記録、および一般的なLLMリクエストで使用する追加のLLMパラメータ(max_tokens、temperatureなど)を含む追加の引数も提供します。同じクエリ内で、Unity Catalogのテーブルにレスポンスを簡単に保存することも可能です。
%sql
...
ai_query(
'nemo_your_name',
CONCAT('次のニュースの要約を1文でまとめてください。要約のみを提供し、導入文/先行テキストは提供しないでください。ブラーブ: ', news_blurb),
modelParameters => named_struct('max_tokens', 100,'temperature', 0.1)
...
今、ニュース記事の要約を生成しましたが、ウェブサイトに公開する前にその品質を自動的にレビューしたいと考えています。LLMのパフォーマンス評価は、mlflow.evaluate()
を通じて簡素化されています。この機能は、評価を行うモデル、評価のためのメトリクス、およびオプションで比較のための評価データセットを活用します。デフォルトのメトリクス(質問応答、テキストの要約、テキストメトリクス)を提供するとともに、独自のカスタムメトリクスを作成する能力も提供します。今回のケースでは、生成された要約の品質をLLMで評価したいので、カスタムメトリクスを定義します。次に、私たちは要約を評価し、低品質の要約を手動レビューのためにフィルタリングします。
例を見てみましょう:
from mlflow.metrics.genai import make_genai_metric
summary_quality = make_genai_metric(
name="news_summary_quality",
definition=(
"ニュースサマリーの品質は、1文のニュースサマリーがニュース記事の最も重要な情報をどれだけよく捉えているかを示します。"),
grading_prompt=(
"""ニュース要約の品質:1文のニュース要約がニュース記事から最も重要な情報を捉えている場合、高評価を与えてください。もし要約がニュース記事からの最も重要な情報を捉えていない場合は、低い評価を与えます。
- スコア0: これは1文の要約ではなく、LLMによって生成された余分なテキストがあります。
- スコア1: 要約はニュース記事からの最も重要な情報をうまく捉えていません。
- スコア2:1文の要約がニュース記事から最も重要な情報を見事に捉えています。"""
),
model="endpoints:/nemo_your_name",
parameters={"temperature": 0.0},
aggregations=["mean", "variance"],
greater_is_better=True
)
print(summary_quality)
news_summaries = spark.table("users.your_name.news_blurb_summaries").toPandas()
with mlflow.start_run() as run:
results = mlflow.evaluate(
None, # データがすでに準備されているため、モデルを指定する必要はありません。data = news_summaries.rename(columns={"news_blurb": "inputs"}), # 入力データを渡し、'inputs'列(ニュース記事)を指定します
predictions="sentence_summary", # データ内の予測要約を含む列の名前
extra_metrics=[summary_quality] # カスタムの要約品質メトリクス
)
# 全体のメトリクスと評価結果を観察する
print(results.metrics)
display(results.tables["eval_results_table"])# 品質スコアが2.0以上(良質なサマリー)および2.0未満(レビューが必要)の行をフィルタリングします
eval_results = results.tables["eval_results_table"]needs_manual_review = eval_results[eval_results["news_summary_quality/v1/score"] < 2.0]
summaries_ready = eval_results[eval_results["news_summary_quality/v1/score"] >= 2.0]
mlflow.evaluate()
からの結果は自動的に実験の実行に記録され、後で簡単にクエリを行うためにUnity Catalogのテーブルに書き込むことができます。
このブログ記事では、ニュース組織が人気のある新しい微調整されたLlamaベースのLLMをプロビジョニングスループットで設定し、ai_query
を使用してバッチ推論により要約を生成し、mlflow.evaluateを使用してカスタムメトリックで結果を評価するという仮想的な使用例を示しました。 これらの機能により、使用するモデルの選択、専用モデルホスティングの生産信頼性、および特定のタスクに最適なサイズのモデルを選択し、使用した計算のみを支払うことによるコスト削減をバランスさせる産業級の生成AIシステムを実現できます。これらの機能はすべて、Databricks環境内の通常のPythonまたはSQLワークフローで直接利用でき、Unity Catalogでデータとモデルのガバナンスが可能です。