使用 ML.GENERATE_EMBEDDING 函数生成视频嵌入
本文档介绍如何创建引用 Vertex AI 嵌入基础模型的 BigQuery ML 远程模型。然后,将该模型与 ML.GENERATE_EMBEDDING
函数搭配使用,以使用 BigQuery 对象表中的数据创建视频嵌入。
所需的角色
如需创建连接,您需要拥有以下 Identity and Access Management (IAM) 角色的成员资格:
roles/bigquery.connectionAdmin
如需向连接的服务账号授予权限,您需要以下权限:
resourcemanager.projects.setIamPolicy
如需使用 BigQuery ML 创建模型,您需要以下 IAM 权限:
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
bigquery.models.updateMetadata
如需运行推理,您需要以下权限:
- 表的
bigquery.tables.getData
权限 - 模型的
bigquery.models.getData
权限 bigquery.jobs.create
- 表的
须知事项
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
创建数据集
创建 BigQuery 数据集以存储您的机器学习模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在探索器窗格中,点击您的项目名称。
点击
查看操作 > 创建数据集。在创建数据集页面上,执行以下操作:
在数据集 ID 部分,输入
bqml_tutorial
。在位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。
公共数据集存储在
US
多区域中。为简单起见,请将数据集存储在同一位置。保持其余默认设置不变,然后点击创建数据集。
创建连接
创建 Cloud 资源连接并获取连接的服务账号。 在与上一步中创建的数据集相同的位置创建连接。
从下列选项中选择一项:
控制台
转到 BigQuery 页面。
如需创建连接,请点击
添加,然后点击与外部数据源的连接。在连接类型列表中,选择 Vertex AI 远程模型、远程函数和 BigLake(Cloud 资源)。
在连接 ID 字段中,输入连接的名称。
点击创建连接。
点击转到连接。
在连接信息窗格中,复制服务账号 ID 以在后续步骤中使用。
bq
在命令行环境中,创建连接:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
--project_id
参数会替换默认项目。替换以下内容:
REGION
:您的连接区域PROJECT_ID
:您的 Google Cloud 项目 IDCONNECTION_ID
:您的连接的 ID
当您创建连接资源时,BigQuery 会创建一个唯一的系统服务账号,并将其与该连接相关联。
问题排查:如果您收到以下连接错误,请更新 Google Cloud SDK:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
检索并复制服务账号 ID 以在后续步骤中使用:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
输出类似于以下内容:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
将以下部分附加到 main.tf
文件中。
## This creates a cloud resource connection. ## Note: The cloud resource nested object has only one output only field - serviceAccountId. resource "google_bigquery_connection" "connection" { connection_id = "CONNECTION_ID" project = "PROJECT_ID" location = "REGION" cloud_resource {} }替换以下内容:
CONNECTION_ID
:您的连接的 IDPROJECT_ID
:您的 Google Cloud 项目 IDREGION
:您的连接区域
向服务账号授予访问权限
向您的服务账号授予使用连接的权限。未授予权限会导致错误。从下列选项中选择一项:
控制台
前往 IAM 和管理页面。
点击
授予访问权限。系统随即会打开添加主账号对话框。
在新的主账号字段中,输入您之前复制的服务账号 ID。
在选择角色字段中,选择 Vertex AI,然后选择 Vertex AI User。
点击保存。
gcloud
使用 gcloud projects add-iam-policy-binding
命令:
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None
请替换以下内容:
PROJECT_NUMBER
:您的项目编号MEMBER
:您之前复制的服务账号 ID
创建对象表
创建对象表以存储视频内容。对象表让您无需从 Cloud Storage 中移动视频即可分析视频。
创建模型
在 Google Cloud 控制台中,转到 BigQuery 页面。
使用 SQL 编辑器创建远程模型:
CREATE OR REPLACE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME` REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID` OPTIONS (ENDPOINT = 'ENDPOINT');
替换以下内容:
生成视频嵌入
使用对象表中的视频数据,通过 ML.GENERATE_EMBEDDING
函数生成视频嵌入:
SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`, TABLE PROJECT_ID.DATASET_ID.TABLE_NAME, STRUCT(FLATTEN_JSON AS flatten_json_output, START_SECOND AS start_second, END_SECOND AS end_second, INTERVAL_SECONDS AS interval_seconds) );
替换以下内容:
PROJECT_ID
:您的项目 ID。DATASET_ID
:包含该模型的数据集的 ID。MODEL_NAME
:基于multimodalembedding@001
模型的远程模型的名称。TABLE_NAME
:包含要嵌入的视频的对象表的名称。FLATTEN_JSON
:指示是否将嵌入解析为单独的列的BOOL
值。默认值为TRUE
。START_SECOND
:FLOAT64
值,用于指定视频中开始嵌入的时间(以秒为单位)。默认值为0
。此值必须为正数且小于end_second
值。END_SECOND
:FLOAT64
值,指定视频中结束嵌入的时间(以秒为单位)。默认值为120
。 此值必须为正数且大于start_second
值。INTERVAL_SECONDS
:FLOAT64
值,指定创建嵌入时使用的间隔时间。例如,如果您设置了start_second = 0
、end_second = 120
和interval_seconds = 10
,则视频会拆分为 12 个 10 秒的片段 ([0, 10), [10, 20), [20, 30)...
),并且系统会为每个片段生成嵌入。此值必须大于4
且小于120
。默认值为16
。
示例
以下示例展示了如何为 videos
对象表中的视频创建嵌入。系统会在每个视频中 10 秒到 40 秒标记之间针对每 5 秒时间间隔创建嵌入。
SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `mydataset.embedding_model`, TABLE `mydataset.videos`, STRUCT(TRUE AS flatten_json_output, 10 AS start_second, 40 AS end_second, 5 AS interval_seconds) );