如何加载Azure AutoML模型对应环境以解决版本兼容问题?
问题描述
我想在代码中使用Azure AutoML生成的模型做测试(暂不部署),当前用以下代码加载模型:
import joblib from azureml.core.model import Model from azureml.core import Workspace import os import pickle ws = Workspace.from_config() path=Model.get_model_path('my_automl_model', version=1, _workspace=ws) model_path = os.path.join(path, 'model.pkl') model = joblib.load(model_path)
运行时出现错误:
/anaconda/envs/azureml_py38/lib/python3.8/site-packages/spacy/util.py:873: UserWarning: [W094] Model 'en_core_web_sm' (2.1.0) specifies an under-constrained spaCy version requirement: >=2.1.0. This can lead to compatibility problems with older versions, or as new spaCy versions are released, because the model may say it's compatible when it's not. Consider changing the "spacy_version" in your meta.json to a version range, with a lower and upper pin. For example: >=3.4.0,<3.5.0 warnings.warn(warn_msg) Output exceeds the size limit. Open the full output data in a text editor --------------------------------------------------------------------------- OSError Traceback (most recent call last) /home/azureuser/....ipynb Cellule 4 in <cell line: 11>() 9 model_path = os.path.join(path, 'model.pkl') 10 print(os.stat(model_path)) ---> 11 model = joblib.load(model_path) File /anaconda/envs/azureml_py38/lib/python3.8/site-packages/joblib/numpy_pickle.py:605, in load(filename, mmap_mode) 599 if isinstance(fobj, _basestring): 600 # if the returned file object is a string, this means we 601 # try to load a pickle file generated with an version of 602 # Joblib so we load it with joblib compatibility function. 603 return load_compatibility(fobj) --> 605 obj = _unpickle(fobj, filename, mmap_mode) 607 return obj File /anaconda/envs/azureml_py38/lib/python3.8/site-packages/joblib/numpy_pickle.py:529, in _unpickle(fobj, filename, mmap_mode) 527 obj = None 528 try: --> 529 obj = unpickler.load() 530 if unpickler.compat_mode: 531 warnings.warn("The file '%s' has been generated with a " 532 "joblib version less than 0.10. " 533 "Please regenerate this pickle file." 534 % filename, ... 679 return config.from_disk( 680 config_path, overrides=overrides, interpolate=interpolate 681 ) OSError: [E053] Could not read config file from /anaconda/envs/azureml_py38/lib/python3.8/site-packages/en_core_web_sm/en_core_web_sm-2.1.0/config.cfg
AutoML模型文件夹包含相关文件,我推测错误原因是当前运行环境为Python 3.8.5,而模型生成环境为Python 3.7.9(conda.yaml文件已标注),请问加载该模型对应环境的最佳方式是什么?
解决方案
针对Python版本不匹配导致的模型加载问题,最佳方式是复用AutoML生成的conda环境配置,步骤如下:
提取模型的conda配置文件
从Azure AutoML模型文件夹中找到conda.yaml文件,该文件记录了模型训练时的所有依赖包及版本。基于配置创建conda环境
使用conda命令创建与训练环境一致的虚拟环境:conda env create -f conda.yaml环境创建完成后,激活该环境:
conda activate <环境名称>(注:
<环境名称>可在conda.yaml的name字段中找到)在匹配环境中加载模型
激活环境后,运行你原来的加载代码即可。如果需要在Jupyter Notebook中使用该环境,需先将环境添加到Notebook内核:python -m ipykernel install --user --name <环境名称> --display-name "Python (<环境名称>)"之后在Notebook中选择对应的内核运行代码。
备选方案:使用Azure ML环境进行本地测试
如果你不想手动管理conda环境,可以用Azure ML SDK加载模型的原始环境并运行测试:from azureml.core import Workspace, Model, Environment from azureml.core.model import InferenceConfig from azureml.core.compute import LocalCompute ws = Workspace.from_config() model = Model(ws, 'my_automl_model', version=1) # 获取模型关联的环境 env = model.get_environment() # 创建本地计算目标 local_compute = LocalCompute(ws, 'local') # 创建推理配置 inference_config = InferenceConfig(entry_script='score.py', environment=env) # 部署到本地(仅测试用) service = Model.deploy(ws, 'local-test-service', [model], inference_config, local_compute, overwrite=True) service.wait_for_deployment(show_output=True) # 调用模型测试 result = service.run(input_data='{"data": [...]}')这种方式完全复用训练时的环境配置,避免版本冲突,但需要编写简单的
score.py脚本处理输入输出。
内容的提问来源于stack exchange,提问作者tammuz
相关产品推荐
相关产品推荐

