如何在AzureML中使用已有model.pth与cfg.yaml部署Detectron2模型
问题解决方案
部署错误修复步骤
- 先修改
cfg.yaml配置,删除硬编码的WEIGHTS字段,或者将该字段值设为空,避免加载配置时自动访问不存在的固定路径。 - 调整
scoring.py的代码结构,按照AzureML的规范将模型初始化逻辑放到init()函数中,加载配置后手动覆盖权重路径,示例代码如下:
import os import logging from detectron2.config import get_cfg from detectron2.engine import DefaultPredictor logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) predictor = None def init(): global predictor cfg = get_cfg() cfg.merge_from_file("cfg.yaml") # 手动指定权重路径 cfg.MODEL.WEIGHTS = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'model.pth') # 如果使用CPU部署,添加这行配置,避免GPU环境缺失报错 cfg.MODEL.DEVICE = "cpu" predictor = DefaultPredictor(cfg) logger.info("模型加载完成") def run(raw_data): # 原有推理逻辑保持不变即可 pass
- 确认模型注册规则:你在AzureML工作区注册模型时,如果是同时上传
model.pth和cfg.yaml两个文件作为同一个模型的资产,部署后两个文件都会直接出现在AZUREML_MODEL_DIR对应的目录下;如果上传的是压缩包,需要确认解压后的文件层级,调整路径读取逻辑匹配实际结构。 - 检查推理环境依赖:确保部署用的环境安装了和训练环境版本一致的Detectron2、PyTorch、opencv-python等依赖包,依赖缺失或版本不兼容也会触发无明确日志的服务启动失败。
AzureML部署服务内部文件结构说明
部署生成的容器内部文件结构规则如下:
- 所有注册的模型都会挂载到
/var/azureml-app/azureml-models/目录下,单模型的完整路径格式为/var/azureml-app/azureml-models/<模型名称>/<模型版本>/<模型文件路径> - 环境变量
AZUREML_MODEL_DIR默认指向你部署时指定的主模型的根目录,也就是上述路径中的/var/azureml-app/azureml-models/<模型名称>/<模型版本>/ - 你上传的部署脚本(包括
scoring.py、conda依赖配置文件等)会放在/var/azureml-app/目录下,在scoring.py中可以直接用相对路径读取同目录下的配置文件。 - 如需确认实际路径结构,可以在
init()函数中添加日志打印代码,输出对应目录的文件列表,部署后查看服务日志就能获取准确路径信息,示例代码如下:
def init(): logger.info(f"当前工作目录: {os.getcwd()}") logger.info(f"工作目录文件列表: {os.listdir('.')}") model_dir = os.getenv('AZUREML_MODEL_DIR') logger.info(f"模型目录路径: {model_dir}") if model_dir: logger.info(f"模型目录下的文件: {os.listdir(model_dir)}") # 后续初始化逻辑
内容的提问来源于stack exchange,提问作者Mountassir EL MOUSTAAID
相关产品推荐
相关产品推荐

