Hacer predicciones con modelos de scikit-learn en formato ONNX


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

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.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

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

  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.

    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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  4. Verify that billing is enabled for your Google Cloud project.

  5. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  6. Asegúrate de que tienes los permisos necesarios para realizar las tareas descritas en este documento.
  7. 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

    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 Conceder acceso.
    4. En el campo Nuevos principales, introduce tu identificador de usuario. Normalmente, se trata de la dirección de correo de una cuenta de Google.

    5. En la lista Selecciona un rol, elige un rol.
    6. Para conceder más roles, haz clic en Añadir otro rol y añade cada rol adicional.
    7. Haz clic en Guardar.
    8. 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

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

        Ir a la página de BigQuery

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

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

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

      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.

      1. Crea un conjunto de datos llamado bqml_tutorial con la ubicación de los datos definida como US y la descripción 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 omite -d y --dataset, el comando creará un conjunto de datos de forma predeterminada.

      2. Confirma que se ha 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"
        }
      }

      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.

      import google.cloud.bigquery
      
      bqclient = google.cloud.bigquery.Client()
      bqclient.create_dataset("bqml_tutorial", exists_ok=True)

      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

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

        Ir a BigQuery Studio

      2. 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, sustituye BUCKET_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: Icono de modelo en el panel Recursos Si selecciona el nuevo modelo en el panel Recursos, aparecerá información sobre el modelo junto al editor de consultas.

        Panel de información de `imported_onnx_model`

      bq

      1. 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, sustituye BUCKET_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.

      2. 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

      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.

      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 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:

      • sepal_length
      • sepal_width
      • petal_length
      • petal_width

      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

      1. Ve a la página BigQuery Studio.

        Ir a BigQuery Studio

      2. 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:

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

      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.

      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

      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

      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

      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.

      Eliminar recursos concretos

      Si quieres eliminar los recursos utilizados en este tutorial, sigue estos pasos:

      1. Elimina el modelo importado.

      2. Opcional: elimina el conjunto de datos.

      Siguientes pasos