Entrena con scikit-learn en AI Platform Training

El servicio de entrenamiento de AI Platform Training administra los recursos de procesamiento en la nube para entrenar los modelos. En esta página, se describe el proceso para entrenar un modelo de scikit-learn mediante AI Platform Training.

En este instructivo, se entrena un modelo simple para predecir el nivel de ingresos de una persona en función del conjunto de datos de ingresos del censo. Debes crear una aplicación de entrenamiento de manera local, subirla a Cloud Storage y enviar un trabajo de entrenamiento. El servicio de entrenamiento de AI Platform Training escribe el resultado en tu depósito de Cloud Storage y crea registros en Logging.

Este contenido también está disponible en GitHub como un notebook de Jupyter.

Cómo entrenar tu modelo en AI Platform Training

Puedes entrenar el modelo en AI Platform Training en tres pasos:

  • Crea tu archivo de modelo de Python.
    • Agrega un código para descargar los datos desde Cloud Storage de modo que AI Platform Training pueda usarlos.
    • Agrega un código para exportar y guardar el modelo en Cloud Storage después de que AI Platform Training finalice el entrenamiento del modelo.
  • Prepara un paquete de aplicación de entrenamiento.
  • Envía el trabajo de entrenamiento.

Antes de comenzar

Completa los siguientes pasos para configurar una cuenta de GCP, activar la API de AI Platform Training y, además, instalar y activar el SDK de Cloud.

Configura el proyecto de GCP

  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. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the AI Platform Training & Prediction and Compute Engine APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  9. Enable the AI Platform Training & Prediction and Compute Engine APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

Configura el entorno

Elige una de las siguientes opciones para configurar tu entorno de manera local en macOS o en un entorno remoto en Cloud Shell.

Si eres usuario de macOS, te recomendamos que configures tu entorno mediante el uso de la pestaña MACOS a continuación. Cloud Shell, que se muestra en la pestaña CLOUD SHELL, está disponible en macOS, Linux y Windows. Cloud Shell proporciona una forma rápida de probar AI Platform Training, pero no es conveniente para el trabajo de desarrollo continuo.

macOS

  1. Verifica la instalación de Python
    Confirma que tienes Python instalado y, si es necesario, instálalo.

    python -V
  2. Verifica la instalación de pip
    pip es el administrador de paquetes de Python y se incluye en sus versiones actuales. Para verificar si ya tienes pip instalado, ejecuta el comando pip --version. De lo contrario, consulta cómo instalar pip.

    Puedes actualizar pip con el siguiente comando:

    pip install -U pip

    Consulta la documentación de pip para obtener más detalles.

  3. Instala virtualenv
    virtualenv es una herramienta que sirve para crear entornos de Python aislados. Para verificar si ya tienes virtualenv instalado, ejecuta el comando virtualenv --version. De lo contrario, instala virtualenv con el comando siguiente:

    pip install --user --upgrade virtualenv

    Si deseas crear un entorno de desarrollo aislado para esta guía, crea un entorno virtual nuevo en virtualenv. Por ejemplo, el siguiente comando activa un entorno llamado aip-env:

    virtualenv aip-env
    source aip-env/bin/activate
  4. A los fines de este instructivo, ejecuta el resto de los comandos dentro de tu entorno virtual.

    Obtén más información sobre el uso de virtualenv. Para salir de virtualenv, ejecuta deactivate.

Cloud Shell

  1. Abre la consola de Google Cloud.

    La consola de Google Cloud

  2. Haz clic en el botón Activar Cloud Shell en la parte superior de la ventana de la consola.

    Activar Google Cloud Shell

    Se abrirá una sesión de Cloud Shell dentro de un marco nuevo en la parte inferior de la consola y, en ella, se mostrará una ventana de la línea de comandos. La sesión de Shell puede tardar unos segundos en inicializar.

    Sesión de Cloud Shell

    Tu sesión de Cloud Shell está lista para usarse.

  3. Configura la herramienta de línea de comandos de gcloud a fin de usar el proyecto seleccionado.

    gcloud config set project [selected-project-id]

    donde [selected-project-id] es el ID del proyecto. (omite los corchetes).

Instala frameworks

macOS

En tu entorno virtual, ejecuta el siguiente comando para instalar las versiones de scikit-learn y Pandas que se usan en la versión 2.11 del entorno de ejecución de AI Platform Training:

(aip-env)$ pip install scikit-learn==1.0.2 pandas==1.3.5

Cuando proporcionas los números de versión en el comando anterior, garantizas que las dependencias del entorno virtual coincidan con las de la versión del entorno de ejecución. Esto ayuda a evitar comportamientos inesperados cuando el código se ejecuta en AI Platform Training.

Para obtener más detalles, información de solución de problemas y opciones de instalación, consulta las instrucciones de instalación de cada framework:

Cloud Shell

Ejecuta el siguiente comando para instalar scikit-learn y Pandas:

pip install --user scikit-learn pandas

Para obtener más detalles, opciones de instalación y también información que te ayude a solucionar problemas, consulta las instrucciones de instalación para cada marco de trabajo:

Configura tu bucket de Cloud Storage

Necesitarás un bucket de Cloud Storage para almacenar el código de entrenamiento y las dependencias. A los fines de este instructivo, es más fácil usar un bucket dedicado de Cloud Storage en el mismo proyecto que usas para AI Platform Training.

Si usas un bucket en un proyecto diferente, debes asegurarte de que la cuenta de servicio de AI Platform Training pueda acceder al código de entrenamiento y a las dependencias en Cloud Storage. Sin los permisos adecuados, el trabajo de entrenamiento fallará. Consulta cómo otorgar permisos para el almacenamiento.

Asegúrate de usar o configurar un bucket en la misma región que usas para ejecutar tus trabajos de entrenamiento. Consulta las regiones disponibles para los servicios de AI Platform Training.

En esta sección se muestra cómo crear un bucket nuevo. Puedes usar un bucket existente, pero debe estar en la misma región en la que planeas ejecutar los trabajos de AI Platform. Además, si no es parte del proyecto que usas para ejecutar AI Platform Training, debes otorgar acceso a las cuentas de servicio de AI Platform Training de forma explícita.

  1. Especifica un nombre para el bucket nuevo. El nombre debe ser único en todos los depósitos en Cloud Storage.

    BUCKET_NAME="YOUR_BUCKET_NAME"

    Por ejemplo, usa el nombre de tu proyecto con -aiplatform agregado:

    PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    BUCKET_NAME=${PROJECT_ID}-aiplatform
  2. Comprueba el nombre del bucket que creaste.

    echo $BUCKET_NAME
  3. Selecciona una región para tu depósito y establece una variable de entorno REGION.

    Usa la misma región en la que planeas ejecutar los trabajos de AI Platform Training. Consulta las regiones disponibles para los servicios de AI Platform Training.

    Por ejemplo, con el código siguiente, se crea una REGION y se la configura como us-central1:

    REGION=us-central1
  4. Crea el bucket nuevo:

    gcloud storage buckets create gs://$BUCKET_NAME --location=$REGION

Acerca de los datos

UC Irvine Machine Learning Repository aloja el Conjunto de datos de ingresos del censo que se usa en esta muestra para el entrenamiento.

Los datos del censo son cortesía de Lichman, M. (2013). UCI Machine Learning Repositoryhttp://archive.ics.uci.edu/ml. Irvine, CA: University of California, School of Information and Computer Science. Este conjunto de datos está disponible públicamente para que cualquiera lo use según los siguientes términos proporcionados por la fuente del conjunto de datos: http://archive.ics.uci.edu/ml, y se proporciona "TAL CUAL", sin ninguna garantía, expresa o implícita de Google. Google renuncia a toda responsabilidad por cualquier daño, directo o indirecto, que resulte del uso del conjunto de datos.

Para tu comodidad, alojamos los datos en un depósito público de Cloud Storage, gs://cloud-samples-data/ai-platform/sklearn/census_data/, que puedes descargar en tu archivo de entrenamiento de Python.

Crea tu archivo de modelo de Python

Puedes encontrar todo el código de entrenamiento para esta sección en GitHub: train.py.

En el resto de esta sección, se proporciona una explicación de lo que hace el código de entrenamiento.

Configuración

Importa las siguientes bibliotecas desde Python, Google Cloud CLI y scikit-learn. Configura una variable para el nombre de tu bucket de Cloud Storage.

import datetime
import pandas as pd
import joblib

from google.cloud import storage

from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectKBest
from sklearn.pipeline import FeatureUnion
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import LabelBinarizer


# TODO: REPLACE 'YOUR_BUCKET_NAME' with your GCS Bucket name.
BUCKET_NAME = 'YOUR_BUCKET_NAME'

Descarga los datos desde Cloud Storage

Durante el proceso de desarrollo típico, subes tus propios datos a Cloud Storage para que AI Platform Training pueda acceder a ellos. Los datos de este instructivo están alojados en un depósito público: gs://cloud-samples-data/ai-platform/sklearn/census_data/.

El siguiente código descarga el conjunto de datos de entrenamiento adult.data. (Los datos de evaluación están disponibles en adult.test, pero no se usan en este instructivo).

# Public bucket holding the census data
bucket = storage.Client().bucket('cloud-samples-data')

# Path to the data inside the public bucket
blob = bucket.blob('ai-platform/sklearn/census_data/adult.data')
# Download the data
blob.download_to_filename('adult.data')

Agrega el código del modelo

El código de entrenamiento de modelos lleva a cabo algunos pasos básicos:

  • Define y carga datos
  • Convertir funciones categóricas en funciones numéricas.
  • Extraer funciones numéricas con una canalización de scikit-learn.
  • Exporta y guarda el modelo en Cloud Storage

Define y carga datos

# Define the format of your input data including unused columns (These are the columns from the census data files)
COLUMNS = (
    'age',
    'workclass',
    'fnlwgt',
    'education',
    'education-num',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'capital-gain',
    'capital-loss',
    'hours-per-week',
    'native-country',
    'income-level'
)

# Categorical columns are columns that need to be turned into a numerical value to be used by scikit-learn
CATEGORICAL_COLUMNS = (
    'workclass',
    'education',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'native-country'
)


# Load the training census dataset
with open('./adult.data', 'r') as train_data:
    raw_training_data = pd.read_csv(train_data, header=None, names=COLUMNS)

# Remove the column we are trying to predict ('income-level') from our features list
# Convert the Dataframe to a lists of lists
train_features = raw_training_data.drop('income-level', axis=1).values.tolist()
# Create our training labels list, convert the Dataframe to a lists of lists
train_labels = (raw_training_data['income-level'] == ' >50K').values.tolist()

Convierte atributos categóricos en atributos numéricos

# Since the census data set has categorical features, we need to convert
# them to numerical values. We'll use a list of pipelines to convert each
# categorical column and then use FeatureUnion to combine them before calling
# the RandomForestClassifier.
categorical_pipelines = []

# Each categorical column needs to be extracted individually and converted to a numerical value.
# To do this, each categorical column will use a pipeline that extracts one feature column via
# SelectKBest(k=1) and a LabelBinarizer() to convert the categorical value to a numerical one.
# A scores array (created below) will select and extract the feature column. The scores array is
# created by iterating over the COLUMNS and checking if it is a CATEGORICAL_COLUMN.
for i, col in enumerate(COLUMNS[:-1]):
    if col in CATEGORICAL_COLUMNS:
        # Create a scores array to get the individual categorical column.
        # Example:
        #  data = [39, 'State-gov', 77516, 'Bachelors', 13, 'Never-married', 'Adm-clerical',
        #         'Not-in-family', 'White', 'Male', 2174, 0, 40, 'United-States']
        #  scores = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        #
        # Returns: [['State-gov']]
        # Build the scores array.
        scores = [0] * len(COLUMNS[:-1])
        # This column is the categorical column we want to extract.
        scores[i] = 1
        skb = SelectKBest(k=1)
        skb.scores_ = scores
        # Convert the categorical column to a numerical value
        lbn = LabelBinarizer()
        r = skb.transform(train_features)
        lbn.fit(r)
        # Create the pipeline to extract the categorical feature
        categorical_pipelines.append(
            ('categorical-{}'.format(i), Pipeline([
                ('SKB-{}'.format(i), skb),
                ('LBN-{}'.format(i), lbn)])))

Extrae atributos numéricos con una canalización de scikit-learn

# Create pipeline to extract the numerical features
skb = SelectKBest(k=6)
# From COLUMNS use the features that are numerical
skb.scores_ = [1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0]
categorical_pipelines.append(('numerical', skb))

# Combine all the features using FeatureUnion
preprocess = FeatureUnion(categorical_pipelines)

# Create the classifier
classifier = RandomForestClassifier()

# Transform the features and fit them to the classifier
classifier.fit(preprocess.transform(train_features), train_labels)

# Create the overall model as a single pipeline
pipeline = Pipeline([
    ('union', preprocess),
    ('classifier', classifier)
])

Exporta y guarda el modelo en Cloud Storage

Si el bucket de Cloud Storage está en el mismo proyecto que usas para AI Platform Training, este servicio puede leer y escribir en el bucket. Si no es así, debes asegurarte de que el proyecto que usas para ejecutar AI Platform Training pueda acceder al bucket de Cloud Storage. Consulta cómo otorgar permisos para el almacenamiento.

Asegúrate de asignarle los nombres model.pkl o model.joblib al archivo del modelo si deseas usarlo a fin de solicitar predicciones en línea mediante AI Platform Prediction.

# Export the model to a file
model = 'model.joblib'
joblib.dump(pipeline, model)

# Upload the model to GCS
bucket = storage.Client().bucket(BUCKET_NAME)
blob = bucket.blob('{}/{}'.format(
    datetime.datetime.now().strftime('census_%Y%m%d_%H%M%S'),
    model))
blob.upload_from_filename(model)

Verifica la carga del archivo de modelo en Cloud Storage (opcional)

En la línea de comandos, visualiza los contenidos de la carpeta del modelo de destino para verificar que tu archivo de modelo se haya subido a Cloud Storage. Configura una variable de entorno (BUCKET_NAME) para el nombre de tu depósito, si aún no lo has hecho.

gcloud storage ls gs://$BUCKET_NAME/census_*

El resultado debería ser similar al ejemplo siguiente:

gs://[YOUR-PROJECT-ID]/census_[DATE]_[TIME]/model.joblib

Crea un paquete de aplicación de entrenamiento

La forma más fácil (y recomendada) de crear un paquete de aplicación de entrenamiento usa gcloud para empaquetar y subir la aplicación cuando envías tu trabajo de entrenamiento. Este método te permite crear una estructura de archivos muy simple con solo dos archivos. Para este instructivo, la estructura del archivo de tu paquete de aplicación de entrenamiento debe ser similar a la siguiente:

census_training/
    __init__.py
    train.py
  1. Crea un directorio de manera local:

    mkdir census_training
    
  2. Crea un archivo en blanco llamado __init__.py:

    touch census_training/__init__.py
    
  3. Guarda tu código de entrenamiento en un archivo de Python, y guarda ese archivo en tu directorio census_training. Consulta el código de ejemplo para train.py. Puedes usar cURL para descargar y guardar el archivo:

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-samples/master/sklearn/notebooks/census_training/train.py > census_training/train.py
    

Obtén más información sobre cómo empaquetar una aplicación de entrenamiento.

Envía el trabajo de entrenamiento

En esta sección, usarás gcloud ai-platform jobs submit training para enviar tu trabajo de entrenamiento.

Especifica los parámetros del trabajo de entrenamiento

Configura las siguientes variables de entorno para cada parámetro en tu solicitud de trabajo de entrenamiento:

  • PROJECT_ID: Usa el PROJECT_ID que coincida con tu proyecto de Google Cloud.
  • BUCKET_NAME: Es el nombre de tu depósito de Cloud Storage.
  • JOB_NAME: es un nombre para el trabajo (combinaciones de mayúsculas y minúsculas, números y guiones bajos únicamente, que comience con una letra). En este caso, es census_training_$(date +"%Y%m%d_%H%M%S").
  • JOB_DIR: es la ruta a una ubicación de Cloud Storage para tus archivos de salida del trabajo de entrenamiento. Por ejemplo, gs://$BUCKET_NAME/scikit_learn_job_dir.
  • TRAINING_PACKAGE_PATH: es la ruta local al directorio raíz de tu aplicación de entrenamiento. En este caso, es ./census_training/.
  • MAIN_TRAINER_MODULE: Especifica qué archivo debe ejecutar el servicio de entrenamiento de AI Platform Training. Tiene el formato [YOUR_FOLDER_NAME.YOUR_PYTHON_FILE_NAME]. En este caso, es census_training.train.
  • REGION: Es el nombre de la región que usas para ejecutar el trabajo de entrenamiento. Usa una de las regiones disponibles para el servicio de capacitación de AI Platform Training. Asegúrate de que tu bucket de Cloud Storage esté en la misma región.
  • RUNTIME_VERSION: Debes especificar una versión del entorno de ejecución de AI Platform Training que sea compatible con scikit-learn. En este ejemplo, es 2.11.
  • PYTHON_VERSION: Es la versión de Python que se usa para el trabajo. Para este instructivo, especifica Python 3.7.
  • SCALE_TIER: una especificación del clúster predefinida para que las máquinas ejecuten tu trabajo de entrenamiento. En este caso, es BASIC. También puedes usar niveles de escala personalizados a fin de definir tu propia configuración del clúster para el entrenamiento.

Para tu comodidad, las variables de entorno en este instructivo se encuentran a continuación. Reemplaza [VALUES-IN-BRACKETS] por los valores adecuados como se muestra a continuación:

PROJECT_ID=[YOUR-PROJECT-ID]
BUCKET_NAME=[YOUR-BUCKET-NAME]
JOB_NAME=census_training_$(date +"%Y%m%d_%H%M%S")
JOB_DIR=gs://$BUCKET_NAME/scikit_learn_job_dir
TRAINING_PACKAGE_PATH="[YOUR-LOCAL-PATH-TO-TRAINING-PACKAGE]/census_training/"
MAIN_TRAINER_MODULE=census_training.train
REGION=us-central1
RUNTIME_VERSION=2.11
PYTHON_VERSION=3.7
SCALE_TIER=BASIC

Envía la solicitud:

gcloud ai-platform jobs submit training $JOB_NAME \
  --job-dir $JOB_DIR \
  --package-path $TRAINING_PACKAGE_PATH \
  --module-name $MAIN_TRAINER_MODULE \
  --region $REGION \
  --runtime-version=$RUNTIME_VERSION \
  --python-version=$PYTHON_VERSION \
  --scale-tier $SCALE_TIER

Deberías ver un resultado similar al siguiente:

Job [census_training_[DATE]_[TIME]] submitted successfully.
Your job is still active. You may view the status of your job with the command

  $ gcloud ai-platform jobs describe census_training_[DATE]_[TIME]

or continue streaming the logs with the command

  $ gcloud ai-platform jobs stream-logs census_training_[DATE]_[TIME]
jobId: census_training_[DATE]_[TIME]
state: QUEUED

Visualiza los registros de entrenamiento (opcional)

AI Platform Training captura todas las transmisiones stdout y stderr, además de las instrucciones de registro. Estos registros se almacenan en Logging y son visibles durante la ejecución y después de ella.

Para visualizar los registros de tu trabajo de entrenamiento:

Console

  1. Abre la página Trabajos de AI Platform Training.

    Abrir Trabajos en la consola de Google Cloud

  2. Selecciona el nombre del trabajo de entrenamiento para inspeccionar. Esto te lleva a la página Detalles del trabajo de tu trabajo de entrenamiento seleccionado.

  3. Dentro de los detalles del trabajo, selecciona el vínculo Ver registros. Esto te lleva a la página de Logging donde puedes buscar y filtrar los registros para tu trabajo de entrenamiento seleccionado.

gcloud

Puedes ver los registros en tu terminal con gcloud ai-platform jobs stream-logs.

gcloud ai-platform jobs stream-logs $JOB_NAME

¿Qué sigue?