Generar incrustaciones con modelos de transformador en formato ONNX

En este tutorial se explica cómo exportar un modelo Transformer al formato Open Neural Network Exchange (ONNX), importar el modelo ONNX a un conjunto de datos de BigQuery y, a continuación, usar el modelo para generar inserciones a partir de una consulta SQL.

En este tutorial se usa el modelo sentence-transformers/all-MiniLM-L6-v2. Este modelo Transformer de frases es conocido por su rendimiento rápido y eficaz a la hora de generar representaciones de frases. La inserción de frases permite realizar tareas como la búsqueda semántica, la agrupación en clústeres y la similitud de frases al captar el significado subyacente del texto.

ONNX proporciona un formato uniforme diseñado para representar cualquier framework de aprendizaje automático (ML). La compatibilidad de BigQuery ML con ONNX te permite hacer lo siguiente:

  • Entrena un modelo con tu framework favorito.
  • Convierte el modelo al formato ONNX.
  • Importa el modelo ONNX a BigQuery y haz predicciones con BigQuery ML.

Convertir los archivos del modelo Transformer a ONNX

También puedes seguir los pasos de esta sección para convertir manualmente el modelo sentence-transformers/all-MiniLM-L6-v2 y el tokenizador a ONNX. De lo contrario, puede usar archivos de ejemplo del gs://cloud-samples-datasegmento de Cloud Storage público que ya se hayan convertido.

Si decides convertir los archivos manualmente, debes tener un entorno de línea de comandos local con Python instalado. Para obtener más información sobre cómo instalar Python, consulta la página de descargas de Python.

Exportar el modelo Transformer a ONNX

Usa la CLI de Hugging Face Optimum para exportar el modelo sentence-transformers/all-MiniLM-L6-v2 a ONNX. Para obtener más información sobre cómo exportar modelos con la CLI de Optimum, consulta Exportar un modelo a ONNX con optimum.exporters.onnx.

Para exportar el modelo, abre un entorno de línea de comandos y sigue estos pasos:

  1. Instala la CLI de Optimum:

    pip install optimum[onnx]
    
  2. Exporta el modelo. El argumento --model especifica el ID del modelo de Hugging Face. El argumento --opset especifica la versión de la biblioteca ONNXRuntime y se define como 17 para mantener la compatibilidad con la biblioteca ONNXRuntime compatible con BigQuery.

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

El archivo del modelo se exporta al directorio all-MiniLM-L6-v2 como model.onnx.

Aplicar la cuantificación al modelo Transformer

Usa la CLI de Optimum para aplicar la cuantización al modelo de Transformer exportado. De esta forma, reducirás el tamaño del modelo y acelerarás la inferencia. Para obtener más información, consulta Cuantización.

Para aplicar la cuantización al modelo, ejecuta el siguiente comando en la línea de comandos:

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

El archivo del modelo cuantificado se exporta al directorio all-MiniLM-L6-v2_quantized como model_quantized.onnx.

Convertir el tokenizador a ONNX

Para generar embeddings con un modelo Transformer en formato ONNX, normalmente se usa un tokenizador para generar dos entradas al modelo: input_ids y attention_mask.

Para generar estas entradas, convierte el tokenizador del modelo sentence-transformers/all-MiniLM-L6-v2 al formato ONNX mediante la biblioteca onnxruntime-extensions. Una vez que hayas convertido el tokenizador, podrás realizar la tokenización directamente en las entradas de texto sin formato para generar predicciones de ONNX.

Para convertir el tokenizador, sigue estos pasos en la línea de comandos:

  1. Instala la CLI de Optimum:

    pip install optimum[onnx]
    
  2. Con el editor de texto que prefieras, crea un archivo llamado convert-tokenizer.py. En el siguiente ejemplo se usa el editor de texto nano:

    nano convert-tokenizer.py
    
  3. Copia y pega la siguiente secuencia de comandos de Python en el archivo 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. Guarda el archivo convert-tokenizer.py.

  5. Ejecuta la secuencia de comandos de Python para convertir el tokenizador:

    python convert-tokenizer.py
    

El tokenizador convertido se exporta al directorio all-MiniLM-L6-v2_quantized como tokenizer.onnx.

Subir los archivos del modelo convertido a Cloud Storage

Una vez que hayas convertido el modelo Transformer y el tokenizador, haz lo siguiente:

Crear conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tu modelo de aprendizaje automático.

Consola

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a la página de BigQuery

  2. En el panel Explorador, haz clic en el nombre de tu proyecto.

  3. Haga clic en Ver acciones > Crear conjunto de datos.

  4. En la página Crear conjunto de datos, haz lo siguiente:

    • En ID del conjunto de datos, introduce bqml_tutorial.

    • En Tipo de ubicación, selecciona Multirregión y, a continuación, EE. UU. (varias regiones de Estados Unidos).

    • Deje el resto de los ajustes predeterminados como están y haga clic en Crear conjunto de datos.

bq

Para crear un conjunto de datos, usa el comando bq mk con la marca --location. Para ver una lista completa de los parámetros posibles, consulta la referencia del comando bq mk --dataset.

  1. Crea un conjunto de datos llamado bqml_tutorial con la ubicación de los datos definida como US y la descripción BigQuery ML tutorial dataset:

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

    En lugar de usar la marca --dataset, el comando usa el acceso directo -d. Si omite -d y --dataset, el comando creará un conjunto de datos de forma predeterminada.

  2. Confirma que se ha creado el conjunto de datos:

    bq ls

API

Llama al método datasets.insert con un recurso de conjunto de datos definido.

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

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

import google.cloud.bigquery

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

Importar los modelos ONNX a BigQuery

Importa el tokenizador convertido y los modelos de transformador de frases como modelos de BigQuery ML.

Selecciona una de las opciones siguientes:

