使用 Swivel 流水线模板创建嵌入

您可以使用 Vertex AI Pipelines 以及子矩阵矢量嵌入学习器 (Swivel) 算法来训练嵌入模型。

Swivel 是从项共存矩阵生成项嵌入的方法。对于结构化数据,例如采购订单,可以通过计算包含产品 A 和产品 B 的采购订单数量来计算项的共生矩阵,这些采购订单是您要为其生成嵌入的所有产品。

以下教程介绍如何使用 Swivel 流水线模板从您自己的文本或结构化数据中生成嵌入。执行的步骤包括:

  1. 设置:启用 API,授予权限,准备输入数据。
  2. 配置参数:为 Swivel 作业设置适当的参数值。
  3. 在 Vertex AI Pipelines 上训练:使用 Swivel 流水线模板在 Vertex AI Pipelines 上创建 Swivel 作业。

准备工作

  1. 为 Vertex AI Pipelines 设置 Google Cloud 项目

  2. 启用 Dataflow API 服务

  3. 配置具有精细权限的服务帐号。

    • 如果您未指定服务帐号,则流水线运行将使用 Compute Engine 默认服务帐号,该帐号默认具有 Project Editor 角色。
    • 如需了解如何创建您自己的服务帐号,请参阅配置具有精细权限的服务帐号,并向该服务帐号授予以下角色:
      • roles/aiplatform.user
      • roles/iam.serviceAccountUser
      • roles/dataflow.developer
      • roles/compute.viewer
      • roles/storage.objectAdmin

输入数据

您可以使用 Swivel 流水线模板生成文本语料库中的字词或结构化数据集中项的嵌入。Swivel 流水线模板要求输入数据文件采用以下格式:

  • 每行代表一个共现上下文。例如,某个句子中的字词、购物篮中的一组项、播放列表中的一组歌曲,或用户会话中访问的一组网址。

  • 每行中的各个条目用空格分隔。因此,项名称不得包含空格

输入数据类型

输入有两种类型:文本。为您的使用场景指定正确的类型非常重要,因为输入规范会影响输入数据的处理方式。

  1. 文本输入应具有大写字母和标点符号,因此,Swivel 会小写文本并移除标点符号。这样一来,Swivel 可确保“apple”、“Apple”和“APPLE!”等令牌被视为同一词法单元,因此具有相同的嵌入。

  2. 项输入以空格拆分,每个令牌应为项目 ID。此外,顺序对项输入无关紧要,因为篮子中的项组本身没有排序。换句话说,输入项的每一行都被视为一个集合,而非一个数组。因此,Swivel 会将该行中的每一项视为与其他项相关。

样本数据

将以下示例数据复制到 Cloud Storage 存储桶进行测试:

  • 维基百科:根据维基媒体转储创建的文本语料库数据集,可用于学习字词嵌入。此数据集使用文本输入类型。

要复制此数据,请运行以下命令:

gsutil cp -r gs://cloud-samples-data/vertex-ai/matching-engine/swivel/wikipedia/* BUCKET_NAME/wikipedia

BUCKET_NAME 替换为您管理的 Cloud Storage 存储桶的名称。

  • movielens_25m:一个电影评分数据集,可用于为电影创建嵌入。系统会处理此数据集,使每行都包含同一用户具有相同评分的电影。该目录还包含 movies.csv,用于将电影 ID 映射到其名称。此数据集使用项输入类型。

要复制此数据,请运行以下命令:

gsutil cp -r gs://cloud-samples-data/vertex-ai/matching-engine/swivel/movielens_25m/data* BUCKET_NAME/movielesn_25m

BUCKET_NAME 替换为您管理的 Cloud Storage 存储桶的名称。

使用 Vertex AI Pipelines 创建 Swivel 作业

如需运行流水线,请使用 Google Cloud Console:

  1. 在本地下载以下预编译的流水线模板和配置脚本。

  2. 使用以下 swivel_template_configuration.sh 脚本配置模板:

    ./swivel_template_configuration.sh \
        -pipeline_suffix YOUR_PIPELINE_SUFFIX \
        -project_id PROJECT_ID \
        -machine_type n1-standard-16 \
        -accelerator_count 2 \
        -accelerator_type NVIDIA_TESLA_V100 \
        -pipeline_root BUCKET_NAME \
        -region YOUR_REGION \
        -network_name YOUR_NETWORK_NAME
    

    以下是参数列表:

    • pipeline_suffix:流水线名称的后缀(允许使用小写字母和连字符)。
    • machine_type:例如 n1-standard-16。如需了解详情,请参阅为自定义训练配置计算资源
    • accelerator_count:每台机器中的 GPU 数量。
    • accelerator_type:例如 NVIDIA_TESLA_P100、NVIDIA_TESLA_V100。 如需了解详情,请参阅 GPU
    • pipeline_root:Cloud Storage 存储分区的名称。 请勿添加 gs:// 前缀。
    • region:(可选)默认值为 us-central1
    • network_name:(可选)您的子网。

    swivel_template_configuration.sh 脚本会生成使用您的配置的预编译流水线模板。

    如果您未使用专用 IP 地址并且不需要设置 VPC 网络,则可以在提交 Swivel 作业之前,移除 swivel_pipeline.json 中的以下行:

    • --subnetwork=regions/%REGION%/subnetworks/%NETWORK_NAME%
    • --no_use_public_ips
    • networkprojects/%PROJECT_NUMBER%/global/networks/%NETWORK_NAME%\
  3. 在 Cloud Console 中使用 swivel_pipeline.json 创建流水线运行。

    下表显示了您需要在 Cloud Console 中设置的用于 Swivel 作业的运行时参数:

    参数 数据类型 说明 必需
    embedding_dim int 要训练的嵌入的维度。 否 - 默认值为 100
    input_base 字符串 存储输入输入的 Cloud Storage 路径。
    input_type 字符串 输入数据的类型。 类型可以是“文本”(用于维基百科示例)或“项”(用于 MovieLens 示例)。
    max_vocab_size int 要生成嵌入的词汇大小上限。 否 - 默认值为 409600
    num_epochs int 训练的周期数。 否 - 默认值为 20
    • 对于项输入类型,输入数据的每一行必须是以空格分隔的项 ID。每行通过对空格进行拆分来词法单元化。
    • 对于文本输入类型,输入数据的每一行都被视为一个句子。每行通过对空格进行小写和拆分来词法单元化。
    • 对于维基百科示例,请使用 input_type = textinput_base = {SOURCE_DATA}/wikipedia
    • 对于 MovieLens 示例,请使用 input_type = itemsinput_base = {SOURCE_DATA}/movielens_25m

使用经过训练的嵌入模型

流水线运行成功完成后,经过训练的 TensorFlow SavedModel 将导出到 Cloud Storage 目录:

{BUCKET_NAME}/pipeline_root/{PROJECT_NUMBER}/swivel-{TIMESTAMP}/EmbTrainerComponent_-{SOME_NUMBER}/model/model/

您可以在 Cloud Console 的 Vertex ML Metadata 部分中找到此路径

教程

如需了解如何在 Vertex AI 上训练 Swivel 流水线模板,请探索经过训练的嵌入,部署在线服务的嵌入模型,并在 Colab 中启动示例笔记本

后续步骤