Haz predicciones con modelos de scikit-learn en formato ONNX


En este instructivo, se muestra cómo importar un modelo de Open Neural Network Exchange (ONNX) que se entrenó con scikit-learn. Importas el modelo a un conjunto de datos de BigQuery y lo usas para realizar predicciones con una consulta de SQL.

ONNX proporciona un formato uniforme diseñado para representar cualquier framework de aprendizaje automático (AA). La compatibilidad de BigQuery ML con ONNX te permite hacer lo siguiente:

  • Entrenar un modelo con tu framework favorito.
  • Convierte el modelo al formato de modelo ONNX.
  • Importar el modelo ONNX a BigQuery y hacer predicciones con BigQuery ML

Objetivos

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  4. Make sure that billing is enabled for your Google Cloud project.

  5. Enable the BigQuery and Cloud Storage APIs.

    Enable the APIs

  6. Asegúrate de tener los permisos necesarios para realizar las tareas de este documento.

Roles obligatorios

Si creas un proyecto nuevo, eres el propietario y se te otorgan 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

  1. In the Google Cloud console, go to the IAM page.

    Go to IAM
  2. Select the project.
  3. 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.

  4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

Grant the roles

  1. In the Google Cloud console, go to the IAM page.

    Ir a IAM
  2. Selecciona el proyecto.
  3. Haz clic en Grant access.
  4. 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.

  5. En la lista Seleccionar un rol, elige un rol.
  6. Para otorgar funciones adicionales, haz clic en Agregar otro rol y agrega cada rol adicional.
  7. Haz clic en Guardar.
  8. 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 las siguientes muestras de código, se muestra cómo entrenar un modelo de clasificación con scikit-learn y cómo convertir la canalización resultante en formato ONNX. En este instructivo, se usa un modelo de ejemplo compilado previamente que se almacena en gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx. No es necesario completar estos pasos si usas el modelo de ejemplo.

Entrena un modelo de clasificación con scikit-learn

Usa el siguiente código de muestra para crear y entrenar una canalización de scikit-learn en el conjunto de datos de 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)

Convierte la canalización en un modelo de ONNX

Usa el siguiente código de muestra en 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.

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

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a la página de BigQuery

  2. En el panel Explorador, haz clic en el nombre de tu proyecto.

  3. Haz clic en Ver acciones > Crear conjunto de datos.

    La opción de menú Crear conjunto de datos

  4. 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).

    Los conjuntos de datos públicos se almacenan en la multirregión US. Para que sea más simple, almacena tu conjunto de datos en la misma ubicación.

    • Deja la configuración predeterminada restante como está y haz clic en Crear conjunto de datos.

    La página Crear conjunto de datos con los valores propagados

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.

  1. Crea un conjunto de datos llamado bqml_tutorial con la ubicación de los datos establecida en US y una descripción de BigQuery 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 -d y --dataset, el comando crea un conjunto de datos de manera predeterminada.

  2. Confirma que se haya creado el conjunto de datos:

    bq ls

API

Llama al método datasets.insert con un recurso de conjunto de datos definido.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

Importa el modelo ONNX a BigQuery

En los siguientes pasos, se muestra cómo importar el modelo de ONNX de muestra desde Cloud Storage con una sentencia CREATE MODEL.

Para importar el modelo de ONNX a tu conjunto de datos, selecciona una de las siguientes opciones:

Console

  1. En la consola de Google Cloud, ve a la página de BigQuery Studio.

    Ve a BigQuery Studio

  2. En el editor de consultas, ingresa la siguiente sentencia CREATE MODEL.

     CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='BUCKET_PATH')

    Reemplaza BUCKET_PATH por la ruta de acceso al modelo que subiste a Cloud Storage. Si usas el modelo de ejemplo, reemplaza BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx.

    Cuando se complete la operación, verás un mensaje similar al siguiente: Successfully created model named imported_onnx_model.

    Tu nuevo modelo aparecerá en el panel Recursos. Los modelos se indican con el ícono de modelo: El ícono del modelo en el panel Recursos. Si seleccionas el modelo nuevo en el panel Recursos, la información sobre el modelo aparecerá junto al Editor de consultas.

    El panel de información de "imported_onnx_model"

bq

  1. Para importar el modelo de ONNX desde Cloud Storage, ingresa la siguiente sentencia 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_PATH por la ruta de acceso al modelo que subiste a Cloud Storage. Si usas el modelo de ejemplo, reemplaza BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx.

    Cuando se complete la operación, verás un mensaje similar al siguiente: Successfully created model named imported_onnx_model.

  2. Después de importar el modelo, verifica que aparezca en el conjunto de datos.

    bq ls bqml_tutorial

    El resultado es similar a este:

    tableId               Type
    --------------------- -------
    imported_onnx_model  MODEL

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 con el objeto ONNXModel.

import bigframes
from bigframes.ml.imported import ONNXModel

bigframes.options.bigquery.project = PROJECT_ID
# You can change the location to one of the valid locations: https://cloud.google.com/bigquery/docs/locations#supported_locations
bigframes.options.bigquery.location = "US"

imported_onnx_model = ONNXModel(
    model_path="gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx"
)

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.

Realiza predicciones con el modelo ONNX importado

Después de importar el modelo de ONNX, usa la función ML.PREDICT para hacer predicciones con el modelo.

La consulta de los siguientes pasos usa imported_onnx_model para realizar predicciones con los datos de entrada de la tabla iris en el conjunto de datos públicos ml_datasets. El modelo ONNX espera cuatro valores FLOAT como entrada:

  • sepal_length
  • sepal_width
  • petal_length
  • petal_width

Estas entradas coinciden con el initial_types que se definió cuando convertiste el modelo al formato ONNX.

Los resultados incluyen las columnas label y probabilities, y 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.

Para realizar predicciones con el modelo de TensorFlow importado, elige una de las siguientes opciones:

Console

  1. Ve a la página de BigQuery Studio.

    Ve a BigQuery Studio

  2. En el editor de consultas, ingresa 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:

    El resultado de la consulta ML.PREDICT

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`))'

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.

Usa la función predict para ejecutar el modelo remoto.

import bigframes.pandas as bpd

df = bpd.read_gbq("bigquery-public-data.ml_datasets.iris")
predictions = imported_onnx_model.predict(df)
predictions.peek(5)

El resultado es similar al siguiente:

El resultado de la función predict

Limpia

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

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

gcloud

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Borra los recursos individuales

Como alternativa, para quitar los recursos individuales que se usan en este instructivo, haz lo siguiente:

  1. Borra el modelo importado.

  2. Opcional: Borra el conjunto de datos.

¿Qué sigue?