Haz predicciones con modelos de scikit-learn en formato ONNX
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. Para obtener más información, consulta Convierte al formato 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 scikit-learn a un conjunto de datos de BigQuery y usarlos para realizar predicciones a partir de una consulta de SQL. Puedes importar modelos de ONNX con estas interfaces:
- La consola de Google Cloud
- El comando
bq query
en la herramienta de línea de comandos de bq - La API de BigQuery
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.
Objetivos
En este instructivo, podrás:
- Crear y entrenar modelos con scikit-learn.
- Convertir los modelos al formato ONNX mediante sklearn-onnx.
- Importar los modelos de ONNX a BigQuery y hacer predicciones.
Entrena un modelo de clasificación con scikit-learn
Crea y entrena una canalización de scikit-learn en el conjunto de datos de Iris:
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)
Convierte el modelo al formato ONNX y guarda
Usa sklearn-onnx para convertir la canalización de scikit-learn en un modelo de 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())
Sube el modelo ONNX a Cloud Storage.
Crea un bucket de Cloud Storage para almacenar el archivo del modelo ONNX y, luego, sube el archivo del modelo ONNX guardado a tu bucket de Cloud Storage. Para obtener más información, consulta Sube objetos desde un sistema de archivos.
Importa el modelo ONNX a BigQuery
En este paso, se supone que subiste el modelo ONNX a tu bucket de Cloud Storage. Un modelo de ejemplo se almacena en gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx
.
Console
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ingresa una declaración
CREATE MODEL
como la siguiente.CREATE OR REPLACE MODEL `mydataset.mymodel` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='gs://bucket/path/to/onnx_model/*')
Por ejemplo:
CREATE OR REPLACE MODEL `example_dataset.imported_onnx_model` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx')
La consulta anterior importa el modelo de ONNX ubicado en
gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx
como un modelo de BigQuery llamadoimported_onnx_model
.Tu nuevo modelo ahora debería aparecer en el panel Recursos. A medida que expandes cada uno de los conjuntos de datos en un proyecto, se enumeran los modelos junto con los otros recursos de BigQuery en los conjuntos de datos. Los modelos se indican con el ícono del modelo: .
Si seleccionas el modelo nuevo en el panel Recursos, la información sobre el modelo aparece debajo del Editor de consultas.
bq
Para importar un modelo de ONNX desde Cloud Storage, ejecuta una consulta por lotes mediante un comando como el siguiente:
bq query \
--use_legacy_sql=false \
"CREATE MODEL
`mydataset.mymodel`
OPTIONS
(MODEL_TYPE='ONNX',
MODEL_PATH='gs://bucket/path/to/onnx_model/*')"
Por ejemplo:
bq query --use_legacy_sql=false \
"CREATE OR REPLACE MODEL
`example_dataset.imported_onnx_model`
OPTIONS
(MODEL_TYPE='ONNX',
MODEL_PATH='gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx')"
Después de importar el modelo, debe aparecer en el resultado de bq ls [dataset_name]
:
$ bq ls example_dataset
tableId Type Labels Time Partitioning
--------------------- ------- -------- -------------------
imported_onnx_model MODEL
API
Inserta un nuevo trabajo y propaga la propiedad jobs#configuration.query como en el cuerpo de la solicitud siguiente:
{
"query": "CREATE MODEL project_id:mydataset.mymodel OPTIONS(MODEL_TYPE='ONNX' MODEL_PATH='gs://bucket/path/to/onnx_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. Si deseas obtener más información, consulta Configura ADC para un entorno de desarrollo local.
Importa el modelo con el objeto ONNXModel
.
Realiza predicciones con el modelo ONNX importado
Console
En la consola de Google Cloud, ve a la página de BigQuery.
En el editor de consultas, ingresa una consulta con
ML.PREDICT
como la que se muestra a continuación.SELECT * FROM ML.PREDICT(MODEL
example_dataset.imported_onnx_model
, ( SELECT * FROMbigquery-public-data.ml_datasets.iris
) )La consulta anterior usa el modelo llamado
imported_onnx_model
en el conjunto de datosexample_dataset
en el proyecto actual para realizar predicciones a partir de datos de entrada en la tabla públicairis
del conjunto de datosml_datasets
en el proyectobigquery-public-data
. En este caso, el modelo ONNX espera cuatro entradas de número de punto flotante:sepal_length
,sepal_width
,petal_length
,petal_width
, que coinciden con elinitial_types
definido en el paso. 2, por lo que la subconsultaSELECT
hace toda la tablabigquery-public-data
que contiene estas 4 columnas de entrada.El modelo genera las columnas
label
yprobabilities
, así como las columnas de la tabla de entrada.label
representa la etiqueta de clase prevista.probabilities
es un arreglo de probabilidades que representan probabilidades para cada clase.
El resultado de la consulta es similar al siguiente:
bq
Para realizar predicciones a partir de datos de entrada en la tabla input_data
, ingresa un comando como el siguiente con el modelo de ONNX importado my_model
:
bq query \
--use_legacy_sql=false \
'SELECT *
FROM ML.PREDICT(
MODEL `my_project.my_dataset.my_model`,
(SELECT * FROM input_data))'
Por ejemplo:
bq query \
--use_legacy_sql=false \
'SELECT *
FROM ML.PREDICT(
MODEL `example_dataset.imported_onnx_model`,
(SELECT * FROM `bigquery-public-data.ml_datasets.iris`))'
API
Inserta un nuevo trabajo y propaga la propiedad jobs#configuration.query como en el cuerpo de la solicitud siguiente:
{
"query": "SELECT * FROM ML.PREDICT(MODEL `my_project.my_dataset.my_model`, (SELECT * FROM input_data))"
}
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 la función predict
para ejecutar el modelo remoto:
El resultado es similar al siguiente:
¿Qué sigue?
- Para obtener más información sobre la importación de modelos ONNX, consulta la declaración
CREATE MODEL
para 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.
- Para obtener más información sobre cómo trabajar con modelos, consulta estos recursos: