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.
Objetivos
- Usa la CLI de Hugging Face Optimum para exportar el modelo
sentence-transformers/all-MiniLM-L6-v2a ONNX. - Usa la instrucción
CREATE MODELpara importar el modelo ONNX a BigQuery. - Usa la función
ML.PREDICTpara generar las inserciones con el modelo ONNX importado.
Costes
En este documento, se utilizan los siguientes componentes facturables de Cloud de Confiance by S3NS:
Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que hayas creado. Para obtener más información, consulta la sección Limpiar.
Antes de empezar
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Cloud de Confiance project.
-
Enable the BigQuery and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. - Asegúrate de que tienes los permisos necesarios para realizar las tareas descritas en este documento.
- BigQuery Studio Admin (
roles/bigquery.studioAdmin) - Storage Object Creator (
roles/storage.objectCreator) -
In the Cloud de Confiance console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
-
In the Cloud de Confiance console, go to the IAM page.
Ir a Gestión de Identidades y Accesos - Selecciona el proyecto.
- Haz clic en Conceder acceso.
-
En el campo Nuevos principales, introduce tu identificador de usuario. Normalmente, es el identificador de un usuario en un grupo de identidades de carga de trabajo. Para obtener más información, consulta el artículo Representar a los usuarios del grupo de trabajadores en las políticas de gestión de identidades y accesos o ponte en contacto con tu administrador.
- En la lista Selecciona un rol, elige un rol.
- Para conceder más roles, haz clic en Añadir otro rol y añade cada rol adicional.
- Haz clic en Guardar.
Instala la CLI de Optimum:
pip install optimum[onnx]Exporta el modelo. El argumento
--modelespecifica el ID del modelo de Hugging Face. El argumento--opsetespecifica la versión de la biblioteca ONNXRuntime y se define como17para 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/Instala la CLI de Optimum:
pip install optimum[onnx]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.pyCopia 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())Guarda el archivo
convert-tokenizer.py.Ejecuta la secuencia de comandos de Python para convertir el tokenizador:
python convert-tokenizer.py- Crea un segmento de Cloud Storage para almacenar los archivos convertidos.
- Sube los archivos del modelo Transformer convertido y del tokenizador a tu depósito de Cloud Storage.
En la Cloud de Confiance consola, ve a la página BigQuery.
En el panel Explorador, haz clic en el nombre de tu proyecto.
Haga clic en Ver acciones > Crear conjunto de datos.
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.
Crea un conjunto de datos llamado
bqml_tutorialcon la ubicación de los datos definida comoUSy la descripciónBigQuery 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-dy--dataset, el comando creará un conjunto de datos de forma predeterminada.Confirma que se ha creado el conjunto de datos:
bq lsEn la Cloud de Confiance consola, abre BigQuery Studio.
En el editor de consultas, ejecuta la siguiente instrucción
CREATE MODELpara crear el modelotokenizer.CREATE OR REPLACE MODEL `bqml_tutorial.tokenizer` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='TOKENIZER_BUCKET_PATH')
Sustituye
TOKENIZER_BUCKET_PATHpor la ruta al modelo que has subido a Cloud Storage. Si usas el modelo de ejemplo, sustituyeTOKENIZER_BUCKET_PATHpor 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 tokenizeren el panel Resultados de la consulta.Haz clic en Ir al modelo para abrir el panel Detalles.
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.
En el editor de consultas, ejecuta la siguiente instrucción
CREATE MODELpara crear el modeloall-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_PATHpor la ruta al modelo que has subido a Cloud Storage. Si usas el modelo de ejemplo, sustituyeTRANSFORMER_BUCKET_PATHpor 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 en el panel Resultados de la consulta:
Successfully created model named all-MiniLM-L6-v2.Haz clic en Ir al modelo para abrir el panel Detalles.
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.
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_PATHpor la ruta al modelo que has subido a Cloud Storage. Si usas el modelo de ejemplo, sustituyeTOKENIZER_BUCKET_PATHpor 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 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_PATHpor la ruta al modelo que has subido a Cloud Storage. Si usas el modelo de ejemplo, sustituyeTRANSFORMER_BUCKET_PATHpor 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.Después de importar los modelos, comprueba 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
Usa el siguiente valor de parámetro
querypara crear el modelotokenizer.{ "query": "CREATE MODEL `PROJECT_ID :bqml_tutorial.tokenizer` OPTIONS(MODEL_TYPE='ONNX' MODEL_PATH='TOKENIZER_BUCKET_PATH')" }Haz los cambios siguientes:
PROJECT_IDpor el ID del proyecto.TOKENIZER_BUCKET_PATHcon la ruta al modelo que has subido a Cloud Storage. Si usas el modelo de ejemplo, sustituyeTOKENIZER_BUCKET_PATHpor el siguiente valor:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.
Usa el siguiente valor de parámetro
querypara crear el modeloall-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_IDpor el ID del proyecto.TRANSFORMER_BUCKET_PATHcon la ruta al modelo que has subido a Cloud Storage. Si utilizas el modelo de ejemplo, sustituyeTRANSFORMER_BUCKET_PATHpor el siguiente valor:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.
PROJECT_IDpor el ID del proyecto.TOKENIZER_BUCKET_PATHcon la ruta al modelo que has subido a Cloud Storage. Si usas el modelo de ejemplo, sustituyeTOKENIZER_BUCKET_PATHpor el siguiente valor:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx.TRANSFORMER_BUCKET_PATHcon la ruta al modelo que has subido a Cloud Storage. Si utilizas el modelo de ejemplo, sustituyeTRANSFORMER_BUCKET_PATHpor el siguiente valor:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx.- Tokenización (consulta interna): la llamada
ML.PREDICTinterna usa el modelobqml_tutorial.tokenizer. Toma la columnatitledel conjunto de datos públicobigquery-public-data.imdb.reviewscomo entradatext. El modelotokenizerconvierte las cadenas de texto sin formato en las entradas de token numéricas que necesita el modelo principal, incluidas las entradasinput_idsyattention_mask. - Generación de inserciones (consulta externa): la llamada
ML.PREDICTexterna usa el modelobqml_tutorial.all-MiniLM-L6-v2. La consulta toma las columnasinput_idsyattention_maskde la salida de la consulta interna como entrada. En la Cloud de Confiance consola, abre BigQuery Studio.
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 | | ... | +-----------------------+
- Tokenización (consulta interna): la llamada
ML.PREDICTinterna usa el modelobqml_tutorial.tokenizer. Toma la columnatitledel conjunto de datos públicobigquery-public-data.imdb.reviewscomo entradatext. El modelotokenizerconvierte las cadenas de texto sin formato en las entradas de token numéricas que necesita el modelo principal, incluidas las entradasinput_idsyattention_mask. - Generación de inserciones (consulta externa): la llamada
ML.PREDICTexterna usa el modelobqml_tutorial.all-MiniLM-L6-v2. La consulta toma las columnasinput_idsyattention_maskde la salida de la consulta interna como entrada. - In the Cloud de Confiance console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- In the Cloud de Confiance console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- Consulta cómo usar incrustaciones de texto para la búsqueda semántica y la generación aumentada por recuperación (RAG).
- Para obtener más información sobre cómo convertir modelos de transformadores a ONNX, consulta Exportar un modelo a ONNX con
optimum.exporters.onnx. - Para obtener más información sobre cómo importar modelos ONNX, consulta la sección Instrucción
CREATE MODELpara modelos ONNX. - Para obtener más información sobre cómo hacer predicciones, consulta La función
ML.PREDICT. - Para obtener una descripción general de BigQuery ML, consulta la introducción a BigQuery ML.
- Para empezar a usar BigQuery ML, consulta el artículo Crear modelos de aprendizaje automático en BigQuery ML.
Roles obligatorios
Si creas un proyecto, serás el propietario y se te concederán todos los permisos de gestión de identidades y accesos (IAM) necesarios para completar este tutorial.
Si usas un proyecto que ya tengas, haz lo siguiente.
Make sure that you have the following role or roles on the project:
Check for the roles
Grant the roles
Para obtener más información sobre los permisos de gestión de identidades y accesos en BigQuery, consulta el artículo sobre permisos de gestión de identidades y accesos.
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:
El archivo del modelo se exporta al directorio all-MiniLM-L6-v2 como model.onnx.
Aplicar la cuantización al modelo Transformer
Usa la CLI de Optimum para aplicar la cuantización al modelo de transformer exportado con el fin de 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 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:
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
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.
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 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. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.
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
bq
Usa la herramienta de línea de comandos bq
query command
para ejecutar la instrucción CREATE 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.
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. 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:
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 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:
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.
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:
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 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. 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:
Limpieza
Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.
Eliminar el proyecto
Consola
gcloud
Eliminar recursos concretos
Si quieres eliminar los recursos utilizados en este tutorial, sigue estos pasos: