如何通过gcloud CLI向Vertex AI自定义训练任务传递列表参数
解决方案:Vertex AI自定义任务传递列表参数
在Vertex AI的gcloud ai custom-jobs create命令中,传递列表参数的核心是确保shell将整个列表字符串作为单个参数传递给训练脚本,避免逗号或特殊字符被shell拆分。以下是两种可行的解决方式:
方式1:调整命令的参数包裹方式
保持你现有trainer/task.py的解析逻辑不变,修改--args的写法,用单引号包裹整个--sample-columns参数项:
gcloud ai custom-jobs create \ --region us-central1 \ --display-name=[DISPLAY_NAME] \ --project=[PROJECT] \ --python-package-uris='[BUCKET_URI]/trainer-0.1.tar.gz' \ --worker-pool-spec=machine-type=e2-standard-4,replica-count=1,executor-image-uri='us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-11:latest',python-module=trainer.task \ --args=--sample-int=100 \ --args=--sample-string=12 \ --args=--sample-bool=True \ --args='--sample-columns=["column_01","column_02","column_03"]'
原理
bash中,单引号内的内容会被视为完整的字符串,不会被shell解析拆分,这样--sample-columns后面的列表字符串会完整传递到脚本中,ast.literal_eval可以正常解析双引号包裹的列表格式。如果偏好使用单引号的列表格式,也可以转义内部的单引号:
--args="--sample-columns=['column_01','column_02','column_03']"
方式2:修改argparse解析逻辑(更符合常规用法)
放弃ast.literal_eval的解析方式,直接用argparse的多值参数特性,修改trainer/task.py中的参数定义:
import argparse def parse_arguments(): def str2bool(v): if isinstance(v, bool): return v elif v.lower() in ('true', 't'): return True elif v.lower() in ('false', 'f'): return False raise argparse.ArgumentTypeError('Boolean value expected.') parser = argparse.ArgumentParser() parser.add_argument('--sample-int', type=int, default=5) parser.add_argument('--sample-string', type=str, required=False) parser.add_argument('--sample-bool', type=str2bool, required=False) # 用nargs='+'接受多个参数值,自动转为列表 parser.add_argument('--sample-columns', type=str, nargs='+', default=['column_01', 'column_02']) args = parser.parse_args() return args
对应的命令写法可以选择两种形式:
- 多次传递
--sample-columns:
gcloud ai custom-jobs create \ # 其他参数不变 --args=--sample-int=100 \ --args=--sample-string=12 \ --args=--sample-bool=True \ --args=--sample-columns=column_01 \ --args=--sample-columns=column_02 \ --args=--sample-columns=column_03
- 单次传递所有列表项:
gcloud ai custom-jobs create \ # 其他参数不变 --args=--sample-int=100 \ --args=--sample-string=12 \ --args=--sample-bool=True \ --args='--sample-columns column_01 column_02 column_03'
原理
argparse的nargs='+'会将同一参数后的所有值收集为列表,无需手动解析字符串,更符合Python命令行参数的常规写法,也避免了shell转义的问题。
内容的提问来源于stack exchange,提问作者Jiho Choi
相关产品推荐
相关产品推荐

