Gere incorporações com modelos de transformadores no formato ONNX

Este tutorial mostra como exportar um modelo de transformador para o formato Open Neural Network Exchange (ONNX), importar o modelo ONNX para um conjunto de dados do BigQuery e, em seguida, usar o modelo para gerar incorporações a partir de uma consulta SQL.

Este tutorial usa o modelo sentence-transformers/all-MiniLM-L6-v2. Este modelo de transformador de frases é conhecido pelo seu desempenho rápido e eficaz na geração de incorporações de frases. A incorporação de frases permite tarefas como a pesquisa semântica, o agrupamento e a semelhança de frases, captando o significado subjacente do texto.

O ONNX oferece um formato uniforme concebido para representar qualquer framework de aprendizagem automática (AA). O suporte do BigQuery ML para ONNX permite-lhe fazer o seguinte:

  • Prepare um modelo com a sua framework favorita.
  • Converta o modelo no formato de modelo ONNX.
  • Importe o modelo ONNX para o BigQuery e faça previsões com o BigQuery ML.

Converta os ficheiros do modelo Transformer para ONNX

Opcionalmente, pode seguir os passos nesta secção para converter manualmente o modelo e o tokenizador para ONNX.sentence-transformers/all-MiniLM-L6-v2 Caso contrário, pode usar ficheiros de exemplo do contentor do gs://cloud-samples-dataCloud Storage público que já foram convertidos.

Se optar por converter manualmente os ficheiros, tem de ter um ambiente de linha de comandos local com o Python instalado. Para mais informações sobre a instalação do Python, consulte Transferências do Python.

Exporte o modelo Transformer para ONNX

Use a CLI Hugging Face Optimum para exportar o modelo sentence-transformers/all-MiniLM-L6-v2para ONNX. Para mais informações sobre a exportação de modelos com a CLI Optimum, consulte o artigo Exporte um modelo para ONNX com optimum.exporters.onnx.

Para exportar o modelo, abra um ambiente de linha de comandos e siga estes passos:

  1. Instale a CLI Optimum:

    pip install optimum[onnx]
    
  2. Exporte o modelo. O argumento --model especifica o ID do modelo do Hugging Face. O argumento --opset especifica a versão da biblioteca ONNXRuntime e está definido como 17 para manter a compatibilidade com a biblioteca ONNXRuntime suportada pelo BigQuery.

    optimum-cli export onnx \
      --model sentence-transformers/all-MiniLM-L6-v2 \
      --task sentence-similarity \
      --opset 17 all-MiniLM-L6-v2/
    

O ficheiro do modelo é exportado para o diretório all-MiniLM-L6-v2 como model.onnx.

Aplique a quantização ao modelo Transformer

Use a CLI Optimum para aplicar a quantização ao modelo de transformador exportado de forma a reduzir o tamanho do modelo e acelerar a inferência. Para mais informações, consulte Quantização.

Para aplicar a quantização ao modelo, execute o seguinte comando na linha de comandos:

optimum-cli onnxruntime quantize \
  --onnx_model all-MiniLM-L6-v2/ \
  --avx512_vnni -o all-MiniLM-L6-v2_quantized

O ficheiro do modelo quantizado é exportado para o diretório all-MiniLM-L6-v2_quantized como model_quantized.onnx.

Converta o tokenizador para ONNX

Para gerar incorporações através de um modelo Transformer no formato ONNX, normalmente, usa um tokenizador para produzir duas entradas para o modelo, input_ids e attention_mask.

Para produzir estas entradas, converta o tokenizador para o modelo sentence-transformers/all-MiniLM-L6-v2 para o formato ONNX através da biblioteca onnxruntime-extensions. Depois de converter o tokenizador, pode realizar a tokenização diretamente nas entradas de texto não processado para gerar previsões ONNX.

Para converter o tokenizador, siga estes passos na linha de comandos:

  1. Instale a CLI Optimum:

    pip install optimum[onnx]
    
  2. Com o editor de texto à sua escolha, crie um ficheiro denominado convert-tokenizer.py. O exemplo seguinte usa o editor de texto nano:

    nano convert-tokenizer.py
    
  3. Copie e cole o seguinte script Python no ficheiro convert-tokenizer.py:

    from onnxruntime_extensions import gen_processing_models
    
    # Load the Huggingface tokenizer
    tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")
    
    # Export the tokenizer to ONNX using gen_processing_models
    onnx_tokenizer_path = "tokenizer.onnx"
    
    # Generate the tokenizer ONNX model, and set the maximum token length.
    # Ensure 'max_length' is set to a value less than the model's maximum sequence length, failing to do so will result in error during inference.
    tokenizer_onnx_model = gen_processing_models(tokenizer, pre_kwargs={'max_length': 256})[0]
    
    # Modify the tokenizer ONNX model signature.
    # This is because certain tokenizers don't support batch inference.
    tokenizer_onnx_model.graph.input[0].type.tensor_type.shape.dim[0].dim_value = 1
    
    # Save the tokenizer ONNX model
    with open(onnx_tokenizer_path, "wb") as f:
      f.write(tokenizer_onnx_model.SerializeToString())
    
  4. Guarde o ficheiro convert-tokenizer.py.

  5. Execute o script Python para converter o tokenizador:

    python convert-tokenizer.py
    

O tokenizador convertido é exportado para o diretório all-MiniLM-L6-v2_quantized como tokenizer.onnx.

Carregue os ficheiros do modelo convertidos para o Cloud Storage

Depois de converter o modelo Transformer e o tokenizador, faça o seguinte:

Crie um conjunto de dados

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

Consola

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda à página do BigQuery

  2. No painel Explorador, clique no nome do projeto.

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

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

    • Para o ID do conjunto de dados, introduza bqml_tutorial.

    • Em Tipo de localização, selecione Várias regiões e, de seguida, selecione EUA (várias regiões nos Estados Unidos).

    • Deixe as restantes predefinições como estão e clique em Criar conjunto de dados.

bq

Para criar um novo conjunto de dados, use o comando bq mk com a flag --location. Para uma lista completa de parâmetros possíveis, consulte a referência do comando bq mk --dataset.

  1. Crie um conjunto de dados com o nome bqml_tutorial com a localização dos dados definida como US e uma descrição de BigQuery ML tutorial dataset:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    Em vez de usar a flag --dataset, o comando usa o atalho -d. Se omitir -d e --dataset, o comando cria um conjunto de dados por predefinição.

  2. Confirme que o conjunto de dados foi criado:

    bq ls

API

Chame o método datasets.insert com um recurso de conjunto de dados definido.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

DataFrames do BigQuery

Antes de experimentar este exemplo, siga as instruções de configuração dos DataFrames do BigQuery no início rápido do BigQuery com os DataFrames do BigQuery. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento local.

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

Importe os modelos ONNX para o BigQuery

Importe o tokenizador convertido e os modelos de transformador de frases como modelos do BigQuery ML.

Selecione uma das seguintes opções:

