Genera embeddings con modelos de Transformer en formato ONNX

En este instructivo, usarás la CLI de Hugging Face Optimum para exportar el modelo sentence-transformers/all-MiniLM-L6-v2 al formato Open Neural Network Exchange (ONNX). Usarás la sentencia CREATE MODEL para importar el modelo ONNX a BigQuery. Por último, usas la función ML.PREDICT para generar embeddings con el modelo ONNX importado.

En este instructivo, se usa el modelo sentence-transformers/all-MiniLM-L6-v2. Este modelo de transformador de oraciones es conocido por su rendimiento rápido y eficaz en la generación de incorporaciones de oraciones. La incorporación de oraciones permite realizar tareas como la búsqueda semántica, el agrupamiento en clústeres y la similitud de oraciones, ya que captura el significado subyacente del texto.

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

  • Entrenar un modelo con tu framework favorito.
  • Convierte el modelo al formato de modelo ONNX.
  • Importar el modelo ONNX a BigQuery y hacer predicciones con BigQuery ML.

Objetivos

  • Exporta el modelo sentence-transformers/all-MiniLM-L6-v2 a ONNX.
  • Importar el modelo ONNX a BigQuery
  • Usa la función ML.PREDICT para generar incorporaciones con el modelo ONNX importado.

Costos

En este documento, usarás los siguientes componentes facturables de Cloud de Confiance by S3NS:

Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.

Antes de comenzar

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verifica que la facturación esté habilitada para tu proyecto de Cloud de Confiance .

  3. Habilita las APIs de BigQuery y Cloud Storage.

    Roles necesarios para habilitar las APIs

    Para habilitar APIs, necesitas el permiso serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtener este permiso a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.

    Habilitar las API

  4. Asegúrate de tener los permisos necesarios para realizar las tareas de este documento.

Roles obligatorios

Si quieres obtener los permisos que necesitas para completar este instructivo, pídele a tu administrador que te otorgue los siguientes roles de IAM en el proyecto:

  • Crear conjuntos de datos, tablas y modelos, y ejecutar trabajos de BigQuery: Administrador de BigQuery Studio (roles/bigquery.studioAdmin)
  • Crea un bucket de Cloud Storage y objetos de almacenamiento (si conviertes manualmente los archivos del modelo de Transformer a ONNX): Administrador de almacenamiento (roles/storage.admin)

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.

Si creas un proyecto nuevo, serás el propietario y se te otorgarán todos los permisos de Identity and Access Management (IAM) necesarios para completar este instructivo.

Para obtener más información sobre los permisos de IAM en BigQuery, consulta Permisos de IAM.

Opcional: Convierte manualmente los archivos del modelo Transformer a ONNX

Si conviertes manualmente el modelo sentence-transformers/all-MiniLM-L6-v2 y el tokenizador a ONNX, sigue los pasos que se indican en las siguientes secciones. Como alternativa, puedes usar los archivos de muestra en el bucket de Cloud Storage gs://cloud-samples-data. Los archivos de este bucket ya se convirtieron. Si usas los archivos de muestra, ve a Crea un conjunto de datos.

Si eliges convertir los archivos de forma manual, debes tener un entorno de línea de comandos local que tenga instalado Python. Para obtener más información sobre la instalación de Python, consulta Descargas de Python.

Exporta el modelo de 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 la exportación de modelos con la CLI de Optimum, consulta Exporta 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:

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

    El argumento --model especifica el ID del modelo de Hugging Face. El argumento --opset especifica la versión de la biblioteca de ONNX Runtime y se establece en 17 para mantener la compatibilidad con la biblioteca de ONNX Runtime que admite BigQuery.

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

Aplica la cuantización al modelo Transformer

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

Para aplicar la cuantización al modelo, ejecuta el siguiente comando:

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.

Convierte el tokenizador a ONNX

Para generar embeddings con un modelo de transformador en formato ONNX, por lo general, se usa un tokenizador para producir dos entradas para el modelo, input_ids y attention_mask.

Para generar estas entradas, convierte el tokenizador del modelo sentence-transformers/all-MiniLM-L6-v2 al formato ONNX con la biblioteca onnxruntime-extensions. Después de convertir el tokenizador, puedes realizar la tokenización directamente en las entradas de texto sin procesar 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. Para convertir el tokenizador, ejecuta la secuencia de comandos de Python:

    python convert-tokenizer.py
    

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

Sube los archivos del modelo convertido a Cloud Storage

Después de convertir el modelo Transformer y el tokenizador, haz lo siguiente:

Crea un conjunto de datos

Para crear un conjunto de datos de BigQuery, selecciona una de las siguientes opciones:

Console

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

    Ir a BigQuery

  2. En el panel de la izquierda, haz clic en Explorar.

    Botón destacado del panel Explorador.

    Si no ves el panel izquierdo, haz clic en Expandir panel izquierdo para abrirlo.

  3. En Explorador, expande tu proyecto y, luego, haz clic en Conjuntos de datos.

  4. En la página Conjuntos de datos, haz clic en Crear conjunto de datos.

  5. En el panel Crear conjunto de datos, haz lo siguiente:

    • En ID del conjunto de datos, ingresa bqml_tutorial.

    • En Ubicación de los datos, selecciona EE.UU..

    Deja el resto de la configuración predeterminada como está.

  6. Haz clic en Crear conjunto de datos.

bq

Para crear un conjunto de datos nuevo, usa el comando bq mk --dataset.

  1. Crea un conjunto de datos llamado bqml_tutorial con la ubicación de los datos establecida en US:

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. Confirma que se haya 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"
  }
}

Permite trabajar con BigQuery DataFrames.

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames 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 BigQuery DataFrames.

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

import google.cloud.bigquery

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

Importa los modelos de ONNX a BigQuery

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

Selecciona una de las siguientes opciones:

Console

  1. En la consola de Cloud de Confiance , ve a la página de BigQuery Studio.

    Ir a Studio

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

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

    Reemplaza TOKENIZER_BUCKET_PATH por la ruta de acceso al modelo que subiste a Cloud Storage. Si usas el modelo de muestra, reemplaza TOKENIZER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.

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

  3. Para abrir el panel Detalles, haz clic en Ir al modelo.

  4. Para ver las entradas y el resultado del modelo en la columna de etiquetas, revisa la sección Columnas de atributos:

    El panel **Detalles** del modelo `tokenizer`

  5. Para crear el modelo all-MiniLM-L6-v2, en el editor de consultas, ejecuta la siguiente declaración CREATE MODEL:

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

    Reemplaza TRANSFORMER_BUCKET_PATH por la ruta de acceso al modelo que subiste a Cloud Storage. Si usas el modelo de muestra, reemplaza TRANSFORMER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.

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

  6. Para abrir el panel Detalles, haz clic en Ir al modelo.

  7. Para ver las entradas y salidas del modelo en la columna de etiquetas, revisa la sección Columnas de atributos:

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

bq

Ejecuta la instrucción CREATE MODEL con el comando query de la herramienta de línea de comandos de bq.

  1. Crea 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')"

    Reemplaza TOKENIZER_BUCKET_PATH por la ruta de acceso al modelo que subiste a Cloud Storage. Si usas el modelo de muestra, reemplaza TOKENIZER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.

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

  2. Crea 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')"

    Reemplaza TRANSFORMER_BUCKET_PATH por la ruta de acceso al modelo que subiste a Cloud Storage. Si usas el modelo de muestra, reemplaza TRANSFORMER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.

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

  3. Después de importar los modelos, verifica que aparezcan en el conjunto de datos.

    bq ls -m bqml_tutorial

    El resultado es similar a lo siguiente:

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

API

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

  1. Para crear el modelo tokenizer, usa el siguiente parámetro query:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: el ID de tu proyecto
    • TOKENIZER_BUCKET_PATH: Es la ruta de acceso al modelo que subiste a Cloud Storage. Si usas el modelo de muestra, reemplaza TOKENIZER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.
  2. Para crear el modelo all-MiniLM-L6-v2, usa el siguiente valor del parámetro query:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: el ID de tu proyecto
    • TRANSFORMER_BUCKET_PATH: Es la ruta de acceso al modelo que subiste a Cloud Storage. Si usas el modelo de muestra, reemplaza TRANSFORMER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.

