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-data
Cloud 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-v2
para 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:
Instale a CLI Optimum:
pip install optimum[onnx]
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 como17
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:
Instale a CLI Optimum:
pip install optimum[onnx]
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
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())
Guarde o ficheiro
convert-tokenizer.py
.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 contentor do Cloud Storage para armazenar os ficheiros convertidos.
- Carregue o modelo transformador convertido e os ficheiros do tokenizador para o seu contentor do Cloud Storage.
Crie um conjunto de dados
Crie um conjunto de dados do BigQuery para armazenar o seu modelo de ML.
Consola
Na Google Cloud consola, aceda à página BigQuery.
No painel Explorador, clique no nome do projeto.
Clique em
Ver ações > Criar conjunto de dadosNa 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
.
Crie um conjunto de dados com o nome
bqml_tutorial
com a localização dos dados definida comoUS
e uma descrição deBigQuery 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.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.
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
Na Google Cloud consola, abra o BigQuery Studio.
No editor de consultas, execute a seguinte declaração
CREATE MODEL
para criar o modelotokenizer
.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, substituaTOKENIZER_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.Clique em Aceder ao modelo para abrir o painel Detalhes.
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.
No editor de consultas, execute a declaração
CREATE MODEL
seguinte para criar o modeloall-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, substituaTRANSFORMER_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.Clique em Aceder ao modelo para abrir o painel Detalhes.
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.
bq
Use a ferramenta de linhas de comando bq
query
comando
para executar a declaração CREATE MODEL
.
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, substituaTOKENIZER_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
.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, substituaTRANSFORMER_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
.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
.
Use o seguinte valor do parâmetro
query
para criar o modelotokenizer
.{ "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, substituaTOKENIZER_BUCKET_PATH
pelo seguinte valor:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx
.
Use o seguinte valor do parâmetro
query
para criar o modeloall-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, substituaTRANSFORMER_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, substituaTOKENIZER_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, substituaTRANSFORMER_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 modelobqml_tutorial.tokenizer
. Usa a colunatitle
do conjunto de dados públicobigquery-public-data.imdb.reviews
como entradatext
. O modelotokenizer
converte as strings de texto não processadas nas entradas de tokens numéricas que o modelo principal requer, incluindo as entradasinput_ids
eattention_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 colunasinput_ids
eattention_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 Google Cloud consola, abra o BigQuery Studio.
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 modelobqml_tutorial.tokenizer
. Usa a colunatitle
do conjunto de dados públicobigquery-public-data.imdb.reviews
como entradatext
. O modelotokenizer
converte as strings de texto não processadas nas entradas de tokens numéricas que o modelo principal requer, incluindo as entradasinput_ids
eattention_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 colunasinput_ids
eattention_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: