Vertex AI SDK自定义容器训练报annotation_schema_uri配置错误
问题根因
调用CustomContainerTrainingJob.run()直接传入托管图像数据集触发报错,核心是两个必填配置缺失:
- SDK不会根据传入的
ImageDataset对象自动识别标注类型,无法自动填充必填的annotation_schema_uri字段 - 公开的方法示例里没有标注数据集导出GCS路径的参数,未传入对应配置时SDK不会自动指定导出位置。控制台创建任务时会引导用户补全这两项配置,因此控制台流程可以正常运行。
解决方案
方案1:补全run方法缺失参数(和控制台创建逻辑完全一致,优先使用)
在job.run()的入参里补充两个关键参数即可:
annotation_schema_uri:和数据集标注类型对应的schema地址,最准确的获取方式是打开之前控制台创建成功的训练任务详情,复制input_data_config下的同名字段值。常见图像类任务的官方固定schema地址如下,也可以直接使用:- 单标签图像分类:
gs://google-cloud-aiplatform/schema/dataset/annotation/image_classification_1.0.0.yaml - 多标签图像分类:
gs://google-cloud-aiplatform/schema/dataset/annotation/image_multi_label_classification_1.0.0.yaml - 图像目标检测(边界框):
gs://google-cloud-aiplatform/schema/dataset/annotation/image_bounding_box_1.0.0.yaml
- 单标签图像分类:
gcs_destination_prefix:就是控制台里配置的数据集导出目录,传入Vertex AI服务账号有读写权限的GCS路径即可,格式为gs://<存储桶名>/<自定义导出路径前缀>/
修改后的核心代码:
model = job.run( dataset=dataset, model_display_name=model_display_name, args=args, replica_count=replica_count, machine_type=machine_type, accelerator_type=accelerator_type, accelerator_count=accelerator_count, training_fraction_split=training_fraction_split, validation_fraction_split=validation_fraction_split, test_fraction_split=test_fraction_split, # 补全以下两个必填参数 annotation_schema_uri="对应数据集的annotation_schema_uri地址", gcs_destination_prefix="gs://你的存储桶名/数据集导出目录/", sync=sync, ) model.wait() print(model.display_name) print(model.resource_name) print(model.uri) return model
方案2:手动导出数据集后传路径(兜底方案)
如果不想依赖SDK自动处理数据集导出逻辑,可以先手动把托管数据集导出到GCS,再把导出路径作为启动参数传给训练容器,run方法里dataset参数直接传None:
- 先执行数据集导出:
dataset.export( gcs_destination_prefix="gs://你的存储桶名/数据集导出目录/", annotation_schema_uri="对应数据集的annotation_schema_uri地址", sync=True ) - 把导出后的GCS路径加入训练启动参数
args,训练容器内直接读取该路径下的数据即可,运行效果和控制台创建的任务完全一致。
内容的提问来源于stack exchange,提问作者ManuSerp
相关产品推荐
相关产品推荐

