Vertex AI是否支持InputPath/OutputPath及跨步骤大文件传递
Google Cloud Vertex Pipelines对KFP SDK InputPath/OutputPath参数类型的支持问题
环境配置流程
已完成的GCP环境配置步骤如下:
- 设置
PROJECT_ID、SERVICE_ACCOUNT_ID、USER_EMAIL、BUCKET_NAME、FILE_NAME、GOOGLE_APPLICATION_CREDENTIALS等环境变量 - 创建Vertex运行专用服务账号,授予
roles/storage.objectAdmin、roles/aiplatform.user、roles/ml.admin权限 - 为当前用户绑定该服务账号的
roles/iam.serviceAccountUser角色 - 创建GCS存储桶,为服务账号授予存储对象创建、查看权限
- 生成服务账号密钥文件,完成认证配置
流水线实现逻辑
基于KFP v2 DSL编写两步骤流水线:
- 将
step_1_fn、step_2_fn封装为轻量组件,指定基础镜像为library/python:3.10-slim-buster,安装dill依赖 - 配置流水线根路径为
gs://minimal_vertex_test_bucket,流水线名称为minimalcompile,step_1执行完成后将输出output_context_path传入step_2作为input_context_path参数 - step_1_fn定义
OutputPath(str)类型的output_context_path参数:逻辑为定义变量a=10,使用dill.dump_session将会话序列化到输出路径 - step_2_fn定义
InputPath(str)类型的input_context_path参数、OutputPath(str)类型的output_context_path参数:逻辑为读取输入路径的文件内容,打印变量a后序列化会话到输出路径
报错现象
使用compiler.Compiler().compile()命令编译流水线,成功生成合法的root.json流水线定义文件,但上传至Vertex AI运行时,step_2抛出异常:
ValueError: Failed to get input artifact path for artifact name input_context_path
排查执行日志确认:
- step_1的执行参数中
output_context_path已正确映射到GCS路径下的输出文件 - step_2的执行参数中
input_context_path的stringValue为空,未正确关联step_1的输出文件路径
核心问题
- Vertex AI Pipelines是否原生支持InputPath/OutputPath类型的参数传递?
- 若不支持该特性,在Vertex流水线中实现单步骤输出大文件、下游步骤读取该大文件的标准实践方案是什么?
解答
问题1答复
Vertex AI Pipelines 不完全原生支持 裸用KFP SDK的InputPath/OutputPath参数传递:Vertex适配的KFP v2运行时会将无显式Artifact类型标注的Path参数识别为普通参数而非制品引用,这是step_2无法获取上游路径值的根因——直接传OutputPath(str)时,Vertex不会自动建立上下游制品的依赖关联。
问题2答复
大文件跨步骤传递的标准实现方案有两种,按需选择即可:
- 使用KFP内置Artifact类型标注Path参数
不要直接给InputPath/OutputPath传基础类型str,替换为KFP内置的Dataset、Model等标准Artifact类型,示例写法:
这种写法下Vertex运行时会自动完成上下游路径的映射,不需要手动处理GCS路径拼接,编译后Vertex可以正确识别制品依赖,不会出现参数值为空的问题。from kfp import dsl from kfp.dsl import Dataset, Input, Output @dsl.component(base_image="python:3.10-slim-buster", packages_to_install=["dill"]) def step_1_fn(output_context_path: Output[Dataset]): a = 10 import dill # 直接通过Artifact的path属性拿到自动分配的GCS挂载路径 dill.dump_session(output_context_path.path) @dsl.component(base_image="python:3.10-slim-buster", packages_to_install=["dill"]) def step_2_fn(input_context_path: Input[Dataset], output_context_path: Output[Dataset]): import dill dill.load_session(input_context_path.path) print(a) dill.dump_session(output_context_path.path) - 手动固定GCS路径传递
如果不想使用内置Artifact类型,可以在流水线层面固定大文件的GCS存储路径,将路径作为普通字符串参数在组件间传递,组件内部直接读写对应GCS路径即可,注意要提前给服务账号开通对应GCS路径的读写权限,这种方式适合需要自定义文件存储结构的场景。
内容的提问来源于stack exchange,提问作者aronchick
相关产品推荐
相关产品推荐