Consola

  1. En la Google Cloud consola, abre BigQuery Studio.

    Ir a BigQuery Studio

  2. En el editor de consultas, ejecuta la siguiente instrucción CREATE MODEL para crear el modelo tokenizer.

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

    Sustituye TOKENIZER_BUCKET_PATH por la ruta al modelo que has subido a Cloud Storage. Si utilizas el modelo de ejemplo, sustituye TOKENIZER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.

    Cuando la operación se haya completado, verás un mensaje similar al siguiente: Successfully created model named tokenizer en el panel Resultados de la consulta.

  3. Haz clic en Ir al modelo para abrir el panel Detalles.

  4. Consulte la sección Columnas de características para ver las entradas del modelo y la sección Columna de etiquetas para ver las salidas del modelo.

    El panel **Detalles** del modelo `tokenizer

  5. En el editor de consultas, ejecuta la siguiente instrucción CREATE MODEL para crear el modelo all-MiniLM-L6-v2.

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

    Sustituye TRANSFORMER_BUCKET_PATH por la ruta al modelo que has subido a Cloud Storage. Si utilizas el modelo de ejemplo, sustituye TRANSFORMER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.

    Cuando la operación se haya completado, verás un mensaje similar al siguiente: Successfully created model named all-MiniLM-L6-v2 en el panel Resultados de la consulta.

  6. Haz clic en Ir al modelo para abrir el panel Detalles.

  7. Consulte la sección Columnas de características para ver las entradas del modelo y la sección Columna de etiquetas para ver las salidas del modelo.

    El panel **Detalles** del modelo `all-MiniLM-L6-v2`

bq

Usa la herramienta de línea de comandos bq query command para ejecutar la instrucción CREATE MODEL.

  1. En la línea de comandos, ejecuta el siguiente comando para crear el modelo tokenizer.

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

    Sustituye TOKENIZER_BUCKET_PATH por la ruta al modelo que has subido a Cloud Storage. Si utilizas el modelo de ejemplo, sustituye TOKENIZER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.

    Cuando la operación se haya completado, verás un mensaje similar al siguiente: Successfully created model named tokenizer.

  2. En la línea de comandos, ejecuta el siguiente comando para crear el 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')"

    Sustituye TRANSFORMER_BUCKET_PATH por la ruta al modelo que has subido a Cloud Storage. Si utilizas el modelo de ejemplo, sustituye TRANSFORMER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.

    Cuando la operación se haya completado, verás un mensaje similar al siguiente: Successfully created model named all-MiniLM-L6-v2.

  3. Después de importar los modelos, compruebe que aparecen en el conjunto de datos.

    bq ls -m bqml_tutorial

    El resultado debería ser similar al siguiente:

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

API

Usa el método jobs.insert para importar los modelos.Rellena el parámetro query del recurso QueryRequest en el cuerpo de la solicitud con la instrucción CREATE MODEL.

  1. Usa el siguiente valor de parámetro query para crear el modelo tokenizer.

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

    Haz los cambios siguientes:

    • PROJECT_ID por el ID del proyecto.
    • TOKENIZER_BUCKET_PATH con la ruta al modelo que has subido a Cloud Storage. Si usas el modelo de ejemplo, sustituye TOKENIZER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.
  2. Usa el siguiente valor de parámetro query para crear el 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')"
    }

    Haz los cambios siguientes:

    • PROJECT_ID por el ID del proyecto.
    • TRANSFORMER_BUCKET_PATH con la ruta al modelo que has subido a Cloud Storage. Si utilizas el modelo de ejemplo, sustituye TRANSFORMER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

Importa los modelos de tokenizador y de transformador de frases mediante el 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"
)

Haz los cambios siguientes:

  • PROJECT_ID por el ID del proyecto.
  • TOKENIZER_BUCKET_PATH con la ruta al modelo que has subido a Cloud Storage. Si usas el modelo de ejemplo, sustituye TOKENIZER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.
  • TRANSFORMER_BUCKET_PATH con la ruta al modelo que has subido a Cloud Storage. Si utilizas el modelo de ejemplo, sustituye TRANSFORMER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.

Generar incrustaciones con los modelos ONNX importados

Usa el tokenizador importado y los modelos de transformador de frases para generar incrustaciones basadas en datos del conjunto de datos público bigquery-public-data.imdb.reviews.

Selecciona una de las opciones siguientes:

Consola

Usa la función ML.PREDICT para generar embeddings con los modelos.

La consulta usa una llamada ML.PREDICT anidada para procesar texto sin formato directamente a través del tokenizador y el modelo de inserción, de la siguiente manera:

  • Tokenización (consulta interna): la llamada ML.PREDICT interna usa el modelo bqml_tutorial.tokenizer. Toma la columna title del conjunto de datos público bigquery-public-data.imdb.reviews como entrada text. El modelo tokenizer convierte las cadenas de texto sin formato en las entradas de token numéricas que necesita el modelo principal, incluidas las entradas input_ids y attention_mask.
  • Generación de inserciones (consulta externa): la llamada ML.PREDICT externa usa el modelo bqml_tutorial.all-MiniLM-L6-v2. La consulta toma las columnas input_ids y attention_mask de la salida de la consulta interna como entrada.

La instrucción SELECT obtiene la columna sentence_embedding, que es un array de valores FLOAT que representan la inserción semántica del texto.

  1. En la Google Cloud consola, abre BigQuery Studio.

    Ir a BigQuery Studio

  2. En el editor de consultas, ejecuta la siguiente 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))))

    El resultado es similar al siguiente:

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

bq

Usa la herramienta de línea de comandos bq query command para ejecutar una consulta. La consulta usa la función ML.PREDICT para generar las inserciones con los modelos.

La consulta usa una llamada ML.PREDICT anidada para procesar texto sin formato directamente a través del tokenizador y el modelo de inserción, de la siguiente manera:

  • Tokenización (consulta interna): la llamada ML.PREDICT interna usa el modelo bqml_tutorial.tokenizer. Toma la columna title del conjunto de datos público bigquery-public-data.imdb.reviews como entrada text. El modelo tokenizer convierte las cadenas de texto sin formato en las entradas de token numéricas que necesita el modelo principal, incluidas las entradas input_ids y attention_mask.
  • Generación de inserciones (consulta externa): la llamada ML.PREDICT externa usa el modelo bqml_tutorial.all-MiniLM-L6-v2. La consulta toma las columnas input_ids y attention_mask de la salida de la consulta interna como entrada.

La instrucción SELECT obtiene la columna sentence_embedding, que es un array de valores FLOAT que representan la inserción semántica del texto.

En la línea de comandos, ejecuta el siguiente comando para ejecutar la 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))))'

El resultado es similar al siguiente:

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

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

Usa el método predict para generar las inserciones con los 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)

El resultado debería ser similar al siguiente:

Salida del modelo Transformer.