Skip to main content
Version: 2.17.1

开发自定义模型的标准格式

开发自定义模型包括以下步骤:

  • 准备模型代码;

  • 编辑相应的本地模型注册脚本、模型预测入口脚本 和 conda 依赖项脚本;

  • 生成本地生成的模型文件夹。

示例模型

线性函数,输入参数x,通过y=2x+1,得到y

    def Linear_function(x):
y = 2 * x + 1
return y

注册文件目录

    ├── conda.yaml                     <- 定义环境脚本.
├── prediction.py <- 定义模型预测入口脚本.
├── other_dependent_file1.py <- 模型依赖文件1.
├── other_dependent_file2.py <- 模型依赖文件2.
├── other_dependent_file3.py <- 模型依赖文件3.
├── ...... <- 模型依赖文件n.
└── local_registration_model.py <- 本地模型注册脚本.

编写模型文件夹

  1. 定义环境脚本 conda.yaml

    基于平台所提供的多种基础镜像包,如果模型仍含有基础镜像不涵盖的依赖包,则需要自定义 conda.yaml 。如果模型所需的依赖包均在基础镜像包中,则无需自定义 conda.yaml

    以下是自定义的Conda环境的示例表示形式:

    dependencies:
    - python=3.7.7 #自定义依赖包
    - pip=20.2.4
    - pip:
    - opencv-python==4.1.2.30 #自定义依赖包
    - pillow=7.2.0 #自定义依赖包
    - tensorflow=1.14.0 #自定义依赖包
  2. 定义模型预测入口脚本 prediction.py

    入口脚本接收提交到已部署 Web 服务的数据,将数据传递给模型并进行模型预测,并将预测数据返回。

    你需要在输入脚本中完成以下操作:定义 model_predict类,覆写函数 predict(context, model_input)

    predict() 函数为自定义的Python模型的预测函数,contextPythonModelContext实例,其中包含模型可用于执行推理的变量。model_input为入参变量。

    以下是自定义的predict()的示例表示形式:

        class model_predict(pyfunc.PythonModel):
    def predict(self, context, inputs):
    # 入参
    input = inputs.values

    # 调用自定义的Linear_function()进行模型预测
    outputs = Linear_function(input)

    # 转换为平台可识别格式
    x = np.zeros((len(outputs), 1))
    for i in range(len(outputs)):
    x[i, 0] = outputs[i, 0]
    dic = {"y": x[:, 0]}
    predict_value = pd.DataFrame(dic, index=range(0, len(outputs)))
    # 返回预测结果
    return predict_value
  3. 编辑本地模型注册脚本 local_registration_model.py

    函数 mlflow.pyfunc.log_model()

        mlflow.pyfunc.log_model(artifact_path, code_path, conda_env, python_model, artifacts)

    参数说明:

    • artifact_path  – Python模型保存路径。

    • code_path  – 自定义覆写的模型预测入口脚本(prediction.py)以及模型预测所依赖的文件或文件路径。

    • conda_env  – 自定义的环境脚本(conda.yaml),或者,当无特别的依赖包,可以选择None为默认Conda环境。

    • python_model  – 模型预测脚本( prediction.py )中的类函数 model_predict()。

    • artifacts  – 自定义保存的文件或者文件路径。模型预测时,python_model可以将其解析的文件作为PythonModel.load_context()和PythonModel.predict()中context数的artifacts属性来引用。如果为None,则不会将任何文件添加到模型。

    以下为本地模型注册的示例脚本:

        def local_registration_model():
    mlflow.pyfunc.log_model(
    artifact_path="model", # 模型文件夹名称(自定义)
    python_model=model_predict(), # 模型预测类函数( prediction.py )
    code_path=['prediction.py', 'Linear_function.py'], # 模型预测文件
    conda_env=None, # 环境文件
    )
        if __name__ == '__main__':
    local_registration_model() # 本地注册模型

本地生成模型文件夹

  1. 本地运行模型注册脚本并生成模型文件夹

    运行文件后,在本地默认路径 "./mlruns/0/[自动生成的模型运行id]/artifacts/" 下。

    生成相应的模型行文件夹如下:

    - model                   # 生成的模型文件名称
    - artifacts # 保存生成的依赖文件、模型文件或文件夹
    - file
    - file1.txt
    - model.h5
    - code # 保存需要的代码文件
    - prediction.py # 预测文件:覆写mlflow.pyfunc的预测方法
    - conda.yaml # 模型需要的环境配置或生成默认环境文件
    - MLmodel # 自动生成的模型配置文件
    - python_model.pkl # 自动生成的模型文件

    以下为示例模型生成的模型文件夹的目录结构如下:

    数据

  2. 利用本地注册模型进行模型预测验证

    通过读取本地生成的模型文件夹,输出正确的预测结果,即为模型验证通过。

    以下为针对已生成的示例模型的模型文件夹的模型验证:

        if __name__ == '__main__':
    # 本地注册模型生成的模型路径
    model_path = "." + "/mlruns/0/bf2a396b70c84b61bb30568bc2e326c7/artifacts/model"
    test = mlflow.pyfunc.load_model(model_path)
    # 模型入参

    input_x = pd.read_json('{"columns":["x"], "data": [[1],[2]]}', orient="split", dtype=False)

    # 模型预测
    predictions = test.predict(input_x)
    # 输出预测结果
    print(predictions)
  3. 预测结果输出

    数据

至此,已生成本地的自定义模型文件夹。

本地运行模型注册脚本,生成模型文件夹。在本地默认路径 "./mlruns/0/[自动生成的模型运行id]/artifacts/" 下。

模型上传本地文件夹时,选择目录"./mlruns/0/[自动生成的模型运行id]/artifacts/model"文件夹上传。