使用mlflow.spark.log_model记录ALS模型时input_sample参数报错求助
解决MLflow Spark日志ALS模型时
sample_example触发MLeap依赖错误的问题 问题原因
当你向mlflow.spark.log_model传入sample_example参数时,MLFlow会自动尝试启用MLeap flavor来序列化模型和示例数据,但Databricks Runtime 15.3默认未预装MLeap库,因此触发ModuleNotFoundError: No module named 'mleap'错误。
解决方案
1. 安装MLeap依赖(原生支持sample_example)
直接在Databricks Notebook中安装MLeap,即可正常使用sample_example参数:
%pip install mleap
安装完成后,原代码中sample_example = df_train.limit(20)的写法可以直接生效,无需修改数据格式。注意:ALS模型在Spark 3.5环境下与MLeap兼容,不会出现兼容性问题。
2. 优化现有字典转换方案
你当前使用的input_example=df_train.limit(20).toPandas().to_dict(orient="records")是完全可行的,且无需引入额外依赖。MLFlow会将字典格式的输入示例存储为JSON,在模型UI中可正常展示和测试。
若想简化转换步骤,也可以直接用Spark原生API处理:
import json # 取单条样本转为字典(若需多条可循环处理) input_example = json.loads(df_train.limit(1).toJSON().collect()[0])
3. 手动记录样本数据(跳过示例参数)
如果不需要在MLFlow模型UI中直接测试示例,可去掉sample_example/input_example参数,改用mlflow.log_artifact手动保存样本:
# 将样本保存为CSV并上传到MLFlow artifacts df_train.limit(20).write.mode("overwrite").csv("/tmp/training_sample.csv", header=True) mlflow.log_artifact("/tmp/training_sample.csv", "training_samples")
最优方案选择
- 若需要保留
sample_example的原生Spark DataFrame支持,优先选择安装MLeap依赖,这是最贴合MLFlow设计的方式。 - 若不想引入额外依赖,你的字典转换方案已经是最优选择,既满足输入示例的展示需求,又避免了MLeap的依赖问题。
内容的提问来源于stack exchange,提问作者Moj
相关产品推荐
相关产品推荐

