开发Python标准格式的在线训练模型
了解如何定义 模型训练的标准格式代码
作为 Web
服务部署在 小波AI平台
中。
以下介绍均以 demo-标准格式训练示例 为例。
训练文件目录
├── code <- Scripts to train models and then use trained models to make predictions.
│ ├── train_model.py <- Train the model and generate the corresponding model files.
│ ├── predict_model.py <- Model prediction combined with specific data preprocessing and business logic.
│ ├── MLproject <- Configuration files of training entrance.
│ └── requirements.txt <- Configuration files of the model running environment.
└── README.md <- The top-level README for developers using this project.
有关模型
在线训练部署
工作流的详细信息,请参阅使用 快速开始-在线训练模型。
编写训练文件
训练入口文件 MLproject
配置文件结构:
├── name <- 非必填,指定系统自动生成的训练所需的镜像名称))
├── docker_env <- docker环境
│ ├── args
│ │ └── cpus/gpus <- 非必填,cpus/gpus环境,选择运行内存大小
│ └── image <- 基础Docker镜像路径
└── entry_points
└── main
├── command <- 模型运行入口
└── parameters <- 模型入口参数name
镜像名称属性,注意不允许出现大写和特殊符号,参考docker镜像名称规范基础Docker镜像路径:一般直接使用系统提供的基础镜像即可。了解并使用Docker镜像,选择预生成Docker镜像路径。
模型运行入口:执行python方法的模型训练文件,添加入口参数。
python train_model.py -pi={parameter_i} -pj={parameter_j} -pk={parameter_k} -td={training_data}
模型入口参数:常用数据类型 str, int, float, url 等。其中 training_data为必填参数,参数类型type为url, 默认值default为"",训练数据在AI平台模型训练时进行选择,并自动填写。
parameter_i:
type: int
default: 3
parameter_j:
type: float
default: 3.5
parameter_k:
type: str
default: '7e911-9ac94806add-328f7f1e35'
training_data:
type: url
default: ""示例demo如下:
name: example_case
docker_env:
args:
cpus: 3
image: harbor.xiaobodata.com/wai/cpu:py37
entry_points:
main:
command: python train_model.py -dr={division_ratio} -td={training_data}
parameters:
training_data:
type: url
default: ""
division_ratio:
default: 0.7
type: float模型训练文件 train_model.py
代码结构:
├── @click <- 以click方法为例,引入模型入口参数
├── train() <- 编辑训练函数
│ ├── mlflow.log_param() <- 记录模型参数
│ ├── mlflow.log_metric() <- 记录模型指标
│ ├── mlflow.log_artifact() <- 保存模型依赖文件
│ └── mlflow.log_model() <- 保存模型文件
└── eval() <- 模型测试模型入口传参方法:引入模型入口参数,详情了解平台训练传参。
以click方法为例:
@click.command()
@click.option("--parameter_i", "-pi", type=int, default='none', help="参数i")
@click.option("--parameter_j", "-pj", type=float, default='none', help="参数j")
@click.option("--parameter_k", "-pk", type=str, default=0.7, help="参数k")
@click.option("--training_data", "-td", type=url, default="", help="数据集")log_param():在训练过程中,运行中记录单个键值的训练运行参数。键和值都是字符串。用于mlflow.log_params()一次记录多个参数。
备注:平台训练传参的入口参数 gunicorn 与 mlflow.log_param记录参数的argprase()参数名不能为相同的。否则,平台无法记录。
mlflow.log_param("param_i", 1)
log_metric():在训练过程中,记录单个键值的模型预测指标。该值必须始终是一个数字。MLflow 会记住每个指标的值的历史记录。用于mlflow.log_metrics()一次记录多个指标。
mlflow.log_metric("metric_i", 2)
log_artifact():训练结束后,在保存模型的过程中,将本地文件保存文件目录到模型库中,记录artifact_path,用于后续的模型预测。
mlflow.log_artifact("features.txt") <- 保存文件
mlflow.log_artifacts("./features/", "features") <- 保存文件夹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,则不会将任何文件添加到模型。示例demo如下:
artifacts = {
"file1": file1_path,
"file2": file2_path,
"file3": file3_path,
}
mlflow.pyfunc.log_model(
artifact_path="model", <- 模型文件夹名称(自定义)
python_model=model_predict(), <- 模型预测类函数( prediction.py)
code_path=['prediction.py', 'dependent_file1.py', 'dependent_file2.py'], <- 模型预测文件
artifacts=artifacts <- 依赖文件
conda_env=None, <- 环境文件
)eval():编辑完训练代码,用于本地进行模型测试。
模型预测文件 predict_model.py
入口脚本接收提交到已部署 Web 服务的数据,将数据传递给模型并进行模型预测,并将预测数据返回。
你需要在输入脚本中完成以下操作:
定义
model_predict类
,覆写函数predict(context, model_input)
predict()
函数为自定义的Python模型的预测函数,context
为PythonModelContext
实例,其中包含模型可用于执行推理的变量。model_input
为入参变量。以下是自定义的
predict()
的示例表示形式:def function1(x):
...
...
return outputs
class model_predict(pyfunc.PythonModel):
def load_context(self, context):
self.file1 = context.artifacts["file1"] <- 引用依赖文件,参与模型预测
self.file2 = context.artifacts["file2"]
self.file3 = context.artifacts["file3"]
def predict(self, context, inputs):
input = inputs.values <- 模型入参
outputs = function1(input) <- 调用自定义的预测函数function()进行模型预测
...
...
dic = {"out_parameter_name": outputs[:, 0]} <- 转换为平台可识别DataFrame格式
predict_value = pd.DataFrame(dic, index=range(0, len(outputs)))
return predict_value环境配置文件 requirements.txt
waveletai <- 官方提供的SDK插件,必填依赖包,本地开发时使用,平台提供的基础镜像中默认已安装
scikit-learn <- 自定义依赖包
scipy <- 自定义依赖包