Como gerar incorporações de vídeo usando a função ML.GENERATE_EMBEDDING

Neste tutorial, mostramos como criar um modelo remoto do BigQuery ML que faz referência ao modelo de fundação de incorporação da Vertex AI. Em seguida, use esse modelo com a função ML.GENERATE_EMBEDDING para criar embeddings de vídeo usando dados de uma tabela de objetos do BigQuery.

Funções exigidas

  • Para criar uma conexão, você precisa da associação no seguinte papel do Identity and Access Management (IAM):

    • roles/bigquery.connectionAdmin
  • Para conceder permissões à conta de serviço da conexão, você precisa da seguinte permissão:

    • resourcemanager.projects.setIamPolicy
  • Para criar o modelo usando o BigQuery ML, você precisa das seguintes permissões do IAM:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata
  • Para executar a inferência, você precisa das seguintes permissões:

    • bigquery.tables.getData na tabela
    • bigquery.models.getData no modelo
    • bigquery.jobs.create

Antes de começar

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

Criar um conjunto de dados

Crie um conjunto de dados do BigQuery para armazenar o modelo de ML:

  1. No console do Google Cloud, acesse a página do BigQuery.

    Acesse a página do BigQuery

  2. No painel Explorer, clique no nome do seu projeto.

  3. Clique em Conferir ações > Criar conjunto de dados.

    Criar conjunto de dados.

  4. Na página Criar conjunto de dados, faça o seguinte:

    • Para o código do conjunto de dados, insira bqml_tutorial.

    • Em Tipo de local, selecione Multirregião e EUA (várias regiões nos Estados Unidos).

      Os conjuntos de dados públicos são armazenados na multirregião US. Para simplificar, armazene seus conjuntos de dados no mesmo local.

    • Mantenha as configurações padrão restantes e clique em Criar conjunto de dados.

      Página Criar conjunto de dados.

Criar uma conexão

Crie uma Conexão de recursos do Cloud e tenha acesso à conta de serviço da conexão. Crie a conexão no mesmo local do conjunto de dados criado na etapa anterior.

Selecione uma das seguintes opções:

Console

  1. Acessar a página do BigQuery.

    Acessar o BigQuery

  2. Para criar uma conexão, clique em Adicionar e em Conexões com fontes de dados externas.

  3. Na lista Tipo de conexão, selecione Modelos remotos da Vertex AI, funções remotas e BigLake (Cloud Resource).

  4. No campo ID da conexão, insira um nome para a conexão.

  5. Clique em Criar conexão.

  6. Clique em Ir para conexão.

  7. No painel Informações da conexão, copie o ID da conta de serviço para uso em uma etapa posterior.

bq

  1. Em um ambiente de linha de comando, crie uma conexão:

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID

    O parâmetro --project_id substitui o projeto padrão.

    Substitua:

    • REGION: sua região de conexão
    • PROJECT_ID: o ID do projeto do Google Cloud
    • CONNECTION_ID: um ID para sua conexão

    Quando você cria um recurso de conexão, o BigQuery cria uma conta de serviço do sistema exclusiva e a associa à conexão.

    Solução de problemas: se você receber o seguinte erro de conexão, atualize o SDK Google Cloud:

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. Recupere e copie o ID da conta de serviço para uso em uma etapa posterior:

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID

    O resultado será assim:

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

Use o recurso google_bigquery_connection.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, acesse Configurar a autenticação para bibliotecas de cliente.

O exemplo a seguir cria uma conexão de recurso do Cloud chamada my_cloud_resource_connection na região US:


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

Para aplicar a configuração do Terraform em um projeto do Google Cloud, conclua as etapas nas seções a seguir.

Preparar o Cloud Shell

  1. Inicie o Cloud Shell.
  2. Defina o projeto padrão do Google Cloud em que você quer aplicar as configurações do Terraform.

    Você só precisa executar esse comando uma vez por projeto, e ele pode ser executado em qualquer diretório.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    As variáveis de ambiente serão substituídas se você definir valores explícitos no arquivo de configuração do Terraform.

Preparar o diretório

Cada arquivo de configuração do Terraform precisa ter o próprio diretório, também chamado de módulo raiz.

  1. No Cloud Shell, crie um diretório e um novo arquivo dentro dele. O nome do arquivo precisa ter a extensão .tf, por exemplo, main.tf. Neste tutorial, o arquivo é chamado de main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Se você estiver seguindo um tutorial, poderá copiar o exemplo de código em cada seção ou etapa.

    Copie o exemplo de código no main.tf recém-criado.

    Se preferir, copie o código do GitHub. Isso é recomendado quando o snippet do Terraform faz parte de uma solução de ponta a ponta.

  3. Revise e modifique os parâmetros de amostra para aplicar ao seu ambiente.
  4. Salve as alterações.
  5. Inicialize o Terraform. Você só precisa fazer isso uma vez por diretório.
    terraform init

    Opcionalmente, para usar a versão mais recente do provedor do Google, inclua a opção -upgrade:

    terraform init -upgrade

