You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

解决方案

核心问题分析

  1. 输出类型不匹配:prep组件定义的输出是uri_file,但尝试保存到目录下的文件,或错误拼接路径,不符合uri_file要求的单个文件路径规则。
  2. 路径处理错误:uri_file类型的参数传递的是完整文件路径(而非目录),直接拼接子文件会导致目标目录不存在。
  3. 硬编码路径无效:手动指定azureml://路径会绕过Azure ML的组件间传递机制,无法自动同步到下游组件。

修正步骤

  1. 修改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要求输出是单个文件,必须直接写入参数指定的路径,不能是目录下的子文件。

  2. 保持组件配置与流水线逻辑不变

    • prep和middle组件的YAML配置中,uri_file类型的输入输出定义是正确的,无需修改。
    • 当前流水线的参数绑定代码transform_node = middle(Y_df=prep_node.outputs.Y_df, S_df=prep_node.outputs.S_df)符合要求,无需调整。
  3. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:22:03