Azure Machine Learning组件间数据传递失败问题排查
问题:Azure ML组件间传递数据帧失败
问题背景
我在Azure Machine Learning中有两个组件,希望将第一个名为prep的组件中的两个数据帧传递给第二个middle组件做后续处理。
尝试的操作
在prep组件代码中,我试了三种保存数据帧的方式:
print((Path(args.Y_df) / "Y_df.csv")) df1.to_csv("./outputs/Y_df.csv") df1.to_csv(args.Y_df.path) df1.to_csv("azureml://subscriptions/subscription_id/resourcegroups/rg_group/workspaces/workspace_name/datastores/datastore_name/paths/azureml/forecast/testing/y_df.csv")
只有第一种(保存到./outputs/目录)能成功。
流水线定义代码:
def data_pipeline( compute_train_node: str, ): prep_node = prep() transform_node = middle(Y_df=prep_node.outputs.Y_df, S_df=prep_node.outputs.S_df)
错误情况
middle组件无法启动,错误截图:
组件YAML配置
middle组件
name: middle4 display_name: middle4 inputs: Y_df: type: uri_file S_df: type: uri_file code: ./middle environment: azureml:environment_name:4 command: >- python middle_script.py --Y_df ${{inputs.Y_df}} --S_df ${{inputs.S_df}}
prep组件
name: preprocessing24 display_name: preprocessing24 outputs: Y_df: type: uri_file S_df: type: uri_file code: ./preprocessing environment: azureml:environment_name:4 command: >- python preprocessing_script.py --Y_df ${{outputs.Y_df}} --S_df ${{outputs.S_df}}
补充说明(尝试方案后)
args.Y_df指向了随机默认路径,而非指定路径,报错:
OSError: Cannot save file into a non-existent directory:
'/mnt/azureml/cr/j/32h438dshj537dj284ndhs630e1/cap/data-capability/wd/Y_df/testing'
prep代码中获取路径的部分:
parser = argparse.ArgumentParser("prep") parser.add_argument("--Y_df", type=str, help="Path of prepped data") parser.add_argument("--S_df", type=str, help="Path of prepped data") parser.add_argument("--clinical_actuals_path", type=str, help="Path of prepped data") args = parser.parse_args()
解决方案
核心问题分析
- 输出类型不匹配:prep组件定义的输出是
uri_file,但尝试保存到目录下的文件,或错误拼接路径,不符合uri_file要求的单个文件路径规则。 - 路径处理错误:
uri_file类型的参数传递的是完整文件路径(而非目录),直接拼接子文件会导致目标目录不存在。 - 硬编码路径无效:手动指定
azureml://路径会绕过Azure ML的组件间传递机制,无法自动同步到下游组件。
修正步骤
修改prep组件的保存逻辑
直接将数据帧保存到args.Y_df和args.S_df指定的完整路径,无需额外拼接文件名:# 替换原保存代码 df1.to_csv(args.Y_df, index=False) df2.to_csv(args.S_df, index=False) # df2为S_df对应的数据帧注意:
uri_file要求输出是单个文件,必须直接写入参数指定的路径,不能是目录下的子文件。保持组件配置与流水线逻辑不变
- prep和middle组件的YAML配置中,
uri_file类型的输入输出定义是正确的,无需修改。 - 当前流水线的参数绑定代码
transform_node = middle(Y_df=prep_node.outputs.Y_df, S_df=prep_node.outputs.S_df)符合要求,无需调整。
- prep和middle组件的YAML配置中,
修正middle组件的读取逻辑
确保middle组件正确读取输入参数指定的文件路径:import pandas as pd parser = argparse.ArgumentParser("middle") parser.add_argument("--Y_df", type=str) parser.add_argument("--S_df", type=str) args = parser.parse_args() df_y = pd.read_csv(args.Y_df) df_s = pd.read_csv(args.S_df)
内容的提问来源于stack exchange,提问作者Ameya Bhave
相关产品推荐
相关产品推荐

