MLflow LLM Evaluate：mlflow.metrics.latency() で ValueError が発生した時の対処方法

# はじめに

株式会社NTTデータ [デジタルサクセスソリューション事業部](https://enterprise-aiiot.nttdata.com/) で AWS や Databricks を推進している [nttd-saitouyun](https://qiita.com/nttd-saitouyun) です。

MLflow LLM Evaluate で LLM を評価する記事を投稿しました。

https://qiita.com/nttd-saitouyun/items/5b4014f9326bd3997736

その中で、少しハマったところがあったので本書にまとめておきます。


# MLflow LLM Evaluate のメトリクスのカスタムリストを使用する
mlflow.evaluate の **extra_metrics 引数にメトリクスのカスタムリストを指定できます**。マニュアルは[こちらのページに](https://docs.databricks.com/ja/mlflow/llm-evaluate.html#use-a-custom-list-of-metrics)記載があります。

[このページ](https://docs.databricks.com/ja/mlflow/llm-evaluate.html#select-metrics-to-evaluate-your-llm)に記載の通り、追加のメトリクスの使用にはいくつかのライブラリの事前インストールが必要である点、ご注意ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/4e3f37e1-6446-fa0f-153f-b9cd6bfe7d92.png)


私は、ランタイム `15.3 ML` を使っていましたが、textstat、rouge-score が不足していました。以下のコードでインストールできます。

```python
%pip install textstat rouge-score
dbutils.library.restartPython()
```


# 発生した事象
MLflow LLM Evaluate で追加のメトリクスを設定してみようと思い、[Question Answering Metrics](https://mlflow.org/docs/latest/python_api/mlflow.metrics.html#question-answering-metrics) の**すべてのメトリクスを extra_metrics 引数に指定してみました**。

```python
with mlflow.start_run() as run:    
    results = mlflow.evaluate(
        model = f"endpoints:/{endpoint}",
        data = eval_data,
        targets = "ground_truth",
        model_type = "question-answering",
        inference_params = {"max_tokens": 128, "temperature": 0.0},
        extra_metrics = [
            mlflow.metrics.exact_match(),
            mlflow.metrics.rouge1(),
            mlflow.metrics.rouge2(),
            mlflow.metrics.rougeL(),
            mlflow.metrics.rougeLsum(),
            mlflow.metrics.toxicity(),
            mlflow.metrics.token_count(),
            mlflow.metrics.latency(),
        ],
    )
```

すると、mlflow.evaluate の実行で以下のエラーが発生しました。

>ValueError: Module inputs don't match the expected format.
Expected format: {'predictions': Value(dtype='string', id='sequence')},
Input predictions: 0    MLflow is an open-source platform designed to ...

# 原因の特定
追加したメトリクスが悪さをしていると思い、１つ１つコメントアウトして確認したところ、`mlflow.metrics.latency()` をコメントアウトすると正常にコードを実行できました。


一方で、以下の記事で、評価対象のモデルがモデルサービングエンドポイントではなく、カスタム関数である場合は同条件でこの事象が発生しないことがわかりました。

https://qiita.com/nttd-saitouyun/items/ef0370328284ba9a4955

よって、本事象は、以下の条件で発生していることがわかりました。
1. 評価対象のモデルとして「**モデルサービングエンドポイント**」を指定している
1. **mlflow.metrics.latency()** を追加メトリクスとして指定する


# 対処方法
mlflow.metrics.latency() をカスタム関数では使えて、モデルサービングエンドポイントで使えないのは、状況的に不具合の可能性が高いと思い、**MLflow のバージョンを上げてみたところ、事象は解決しました**。

具体的には、**ランタイムを `15.3 ML` から `15.4 ML` に上げました**。以下の表から MLflow のバージョンを `2.13.1` 以上にしておけば事象は発生しなくなりそうです。

| Databricks Runtime | mlflow-skinny のバージョン |
| ---- | ---- |
| 15.3 ML | 2.11.3 |
| 15.4 ML | 2.13.1 |

 
 # おまけ：不具合の調査
 MLflow の[リリースノート](https://github.com/mlflow/mlflow/blob/master/CHANGELOG.md
)をさらっと見ましたが、具体的な修正に関する言及は見当たりませんでした。なので、Small bug fixes and documentation updates で軽微な修正として取り込まれていそうです。

コードまでは見ていないですが、バージョン `2.12.1 (2024-04-17)` の Small bug fixes and documentation updates で修正されている #11692 [Fix issue with mlflow.evaluate() with latency metric enabled](https://github.com/mlflow/mlflow/pull/11692) が内容的に怪しそうです。実際に MLflow のバージョンを 2.12.1 にしたら事象は発生しないくなりましたし。

まあ、あまり時間かけても意味がないので深追いはしないでおきます。


# おわりに
**同じようにハマってしまった人のお役に立てば幸いです！**

Databricks を使っている場合、**ランタイムは定期的に最新化しましょう！**
最新機能は、不具合の修正が数多く取り込まれているので、余計なポイントでつまずかずに済みます。

# 仲間募集
NTTデータ デザイン＆テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary> 1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア) </summary>
クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。

https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer

</details>

<details><summary> 2. データサイエンス領域（データサイエンティスト／データアナリスト） </summary>
データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。

https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist

</details>

<details><summary> 3.お客様のAI活用の成功を推進するAIサクセスマネージャー </summary>
DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=804

</details>

<details><summary> 4.DX／デジタルサクセスを推進するデータサイエンティスト《管理職/管理職候補》 </summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=898

</details>

# ソリューション紹介
<details><summary> Trusted Data Foundationについて </summary>
～データ資産を分析活用するための環境をオールインワンで提供するソリューション～

https://enterprise-aiiot.nttdata.com/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。

</details>

<details><summary> NTTデータとDatabricksについて </summary>
NTTデータは、お客様企業のデジタル変革・DXの成功に向けて、「databricks」のソリューションの提供に加え、情報活用戦略の立案から、AI技術の活用も含めたアナリティクス、分析基盤構築・運用、分析業務のアウトソースまで、ワンストップの支援を提供いたします。

 https://enterprise-aiiot.nttdata.com/service/databricks

</details>

<details><summary> TDF-AM（Trusted Data Foundation - Analytics Managed Service）について </summary>
～データ活用基盤の段階的な拡張支援（Quick Start) と保守運用のマネジメント（Analytics Managed）をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス～

https://enterprise-aiiot.nttdata.com/service/tdf/tdf_am
TDF-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。

</details>

</details>

<details><summary> NTTデータとSnowflakeについて </summary>
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。
NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://enterprise-aiiot.nttdata.com/service/snowflake

</details>

</details>

<details><summary> NTTデータとInformaticaについて </summary>
データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。

https://enterprise-aiiot.nttdata.com/service/informatica

</details>

</details>

<details><summary> NTTデータとTableauについて </summary>
ビジュアル分析プラットフォームのTableauと2014年にパートナー契約を締結し、自社の経営ダッシュボード基盤への採用や独自のコンピテンシーセンターの設置などの取り組みを進めてきました。さらに2019年度にはSalesforceとワンストップでのサービスを提供開始するなど、積極的にビジネスを展開しています。

これまでPartner of the Year, Japanを4年連続で受賞しており、2021年にはアジア太平洋地域で最もビジネスに貢献したパートナーとして表彰されました。
また、2020年度からは、Tableauを活用したデータ活用促進のコンサルティングや導入サービスの他、AI活用やデータマネジメント整備など、お客さまの企業全体のデータ活用民主化を成功させるためのノウハウ・方法論を体系化した「デジタルサクセス」プログラムを提供開始しています。

https://enterprise-aiiot.nttdata.com/service/tableau

</details>

</details>

<details><summary> NTTデータとAlteryxについて </summary>
Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。
Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

導入時のプロフェッショナル支援など独自メニューを整備し、特定の業種によらない多くのお客さまに、Alteryxを活用したサービスの強化・拡充を提供します。

https://enterprise-aiiot.nttdata.com/service/alteryx

</details>

</details>

<details><summary> NTTデータとDataRobotについて </summary>
DataRobotは、包括的なAIライフサイクルプラットフォームです。
NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

https://enterprise-aiiot.nttdata.com/service/datarobot

</details>