You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MLflow 2.19.0 log_image路径字符异常问题求助

问题

在Red Hat Enterprise Linux Server release 7.9(Maipo)环境使用Mlflow==2.19.0时,其他功能正常,但log_image方法使用key参数时,生成的图像路径出现字符异常:

  • 错误路径:/data/gcprcmsbx/work/hive/gcprcmsbx_work/citilabs/sherlock/mlflow/artifacts/ip70574/1/3403fe396bf64129980fb6e7f26b5875/artifacts/images/sample_image%step%0%timestamp%1745516773738�f3cea2-6baa-4b8a-9107-68f0ab83b572.png
  • 正确路径:hdfs:/data/gcprcmsbx/work/hive/gcprcmsbx_work/citilabs/sherlock/mlflow/artifacts/ip70574/1/3403fe396bf64129980fb6e7f26b5875/artifacts/images/sample_image%step%0%timestamp%1745516773738%daf3cea2-6baa-4b8a-9107-68f0ab83b572.png

已尝试以下环境变量配置,均无效:

os.environ["ESCAPE_PERCENT"] = "1"
os.environ["LANG"] = "en_US.UTF-8"
os.environ["LC_ALL"] = "en_US.UTF-8"
os.environ["PYTHONUTF8"] = "1"
os.environ["PYTHONIOENCODING"] = "UTF-8"
os.environ["NO_PROXY"] = "*"

约束条件:必须使用key≠None(需对比不同运行的图像),无sudo权限。

复现代码:

import io
import matplotlib.pyplot as plt
from PIL import Image
import mlflow

x = range(10)
y = [i**2 for i in x]

plt.plot(x, y, marker='o')
plt.title('Basic Line Plot')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')

fig = plt.gcf()

def fig2img(fig):
    """Converts a Matplotlib figure to a PIL Image."""
    buf = io.BytesIO()
    fig.savefig(buf, format='png', bbox_inches='tight')
    buf.seek(0)
    img = Image.open(buf)
    return img

pil_image = fig2img(fig=fig)

mlflow.log_image(image=pil_image,                 
                 key='sample_image',
                 step=None,
                 timestamp=None)

解决方案

1. 手动构造路径并保留对比标识

MLflow自动生成路径时,会将%d误解析为格式占位符而非字面量,导致字符异常。可以手动生成符合规则的文件名,用artifact_file参数指定路径,同时通过run标签保留key信息以实现对比:

import time
import uuid
import mlflow

# 手动构造符合要求的文件名
custom_filename = f"images/sample_image%step%0%timestamp%{int(time.time()*1000)}%{uuid.uuid4()}.png"
# 存入标签用于后续对比
mlflow.set_tag("image_key", "sample_image")
# 用artifact_file参数替代key参数完成日志
mlflow.log_image(image=pil_image, artifact_file=custom_filename)

2. 猴子补丁修复MLflow内部逻辑

在脚本开头对MlflowClient的log_image方法打补丁,绕过原有的错误路径生成逻辑:

import time
import uuid
import mlflow
from mlflow.tracking.client import MlflowClient

original_log_image = MlflowClient.log_image

def patched_log_image(self, run_id, image, artifact_file=None, key=None, step=None, timestamp=None, synchronous=False):
    if key is not None:
        # 手动生成正确路径,避免格式字符串解析错误
        step = step if step is not None else 0
        timestamp = timestamp if timestamp is not None else int(time.time() * 1000)
        artifact_file = f"images/{key}%step%{step}%timestamp%{timestamp}%{uuid.uuid4()}.png"
        # 清空key等参数,让MLflow走artifact_file逻辑
        key = step = timestamp = None
    return original_log_image(self, run_id, image, artifact_file, key, step, timestamp, synchronous)

MlflowClient.log_image = patched_log_image

# 之后正常调用log_image即可
mlflow.log_image(image=pil_image, key='sample_image')

3. 升级MLflow版本

该问题大概率是MLflow 2.19.0的版本bug,后续版本可能已修复。无需sudo权限,用--user参数升级到最新稳定版:

pip install --upgrade mlflow --user

内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:04:55