Consola

  1. Na Google Cloud consola, abra o BigQuery Studio.

    Aceda ao BigQuery Studio

  2. No editor de consultas, execute a seguinte declaração CREATE MODEL para criar o modelo tokenizer.

     CREATE OR REPLACE MODEL `bqml_tutorial.tokenizer`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='TOKENIZER_BUCKET_PATH')

    Substitua TOKENIZER_BUCKET_PATH pelo caminho para o modelo que carregou para o Cloud Storage. Se estiver a usar o modelo de exemplo, substitua TOKENIZER_BUCKET_PATH pelo seguinte valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.

    Quando a operação estiver concluída, vê uma mensagem semelhante à seguinte: Successfully created model named tokenizer no painel Resultados da consulta.

  3. Clique em Aceder ao modelo para abrir o painel Detalhes.

  4. Reveja a secção Colunas de funcionalidades para ver as entradas do modelo e a Coluna de etiquetas para ver as saídas do modelo.

    O painel **Detalhes** do `modelo de tokenizador

  5. No editor de consultas, execute a declaração CREATE MODEL seguinte para criar o modelo all-MiniLM-L6-v2.

     CREATE OR REPLACE MODEL `bqml_tutorial.all-MiniLM-L6-v2`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='TRANSFORMER_BUCKET_PATH')

    Substitua TRANSFORMER_BUCKET_PATH pelo caminho para o modelo que carregou para o Cloud Storage. Se estiver a usar o modelo de exemplo, substitua TRANSFORMER_BUCKET_PATH pelo seguinte valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.

    Quando a operação estiver concluída, vê uma mensagem semelhante à seguinte: Successfully created model named all-MiniLM-L6-v2 no painel Resultados da consulta.

  6. Clique em Aceder ao modelo para abrir o painel Detalhes.

  7. Reveja a secção Colunas de funcionalidades para ver as entradas do modelo e a Coluna de etiquetas para ver as saídas do modelo.

    O painel **Detalhes** do modelo `all-MiniLM-L6-v2`

bq

Use a ferramenta de linhas de comando bq query comando para executar a declaração CREATE MODEL.

  1. Na linha de comandos, execute o seguinte comando para criar o modelo tokenizer.

    bq query --use_legacy_sql=false \
    "CREATE OR REPLACE MODEL
    `bqml_tutorial.tokenizer`
    OPTIONS
    (MODEL_TYPE='ONNX',
    MODEL_PATH='TOKENIZER_BUCKET_PATH')"

    Substitua TOKENIZER_BUCKET_PATH pelo caminho para o modelo que carregou para o Cloud Storage. Se estiver a usar o modelo de exemplo, substitua TOKENIZER_BUCKET_PATH pelo seguinte valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.

    Quando a operação estiver concluída, é apresentada uma mensagem semelhante à seguinte: Successfully created model named tokenizer.

  2. Na linha de comandos, execute o seguinte comando para criar o modelo all-MiniLM-L6-v2.

    bq query --use_legacy_sql=false \
    "CREATE OR REPLACE MODEL
    `bqml_tutorial.all-MiniLM-L6-v2`
    OPTIONS
    (MODEL_TYPE='ONNX',
      MODEL_PATH='TRANSFORMER_BUCKET_PATH')"

    Substitua TRANSFORMER_BUCKET_PATH pelo caminho para o modelo que carregou para o Cloud Storage. Se estiver a usar o modelo de exemplo, substitua TRANSFORMER_BUCKET_PATH pelo seguinte valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.

    Quando a operação estiver concluída, é apresentada uma mensagem semelhante à seguinte: Successfully created model named all-MiniLM-L6-v2.

  3. Depois de importar os modelos, verifique se estes aparecem no conjunto de dados.

    bq ls -m bqml_tutorial

    O resultado é semelhante ao seguinte:

    tableId            Type
    ------------------------
    tokenizer          MODEL
    all-MiniLM-L6-v2   MODEL

API

Use o método jobs.insert para importar os modelos.Preencha o parâmetro query do recurso QueryRequest no corpo do pedido com a declaração CREATE MODEL.

  1. Use o seguinte valor do parâmetro query para criar o modelo tokenizer.

    {
    "query": "CREATE MODEL `PROJECT_ID :bqml_tutorial.tokenizer` OPTIONS(MODEL_TYPE='ONNX' MODEL_PATH='TOKENIZER_BUCKET_PATH')"
    }

    Substitua o seguinte:

    • PROJECT_ID com o ID do seu projeto.
    • TOKENIZER_BUCKET_PATH com o caminho para o modelo que carregou para o Cloud Storage. Se estiver a usar o modelo de exemplo, substitua TOKENIZER_BUCKET_PATH pelo seguinte valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.
  2. Use o seguinte valor do parâmetro query para criar o modelo all-MiniLM-L6-v2.

    {
    "query": "CREATE MODEL `PROJECT_ID :bqml_tutorial.all-MiniLM-L6-v2` OPTIONS(MODEL_TYPE='ONNX' MODEL_PATH='TRANSFORMER_BUCKET_PATH')"
    }

    Substitua o seguinte:

    • PROJECT_ID com o ID do seu projeto.
    • TRANSFORMER_BUCKET_PATH com o caminho para o modelo que carregou para o Cloud Storage. Se estiver a usar o modelo de exemplo, substitua TRANSFORMER_BUCKET_PATH pelo seguinte valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.

DataFrames do BigQuery

Antes de experimentar este exemplo, siga as instruções de configuração dos DataFrames do BigQuery no início rápido do BigQuery com os DataFrames do BigQuery. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento local.

Importe os modelos de tokenizador e transformador de frases através do objeto ONNXModel.

import bigframes
from bigframes.ml.imported import ONNXModel

bigframes.options.bigquery.project = PROJECT_ID

bigframes.options.bigquery.location = "US"

tokenizer = ONNXModel(
  model_path= "TOKENIZER_BUCKET_PATH"
)
imported_onnx_model = ONNXModel(
  model_path="TRANSFORMER_BUCKET_PATH"
)

Substitua o seguinte:

  • PROJECT_ID com o ID do seu projeto.
  • TOKENIZER_BUCKET_PATH com o caminho para o modelo que carregou para o Cloud Storage. Se estiver a usar o modelo de exemplo, substitua TOKENIZER_BUCKET_PATH pelo seguinte valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.
  • TRANSFORMER_BUCKET_PATH com o caminho para o modelo que carregou para o Cloud Storage. Se estiver a usar o modelo de exemplo, substitua TRANSFORMER_BUCKET_PATH pelo seguinte valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.

Gere incorporações com os modelos ONNX importados

Use o tokenizador importado e os modelos de transformadores de frases para gerar incorporações com base em dados do conjunto de dados público bigquery-public-data.imdb.reviews.

Selecione uma das seguintes opções:

Consola

Use a ML.PREDICT função para gerar incorporações com os modelos.

A consulta usa uma chamada ML.PREDICT aninhada para processar texto não processado diretamente através do tokenizador e do modelo de incorporação, da seguinte forma:

  • Tokenização (consulta interna): a chamada ML.PREDICT interna usa o modelo bqml_tutorial.tokenizer. Usa a coluna title do conjunto de dados público bigquery-public-data.imdb.reviews como entrada text. O modelo tokenizer converte as strings de texto não processadas nas entradas de tokens numéricas que o modelo principal requer, incluindo as entradas input_ids e attention_mask.
  • Geração de incorporações (consulta externa): a chamada externa usa o modelo bqml_tutorial.all-MiniLM-L6-v2.ML.PREDICT A consulta usa as colunas input_ids e attention_mask da saída da consulta interna como entrada.

A declaração SELECT obtém a coluna sentence_embedding, que é uma matriz de valores FLOAT que representam a incorporação semântica do texto.

  1. Na Google Cloud consola, abra o BigQuery Studio.

    Aceda ao BigQuery Studio

  2. No editor de consultas, execute a seguinte consulta.

    SELECT
    sentence_embedding
    FROM
    ML.PREDICT (MODEL `bqml_tutorial.all-MiniLM-L6-v2`,
      (
      SELECT
        input_ids, attention_mask
      FROM
        ML.PREDICT(MODEL `bqml_tutorial.tokenizer`,
          (
          SELECT
            title AS text
          FROM
            `bigquery-public-data.imdb.reviews` limit 10))))

    O resultado é semelhante ao seguinte:

    +-----------------------+
    | sentence_embedding    |
    +-----------------------+
    | -0.02361682802438736  |
    | 0.02025664784014225   |
    | 0.005168713629245758  |
    | -0.026361213997006416 |
    | 0.0655381828546524    |
    | ...                   |
    +-----------------------+
    

bq

Use a ferramenta de linhas de comando bq query comando para executar uma consulta. A consulta usa a função ML.PREDICT para gerar incorporações com os modelos.

A consulta usa uma chamada ML.PREDICT aninhada para processar texto não processado diretamente através do tokenizador e do modelo de incorporação, da seguinte forma:

  • Tokenização (consulta interna): a chamada ML.PREDICT interna usa o modelo bqml_tutorial.tokenizer. Usa a coluna title do conjunto de dados público bigquery-public-data.imdb.reviews como entrada text. O modelo tokenizer converte as strings de texto não processadas nas entradas de tokens numéricas que o modelo principal requer, incluindo as entradas input_ids e attention_mask.
  • Geração de incorporações (consulta externa): a chamada externa usa o modelo bqml_tutorial.all-MiniLM-L6-v2.ML.PREDICT A consulta usa as colunas input_ids e attention_mask da saída da consulta interna como entrada.

A declaração SELECT obtém a coluna sentence_embedding, que é uma matriz de valores FLOAT que representam a incorporação semântica do texto.

Na linha de comandos, execute o seguinte comando para executar a consulta.

bq query --use_legacy_sql=false \
'SELECT
sentence_embedding
FROM
ML.PREDICT (MODEL `bqml_tutorial.all-MiniLM-L6-v2`,
  (
  SELECT
    input_ids, attention_mask
  FROM
    ML.PREDICT(MODEL `bqml_tutorial.tokenizer`,
      (
      SELECT
        title AS text
      FROM
        `bigquery-public-data.imdb.reviews` limit 10))))'

O resultado é semelhante ao seguinte:

+-----------------------+
| sentence_embedding    |
+-----------------------+
| -0.02361682802438736  |
| 0.02025664784014225   |
| 0.005168713629245758  |
| -0.026361213997006416 |
| 0.0655381828546524    |
| ...                   |
+-----------------------+

DataFrames do BigQuery

Antes de experimentar este exemplo, siga as instruções de configuração dos DataFrames do BigQuery no início rápido do BigQuery com os DataFrames do BigQuery. Para mais informações, consulte a documentação de referência do BigQuery DataFrames.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure o ADC para um ambiente de desenvolvimento local.

Use o método predict para gerar incorporações com os modelos ONNX.

import bigframes.pandas as bpd

df = bpd.read_gbq("bigquery-public-data.imdb.reviews", max_results=10)
df_pred = df.rename(columns={"title": "text"})
tokens = tokenizer.predict(df_pred)
predictions = imported_onnx_model.predict(tokens)
predictions.peek(5)

O resultado é semelhante ao seguinte:

Resultado do modelo Transformer.