创建 Vertex Vizier 研究

本页面介绍如何使用 Python 向 Vizier 发出 API 请求。如需了解 Vizier 的工作原理,请参阅 Vertex Vizier 概览

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 启用 Vertex AI API。

    启用 API

  4. 创建服务帐号:

    1. 在 Cloud Console 中,转到创建服务帐号页面。

      转到“创建服务帐号”
    2. 选择一个项目。
    3. 服务帐号名称字段中,输入一个名称。 Cloud Console 会根据此名称填充服务帐号 ID 字段。

      服务帐号说明字段中,输入说明。例如,Service account for quickstart

    4. 点击创建并继续
    5. 点击选择角色字段。

      快速访问下,点击基本,然后点击所有者

    6. 点击继续
    7. 点击完成以完成服务帐号的创建过程。

      不要关闭浏览器窗口。您将在下一步骤中用到它。

  5. 创建服务帐号密钥:

    1. 在 Cloud Console 中,点击您创建的服务帐号的电子邮件地址。
    2. 点击密钥
    3. 依次点击添加密钥创建新密钥
    4. 点击创建。JSON 密钥文件将下载到您的计算机上。
    5. 点击关闭
  6. 将环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为包含您的服务帐号密钥的 JSON 文件的路径。 此变量仅适用于当前的 shell 会话,因此,如果您打开新的会话,请重新设置该变量。

  7. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  8. 启用 Vertex AI API。

    启用 API

  9. 创建服务帐号:

    1. 在 Cloud Console 中,转到创建服务帐号页面。

      转到“创建服务帐号”
    2. 选择一个项目。
    3. 服务帐号名称字段中,输入一个名称。 Cloud Console 会根据此名称填充服务帐号 ID 字段。

      服务帐号说明字段中,输入说明。例如,Service account for quickstart

    4. 点击创建并继续
    5. 点击选择角色字段。

      快速访问下,点击基本,然后点击所有者

    6. 点击继续
    7. 点击完成以完成服务帐号的创建过程。

      不要关闭浏览器窗口。您将在下一步骤中用到它。

  10. 创建服务帐号密钥:

    1. 在 Cloud Console 中,点击您创建的服务帐号的电子邮件地址。
    2. 点击密钥
    3. 依次点击添加密钥创建新密钥
    4. 点击创建。JSON 密钥文件将下载到您的计算机上。
    5. 点击关闭
  11. 将环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为包含您的服务帐号密钥的 JSON 文件的路径。 此变量仅适用于当前的 shell 会话,因此,如果您打开新的会话,请重新设置该变量。

  12. 安装 Python 版 Vertex SDK

定义常量

如需定义常量,请运行以下命令,将 REGIONPROJECT_ID 替换为您的区域和项目 ID。创建您自己的研究名称或使用建议值。

import json
import datetime
from google.cloud import aiplatform_v1beta1

REGION = "REGION"
PROJECT_ID = "PROJECT_ID"

# The following placeholder variables are automatically filled in.
STUDY_DISPLAY_NAME = '{}_study_{}'.format(PROJECT_ID.replace('-', ''), datetime.datetime.now().strftime('%Y%m%d_%H%M%S')) #@param {type: 'string'}
ENDPOINT = REGION + '-aiplatform.googleapis.com'
PARENT = 'projects/{}/locations/{}'.format(PROJECT_ID, REGION)

构建 API 请求

以下命令行 API 请求使用 Python 编写。

创建研究

研究是一系列实验或试验,可帮助您优化超参数或参数。

以下示例的目标是计算 y = x^2 的最大值,其中 x 的范围为 [-10. 10]。此示例只有一个参数,并使用易于计算的函数来帮助演示如何使用 Vizier。

param_x = {
    'parameter_id': 'x',
    'double_value_spec': {
        'min_value': -10.0,
        'max_value': 10.0
    }
}

metric_y = {
    'metric_id': 'y',
    'goal': 'MAXIMIZE'
}

