如何控制Azure ML Command作业中源代码的上传路径?
问题:控制Azure ML Command作业中本地代码的上传位置
在Azure Machine Learning Studio笔记本中使用command函数创建作业时,每次./src目录代码变更,新的代码副本都会上传到默认Blob存储账户的新容器中,导致存储杂乱。相关代码如下:
from azure.ai.ml import command, Input, Output from azure.ai.ml.entities import Data from azure.ai.ml.constants import AssetTypes subscription_id = "<subscription_id>" resource_group = "<resource_group>" workspace = "<workspace>" storage_account = "<storage_account>" input_path = "<input_path>" output_path = "<output_path>" input_dict = { "input_data_object": Input( type=AssetTypes.URI_FILE, path=f"azureml://subscriptions/{subscription_id}/resourcegroups/{resource_group}/workspaces/{workspace}/datastores/{storage_account}/paths/{input_path}" ) } output_dict = { "output_folder_object": Output( type=AssetTypes.URI_FOLDER, path=f"azureml://subscriptions/{subscription_id}/resourcegroups/{resource_group}/workspaces/{workspace}/datastores/{storage_account}/paths/{output_path}", ) } job = command( code="./src", command="python 01_read_write_data.py -v --input_data=${{inputs.input_data_object}} --output_folder=${{outputs.output_folder_object}}", inputs=input_dict, outputs=output_dict, environment="<asset_env>", compute="<compute_cluster>", ) returned_job = ml_client.create_or_update(job)
请问是否有方法控制./src代码的上传位置?
解决方案
有两种可行方式解决这个问题,核心思路是避免每次作业创建时自动上传本地代码到随机容器,而是指定固定存储位置:
方法1:注册代码资产(推荐)
将本地./src目录注册为Azure ML的代码资产(Code Asset),可以指定存储位置和版本,后续作业直接引用该资产,不会生成新的随机容器。
步骤示例:
- 先创建并注册代码资产,指定目标存储路径:
from azure.ai.ml.entities import Code # 定义代码资产,指定要存储到的datastore和路径 code_asset = Code( path="./src", # 本地代码目录 name="data_processing_src", # 资产名称 version="1", # 版本号,代码变更时可更新版本 datastore=storage_account, # 目标存储账户名 path_on_datastore="code/assets/data_processing" # 自定义的存储路径 ) # 注册资产到工作区 ml_client.code.create_or_update(code_asset)
- 在Command作业中引用该代码资产:
job = command( code="azureml:data_processing_src:1", # 格式:azureml:<资产名称>:<版本号> command="python 01_read_write_data.py -v --input_data=${{inputs.input_data_object}} --output_folder=${{outputs.output_folder_object}}", inputs=input_dict, outputs=output_dict, environment="<asset_env>", compute="<compute_cluster>", )
这种方式的优势是支持版本管理,代码变更时只需更新资产版本,存储位置固定,且无需手动上传代码。
方法2:直接引用存储中的代码路径
如果不想注册资产,可以提前将本地./src代码上传到指定的datastore路径,然后在Command作业中直接引用该路径,跳过本地代码自动上传步骤。
代码示例:
# 直接指定datastore中的代码文件夹路径 job = command( code=f"azureml://subscriptions/{subscription_id}/resourcegroups/{resource_group}/workspaces/{workspace}/datastores/{storage_account}/paths/code/assets/data_processing/", command="python 01_read_write_data.py -v --input_data=${{inputs.input_data_object}} --output_folder=${{outputs.output_folder_object}}", inputs=input_dict, outputs=output_dict, environment="<asset_env>", compute="<compute_cluster>", )
注意:这种方式需要手动同步本地代码到指定的datastore路径,适合不需要版本管理的简单场景。
内容的提问来源于stack exchange,提问作者Matt_Haythornthwaite
相关产品推荐
相关产品推荐

