En este tutorial se muestra cómo importar un modelo Open Neural Network Exchange (ONNX) entrenado con scikit-learn. Importa el modelo a un conjunto de datos de BigQuery y úsalo para hacer predicciones con una consulta SQL.
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
- Crea y entrena un modelo con scikit-learn.
- Convierte el modelo al formato ONNX con sklearn-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 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
) - Storage Object Creator (
roles/storage.objectCreator
) -
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/pipeline_rf.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 utilizas el modelo de ejemplo, sustituyeBUCKET_PATH
por el siguiente valor:gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx
.Cuando la operación se haya completado, verás un mensaje similar al siguiente:
Successfully created model named imported_onnx_model
.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
sepal_length
sepal_width
petal_length
petal_width
Ve a la página BigQuery Studio.
En el editor de consultas, introduce esta consulta que usa la función
ML.PREDICT
.SELECT * FROM ML.PREDICT(MODEL `bqml_tutorial.imported_onnx_model`, ( SELECT * FROM `bigquery-public-data.ml_datasets.iris` ) )
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 entrenar un modelo de clasificación con scikit-learn y cómo convertir la canalización resultante al formato ONNX. En este tutorial se usa un modelo de ejemplo precompilado que se almacena en gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx
. No es necesario que completes estos pasos si utilizas el modelo de ejemplo.
Entrenar un modelo de clasificación con scikit-learn
Usa el siguiente código de ejemplo para crear y entrenar una pipeline de scikit-learn en el conjunto de datos Iris. Para obtener instrucciones sobre cómo instalar y usar scikit-learn, consulta la guía de instalación de scikit-learn.
import numpy
from sklearn.datasets import load_iris
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
data = load_iris()
X = data.data[:, :4]
y = data.target
ind = numpy.arange(X.shape[0])
numpy.random.shuffle(ind)
X = X[ind, :].copy()
y = y[ind].copy()
pipe = Pipeline([('scaler', StandardScaler()),
('clr', RandomForestClassifier())])
pipe.fit(X, y)
Convertir el flujo de trabajo en un modelo ONNX
Usa el siguiente código de ejemplo en sklearn-onnx para convertir la canalización de scikit-learn en un modelo ONNX llamado pipeline_rf.onnx
.
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
# Disable zipmap as it is not supported in BigQuery ML.
options = {id(pipe): {'zipmap': False}}
# Define input features. scikit-learn does not store information about the
# training dataset. It is not always possible to retrieve the number of features
# or their types. That's why the function needs another argument called initial_types.
initial_types = [
('sepal_length', FloatTensorType([None, 1])),
('sepal_width', FloatTensorType([None, 1])),
('petal_length', FloatTensorType([None, 1])),
('petal_width', FloatTensorType([None, 1])),
]
# Convert the model.
model_onnx = convert_sklearn(
pipe, 'pipeline_rf', initial_types=initial_types, options=options
)
# And save.
with open('pipeline_rf.onnx', 'wb') as f:
f.write(model_onnx.SerializeToString())
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 desde Cloud Storage mediante una instrucción CREATE MODEL
.
Para importar el modelo ONNX al conjunto de datos, selecciona una de las siguientes opciones:
Consola
bq
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 el modelo mediante el objeto ONNXModel
.
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.
Hacer predicciones con el modelo ONNX importado
Después de importar el modelo ONNX, usa la función ML.PREDICT
para hacer predicciones con el modelo.
La consulta de los siguientes pasos usa imported_onnx_model
para hacer predicciones
con datos de entrada de la tabla iris
del conjunto de datos público ml_datasets
. El modelo ONNX espera cuatro valores FLOAT
como entrada:
Estas entradas coinciden con las initial_types
que se definieron cuando convirtió el modelo al formato ONNX.
Los resultados incluyen las columnas label
y probabilities
, así como las columnas de la tabla de entrada. label
representa la etiqueta de clase predicha.
probabilities
es una matriz de probabilidades que representa las probabilidades de cada clase.
Para hacer predicciones con el modelo de TensorFlow importado, elige una de las siguientes opciones:
Consola
bq
Ejecuta la consulta que usa ML.PREDICT
.
bq query --use_legacy_sql=false \ 'SELECT * FROM ML.PREDICT( MODEL `example_dataset.imported_onnx_model`, (SELECT * FROM `bigquery-public-data.ml_datasets.iris`))'
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 la función predict
para ejecutar el modelo remoto.
El resultado es 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: