Open Neural Network Exchange (ONNX) proporciona un formato uniforme diseñado para representar cualquier framework de aprendizaje automático. La compatibilidad de BigQuery ML con ONNX te permite hacer lo siguiente:
- Entrenar un modelo con tu framework favorito.
- Convertir el modelo al formato de modelo ONNX.
- Importar el modelo ONNX a BigQuery y hacer predicciones con BigQuery ML.
En este instructivo, se muestra cómo importar modelos ONNX entrenados con PyTorch a un conjunto de datos de BigQuery y usarlos para realizar predicciones a partir de una consulta en SQL.
Objetivos
- Importa un modelo previamente entrenado con PyTorch.
- Convierte el modelo al formato ONNX con torch.onnx.
- Usa la sentencia
CREATE MODELpara importar el modelo ONNX a BigQuery. - Usa la función
ML.PREDICTpara hacer predicciones con el modelo ONNX importado.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para obtener una estimación de costos en función del uso previsto,
usa la calculadora de precios.
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
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud 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 Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, 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 tener los permisos necesarios para realizar las tareas de este documento.
- BigQuery Studio Admin (
roles/bigquery.studioAdmin) - BigQuery Connection Admin (
roles/bigquery.connectionAdmin) - Storage Admin
(roles/storage.admin) -
In the Google Cloud 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 Google Cloud console, go to the IAM page.
Ir a IAM - Selecciona el proyecto.
- Haz clic en Otorgar acceso.
-
En el campo Principales nuevas, ingresa tu identificador de usuario. Esta suele ser la dirección de correo electrónico de una Cuenta de Google.
- En la lista Seleccionar un rol, elige uno.
- Para otorgar roles adicionales, haz clic en Agregar otro rol y agrega uno más.
- Haz clic en Guardar.
- Crea un bucket de Cloud Storage para almacenar el modelo.
- Sube el modelo ONNX a tu bucket de Cloud Storage.
En la consola de Google Cloud , ve a la página BigQuery.
En el panel Explorador, haz clic en el nombre de tu proyecto.
Haz 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, ingresa
bqml_tutorial.En Tipo de ubicación, selecciona Multirregión y, luego, EE.UU. (varias regiones en Estados Unidos).
Deja la configuración predeterminada restante como está y haz clic en Crear conjunto de datos.
Crea un conjunto de datos llamado
bqml_tutorialcon la ubicación de los datos establecida enUSy una descripción deBigQuery 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 omites-dy--dataset, el comando crea un conjunto de datos de manera predeterminada.Confirma que se haya creado el conjunto de datos:
bq lsEn la consola de Google Cloud , ve a la página BigQuery Studio.
En el editor de consultas, ingresa la siguiente instrucción
CREATE MODEL.CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='BUCKET_PATH')
Reemplaza
BUCKET_PATHpor la ruta de acceso al modelo que subiste a Cloud Storage. Si usas el modelo de muestra, reemplazaBUCKET_PATHpor el siguiente valor:gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx.Cuando se complete la operación, verás un mensaje similar al siguiente:
Successfully created model named imported_onnx_model.Tu nuevo modelo aparece en el panel Recursos. Los modelos se indican con el ícono de modelo:
Si seleccionas el modelo nuevo en el panel Recursos, la información sobre el modelo aparecerá junto al Editor de consultas.
Para importar el modelo ONNX desde Cloud Storage, ingresa la siguiente declaración
CREATE MODEL.bq query --use_legacy_sql=false \ "CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='BUCKET_PATH')"
Reemplaza
BUCKET_PATHpor la ruta de acceso al modelo que subiste a Cloud Storage. Si usas el modelo de muestra, reemplazaBUCKET_PATHpor este valor:gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx.Después de importar el modelo, verifica que aparezca en el conjunto de datos.
bq ls -m bqml_tutorial
El resultado es similar a lo siguiente:
tableId Type --------------------- ------- imported_onnx_model MODEL
- Crea un bucket de Cloud Storage y sube una imagen de un pez dorado.
- Crea una conexión de recursos de Cloud que se use para acceder a la tabla de objetos.
- Otorga acceso a la cuenta de servicio de la conexión del recurso.
- En la consola de Google Cloud , ve a la página Buckets de Cloud Storage.
Haz clic en Crear.
En la página Crear un bucket, ingresa la información de tu bucket.
En la sección Primeros pasos, haz lo siguiente:
En el cuadro, ingresa
bqml_images.Haz clic en Continuar.
En la sección Eligir dónde almacenar tus datos, haz lo siguiente:
En Tipo de ubicación, selecciona Multirregión.
En el menú de tipo de ubicación, selecciona US (varias regiones en Estados Unidos).
Haz clic en Continuar.
En la sección Elige una clase de almacenamiento para tus datos, haz lo siguiente:
Selecciona Establecer una clase predeterminada.
Selecciona Estándar.
Haz clic en Continuar.
En las secciones restantes, deja los valores predeterminados.
Haz clic en Crear.
- En la consola de Google Cloud , ve a la página Buckets de Cloud Storage.
En la lista de buckets, haz clic en
bqml_images.En la pestaña Objetos del bucket, realiza una de las siguientes acciones:
Arrastra el archivo desde tu escritorio o administrador de archivos al panel principal de la consola de Google Cloud .
Haz clic en Subir > Subir archivos, selecciona el archivo de imagen que deseas subir en el diálogo que aparece y, luego, haz clic en Abrir.
OBJECT_LOCATION: Es la ruta de acceso local a tu archivo de imagen. Por ejemplo,Desktop/goldfish.jpgIMAGE_NAME: Es el nombre de la imagen. Por ejemplo,goldfish.jpgVe a la página de BigQuery Studio.
En el panel de la izquierda, haz clic en Explorar:

