开发自定义模型的标准格式
开发自定义模型包括以下步骤:
准备模型代码;
编辑相应的本地模型注册脚本、模型预测入口脚本 和 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 <- 本地模型注册脚本.
编写模型文件夹
定义环境脚本
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 #自定义依赖包定义模型预测入口脚本
prediction.py
入口脚本接收提交到已部署 Web 服务的数据,将数据传递给模型并进行模型预测,并将预测数据返回。
你需要在输入脚本中完成以下操作:定义
model_predict类
,覆写函数predict(context, model_input)
predict()
函数为自定义的Python模型的预测函数,context
为PythonModelContext
实例,其中包含模型可用于执行推理的变量。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编辑本地模型注册脚本
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() # 本地注册模型
本地生成模型文件夹
本地运行模型注册脚本并生成模型文件夹
运行文件后,在本地默认路径
"./mlruns/0/[自动生成的模型运行id]/artifacts/"
下。生成相应的模型行文件夹如下:
- model # 生成的模型文件名称
- artifacts # 保存生成的依赖文件、模型文件或文件夹
- file
- file1.txt
- model.h5
- code # 保存需要的代码文件
- prediction.py # 预测文件:覆写mlflow.pyfunc的预测方法
- conda.yaml # 模型需要的环境配置或生成默认环境文件
- MLmodel # 自动生成的模型配置文件
- python_model.pkl # 自动生成的模型文件以下为示例模型生成的模型文件夹的目录结构如下:
利用本地注册模型进行模型预测验证
通过读取本地生成的模型文件夹,输出正确的预测结果,即为模型验证通过。
以下为针对已生成的示例模型的模型文件夹的模型验证:
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)预测结果输出
至此,已生成本地的自定义模型文件夹。
本地运行模型注册脚本,生成模型文件夹。在本地默认路径 "./mlruns/0/[自动生成的模型运行id]/artifacts/"
下。
模型上传本地文件夹时,选择目录"./mlruns/0/[自动生成的模型运行id]/artifacts/model"
文件夹上传。