在 Vertex AI(谷歌云平台)中使用模型进行预测

Posted

技术标签:

【中文标题】在 Vertex AI(谷歌云平台)中使用模型进行预测【英文标题】:Using model for prediction in Vertex AI (Google Cloud Platform) 【发布时间】:2022-01-12 01:53:12 【问题描述】:

我正在关注谷歌云上的顶点AI教程,基于colab(文本分类):

https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/master/notebooks/official/automl/automl-text-classification.ipynb

特别是我想了解如何在 GCP(谷歌云平台)上使用在 vertex-ai 中训练的模型进行数千次预测。

我认为本教程中关于该主题的有趣部分是“从您的模型中获取批量预测”部分。然而,他们展示了一种方法,该方法涉及生成一堆文件,每个文本一个文件,并将所有文件保存在谷歌云存储的存储桶中。这些是完成此操作的笔记本上的行:

instances = [
    "We hiked through the woods and up the hill to the ice caves",
    "My kitten is so cute",
]
input_file_name = "batch-prediction-input.jsonl"

...

# Instantiate the Storage client and create the new bucket
storage = storage.Client()
bucket = storage.bucket(BUCKET_NAME)

# Iterate over the prediction instances, creating a new TXT file
# for each.
input_file_data = []
for count, instance in enumerate(instances):
    instance_name = f"input_count.txt"
    instance_file_uri = f"BUCKET_URI/instance_name"

    # Add the data to store in the JSONL input file.
    tmp_data = "content": instance_file_uri, "mimeType": "text/plain"
    input_file_data.append(tmp_data)

    # Create the new instance file
    blob = bucket.blob(instance_name)
    blob.upload_from_string(instance)

input_str = "\n".join([str(d) for d in input_file_data])
file_blob = bucket.blob(f"input_file_name")
file_blob.upload_from_string(input_str)

...

然后他们加载模型并创建一个作业:

job_display_name = "e2e-text-classification-batch-prediction-job"
model = aiplatform.Model(model_name=model_name)

batch_prediction_job = model.batch_predict(
    job_display_name=job_display_name,
    gcs_source=f"BUCKET_URI/input_file_name",
    gcs_destination_prefix=f"BUCKET_URI/output",
    sync=True,
)

我的问题是这样的。真的有必要为每个句子生成一个文件吗?如果我们有数千个文本,这涉及在 GCP 上生成和保存数千个小文件。这不会损害性能吗?此外,该模型是否仍然能够像通常的 Tensorflow 模型一样利用矢量化来“批量”处理输入?

【问题讨论】:

【参考方案1】:

我检查了tutorial provided,用于训练模型的数据是每个句子。关于您的问题:

    真的有必要为每个句子生成一个文件吗?

    如果您要预测句子、段落等,这实际上取决于您要预测什么。您可以尝试传递一个包含多个句子或段落的文件,以测试经过训练的模型是否可以处理它。 如果您对结果不满意,您可以在多个句子或段落中添加更多训练数据(如果这是您的要求)并重新训练模型,然后再次测试,直到您对结果满意为止。

    如果我们有数千个文本,这涉及在 GCP 上生成和保存数千个小文件。这不会损害性能吗?

    基于batch prediction documentation,可以在生成批量预测作业时启用缩放。所以这应该解决对性能的担忧。
    如果您使用自动缩放配置,Vertex AI 会自动缩放您的 DeployedModel 或 BatchPredictionJob 以使用更多预测 现有节点的 CPU 使用率变高时的节点。顶点人工智能 即使您已经配置了您的 使用 GPU 的预测节点;因此,如果您的预测吞吐量 导致 GPU 使用率高,但 CPU 使用率不高,您的节点可能 无法按预期扩展。
    以下示例代码介绍了如何使用教程中的代码为批量预测作业定义启用缩放:
job_display_name = "e2e-text-classification-batch-prediction-job-scale"
model = aiplatform.Model(model_name=model_name)

batch_prediction_job = model.batch_predict(
    job_display_name=job_display_name,
    gcs_source=f"BUCKET_URI/input_file_name",
    gcs_destination_prefix=f"BUCKET_URI/output",
    sync=True,
    machine_type='n1-highcpu-16', #define machine type
    starting_replica_count=1, 
    max_replica_count=10, # set max_replica_count > starting_replica_count to enable scaling
)

batch_prediction_job_name = batch_prediction_job.resource_name

我查看了生成的日志,并生效了:

    此外,模型是否仍然能够像在通常的 TensorFlow 模型中那样利用矢量化来“批量”处理输入? 我不熟悉 Tensorflow 模型矢量化。最好为此创建一个单独的问题,以便社区做出贡献。

【讨论】:

谢谢!我正在做试验,即使目前我只成功地发送了在线和批量预测的单个句子......请问你是如何获得日志的?我尝试从教程中检查“batch_job = jobs.BatchPredictionJob(batch_prediction_job_name)”,但找不到您看到的内容。找出此类日志以查看 Vertex AI 自动选择了哪些机器(如果未指定)将很有用。 目前我无法恢复关于哪些机器既不用于批处理、在线预测也不用于训练的信息(我还检查了控制台)....我希望有这些信息来优化培训时间和成本...也许我应该提出一个不同的问题... 我实际上也从你那里看到了这个答案,***.com/questions/69577270/…,你说对于这样的模型不可能优化资源。这是正确的吗 ? (无论如何,知道会选择哪些资源会很有趣)但这与您选择“machine_type ='n1-highcpu-16'”的示例不兼容吗? 作为猜测,也许您可​​以在批量预测级别优化资源,但不能用于训练和端点?我无法从文档中澄清这些事情...... @Thomas 你可以去 Logging > 在“Query”部分输入这个。 protoPayload.methodName="google.cloud.aiplatform.v1.JobService.CreateBatchPredictionJob"。这应该会显示创建的批量预测作业的详细信息。

以上是关于在 Vertex AI(谷歌云平台)中使用模型进行预测的主要内容,如果未能解决你的问题,请参考以下文章

谷歌云 AI 平台 jupyter notebook 实例即使在重置后也不会打开并且正在运行

用于服务模型预测的 Google Kubernetes Engine vs Vertex AI(AI Platform Unified)

如何从自定义 AI 平台模型登录

在 Google vertex ai 上创建自定义模型

将谷歌云存储文件夹挂载到谷歌人工智能平台作业

谷歌云平台jupyter笔记本如何读取csv文件?