智能集市故障排除


本文用于识别并解决使用智能集市过程中的一些问题。

构建模型时报错:Need GNU Compiler Collection


在智能集市中构建模型时报错: need GNU Compiler Collection(GCC)

故障原因

Wheel 包缺失导致报错。

解决方案

  1. 智能集市 中打开模型所在的 Notebook 实例。

  2. 在 Notebook 终端中运行以下命令以上传 wheel 包:

    pip install thriftpy
    

模型版本测试失败并报错:NO such file or directory:’model’


通过 MLFlow 导入的模型版本上架后,模型测试失败并出现以下错误信息:NO such file or directory:'model'

故障原因

The value of model parameter in mlflow.{framework}.log_model 命令中 model 的参数值不是 model。其中,Framework 指 Mlflow 过程中所使用的框架。

解决方案

  1. 智能集市 中打开模型所在的 Notebook 实例。
  2. 文件浏览器 中打开 JupyterLab 文件。
  3. 检查 mlflow.{framework}.log_model 命令,将 model 的参数值改为 model

模型版本测试失败并报错:IsADirectoryError:[ERROR 21] is a directory :’/microservice/model’


通过 MLFlow 导入的模型版本上架后,模型测试失败并出现以下错误信息:IsADirectoryError:[ERROR 21] is a directory :'/microservice/model'

故障原因

使用 Mlflow 1.9 或以上版本会导致该报错。智能集市目前支持 Mlflow 1.8 及以下版本。

解决方案

使用 Mlflow 1.8.0 或以下版本导入模型,并注册模型版本。你可以通过以下步骤安装 Mlflow 1.8.0:

  1. 智能集市 中打开模型所在的 Notebook 实例。

  2. 文件浏览器 中打开 JupyterLab 文件。

  3. 运行以下命令:

    conda install Mlflow==1.8.0
    
  4. 安装完成后,重新上架模型版本并测试。

模型版本测试失败并报错:ModuleNotFoundError: No module named ‘{framework}’


通过 MLFlow 导入的模型版本上架后,模型测试失败并出现以下错误信息:ModuleNotFoundError: No module named '{framework}'。其中,Framework 指 Mlflow 过程中所使用的框架。

故障原因

  • 原因 1:训练代码中使用了错误的服务框架。
  • 原因 2:log_model 命令中使用了错误的调用方法。

解决方案

  1. 智能集市 中打开模型所在的 Notebook 实例。
  2. 文件浏览器 中打开 JupyterLab 文件。
  3. 运行以下命令:
    • 对于原因 1:运行 import mlflow.{framework} 命令,导入正确的服务框架。
    • 对于原因 2: 运行 mlflow.{framework}.log_model 命令,调用正确的服务框架。
  4. 重新上架模型版本并测试。

模型版本测试失败并报错:AttributeError: ‘str’ object has no attribute ‘decode’


通过 MLFlow 导入的模型版本上架后,模型测试失败并出现以下错误信息:AttributeError: 'str' object has no attribute 'decode'

故障原因

H5py 版本冲突导致报错。智能集市支持 H5py 2.10.0。

解决方案

  1. 智能集市 中打开模型所在的 Notebook 实例。

  2. 文件浏览器 中打开 JupyterLab 文件。

  3. 运行以下命令:

    conda install h5py==2.10.0
    
  4. 安装完成后,重新上架模型版本并测试。

模型版本测试失败并报错:File “/microservice/MlflowPredictor.py”, line 30, in predict


通过 MLFlow 导入的模型版本上架后,模型测试失败并出现以下错误信息:File "/microservice/MlflowPredictor.py", line 30, in predict

故障原因

模型文件错误导致报错。

解决方案

  1. 在模型测试页面,复制左侧代码框中的代码。
  2. 智能集市 中打开模型所在的 Notebook 实例。
  3. 在 Notebook 实例中粘贴已复制的代码,以测试模型。
  4. 根据测试结果,在本地模型文件中修改错误。 ## 模型版本测试失败并报错:TypeError: an integer is required (got type bytes)


通过 MLFlow 导入的模型版本上架后,模型测试失败并出现以下错误信息:TypeError: an integer is required (got type bytes)。该报错信息在报错日志中如下图所示:

../_images/ts2.png

故障原因

  • 原因 1:使用 tensorflow 1.15 或以下版本训练模型。
  • 原因 2:Notebook 中的依赖包版本与 Mlflow 上架时使用的依赖包版本不一致。
  • 原因 3:Notebook 的 Python 版本与 Mlflow 上架时使用的依赖包版本不一致。

