次の方法で共有


MLflow を使用して大規模言語モデルを評価する

この記事では、mlflow.evaluate にパッケージ化された MLflow の大規模言語モデル (LLM) 評価機能である MLflow LLM Evaluate について紹介します。 この記事では、LLM を評価するために必要なものと、どの評価メトリックがサポートされているかについても説明します。

MLflow LLM Evaluate とは?

LLM パフォーマンスの評価は、比較対象となる単一のグラウンド トゥルースがないことが非常に多いので、従来の ML モデルとは少し異なります。 MLflow は、LLM の評価に役立つ API mlflow.evaluate() を提供しています。

MLflow の LLM 評価機能は、以下の 3 つの主要な要素で構成されています。

  • 評価するモデル: これには、MLflow pyfunc モデル、予測列を持つ DataFrame、登録された 1 つの MLflow モデルを指す URI、またはモデルを表す何らかの Python callable (HuggingFace テキスト要約パイプラインなど) を指定できます。
  • メトリック: 計算するメトリック。LLM 評価は LLM メトリックを使用します。
  • 評価データ: モデルの評価に使用されるデータ。これには、Pandas DataFrame、Python リスト、numpy 配列、または mlflow.data.dataset.Dataset インスタンスを指定できます。

要件

  • MLflow 2.8 以上。
  • mlflow.evaluate() を使用して LLM を評価するには、LLM が以下のいずれかである必要があります。
    • mlflow.pyfunc.PyFuncModel インスタンス、またはログされた mlflow.pyfunc.PyFuncModel モデルを指す URI。
    • 文字列入力を受け取り、単一の文字列を出力するカスタム Python 関数。 callable は、params 引数のない mlflow.pyfunc.PyFuncModel.predict のシグネチャと一致する必要があります。 関数は以下を満たす必要があります。
      • data を唯一の引数として持つ。これには pandas.Dataframenumpy.ndarray、Python リスト、辞書、scipy マトリックスを指定できます。
      • 次のいずれかを返す: pandas.DataFramepandas.Seriesnumpy.ndarray、またはリスト。
    • 静的データセット。

MLflow モデルを使用して評価する

LLM は MLflow モデルとして評価できます。 モデルを mlflow.pyfunc.PyFuncModel インスタンスに変換するための詳細な手順については、カスタム pyfunc モデルを作成する方法を参照してください。

モデルを MLflow モデルとして評価するために、Databricks は以下の手順に従うことを推奨しています。

Note

Azure OpenAI Service を対象とするモデルを正常にログするには、認証と機能に次の環境変数を指定する必要があります。 詳細については、OpenAI と MLflow に関するドキュメントを参照してください。

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"
  1. LLM を MLflow モデルとしてパッケージ化し、log_model を使用してそれを MLflow サーバーにログします。 各フレーバー (opeanaipytorch、...) には、次に示す mlflow.openai.log_model() のような独自の log_model API があります。

    with 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}"},
            ],
        )
    
  2. 次のように mlflow.evaluate() の中で、ログされたモデルの URI をモデル インスタンスとして使用します。

    results = 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 評価メトリックの種類

MLflow には、以下の 2 種類の LLM 評価メトリックがあります。

  • mlflow.metrics.genai.answer_relevance などのスコアリングのために、OpenAI などの SaaS モデルに依存するメトリック。 これらのメトリックは、mlflow.metrics.genai.make_genai_metric() を使用して作成されます。 これらのメトリックは、各データ レコードに関して、SaaS モデルに以下の情報で構成される 1 つのプロンプトを送信し、モデルの応答からスコアを抽出します。
    • メトリック定義。
    • メトリック評価基準。
    • リファレンス例。
    • 入力データまたはコンテキスト。
    • モデル出力。
    • [省略可能] グラウンド トゥルース。
  • 関数ベースの行ごとのメトリック。 これらのメトリックは、Rouge (mlflow.metrics.rougeL) または Flesch Kincaid (mlflow.metrics.flesch_kincaid_grade_level) などの特定の関数に基づいて、各データ レコード (Pandas または Spark DataFrame で言うところの行) のスコアを計算します。 これらのメトリックは、従来のメトリックに似ています。

LLM を評価するメトリックを選択する

どのメトリックでモデルを評価するかを選択できます。 サポートされている評価メトリックの完全なリファレンスは、MLflow の評価に関するドキュメントの中で確認できます。

次のいずれかを実行できます。

  • モデルの種類に対して事前に定義されている既定のメトリックを使用します。
  • メトリックのカスタム リストを使用します。

事前に選択したタスクに既定のメトリックを使用するには、以下の例に示すように、mlflow.evaluatemodel_type 引数を指定します。

results = mlflow.evaluate(
    model,
    eval_data,
    targets="ground_truth",
    model_type="question-answering",
)

次の表は、サポートされている LLM モデルの種類と関連する既定のメトリックをまとめたものです。

question-answering text-summarization text
exact-match ROUGE toxicity*
toxicity* toxicity* ari_grade_level**
ari_grade_level** ari_grade_level** flesch_kincaid_grade_level**
flesch_kincaid_grade_level** flesch_kincaid_grade_level**

* パッケージ evaluatetorchtransformers が必要です。

** パッケージ textstat が必要です。

パッケージ evaluatenltkrouge-score が必要です。

メトリックのカスタム リストを使用する

mlflow.evaluateextra_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: これは、評価データセット全体の平均や分散など、集計された結果を保存します。 以下は、上記のコード例を見直して、集計された結果を出力することに重点を置きます。

    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}")
    
  • tables['eval_results_table']: これは、行ごとの評価結果を保存します。

    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 per-data evaluation results below: \n{results.tables['eval_results_table']}"
        )
    

MLflow を使用した LLM 評価の例のノートブック

次の MLflow を使用した LLM 評価の例のノートブックは、ユースケース指向の例です。

MLflow を使用した LLM 評価の例のノートブック

ノートブックを入手