オープンソースの MLflow を使用して大規模言語モデルを評価する
この記事では、オープンソースの MLflow LLM 評価機能 mlflow.evaluate() の使用方法について説明します。 LLMこの記事では、オープンソース を使用してMLflow を評価するために必要なことと、サポートされている評価メトリクスについても説明します。
MLflow LLM 評価とは何ですか?
LLMのパフォーマンスの評価は、従来のMLモデルとは少し異なり、比較する単一のグラウンドトゥルースがないことがよくあります。 MLflow には、LLM の評価に役立つ API mlflow.evaluate()
が用意されています。
MLflow の LLM 評価機能は、次の 3 つの主要なコンポーネントで構成されています。
- 評価するモデル : MLflow
pyfunc
モデル、予測列を含む DataFrame、1 つの登録済み MLflow モデルを指す URI、またはモデルを表す任意の Python 呼び出し可能 (HuggingFace テキスト要約パイプラインなど) を指定できます。 - メトリクス : the メトリクス to コンピュート, LLM evaluate は LLM メトリクスを使用します。
- 評価データ : モデルが評価されるデータには、Pandas DataFrame、Python リスト、
numpy
配列、mlflow.data.dataset.Dataset
インスタンスなどがあります。
必要条件
- MLflow 2.8 以降。
mlflow.evaluate()
でLLMを評価するには、LLMが次のいずれかである必要があります。-
記録された
mlflow.pyfunc.PyFuncModel
モデルを指すmlflow.pyfunc.PyFuncModel
インスタンスまたは URI。 -
文字列入力を受け取り、1 つの文字列を出力するカスタム Python 関数。 callable は、
params
引数のないmlflow.pyfunc.PyFuncModel.predict
のシグネチャと一致する必要があります。この関数は、次のことを行う必要があります。- 唯一の引数として
data
を持ち、pandas.Dataframe
、numpy.ndarray
、 Python リスト、辞書、または scipy 行列を指定できます。 - 次のいずれかを返します:
pandas.DataFrame
、pandas.Series
、numpy.ndarray
、 list のいずれか。
- 唯一の引数として
-
静的データセット。
-
MLflow モデルで評価する
LLM を MLflow モデルとして評価できます。 モデルを mlflow.pyfunc.PyFuncModel
インスタンスに変換する方法の詳細については、「 カスタム pyfunc モデルを作成する方法」を参照してください。
モデルを MLflow モデルとして評価するには、Databricksでは次の手順に従うことをお勧めします。
OpenAI サービスを対象とするモデルを正常にログ Azure 記録するには、認証と機能に次の環境変数を指定する必要があります。 詳細については、 MLflow を使用した OpenAI のドキュメントを参照してください。
os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_VERSION"] = "2023-05-15"
os.environ["OPENAI_API_BASE"] = "https://<>.<>.<>.com/"
os.environ["OPENAI_DEPLOYMENT_NAME"] = "deployment-name"
-
LLM を MLflow モデルとしてパッケージ化し、
log_model
を使用して MLflow サーバーにログを記録します。 各フレーバー (opeanai
、pytorch
、...) には、次のような独自のlog_model
API がありますmlflow.openai.log_model()
Pythonwith mlflow.start_run():
system_prompt = "Answer the following question in two sentences"
# Wrap "gpt-3.5-turbo" as an MLflow model.
logged_model_info = mlflow.openai.log_model(
model="gpt-3.5-turbo",
task=openai.ChatCompletion,
artifact_path="model",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": "{question}"},
],
) -
mlflow.evaluate()
のモデルインスタンスとして、記録済みモデルのURIを使用します。Pythonresults = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
)
カスタム関数による評価
MLflow 2.8.0 以降では、 mlflow.evaluate()
では、モデルを MLflow にログ記録しなくても Python 関数の評価がサポートされています。 これは、モデルをログに記録せず、単に評価する場合に便利です。 次の例では、 mlflow.evaluate()
を使用して関数を評価します。
また、次のコードを実行するには、OpenAI 認証を設定する必要があります。
eval_data = pd.DataFrame(
{
"inputs": [
"What is MLflow?",
"What is Spark?",
],
"ground_truth": [
"MLflow is an open-source platform for managing the end-to-end machine learning (ML) lifecycle. It was developed by Databricks, a company that specializes in big data and machine learning solutions. MLflow is designed to address the challenges that data scientists and machine learning engineers face when developing, training, and deploying machine learning models.",
"Apache Spark is an open-source, distributed computing system designed for big data processing and analytics. It was developed in response to limitations of the Hadoop MapReduce computing model, offering improvements in speed and ease of use. Spark provides libraries for various tasks such as data ingestion, processing, and analysis through its components like Spark SQL for structured data, Spark Streaming for real-time data processing, and MLlib for machine learning tasks",
],
}
)
def openai_qa(inputs):
answers = []
system_prompt = "Please answer the following question in formal language."
for index, row in inputs.iterrows():
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": "{row}"},
],
)
answers.append(completion.choices[0].message.content)
return answers
with mlflow.start_run() as run:
results = mlflow.evaluate(
openai_qa,
eval_data,
model_type="question-answering",
)
静的データセットで評価する
MLflow 2.8.0 以降の場合、 mlflow.evaluate()
では、モデルを指定せずに静的データセットを評価できます。 これは、モデル出力を Pandas DataFrame または MLflow PandasDataset の列に保存し、モデルを再実行せずに静的データセットを評価する場合に便利です。
model=None
を設定し、モデル出力を data
引数に入れます。この構成は、データが Pandas DataFrame の場合にのみ適用されます。
Pandas DataFrame を使用している場合は、mlflow.evaluate()
の最上位の predictions
パラメーターを使用して、モデル出力を含む列名を指定する必要があります。
import mlflow
import pandas as pd
eval_data = pd.DataFrame(
{
"inputs": [
"What is MLflow?",
"What is Spark?",
],
"ground_truth": [
"MLflow is an open-source platform for managing the end-to-end machine learning (ML) lifecycle. "
"It was developed by Databricks, a company that specializes in big data and machine learning solutions. "
"MLflow is designed to address the challenges that data scientists and machine learning engineers "
"face when developing, training, and deploying machine learning models.",
"Apache Spark is an open-source, distributed computing system designed for big data processing and "
"analytics. It was developed in response to limitations of the Hadoop MapReduce computing model, "
"offering improvements in speed and ease of use. Spark provides libraries for various tasks such as "
"data ingestion, processing, and analysis through its components like Spark SQL for structured data, "
"Spark Streaming for real-time data processing, and MLlib for machine learning tasks",
],
"predictions": [
"MLflow is an open-source platform that provides handy tools to manage Machine Learning workflow "
"lifecycle in a simple way",
"Spark is a popular open-source distributed computing system designed for big data processing and analytics.",
],
}
)
with mlflow.start_run() as run:
results = mlflow.evaluate(
data=eval_data,
targets="ground_truth",
predictions="predictions",
extra_metrics=[mlflow.metrics.genai.answer_similarity()],
evaluators="default",
)
print(f"See aggregated evaluation results below: \n{results.metrics}")
eval_table = results.tables["eval_results_table"]
print(f"See evaluation table below: \n{eval_table}")
LLM 評価 メトリクス types
には、次の2種類のLLM 評価メトリクスがあります。MLflow
-
スコアリングのために OpenAI などの SaaS モデルに依存するメトリクス (
mlflow.metrics.genai.answer_relevance
など)。 これらのメトリクスは、mlflow.metrics.genai.make_genai_metric()
を使用して作成されます。 これらのメトリクスは、データレコードごとに、次の情報で構成される 1 つのプロンプトを SaaS モデルに送信し、モデルのレスポンスからスコアを抽出します。- メトリクス definition.
- メトリクスの評価基準。
- 参考例。
- データまたはコンテキストを入力します。
- モデル出力。
- [オプション]グラウンドトゥルース。
-
関数ベースの行ごとのメトリクス。 これらのメトリクスは、Rouge、
mlflow.metrics.rougeL
、Flesch Kincaid などの特定の関数に基づいて、各データレコード(Pandas または Spark DataFrame の行)のスコアを計算しますmlflow.metrics.flesch_kincaid_grade_level
。 これらのメトリクスは、従来のメトリクスと似ています。
LLM を評価するためのメトリクスを選択する
モデルを評価するメトリクスを選択できます。 サポートされている評価メトリクスの完全なリファレンスは、 MLflow evaluate のドキュメントにあります。
次のいずれかを実行できます。
- モデルタイプに対して事前に定義されている デフォルトの メトリクスを使用します。
- メトリクスの カスタム リストを使用します。
事前に選択されたタスクにデフォルトのメトリクスを使用するには、次の例に示すように、 mlflow.evaluate
で model_type
引数を指定します。
results = mlflow.evaluate(
model,
eval_data,
targets="ground_truth",
model_type="question-answering",
)
次の表は、サポートされている LLM モデル タイプと関連するデフォルト メトリクスをまとめたものです。
|
|
|
---|---|---|
exact-match | ||
*
evaluate、 torch、 transformersの各パッケージが必要です。
**
パッケージ textstat が必要です。
†
evaluate、 nltk、 rouge-score のパッケージが必要です。
メトリクスのカスタムリストを使用する
メトリクスのカスタムリストは、 mlflow.evaluate
の extra_metrics
引数で指定できます。
事前定義されたモデルタイプのデフォルトのメトリクスリストにメトリクスを追加するには、 model_type
パラメーターを保持し、メトリクスを extra_metrics
に追加します。 次の例では、 question-answering
モデルと mlflow.metrics.latency()
のすべてのメトリクスを使用してモデルを評価します。
results = mlflow.evaluate(
model,
eval_data,
targets="ground_truth",
model_type="question-answering",
extra_metrics=[mlflow.metrics.latency()],
)
デフォルト メトリクスの計算を無効にし、選択したメトリクスのみを計算するには、 model_type
引数を削除して目的のメトリクスを定義します。
results = mlflow.evaluate(model,
eval_data,
targets="ground_truth",
extra_metrics=[mlflow.metrics.toxicity(), mlflow.metrics.latency()],
)
LLMを審査員とするメトリクス
また、LLM をジャッジとして使用する事前定型メトリクスを mlflow.evaluate()
の extra_metrics
引数に追加することもできます。これらのLLMを審査員とするメトリクスのリストについては、LLMを審査員とするメトリクスを参照してください。
from mlflow.metrics.genai import answer_relevance
answer_relevance_metric = answer_relevance(model="openai:/gpt-4")
eval_df = pd.DataFrame() # Index(['inputs', 'predictions', 'context'], dtype='object')
eval_results = mlflow.evaluate(
data = eval_df, # evaluation data
model_type="question-answering",
predictions="predictions", # prediction column_name from eval_df
extra_metrics=[answer_relevance_metric]
)
評価結果の表示
mlflow.evaluate()
評価結果を mlflow.models.EvaluationResult
インスタンスとして返します。
選択したメトリクスのスコアを見るには、評価結果の以下の属性を確認することができます。
-
metrics
: 評価データセット全体の平均や分散など、集計された結果が格納されます。 次の例では、上記のコード例を 2 回目に実行し、集計された結果の印刷に重点を置いています。Pythonwith mlflow.start_run() as run:
results = mlflow.evaluate(
data=eval_data,
targets="ground_truth",
predictions="predictions",
extra_metrics=[mlflow.metrics.genai.answer_similarity()],
evaluators="default",
)
print(f"See aggregated evaluation results below: \n{results.metrics}") -
tables['eval_results_table']
: 行ごとの評価結果が保存されます。Pythonwith mlflow.start_run() as run:
results = mlflow.evaluate(
data=eval_data,
targets="ground_truth",
predictions="predictions",
extra_metrics=[mlflow.metrics.genai.answer_similarity()],
evaluators="default",
)
print(
f"See per-data evaluation results below: \n{results.tables['eval_results_table']}"
)
MLflow サンプル ノートブックを使用した LLM 評価
次の MLflow を使用した LLM 評価のサンプル ノートブックは、ユース ケース指向の例です。