Permite trabajar con BigQuery DataFrames.

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames 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 BigQuery DataFrames.

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

Importa los modelos de tokenizador y de transformación de oraciones con 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"
)

Reemplaza lo siguiente:

  • PROJECT_ID: el ID de tu proyecto
  • TOKENIZER_BUCKET_PATH: Es la ruta de acceso al modelo que subiste a Cloud Storage. Si usas el modelo de muestra, reemplaza TOKENIZER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.
  • TRANSFORMER_BUCKET_PATH: Es la ruta de acceso al modelo que subiste a Cloud Storage. Si usas el modelo de muestra, reemplaza TRANSFORMER_BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.

Genera embeddings con los modelos ONNX importados

Usa el tokenizador importado y los modelos de Sentence Transformer para generar incorporaciones basadas en los datos del conjunto de datos públicos bigquery-public-data.imdb.reviews.

Selecciona una de las siguientes opciones:

Console

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

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

  • Tokenización (consulta interna): La llamada interna a ML.PREDICT usa el modelo bqml_tutorial.tokenizer. Toma la columna title del conjunto de datos públicos bigquery-public-data.imdb.reviews como su entrada text. El modelo tokenizer convierte las cadenas de texto sin procesar en las entradas de tokens numéricos que requiere el modelo principal, incluidas las entradas input_ids y attention_mask.
  • Generación de embeddings (consulta externa): La llamada externa a ML.PREDICT usa el modelo bqml_tutorial.all-MiniLM-L6-v2. La consulta toma las columnas input_ids y attention_mask del resultado de la consulta interna como entrada.

La sentencia SELECT recupera la columna sentence_embedding, que es un array de valores FLOAT que representan la incorporación semántica del texto.

Para generar los embeddings, sigue estos pasos:

  1. En la consola de Cloud de Confiance , ve a la página de BigQuery Studio.

    Ir a 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 el comando query de la herramienta de línea de comandos de bq para ejecutar una consulta. La consulta usa la función ML.PREDICT para generar incorporaciones con los modelos.

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

  • Tokenización (consulta interna): La llamada interna a ML.PREDICT usa el modelo bqml_tutorial.tokenizer. Toma la columna title del conjunto de datos públicos bigquery-public-data.imdb.reviews como su entrada text. El modelo tokenizer convierte las cadenas de texto sin procesar en las entradas de tokens numéricos que requiere el modelo principal, incluidas las entradas input_ids y attention_mask.
  • Generación de embeddings (consulta externa): La llamada externa a ML.PREDICT usa el modelo bqml_tutorial.all-MiniLM-L6-v2. La consulta toma las columnas input_ids y attention_mask del resultado de la consulta interna como entrada.

La sentencia SELECT recupera la columna sentence_embedding, que es un array de valores FLOAT que representan la incorporació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    |
| ...                   |
+-----------------------+

Permite trabajar con BigQuery DataFrames.

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames 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 BigQuery DataFrames.

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

Usa el método predict para generar embeddings 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 es similar a lo siguiente:

Es la salida del modelo Transformer.

Realiza una limpieza

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

Console

  1. En la Cloud de Confiance consola, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

gcloud

    Borra un Cloud de Confiance proyecto:

    gcloud projects delete PROJECT_ID

Borra los recursos individuales

Como alternativa, para conservar el proyecto y borrar los recursos que se usaron en este instructivo, sigue estos pasos:

  1. En la consola de Cloud de Confiance , ve a la página de BigQuery Studio.

    Ir a Studio

  2. En el panel izquierdo, expande tu proyecto y, luego, haz clic en Conjuntos de datos.

  3. Para el conjunto de datos bqml_tutorial, haz clic en Abrir acciones > Borrar.

  4. En el cuadro de diálogo Borrar conjunto de datos, haz clic en Borrar para confirmar.

  5. Si seguiste los pasos para convertir manualmente los archivos del modelo Transformer a ONNX, borra el bucket de Cloud Storage.

¿Qué sigue?