AzureML训练管道中如何保存MinMaxScaler并关联模型用于推理?
在Azure ML中保存scikit-learn转换器并与模型关联的简便方法
针对你的需求,有几种比单独存pickle再记录路径更简便的方案,可直接实现转换器与模型的关联:
1. 用scikit-learn Pipeline打包转换器与模型
这是最推荐的方式——将MinMaxScaler和训练好的模型封装成一个Pipeline对象,训练完成后直接保存整个Pipeline,注册到Azure ML时也只需要注册这个Pipeline。推理时直接调用Pipeline的predict方法,自动完成预处理+预测,完全不用单独管理转换器。
示例代码:
from sklearn.pipeline import Pipeline from sklearn.preprocessing import MinMaxScaler from sklearn.ensemble import RandomForestClassifier from azureml.core import Model # 构建Pipeline pipeline = Pipeline([ ('scaler', MinMaxScaler()), ('model', RandomForestClassifier()) ]) # 训练Pipeline pipeline.fit(X_train, y_train) # 保存Pipeline到本地目录 import joblib joblib.dump(pipeline, './trained_pipeline.pkl') # 注册到Azure ML Model.register( workspace=your_workspace, model_name="my_pipeline_model", model_path="./trained_pipeline.pkl", description="包含MinMaxScaler和随机森林模型的Pipeline" )
2. 将转换器与模型放在同一目录下注册
如果不想用Pipeline,也可以把训练好的scaler和模型文件保存到同一个本地目录,然后直接注册整个目录。这样两者会被作为同一个模型资产的一部分存储,推理时从模型目录中分别加载即可,不用额外记录路径。
示例代码:
import os import joblib from azureml.core import Model # 创建模型目录 os.makedirs('./model_assets', exist_ok=True) # 保存scaler和模型到同一目录 joblib.dump(scaler, './model_assets/scaler.pkl') joblib.dump(trained_model, './model_assets/model.pkl') # 注册整个目录 Model.register( workspace=your_workspace, model_name="my_model_with_scaler", model_path="./model_assets", # 注册整个目录 description="包含MinMaxScaler和模型文件的资产" )
3. 注册模型时添加附属文件
Azure ML的Model注册支持通过extra_files参数添加附属文件,直接把scaler文件和模型绑定在一起。注册后,scaler会作为模型的附属文件存在,推理时可以从模型的安装路径中读取。
示例代码:
import joblib from azureml.core import Model # 保存模型和scaler joblib.dump(trained_model, './model.pkl') joblib.dump(scaler, './scaler.pkl') # 注册模型并添加scaler作为附属文件 Model.register( workspace=your_workspace, model_name="my_model", model_path="./model.pkl", extra_files=['./scaler.pkl'], # 添加附属文件 description="带MinMaxScaler附属文件的模型" )
以上三种方法都比你原来的思路更简便,避免了手动管理Blob路径的麻烦,同时天然实现了转换器与模型的关联,推理时加载更顺畅。
内容的提问来源于stack exchange,提问作者ganninu93
相关产品推荐
相关产品推荐