Aplique as alterações

  1. Revise a configuração e verifique se os recursos que o Terraform vai criar ou atualizar correspondem às suas expectativas:
    terraform plan

    Faça as correções necessárias na configuração.

  2. Para aplicar a configuração do Terraform, execute o comando a seguir e digite yes no prompt:
    terraform apply

    Aguarde até que o Terraform exiba a mensagem "Apply complete!".

  3. Abra seu projeto do Google Cloud para ver os resultados. No console do Google Cloud, navegue até seus recursos na IU para verificar se foram criados ou atualizados pelo Terraform.

Conceder acesso à conta de serviço

Conceda à conta de serviço da conexão a função de usuário da Vertex AI.

Se você planeja especificar o endpoint como um URL ao criar o modelo remoto, por exemplo, endpoint = 'https://us-central1-aiplatform.googleapis.com/v1/projects/myproject/locations/us-central1/publishers/google/models/text-embedding-004', conceda essa função no mesmo projeto especificado no URL.

Se você planeja especificar o endpoint usando o nome do modelo ao criar o modelo remoto, por exemplo, endpoint = 'text-embedding-004', conceda esse papel no mesmo projeto em que planeja criar o modelo remoto.

Conceder o papel em um projeto diferente resulta no erro bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource.

Para conceder o papel, siga estas etapas:

Console

  1. Acesse a página IAM e administrador.

    Acessar IAM e administrador

  2. Clique em CONCEDER ACESSO.

    A caixa de diálogo Adicionar principais é aberta.

  3. No campo Novos principais, digite o ID da conta de serviço que você copiou anteriormente.

  4. No campo Selecionar um papel, selecione Vertex AI e, em seguida, selecione Usuário da Vertex AI.

  5. Clique em Salvar.

gcloud

Use o comando gcloud projects add-iam-policy-binding (em inglês).

gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None

Substitua:

  • PROJECT_NUMBER: o ID do seu projeto
  • MEMBER: o ID da conta de serviço que você copiou anteriormente

Criar uma tabela de objetos

Crie uma tabela de objetos que armazene conteúdo de vídeo. Com a tabela de objetos, é possível analisar o vídeo sem movê-lo do Cloud Storage.

O bucket do Cloud Storage usado pela tabela de objetos precisa estar no mesmo projeto em que você planeja criar o modelo e chamar a função ML.GENERATE_EMBEDDING. Se você quiser chamar a função ML.GENERATE_EMBEDDING em um projeto diferente que contém o bucket do Cloud Storage usado pela tabela de objetos, é preciso conceder o papel de Administrador do Storage no nível do bucket para a conta de serviço service-A@gcp-sa-aiplatform.iam.gserviceaccount.com.

Criar um modelo

  1. No Console do Google Cloud, acesse a página BigQuery.

    Acessar o BigQuery

  2. Usando o editor de SQL, crie um modelo remoto:

    CREATE OR REPLACE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`
    REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
    OPTIONS (ENDPOINT = 'ENDPOINT');

    Substitua:

    • PROJECT_ID: ID do projeto
    • DATASET_ID: o ID do conjunto de dados para conter o modelo
    • MODEL_NAME: o nome do modelo
    • REGION: a região usada pela conexão
    • CONNECTION_ID: o ID da conexão do BigQuery

      Quando você visualiza os detalhes da conexão no console do Google Cloud, esse é o valor na última seção do ID da conexão totalmente qualificado, mostrado em ID da conexão, por exemplo projects/myproject/locations/connection_location/connections/myconnection.

    • ENDPOINT: o LLM de embedding a ser usado. Neste caso, multimodalembedding@001.

Gerar embeddings de vídeo

Gere embeddings de vídeo com a função ML.GENERATE_EMBEDDING usando dados de vídeo de uma tabela de objetos:

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)
);

Substitua:

  • PROJECT_ID: o ID do projeto.
  • DATASET_ID: o ID do conjunto de dados que contém o modelo.
  • MODEL_NAME: o nome do modelo remoto em um modelo multimodalembedding@001.
  • TABLE_NAME: o nome da tabela de objetos que contém os vídeos a serem incorporados.
  • FLATTEN_JSON: um valor BOOL que indica se é necessário analisar a incorporação em uma coluna separada. O valor padrão é TRUE.
  • START_SECOND: um valor de FLOAT64 que especifica o segundo em que a incorporação deve ser iniciada no vídeo. O valor padrão é 0. Esse valor precisa ser positivo e menor que o valor de end_second.
  • END_SECOND: um valor de FLOAT64 que especifica o segundo em que a incorporação deve ser concluída no vídeo. O valor padrão é 120. Esse valor precisa ser positivo e maior que o valor de start_second.
  • INTERVAL_SECONDS: um valor de FLOAT64 que especifica o intervalo a ser usado ao criar incorporações. Por exemplo, se você definir start_second = 0, end_second = 120 e interval_seconds = 10, o vídeo será dividido em 12 segmentos de 10 segundos ([0, 10), [10, 20), [20, 30)...) e as incorporações serão geradas para cada segmento. Esse valor precisa ser maior que 4 e menor que 120. O valor padrão é 16.

Exemplo

O exemplo a seguir mostra como criar incorporações para os vídeos na tabela de objetos videos: As incorporações são criadas para cada intervalo de 5 segundos entre as marcas de 10 e 40 segundos em cada vídeo.

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)
  );