Python 在 Vertex AI Pipeline 中调用时,click 会错误地解析参数
Python click incorrectly parses arguments when called in Vertex AI Pipeline
我正在尝试 运行 GCP Vertex AI 上的一个简单的 Ada 增强型决策树回归器。为了解析超参数和其他参数,我使用了 Click for Python,这是一个非常简单的 CLI 库。这是我的任务功能的设置:
@click.command()
@click.argument("input_path", type=str)
@click.option("--output-path", type=str, envvar='AIP_MODEL_DIR')
@click.option('--gcloud', is_flag=True, help='Run as if in Google Cloud Vertex AI Pipeline')
@click.option('--grid', is_flag=True, help='Perform a grid search instead of a single run. Ignored with --gcloud')
@click.option("--max_depth", type=int, default=4, help='Max depth of decision tree', show_default=True)
@click.option("--n_estimators", type=int, default=50, help='Number of AdaBoost boosts', show_default=True)
def click_main(input_path, output_path, gcloud, grid, max_depth, n_estimators):
train_model(input_path, output_path, gcloud, grid, max_depth, n_estimators)
def train_model(input_path, output_path, gcloud, grid, max_depth, n_estimators):
print(input_path, output_path, gcloud)
logger = logging.getLogger(__name__)
logger.info("training models from processed data")
...
当我在本地 运行 如下所示时,Click 正确地从控制台和环境中获取参数并继续进行模型训练(AIP_MODEL_DIR
是 gs://(BUCKET_NAME)/models
)
❯ python3 -m src.models.train_model gs://(BUCKET_NAME)/data/processed --gcloud
gs://(BUCKET_NAME)/data/processed gs://(BUCKET_NAME)/models True
但是,当我把这段代码放到Vertex AI Pipeline上时,它抛出了一个错误,即
FileNotFoundError: b/(BUCKET_NAME)/o/data%2Fprocessed%20%20--gcloud%2Fprocessed_features.csv
可以清楚地看到,Click 抓取了参数和 --gcloud
选项并将其分配给 input_path
。之前的 print 语句通过空格过多和 --gcloud
被解析为 false.
证实了这一点
gs://(BUCKET_NAME)/data/processed --gcloud gs://(BUCKET_NAME)/models/1/model/ False
这里有人遇到过这个问题或知道如何解决吗?
我认为这是由于 arguments and options 的性质造成的,您正在混合参数和选项,尽管文档中并未隐含说明,但参数会吞噬后面的选项。如果未分配 nargs,它将默认为 1,考虑到它后面的所有内容都是字符串,看起来就是这种情况。
nargs – the number of arguments to match. If not 1 the return value is a tuple instead of single value. The default for nargs is 1 (except if the type is a tuple, then it’s the arity of the tuple).
我认为您应该首先使用选项,然后在 documentation page. Other approach is to group it under a command as show on this link 上显示参数。
我正在尝试 运行 GCP Vertex AI 上的一个简单的 Ada 增强型决策树回归器。为了解析超参数和其他参数,我使用了 Click for Python,这是一个非常简单的 CLI 库。这是我的任务功能的设置:
@click.command()
@click.argument("input_path", type=str)
@click.option("--output-path", type=str, envvar='AIP_MODEL_DIR')
@click.option('--gcloud', is_flag=True, help='Run as if in Google Cloud Vertex AI Pipeline')
@click.option('--grid', is_flag=True, help='Perform a grid search instead of a single run. Ignored with --gcloud')
@click.option("--max_depth", type=int, default=4, help='Max depth of decision tree', show_default=True)
@click.option("--n_estimators", type=int, default=50, help='Number of AdaBoost boosts', show_default=True)
def click_main(input_path, output_path, gcloud, grid, max_depth, n_estimators):
train_model(input_path, output_path, gcloud, grid, max_depth, n_estimators)
def train_model(input_path, output_path, gcloud, grid, max_depth, n_estimators):
print(input_path, output_path, gcloud)
logger = logging.getLogger(__name__)
logger.info("training models from processed data")
...
当我在本地 运行 如下所示时,Click 正确地从控制台和环境中获取参数并继续进行模型训练(AIP_MODEL_DIR
是 gs://(BUCKET_NAME)/models
)
❯ python3 -m src.models.train_model gs://(BUCKET_NAME)/data/processed --gcloud
gs://(BUCKET_NAME)/data/processed gs://(BUCKET_NAME)/models True
但是,当我把这段代码放到Vertex AI Pipeline上时,它抛出了一个错误,即
FileNotFoundError: b/(BUCKET_NAME)/o/data%2Fprocessed%20%20--gcloud%2Fprocessed_features.csv
可以清楚地看到,Click 抓取了参数和 --gcloud
选项并将其分配给 input_path
。之前的 print 语句通过空格过多和 --gcloud
被解析为 false.
gs://(BUCKET_NAME)/data/processed --gcloud gs://(BUCKET_NAME)/models/1/model/ False
这里有人遇到过这个问题或知道如何解决吗?
我认为这是由于 arguments and options 的性质造成的,您正在混合参数和选项,尽管文档中并未隐含说明,但参数会吞噬后面的选项。如果未分配 nargs,它将默认为 1,考虑到它后面的所有内容都是字符串,看起来就是这种情况。
nargs – the number of arguments to match. If not 1 the return value is a tuple instead of single value. The default for nargs is 1 (except if the type is a tuple, then it’s the arity of the tuple).
我认为您应该首先使用选项,然后在 documentation page. Other approach is to group it under a command as show on this link 上显示参数。