Open Neural Network Exchange (ONNX) proporciona un formato uniforme diseñado para representar cualquier marco de aprendizaje automático. 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.
En este tutorial se muestra cómo importar modelos ONNX entrenados con PyTorch a un conjunto de datos de BigQuery y usarlos para hacer predicciones a partir de una consulta SQL.
Objetivos
- Importa un modelo preentrenado con PyTorch.
- Convierte el modelo al formato ONNX con torch.onnx.
- Usa la instrucción
CREATE MODEL
para importar el modelo ONNX a BigQuery. - Usa la función
ML.PREDICT
para hacer predicciones con el modelo ONNX importado.
Costes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.
Antes de empezar
- 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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. 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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. 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.enable
permission. 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
) - 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 Conceder acceso.
-
En el campo Nuevos principales, introduce tu identificador de usuario. Normalmente, se trata de la dirección de correo de una cuenta de Google.
- 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.
- Crea un segmento de Cloud Storage para almacenar el modelo.
- Sube el modelo ONNX a tu segmento de Cloud Storage.
En la Google Cloud 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_tutorial
con la ubicación de los datos definida comoUS
y 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-d
y--dataset
, el comando creará un conjunto de datos de forma predeterminada.Confirma que se ha creado el conjunto de datos:
bq ls
En la Google Cloud consola, ve a la página BigQuery Studio.
En el editor de consultas, introduce la siguiente instrucción
CREATE MODEL
.CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='BUCKET_PATH')
Sustituye
BUCKET_PATH
por la ruta al modelo que has subido a Cloud Storage. Si utilizas el modelo de ejemplo, sustituyeBUCKET_PATH
por el siguiente valor:gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
.Cuando la operación se haya completado, verás un mensaje similar al siguiente:
Successfully created model named imported_onnx_model
.El nuevo modelo aparecerá en el panel Recursos. Los modelos se indican con el icono de modelo:
Si selecciona el nuevo modelo en el panel Recursos, aparecerá información sobre el modelo junto al editor de consultas.
Importa el modelo ONNX de Cloud Storage introduciendo la siguiente instrucció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')"
Sustituye
BUCKET_PATH
por la ruta al modelo que has subido a Cloud Storage. Si usas el modelo de ejemplo, sustituyeBUCKET_PATH
por este valor:gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
.Después de importar el modelo, comprueba que aparece en el conjunto de datos.
bq ls bqml_tutorial
El resultado debería ser similar al siguiente:
tableId Type --------------------- ------- imported_onnx_model MODEL
- Crea un segmento de Cloud Storage y sube una imagen de un pez de colores.
- Crea una conexión de recursos de Cloud que se use para acceder a la tabla de objetos.
- Concede acceso a la cuenta de servicio de la conexión de recursos.
- En la Google Cloud consola, ve a la página Segmentos de Cloud Storage.
Haz clic en
Crear.En la página Crear un segmento, introduce la información del segmento.
En la sección Empezar, haz lo siguiente:
En el cuadro, escribe
bqml_images
.Haz clic en Continuar.
En la sección Elige dónde quieres almacenar los datos, haz lo siguiente:
En Tipo de ubicación, selecciona Multirregión.
En el menú del tipo de ubicación, selecciona EE. UU. (varias regiones de Estados Unidos).
Haz clic en Continuar.
En la sección Elige una clase de almacenamiento para tus datos, haz lo siguiente:
Selecciona Definir una clase predeterminada.
Selecciona Estándar.
Haz clic en Continuar.
En las secciones restantes, deja los valores predeterminados.
Haz clic en Crear.
- En la Google Cloud consola, ve a la página Segmentos de Cloud Storage.
En la lista de contenedores, haz clic en
bqml_images
.En la pestaña Objetos del contenedor, haga una de las siguientes acciones:
Arrastra el archivo desde el escritorio o el gestor de archivos al panel principal de la Google Cloud consola.
Haz clic en Subir > Subir archivos, selecciona el archivo de imagen que quieras subir en el cuadro de diálogo que aparece y, a continuación, haz clic en Abrir.
OBJECT_LOCATION
: la ruta local al archivo de imagen. Por ejemplo,Desktop/goldfish.jpg
.IMAGE_NAME
: el nombre de la imagen. Por ejemplo,goldfish.jpg
.Ve a la página BigQuery Studio.
En el panel Explorador, haz clic en
Añadir datos.Se abrirá el cuadro de diálogo Añadir datos.
En el panel Filtrar por, en la sección Tipo de fuente de datos, selecciona Bases de datos.
También puede introducir
Vertex AI
en el campo Buscar fuentes de datos.En la sección Fuentes de datos destacadas, haga 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 (recurso de Cloud).
En el campo ID de conexión, introduce
bqml_tutorial
.Comprueba que esté seleccionada la opción Multirregión (EE. UU.).
Haga clic en Crear conexión.
En la parte inferior de la ventana, haz clic en Ir a la conexión. También puedes ir al panel Explorador, desplegar Conexiones externas y hacer clic en
us.bqml_tutorial
.En el panel Información de la conexión, copia el ID de la cuenta de servicio. Necesitarás este ID cuando configures los permisos de la conexión. Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia a la conexión.
Para crear una conexión, sigue estos pasos:
bq mk --connection --location=US --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE bqml_tutorial
Sustituye
PROJECT_ID
por elGoogle Cloud ID de tu proyecto. El parámetro--project_id
anula el proyecto predeterminado.Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia a la conexión.
Solución de problemas: si aparece 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...
Obtén y copia el ID de la cuenta de servicio para usarlo en un paso posterior:
bq show --connection PROJECT_ID.us.bqml_tutorial
El resultado debería ser similar al siguiente:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Ve a la página IAM y administración.
Haz clic en
Conceder acceso.En el campo Nuevos principales, introduce el ID de cuenta de servicio de la conexión de recursos de Cloud que has copiado anteriormente.
En el campo Selecciona un rol, elige Cloud Storage y, a continuación, Administrador de objetos de Storage.
Haz clic en Guardar.
Ve a la página BigQuery Studio.
En el editor de consultas, introduce 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');
Sustituye
IMAGE_NAME
por el nombre del archivo de imagen; por ejemplo,goldfish.jpg
.Cuando la operación se haya completado, verás un mensaje como
This statement created a new table named goldfish_image_table
.Crea la tabla de objetos introduciendo 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')"
Sustituye
IMAGE_NAME
por el nombre del archivo de imagen; por ejemplo,goldfish.jpg
.Después de crear la tabla de objetos, comprueba que aparece en el conjunto de datos.
bq ls bqml_tutorial
El resultado debería ser similar al siguiente:
tableId Type --------------------- -------- goldfish_image_table EXTERNAL
Ve a la página BigQuery Studio.
En el editor de consultas, introduce la siguiente consulta
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 consulta 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 cómo importar modelos ONNX, consulta la sección Instrucción
CREATE MODEL
para modelos ONNX. - Para obtener más información sobre los convertidores y tutoriales de ONNX disponibles, consulte el artículo Convertir al formato ONNX.
- 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.
Opcional: Entrenar un modelo y convertirlo al formato ONNX
En los siguientes ejemplos de código se muestra cómo importar un modelo de clasificación preentrenado en PyTorch y cómo convertir el modelo resultante al formato ONNX. En este tutorial se usa un modelo de ejemplo precompilado almacenado en gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
. No es necesario que completes estos pasos si utilizas el modelo de ejemplo.
Crear un modelo de visión de PyTorch para clasificar imágenes
Usa el siguiente código de ejemplo para importar un modelo resnet18 preentrenado de PyTorch
que acepte datos de imagen decodificados devueltos por 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()
)
Convertir el modelo al formato ONNX
Usa el siguiente ejemplo 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
Subir el modelo ONNX a Cloud Storage
Después de guardar el modelo, 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 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.
Importar el modelo ONNX a BigQuery
En los pasos siguientes se muestra cómo importar el modelo ONNX de ejemplo de Cloud Storage a su conjunto de datos mediante una instrucción CREATE MODEL
.
Consola
bq
Para obtener más información sobre cómo importar modelos ONNX a BigQuery, incluidos los requisitos de formato y almacenamiento, consulta la sentencia CREATE MODEL
para importar modelos ONNX.
Crear una tabla de objetos en BigQuery para analizar 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 tutorial, usarás la función ML.PREDICT
para obtener la etiqueta de clase predicha de una imagen de entrada almacenada en un segmento de Cloud Storage.
Para crear la tabla de objetos, debes hacer lo siguiente:
Crear un contenedor y subir una imagen
Sigue estos pasos para crear un segmento de Cloud Storage y subir una imagen de un pez de colores.
Consola
Línea de comandos
Introduce el siguiente comando gcloud storage buckets create
:
gcloud storage buckets create gs://bqml_images --location=us
Si la solicitud se realiza correctamente, el comando devuelve el siguiente mensaje:
Creating gs://bqml_images/...
Subir una imagen a un segmento de Cloud Storage
Una vez creado el segmento, descarga una imagen de un pez de colores y súbela al segmento de Cloud Storage.
Sigue estos pasos para subir la imagen:
Consola
Línea de comandos
Introduce el siguiente comando gcloud storage cp
:
gcloud storage cp OBJECT_LOCATION gs://bqml_images/IMAGE_NAME
Haz los cambios siguientes:
Si la solicitud se realiza correctamente, la respuesta será similar a la siguiente:
Completed files 1/1 | 164.3kiB/164.3kiB
Crear una conexión de recursos de Cloud de 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 tutorial.
Las conexiones de recursos de Cloud te permiten consultar datos almacenados 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 Connection de BigQuery.
Sigue estos pasos para crear tu conexión de recursos de Cloud.
Consola
bq
Configurar el acceso a la conexión
Concede el rol Administrador de objetos de Storage a la cuenta de servicio de la conexión de recursos de Cloud. Debes conceder este rol en el mismo proyecto en el que has creado el endpoint del modelo remoto.
Para conceder el rol, sigue estos pasos:
Crear la tabla de objetos
Sigue estos pasos para crear una tabla de objetos llamada goldfish_image_table
con la imagen del pez de colores que has subido a Cloud Storage.
Consola
bq
Para obtener más información, consulta Crear tablas de objetos.
Hacer predicciones con el modelo ONNX importado
Usa la siguiente consulta, que contiene la función ML.PREDICT
, para hacer predicciones a partir de los datos de imagen de la tabla de objetos de entrada goldfish_image_table
. Esta consulta devuelve la etiqueta de clase predicha de la imagen de entrada en función del diccionario de etiquetas de ImageNet.
En la consulta, la función ML.DECODE_IMAGE
es necesaria para decodificar los datos de la imagen de forma que ML.PREDICT
pueda interpretarlos. Se llama a la función ML.RESIZE_IMAGE
para cambiar el tamaño de la imagen de forma que se ajuste al tamaño de la entrada del modelo (224x224).
Para obtener más información sobre cómo ejecutar inferencias en tablas de objetos de imagen, consulta Ejecutar inferencias en tablas de objetos de imagen.
Para hacer predicciones a partir de los datos de imagen, sigue estos pasos.
Consola
bq
Introduce 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))'
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: