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