解决方案

  • 对于原因 1:更新 tensorflow 框架版本至 2.3.1。
  • 对于原因 2:通过以下步骤修复依赖包版本冲突:
    1. 智能集市 中打开模型所在的 Notebook 实例。
    2. 文件浏览器中打开 conda.yaml 文件。
    3. 检查并修改 conda.yaml 中的依赖包版本,使其与 Mlflow 上架时使用的依赖包版本一致。
  • 对于原因 3:通过以下步骤修复 Python 版本冲突:
    1. 智能集市 中打开模型所在的 Notebook 实例。
    2. 在终端中运行 python - 命令,查看 Notebook 的 Python 版本。
    3. 检查并修改 Notebook 中的 Python 版本,使其与 Mlflow 上架时使用的 Python 版本一致。

模型可在 Notebook 中运行,但模型版本上架或测试失败


你可以在 Notebook 中成功运行模型,但在模型版本上架或模型版本测试时失败。

故障原因

模型输入参数被封装为 dataframe。 通过以下步骤检查具体原因:

  1. 智能集市 中打开模型所在的 Notebook 实例。
  2. 文件浏览器 中打开 JupyterLab 文件。
  3. 运行 mlflow.{framework}.save_model 命令,将模型文件保存至 Notebook。 其中,Framework 指模型使用的机器学习框架。
  4. 运行 mlflow.pyfunc.load_model 命令,检查是否可以加载模型。
  5. 若加载模型成功,通过 pd.dataframe 函数将预测数据封装为 dataframe,并运行 predict 函数以进行模型预测。

解决方案

  • 解决方案 1:如果加载模型失败,检查本地模型文件,并修改文件中的错误。
  • 解决方案 2:如果模型预测成功,记录下 mlflow 和 python 的版本号并联系管理员。

上架模型版本时出现包戳:test success, number of test result not match repeat from model


若模型的输出参数类型为 object,上架模型版本时出现以下错误信息: test success, number of test result not match repeat from model

故障原因

模型的输出结果不是 object 类型。

解决方案

检查并修改输出参数,确保参数值为 object 类型。object 类型的示例如下所示:

[{  "data": [    ["2021-07-31", 5, 6],    ["2021-07-31", 5, 6],    ["2021-07-31", 5, 6]]}]

测试或部署模型版本时,日志文件不完整


测试或部署模型版本时,日志文件不完整。

../_images/ts.png


故障原因

内存不足导致进程关闭。

解决方案

  • 解决方案 1:如果测试模型时发生错误,在 输入参数 中添加 force_to_stage 参数,以强制上架模型版本。 如需了解更多模型参数的信息,可参考 Set Model Parameters
  • 解决方案 2:如果部署模型时发生错误,增加 Resource RequestResource Limit 的参数值并重试。 如需了解更多模型部署的信息,可参考 Deploy a Model Version.

使用 Cloudpickle 序列化时出错

使用 Cloudpickle 进行序列化时出现如下错误:

File "/opt/conda/lib/python3.8/site-packages/mlflow/pyfunc/__init__.py", line 522, in load_model
model_impl = importlib.import_module(conf[MAIN])._load_pyfunc(data_path)
File "/opt/conda/lib/python3.8/site-packages/mlflow/pyfunc/model.py", line 223, in _load_pyfunc
python_model = cloudpickle.load(f)
AttributeError: Can't get attribute '_make_function' on <module 'cloudpickle.cloudpickle' from '/opt/conda/lib/python3.8/site-packages/cloudpickle/cloudpickle.py'>
2022-06-07 01:44:27,878 - jaeger_tracing:report_span:73 - INFO: Reporting span 874aec19bfb8dc2f:b5d9f8f14bbebca4:0:1 MlflowPredictor.Predict
2022/06/07 01:44:28 WARNING mlflow.pyfunc: The version of CloudPickle that was used to save the model, `CloudPickle 2.1.0`, differs from the version of CloudPickle that is currently running, `CloudPickle 2.0.0`, and may be incompatible
2022-06-07 01:44:28,388 - seldon_core.wrapper:log_exception:1891 - ERROR: Exception on /predict [POST]
Traceback (most recent call last):
File "/opt/conda/lib/python3.8/site-packages/seldon_core/user_model.py", line 236, in client_predict

故障原因

模型训练中的模型版本与模型测试中的版本不一致。

解决方法

指定同一模型版本进行模型训练和模型测试。其最佳实践之一为:

env = {
    'name': 'model',
    'channels': ['default'],
    'dependencies': [
        'python=3.8.8',
                {'pip': [
                    'mlflow==1.13.1',
                    'sklearn',
                    'cloudpickle=={}'.format(cloudpickle.__version__),
                    'eapdataset',
                ]}
    ]
}
wind_power_forecast_model = wind_power_forecast(model=fitted_model)
mlflow.pyfunc.log_model(artifact_path="model", python_model=wind_power_forecast_model, conda_env=env)