Swivel パイプライン テンプレートを使用してエンベディングを作成する

Vertex AI Pipelines を使用してエンベディング モデルをトレーニングする場合、Submatrix-wise Vector Embedding Learner(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 のデフォルトのサービス アカウントが使用されます。このサービス アカウントには、デフォルトでプロジェクト編集者のロールが付与されています。
    • 独自のサービス アカウントの作成方法については、きめ細かい権限を持つサービス アカウントを構成するをご覧ください。また、サービス アカウントには以下のロールを付与してください。
      • roles/aiplatform.user
      • roles/iam.serviceAccountUser
      • roles/dataflow.developer
      • roles/compute.viewer
      • roles/storage.objectAdmin

入力データ

Swivel パイプライン テンプレートを使用すると、テキスト コーパスにある単語や構造化データセットのアイテムにエンベディングを生成できます。Swivel パイプライン テンプレートでは、次の形式の入力データファイルを想定しています。

  • 各行が 1 つの共起コンテキストを表します。たとえば、文中の単語、ショッピング カート内の商品のセット、再生リスト内の曲のセット、ユーザー セッションで訪問された URL のセットなどを表します。

  • 各行のアイテムはスペースで区切ります。アイテム名にスペースを入れることはできません。

入力データ型

入力には、テキストとアイテムの 2 種類があります。入力の仕様は入力データの処理方法に影響するため、正しいユースケースを指定することが重要です。

  1. テキスト入力には大文字と句読点が含まれている必要があるため、Swivel ではテキストは小文字に変換され、句読点が削除されます。このため、「apple」、「Apple」、「APPLE!」は同じトークンとして扱われるため、エンベディングも同じになります。

  2. アイテム入力は空白で分割されます。各トークンはアイテム ID である必要があります。さらに、バスケットなどのアイテムのグループは本質的に順序付けされていないため、アイテム入力に順序は関係ありません。つまり、アイテムの入力の各行は配列ではなく、セットとして扱われます。Swivel は行内の各項目を同等に扱います。

サンプルデータ

テスト用の次のサンプルデータを Cloud Storage バケットにコピーします。

  • wikipedia: Wikipedia のダンプから作成されたテキスト コーパス データセット。単語のエンベディングの学習に使用できます。このデータセットの入力タイプはテキストです。

このデータをコピーするには、次のコマンドを実行します。

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_pipeline.json で次の行を削除してから Swivel ジョブを送信します。

    • --subnetwork=regions/%REGION%/subnetworks/%NETWORK_NAME%
    • --no_use_public_ips
    • network: projects/%PROJECT_NUMBER%/global/networks/%NETWORK_NAME%\
  3. Cloud Console で swivel_pipeline.json を使用して、実行するパイプラインを作成します

    次の表に、Swivel ジョブで使用するために Cloud Console で設定する必要があるランタイム パラメータを示します。

    パラメータ データ型 説明 必須
    embedding_dim 整数 トレーニングするエンベディングのディメンション。 × - デフォルトは 100
    input_base 文字列 入力データが格納されている Cloud Storage パス。
    input_type 文字列 入力データのタイプ。タイプは「text」(Wikipedia のサンプルの場合)または「items」(MovieLens サンプルの場合)のいずれかです。
    max_vocab_size 整数 エンベディングを生成する最大語彙サイズ。 × - デフォルトは 409600
    num_epochs 整数 トレーニングのエポックの数。 × - デフォルトは 20
    • 入力タイプがアイテムの場合は、入力データの各行が空白文字で区切られたアイテム ID になっている必要があります。各行は空白文字で分割してトークン化されます。
    • 入力タイプがテキストの場合は、入力データの各行がセンテンスと同等とみなされます。各行は、テキストを小文字に変換して空白文字で分割することでトークン化されます。
    • Wikipedia のサンプルの場合は、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 でサンプル ノートブックを起動してください。

次のステップ