使用 Swivel 创建嵌入

本指南介绍了如何使用 Vertex 流水线通过子矩阵矢量嵌入学习器 (Swivel) 算法来训练嵌入模型。

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

本教程为您演示如何使用此模板利用您自己的文本或结构化数据生成嵌入。执行的步骤包括:

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

准备工作

  1. 为 Vertex 流水线设置 Google Cloud 项目

  2. 启用 Dataflow API 服务

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

    • 如果您未指定服务帐号,则流水线运行将使用 Compute Engine 默认服务帐号,该帐号默认具有 Project Editor 角色。
    • 如果您想创建自己的服务帐号,请按照指南并将以下角色授予该服务帐号:roles/aiplatform.userroles/iam.serviceAccountUserroles/dataflow.developerroles/compute.viewerroles/storage.objectAdmin

输入数据

您可以使用 Swivel 生成文本语料库中的字词或结构化数据集中的内容的嵌入。它希望输入数据文件采用以下格式:

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

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

输入数据类型

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

  1. 文本输入应具有大写字母和标点符号,因此,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 流水线创建 Swivel 作业

您可以使用 Google Cloud Console 运行流水线。此过程分为三个步骤:

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

  2. 使用脚本 (swivel_template_configuration.sh) 配置模板。以下是参数列表:

    • pipeline_suffix:流水线名称的后缀(允许使用小写字母和连字符)。
    • machine_type:例如 n1-standard-16详细了解机器类型。
    • accelerator_count:每台机器中的 GPU 数量。
    • accelerator_type:例如 NVIDIA_TESLA_P100、NVIDIA_TESLA_V100。详细了解 GPU。
    • pipeline_root:Cloud Storage 存储分区的名称。请勿包含 gs:// 前缀。

    执行以下脚本:

    ./swivel_template_configuration.sh -pipeline_suffix {your-pipeline-suffix} -project_id {your-project-id} -machine_type n1-standard-16 -accelerator_count 2 -accelerator_type NVIDIA_TESLA_V100 -pipeline_root {BUCKET_NAME}
    

    系统将生成包含您的配置的预编译流水线模板 swivel_pipeline.json

  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 元数据部分中找到此路径

教程

有关如何在 Vertex AI 上训练 Swivel、探索经过训练的嵌入,以及如何部署用于在线服务的嵌入模型,请在 Colab 中启动示例笔记本

后续步骤