json 无法识别的内容类型参数:在数据库上提供模型时的格式实验

hrysbysz  于 2023-01-14  发布在  其他
关注(0)|答案(1)|浏览(129)

我得到这个错误时,服务模型到数据库使用MLflow,
无法识别的内容类型参数:格式。重要提示:MLflow模型评分协议在MLflow版本2.0中已更改。如果您看到此错误,则可能使用了过时的评分请求格式。要解决此错误,请更新请求格式或调整MLflow模型的要求文件以指定旧版本的MLflow(例如,将"mlflow"要求说明符更改为"mlflow == 1.30.0")。如果使用MLflow客户端发出请求(例如,通过mlflow. pyfunc. spark_udf()),将MLflow客户端升级到版本〉= 2.0,以便使用新的请求格式。有关MLflow 2.0中更新的MLflow模型评分协议的详细信息,请参阅www.example.com。https://mlflow.org/docs/latest/models.html#deploy-mlflow-models.
我正在寻找正确的格式来用于我的Json输入,因为我正在使用的格式看起来像这个例子:

[
  { 
    "input1":12,
    "input2":290.0,
    "input3":'red'
   }
]

我真的不知道它是否与我的mlfow版本有关(目前我使用的是mlflow==1.24.0),我不能更新版本,因为我没有一些特权。我也尝试了建议的解决方案here,并得到:

TypeError:spark_udf() got an unexpected keyword argument 'env_manager'

到目前为止,我没有找到任何文档来解决这个问题。
谢谢你的帮助,提前。

bvhaajcl

bvhaajcl1#

在记录模型时,MLflow版本为1.24,但在Databrick中将其用作API时,将为其创建一个新环境。此新环境将安装MLflow的2.0+版本。如错误消息所示,您可以指定MLflow版本或更新请求格式。
如果使用的是Classic Model Serving,则应指定版本;如果使用的是Serverless Model Serving,则应更新请求格式。如果必须使用Classic Model Serving且不想升级,请滚动到底部。

指定MLflow版本

在记录模型时,您可以指定一个新的Conda环境,或者添加额外的pip需求,这些需求将在模型运行时使用。

    • 吹号**
# log model with mlflow==1.* specified 
mlflow.<flavor>.log_model(..., extra_pip_requirements=["mlflow==1.*"])
    • 孔达**
# get default conda env
conda_env = mlflow.<flavor>.get_default_conda_env()
print(conda_env)

# specify mlflow==1.*
conda_env = {
    "channels": ["conda-forge"],
    "dependencies": [
        "python=3.9.5",
        "pip<=21.2.4",
        {"pip": ["mlflow==1.*", "cloudpickle==2.0.0"]},
    ],
    "name": "mlflow-env",
}

# log model with new conda_env
mlflow.<flavor>.log_model(..., conda_env=conda_env)

更新请求

另一种方法是更新JSON请求格式,但这仅在使用Databrick的Serverless时有效。
在错误消息末尾的MLflow docs链接中,您可以看到所有格式,根据您提供的数据,我建议使用dataframe_splitdataframe_records
一个二个一个一个

采用MLflow 2.0+的经典型号

如果您使用经典模型服务,不想指定MLflow版本,并且想使用UI进行推理,请不要在记录模型时记录input_example。我知道这不符合MLflow的"最佳实践",但由于一些调查,我相信在您这样做时,数据块存在问题。
当您记录input_example时,MLFlow会记录有关示例的信息,包括typepandas_orient。此信息用于生成推理配方。正如您在生成的curl命令中看到的,它设置format=pandas-records(不生成JSON)。但这会返回 * Unrecognized content type ... * 错误。

curl \
  -u token:$DATABRICKS_TOKEN \
  -X POST \
  -H "Content-Type: application/json; format=pandas-records" \
  -d '{
    "dataframe_split": {
        "columns": ["input1", "input2", "input3"],
        "data": [[12, 290, 3]]
    }
  }' \
  https://<url>/model/<model>/<version>/invocations

对我来说,当我完全删除format=pandas-records时,一切都按预期运行。因此,我相信如果您记录一个示例并使用UI,那么Databricks会为您将此格式添加到请求中。这会导致错误,即使您正确地执行了所有操作。而在无服务器模式下,生成的curl根本不包含此参数。

相关问题