如何在Azure ML环境中添加通过相对路径引用的私有Python包
你遇到的问题根因为:本地运行时相对路径../../utils指向你本地磁盘的实际文件,但Azure ML云端构建Conda环境时,仅会拉取你提交的environment.yml文件本身,不会自动将你本地的utils目录同步到云端构建环境的文件系统中,因此路径指向的私有包不存在,导致安装失败。
以下是三种可落地的解决方案:
方案1:打包私有包为whl文件,通过私有wheel地址安装(最稳定)
适合需要多次复用utils包的场景,无额外路径依赖问题
- 第一步:在本地项目根目录(包含
utils文件夹的上层目录)运行打包命令,生成wheel包:python setup.py sdist bdist_wheel
运行完成后会生成dist目录,里面包含类似utils-0.0.1-py3-none-any.whl的安装包 - 第二步:将生成的wheel包上传到Azure ML工作区,获取可访问的私有地址:
from azureml.core import Workspace, Environment ws = Workspace.from_config() # 替换为你本地wheel包的实际路径 wheel_url = Environment.add_private_pip_wheel(workspace=ws, file_path="./dist/utils-0.0.1-py3-none-any.whl") - 第三步:修改
environment.yml的pip依赖部分,将原来的../../utils替换为上一步得到的wheel_url即可。之后按原来的逻辑创建环境,云端就能正常拉取安装私有包。
方案2:将utils纳入环境构建上下文(适合不想打包的场景)
如果你不想额外打包,可以改用Docker上下文的方式创建环境,将utils目录同步到云端构建环境:
- 第一步:在项目根目录创建
Dockerfile,内容参考:# 使用Azure ML官方基础镜像,可根据需要替换为对应Python版本的镜像 FROM mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest # 创建conda环境安装公共依赖 RUN conda create -n env_name python=3.8 pyodbc pandas azureml-core ENV PATH /opt/conda/envs/env_name/bin:$PATH # 复制utils目录到构建环境并安装 COPY ./utils /tmp/utils RUN pip install /tmp/utils - 第二步:修改
train_pipeline.py中的环境创建逻辑,替换原来的from_conda_specification方法:# context参数填项目根目录的路径,会将该目录下所有内容作为构建上下文上传 environment = Environment.from_dockerfile(name='env_name', dockerfile='./Dockerfile', context='.')
方案3:将utils作为训练脚本的附属文件上传(适合快速测试场景)
如果只是临时测试不想修改环境定义,可以直接在运行时引入utils包,不需要修改环境构建逻辑:
- 第一步:提交训练作业时,将
source_directory参数设置为项目根目录(包含utils、projects、azure_pipelines的上层目录),训练脚本路径改为projects/project_1/script.py - 第二步:在
script.py的开头添加如下代码,将当前工作目录加入Python模块搜索路径:
之后就能正常导入import sys sys.path.append(".")utils下的模块使用。
内容的提问来源于stack exchange,提问作者ganninu93
相关产品推荐
相关产品推荐

