无法从成功的Azure ML管道作业下载JSON文件的技术求助
问题诊断与解决方法
你的问题核心在于作业输出的定义逻辑混乱,以及下载时的参数匹配错误,具体问题点和修正方案如下:
问题根源
输出方式冲突:你同时用了两种输出逻辑,但存储位置完全不同:
- 写入
AZUREML_OUTPUT_DIRECTORY(即outputs目录)的文件,本应作为作业的正式Data Output同步到blob存储 - 调用
run.upload_file()上传的文件,是绑定到Run实例的附属文件,不属于Data Outputs,只会出现在作业的「Files」标签下
- 写入
下载参数错误:
- 用
ml_client.jobs.download()时,output_name需要填的是管道组件中定义的输出参数名,不是文件名portfolio_weights.json - 用旧SDK的
run.download_file()时,要明确你下载的是upload_file()上传的附属文件,还是outputs目录里的正式输出
- 用
Blob存储无内容:你写入了
outputs目录,但可能因为未正确配置作业输出绑定,导致该目录未被同步到blob存储;或者写入路径有误,文件没生成到正确位置
修正步骤
1. 调整作业输出代码(二选一)
方式一:用正式作业输出(推荐,对应Data Outputs)
如果是构建管道组件,用OutputFileDatasetConfig声明输出,直接写入指定路径即可,无需手动上传:
from azure.ai.ml import Output from azure.ai.ml.components import command_component @command_component() def compute_portfolio_weights( # 你的输入参数... weights_output: Output(type="uri_file") # 声明输出文件 ): import json import numpy as np # 模拟计算portfolio_weights portfolio_weights = np.array([0.2, 0.3, 0.5]) # 直接写入Output指定的路径,无需处理环境变量 with open(weights_output, 'w') as f: json.dump(portfolio_weights.tolist(), f)
如果用旧SDK的Run类,只需写入outputs目录,删掉run.upload_file()避免混淆:
output_dir = "outputs" # Azure ML会自动同步这个目录到存储 output_file_path = os.path.join(output_dir, 'portfolio_weights.json') portfolio_weights_list = portfolio_weights.tolist() with open(output_file_path, 'w') as f: json.dump(portfolio_weights_list, f) run.log("portfolio_weights_path", output_file_path) # 移除run.upload_file这一行
方式二:坚持用run.upload_file()上传
保留run.upload_file()的话,下载时要针对Run的附属文件操作:
run = Run.get(ws, job_name) run.download_file( name="portfolio_weights.json", output_file_path=os.path.join(output_dir, "portfolio_weights.json") )
2. 正确下载正式Data Output
用新ML Client下载时,指定组件中定义的输出参数名(不是文件名):
# 假设你的作业输出参数名为"weights_output" ml_client.jobs.download( name=job.name, download_path='./downloads', output_name="weights_output" # 这里填输出参数名,不是文件名 )
3. 验证输出正确性
- 作业运行后,查看「Data Outputs」标签,复制blob存储路径
- 登录Azure存储账户,导航到该路径,确认文件存在且有内容
内容的提问来源于stack exchange,提问作者Cam Howe
相关产品推荐
相关产品推荐

