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

Azure ML Python SDK v2管道中Output的定义与组件传参问题求助

Azure ML Python SDK v2管道中Output的定义与组件传参问题求助

嘿,我刚看完你的代码和报错信息,马上就明白问题出在哪了——你把组件的输出参数当成输入参数来传递啦!

在Azure ML SDK v2里,用@command_component装饰的函数中,标注为Output类型的参数是组件的输出项,不需要你在调用组件时手动传入值。组件运行时会自动生成对应的输出路径(或者你可以指定固定路径,但方式不是直接传参)。

错误原因拆解

你写的组件prepare_data_component里,output_data: Output(type="uri_folder")是组件的输出参数,它不属于需要调用时传入的输入参数范畴。所以当你在管道里调用prepare_data_component(output_data=output_data)时,组件会认为你传了一个它不认识的关键字参数,就抛出了那个报错。

修正后的代码示例

我把你的代码调整成正确的写法,分两种常用场景:

情况1:让组件自动生成输出路径(推荐,适合大多数场景)

这种情况下你不需要提前定义output_path,组件会自动在默认数据存储下创建临时输出路径,最后你可以通过组件的outputs获取结果:

from azure.ai.ml import Input, Output
from azure.ai.ml.components import command_component
from azure.ai.ml.dsl import pipeline

# 只定义输入路径即可
input_path = Input(type="uri_folder", path="azureml://datastores/test/paths/input")

@command_component(
    name="test_com",
    version="1",
    display_name="test com",
    description="test",
    environment=custom_env,
)
def prepare_data_component(
    input_data: Input(type="uri_folder"),
    output_data: Output(type="uri_folder"),  # 这是输出参数,调用时不用传
):
    print("input_data: ", input_data)
    print("output_data: ", output_data)
    # 这里可以写你的数据处理逻辑,把结果写到output_data对应的路径里

@pipeline(
    default_compute=cpu_compute_target,
)
def pipeline_test(pipeline_input_data):
    # 调用组件时只传输入参数
    prepare_data_node = prepare_data_component(
        input_data=pipeline_input_data,
    )
    
    # 返回组件的输出,供后续步骤使用或者作为管道输出
    return {
        "output_data": prepare_data_node.outputs.output_data,
    }

# 创建管道任务
pipeline_job = pipeline_test(
    pipeline_input_data=input_path,
)

print(pipeline_job)

情况2:指定固定的输出路径(如果有特殊需求)

如果你确实需要把输出写到你提前定义的output_path里,正确的做法是在调用组件时,通过output_data参数传递你的Output对象(本质是告诉组件用你指定的路径作为输出,而非把它当成输入):

# 提前定义输入和输出路径
input_path = Input(type="uri_folder", path="azureml://datastores/test/paths/input")
output_path = Output(type="uri_folder", path="azureml://datastores/test/paths/output")

# 组件定义和上面一致,无需修改

@pipeline(
    default_compute=cpu_compute_target,
)
def pipeline_test(pipeline_input_data):
    # 调用组件时传递output_path作为输出参数的值
    prepare_data_node = prepare_data_component(
        input_data=pipeline_input_data,
        output_data=output_path,
    )
    
    return {
        "output_data": prepare_data_node.outputs.output_data,
    }

pipeline_job = pipeline_test(
    pipeline_input_data=input_path,
)

print(pipeline_job)

额外说明

为什么第一种情况不用传输出参数?因为SDK v2会自动为组件的输出分配存储路径,你只需要通过组件实例.outputs.输出参数名来获取这个路径就行。如果你的管道有多个组件,还能直接把前一个组件的输出作为后一个组件的输入,非常方便。

备注:内容来源于stack exchange,提问作者AnonymousKKYY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:29:34