study = {
    'display_name': STUDY_DISPLAY_NAME,
    'study_spec': {
      'algorithm': 'RANDOM_SEARCH',
      'parameters': [param_x],
      'metrics': [metric_y],
    }
}

如需使用研究配置创建研究,请通过 VizierServiceClient 发送以下请求。使用返回的 STUDY_NAME 来查询研究。

vizier_client = aiplatform_v1beta1.VizierServiceClient(client_options=dict(api_endpoint=ENDPOINT))
study = vizier_client.create_study(parent=PARENT, study=study)
STUDY_NAME = study.name

查看您的研究

创建研究后,您可以在 Google Cloud Console 的 Vertex AI 部分中的实验页面上找到该研究。

转到“实验”页面

获取研究报告

如需获取研究,请发送以下请求。

vizier_client.get_study({'name': STUDY_NAME})

列出研究

如需列出特定项目和区域中的研究,请发送以下请求:

vizier_client.list_studies({'parent': PARENT})

获取建议的试验

如需从 Vizier 获取试验建议,请创建包含 SUGGEST_COUNTCLIENT_ID 的请求。通过发送请求,将此信息传递给 Vizier。

使用以下命令创建请求。将 SUGGEST_COUNT 更改为您希望从每个请求中获得的建议数量。

suggest_response = vizier_client.suggest_trials({
    'parent': STUDY_NAME,
    'suggestion_count': SUGGEST_COUNT,
    'client_id': CLIENT_ID
    })

suggest_trials 会启动长时间运行的操作来生成试验。通过其响应,您可以了解 Vizier 是否正在生成试验建议。

要等待返回的结果,请使用 result() 函数。

suggest_response.result().trials

以下格式显示了示例试验。此试验建议为参数 x 使用值 0.1

name: "TRIAL_ID"
state: ACTIVE
parameters {
  parameter_id: "x"
  value {
    number_value: 0.1
  }
}
start_time {
  seconds: 1618011215
}

使用上一个响应中的 TRIAL_ID 获取试验:

vizier_client.get_trial({
        'name': TRIAL_ID
      })

评估效果

在收到试验建议后,您可以计算每个试验,并将每个结果记录为计算结果

例如,如果您尝试优化的函数为 y = x^2,则使用试验提供的 x 的建议值来计算函数。 使用建议值 0.1,函数的计算结果为 y = 0.1 * 0.1,得数为 0.01

添加计算结果

按照试验建议计算以获得计算结果后,将此计算结果添加到试验中。

使用以下命令存储测量结果并发送请求。在此示例中,将 RESULT 替换为测量值。如果您要优化的函数是 y = x^2,建议的 x 值为 0.1,则结果为 0.01

vizier_client.add_trial_measurement({
        'trial_name': TRIAL_ID,
        'measurement': {
            'metrics': [{'metric_id': 'y', 'value':RESULT }]
        }
    })

完成试验

在为某个试验添加所有计算结果后,您必须通过发送命令完成试验。

完成试验后,您可以发送一个命令以仅完成试验,也可以发送命令来添加最终计算结果并完成试验。

不添加最终计算结果

如需完成试验且不添加最终计算结果,请发送以下请求。

vizier_client.complete_trial({
      'name': TRIAL_ID
  })

添加最终计算结果

如需完成试验并添加最终计算结果,请使用以下命令,并将 RESULT 替换为最终计算结果。

vizier_client.complete_trial({
      'name': TRIAL_ID
      'final_measurement': {
        'metrics': [{'metric_id': 'y', 'value': RESULT}]
      }
  })

列出试验

如需列出特定研究中的试验,请发送以下请求。

vizier_client.list_trials({
    'parent': STUDY_NAME
})

完成所有待处理的试验后,您可以调用 suggestTrials 获得更多建议并重复试验计算过程。

列出最优试验

以下示例展示了 list_optimal_trials,它返回了多目标研究的最优试验,或单目标研究的最佳试验:

vizier_client.list_optimal_trials({
    'parent': STUDY_NAME
})