Si no ves el panel izquierdo, haz clic en Expandir panel izquierdo para abrirlo.
En el panel Explorador, haz clic en Agregar datos.
Se abrirá el diálogo Agregar datos.
En el panel Filtrar por, en la sección Tipo de fuente de datos, selecciona Bases de datos.
También puedes ingresar
Vertex AIen el campo Buscar fuentes de datos.En la sección Fuentes de datos destacadas, haz clic en Vertex AI.
Haz clic en la tarjeta de solución Modelos de Vertex AI: Federación de BigQuery.
En la lista Tipo de conexión, selecciona Modelos remotos de Vertex AI, funciones remotas y BigLake (Cloud Resource).
En el campo ID de conexión, ingresa
bqml_tutorial.Verifica que esté seleccionada la opción Multirregional: EE.UU..
Haz clic en Crear conexión.
En la parte inferior de la ventana, haz clic en Ir a la conexión. Como alternativa, en el panel Explorador, haz clic en Conexiones y, luego, en
us.bqml_tutorial.En el panel Información de conexión, copia el ID de la cuenta de servicio. Necesitas este ID cuando configuras los permisos para la conexión. Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia con la conexión.
Crear una conexión
bq mk --connection --location=US --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE bqml_tutorial
Reemplaza
PROJECT_IDpor el ID del proyecto deGoogle Cloud . El parámetro--project_idanula el proyecto predeterminado.Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia con la conexión.
Solución de problemas: Si recibes el siguiente error de conexión, actualiza el SDK de Google Cloud:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Recupera y copia el ID de cuenta de servicio para usarlo en un paso posterior:
bq show --connection PROJECT_ID.us.bqml_tutorial
El resultado es similar a lo siguiente:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}Ir a la página IAM y administración
Haz clic en Otorgar acceso.
En el campo Principales nuevas, ingresa el ID de la cuenta de servicio de la conexión de recursos en la nube que copiaste antes.
En el campo Selecciona un rol, elige Cloud Storage y, luego, selecciona Administrador de objetos de Storage.
Haz clic en Guardar.
Ve a la página de BigQuery Studio.
En el editor de consultas, ingresa esta consulta para crear la tabla de objetos.
CREATE EXTERNAL TABLE `bqml_tutorial.goldfish_image_table` WITH CONNECTION `us.bqml_tutorial` OPTIONS( object_metadata = 'SIMPLE', uris = ['gs://bqml_images/IMAGE_NAME'], max_staleness = INTERVAL 1 DAY, metadata_cache_mode = 'AUTOMATIC');
Reemplaza
IMAGE_NAMEpor el nombre del archivo de imagen, por ejemplo,goldfish.jpg.Cuando se complete la operación, verás un mensaje como
This statement created a new table named goldfish_image_table.Para crear la tabla de objetos, ingresa la siguiente instrucción
CREATE EXTERNAL TABLE.bq query --use_legacy_sql=false \ "CREATE EXTERNAL TABLE `bqml_tutorial.goldfish_image_table` WITH CONNECTION `us.bqml_tutorial` OPTIONS( object_metadata = 'SIMPLE', uris = ['gs://bqml_images/IMAGE_NAME'], max_staleness = INTERVAL 1 DAY, metadata_cache_mode = 'AUTOMATIC')"
Reemplaza
IMAGE_NAMEpor el nombre del archivo de imagen, por ejemplo,goldfish.jpg.Después de crear la tabla de objetos, verifica que aparezca en el conjunto de datos.
bq ls bqml_tutorial
El resultado es similar a lo siguiente:
tableId Type --------------------- -------- goldfish_image_table EXTERNAL
Ve a la página de BigQuery Studio.
En el editor de consultas, ingresa la siguiente consulta de
ML.PREDICT.SELECT class_label FROM ML.PREDICT(MODEL
bqml_tutorial.imported_onnx_model, ( SELECT ML.RESIZE_IMAGE(ML.DECODE_IMAGE(DATA), 224, 224, FALSE) AS input FROM bqml_tutorial.goldfish_image_table))Los resultados de la búsqueda son similares a los siguientes:
- In the Google Cloud 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 Google Cloud 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.
- Para obtener más información sobre la importación de modelos ONNX, consulta la declaración
CREATE MODELpara modelos ONNX. - Para obtener más información sobre los instructivos y los convertidores de ONNX disponibles, consulta Convierte al formato ONNX.
- Para obtener una descripción general de BigQuery ML, consulta Introducción a BigQuery ML.
- Para comenzar a usar BigQuery ML, consulta Crea modelos de aprendizaje automático en BigQuery ML.
Roles obligatorios
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.
Si usas un proyecto existente, 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 IAM en BigQuery, consulta Permisos de IAM.
Opcional: Entrena un modelo y conviértelo al formato ONNX
En los siguientes ejemplos de código, se muestra cómo importar un modelo de clasificación previamente entrenado en PyTorch y cómo convertir el modelo resultante al formato ONNX. En este instructivo, se usa un modelo de ejemplo compilado previamente y almacenado en gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx. No es necesario que completes estos pasos si usas el modelo de muestra.
Crea un modelo de visión de PyTorch para la clasificación de imágenes
Usa el siguiente muestra de código para importar un modelo resnet18 previamente entrenado de PyTorch que acepte los datos de imagen decodificados que muestran las funciones ML.DECODE_IMAGE y ML.RESIZE_IMAGE de BigQuery ML.
import torch
import torch.nn as nn
# Define model input format to match the output format of
# ML.DECODE_IMAGE function: [height, width, channels]
dummy_input = torch.randn(1, 224, 224, 3, device="cpu")
# Load a pretrained pytorch model for image classification
model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet18', pretrained=True)
# Reshape input format from [batch_size, height, width, channels]
# to [batch_size, channels, height, width]
class ReshapeLayer(nn.Module):
def __init__(self):
super().__init__()
def forward(self, x):
x = x.permute(0, 3, 1, 2) # reorder dimensions
return x
class ArgMaxLayer(nn.Module):
def __init__(self):
super().__init__()
def forward(self, x):
return torch.argmax(x, dim=1)
final_model = nn.Sequential(
ReshapeLayer(),
model,
nn.Softmax(),
ArgMaxLayer()
)
Convierte el modelo al formato ONNX
Usa la siguiente muestra para exportar el modelo de visión de PyTorch con torch.onnx. El archivo ONNX exportado se llama resnet18.onnx.
torch.onnx.export(final_model, # model being run
dummy_input, # model input
"resnet18.onnx", # where to save the model
opset_version=10, # the ONNX version to export the model to
input_names = ['input'], # the model's input names
output_names = ['class_label']) # the model's output names
Sube el modelo ONNX a Cloud Storage.
Después de guardar el modelo, haz lo siguiente:
Crea un conjunto de datos
Crea un conjunto de datos de BigQuery para almacenar tu modelo de AA.
Console
bq
Para crear un conjunto de datos nuevo, usa el comando bq mk con la marca --location. Para obtener 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" } }
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 el modelo ONNX a BigQuery
En los siguientes pasos, se muestra cómo importar el modelo de ONNX de ejemplo de Cloud Storage a tu conjunto de datos con una instrucción CREATE MODEL.
Console
bq
Para obtener más información sobre la importación de modelos ONNX a BigQuery, incluidos los requisitos de formato y almacenamiento, consulta la declaración CREATE MODEL para importar modelos ONNX.
Crea una tabla de objetos en BigQuery para analizar los datos de imágenes
Una tabla de objetos es una tabla de solo lectura sobre objetos de datos no estructurados que residen en Cloud Storage. Las tablas de objetos te permiten analizar datos no estructurados de BigQuery.
En este instructivo, usarás la función ML.PREDICT para generar la etiqueta de clase predicha de una imagen de entrada almacenada en un bucket de Cloud Storage.
Para crear la tabla de objetos, debes hacer lo siguiente:
Crea un bucket y sube una imagen
Sigue estos pasos para crear un bucket de Cloud Storage y subir una imagen de un pez dorado.
Console
Línea de comandos
Ingresa el siguiente comando gcloud storage buckets create:
gcloud storage buckets create gs://bqml_images --location=us
Si la solicitud se realiza correctamente, el comando mostrará el siguiente mensaje:
Creating gs://bqml_images/...
Sube una imagen a tu bucket de Cloud Storage
Después de crear el bucket, descarga una imagen de un pez dorado y súbela a tu bucket de Cloud Storage.
Para subir la imagen, completa los siguientes pasos:
Console
Línea de comandos
Ingresa el siguiente comando gcloud storage cp:
gcloud storage cp OBJECT_LOCATION gs://bqml_images/IMAGE_NAME
Reemplaza lo siguiente:
Si se ejecuta de forma correcta, la respuesta será similar a la siguiente:
Completed files 1/1 | 164.3kiB/164.3kiB
Crea una conexión de recurso de Cloud en BigQuery
Debes tener una conexión de recursos de Cloud para conectarte a la tabla de objetos que crearás más adelante en este instructivo.
Las conexiones de recursos de Cloud te permiten consultar datos que se almacenan fuera de BigQuery en Google Cloud servicios como Cloud Storage o Spanner, o en fuentes de terceros, como AWS o Azure. Estas conexiones externas usan la API de BigQuery Connection.
Sigue estos pasos para crear la conexión de tu recurso de Cloud.
Console
bq
Configura el acceso a la conexión
Otorga el rol de administrador de objetos de Storage a la cuenta de servicio de la conexión de recursos de Cloud. Debes otorgar este rol en el mismo proyecto en el que subiste los archivos de imagen.
Para otorgar el rol, sigue estos pasos:
Crea la tabla de objetos
Sigue estos pasos para crear una tabla de objetos llamada goldfish_image_table con la imagen de pez dorado que subiste a Cloud Storage.
Console
bq
Para obtener más información, consulta Crea tablas de objetos.
Realiza predicciones con el modelo ONNX importado
Usas la siguiente consulta que contiene la función ML.PREDICT para realizar predicciones a partir de datos de imágenes en la tabla de objetos de entrada goldfish_image_table. Esta consulta genera la etiqueta de clase prevista de la imagen de entrada según el diccionario de etiquetas de ImageNet.
En la consulta, se requiere la función ML.DECODE_IMAGE para decodificar los datos de la imagen de modo que ML.PREDICT los pueda interpretar. Se llama a la función ML.RESIZE_IMAGE para cambiar el tamaño de la imagen y que se ajuste al tamaño de la entrada del modelo (224*224).
Para obtener más información sobre cómo ejecutar inferencias en tablas de objetos de imagen, consulta Ejecuta inferencias en tablas de objetos de imagen.
Para generar predicciones a partir de tus datos de imágenes, haz lo siguiente.
Console
bq
Ingresa el siguiente comando bq query:
bq query --use_legacy_sql=false \
'SELECT
class_label
FROM
ML.PREDICT(MODEL `bqml_tutorial.imported_onnx_model`,
(
SELECT
ML.RESIZE_IMAGE(ML.DECODE_IMAGE(DATA),
224,
224,
FALSE) AS input
FROM
bqml_tutorial.goldfish_image_table))'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
gcloud
Borra los recursos individuales
Como alternativa, para quitar los recursos individuales que se usan en este instructivo, haz lo siguiente: