Treinamento com scikit-learn no AI Platform Training

O serviço de treinamento do AI Platform Training gerencia recursos de computação na nuvem para treinar seus modelos. Esta página descreve o processo de treinamento de um modelo scikit-learn usando o AI Platform Training.

Neste tutorial, você treinará um modelo simples para prever o nível de renda de uma pessoa com base no conjunto de dados de renda do Censo (em inglês). Você criará um aplicativo de treinamento no local, fará o upload dele para o Cloud Storage e enviará um job de treinamento. O serviço de treinamento do AI Platform Training grava a saída no bucket do Cloud Storage e cria registros no Logging.

Este conteúdo também está disponível no GitHub como um bloco de anotações do Jupyter.

Como treinar seu modelo no AI Platform Training

É possível treinar seu modelo no AI Platform Training em três etapas:

  • Crie o arquivo de modelo em Python
    • Adicione o código para fazer o download dos seus dados pelo Cloud Storage para que o AI Platform Training possa usá-los.
    • Adicione código para exportar e salvar o modelo no Cloud Storage depois que o AI Platform Training terminar de treinar o modelo.
  • Prepare um pacote de aplicativo de treinamento.
  • Enviar o job de treinamento

Antes de começar

Conclua as etapas a seguir para configurar uma conta do GCP, ativar a API AI Platform Training e instalar e ativar o SDK do Cloud.

Configurar o projeto GCP

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No Console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.

  4. Ative as APIs AI Platform Training & Prediction and Compute Engine.

    Ative as APIs

  5. Instale e inicialize o SDK do Cloud..

Configurar o ambiente

Escolha uma das opções abaixo para configurar o ambiente localmente no macOS ou em um ambiente remoto no Cloud Shell.

Para usuários do macOS, recomendamos a configuração do ambiente usando a guia MACOS abaixo. O Cloud Shell, mostrado na guia CLOUD SHELL, está disponível para macOS, Linux e Windows. Com ele, você testa rapidamente o AI Platform Training. No entanto, ele não é adequado para trabalhos de desenvolvimento contínuos.

macOS

  1. Verificar a instalação do Python
    Verifique se o Python (em inglês) está instalado e, se necessário, instale-o.

    python -V
  2. Verificar a pip instalação do
    pip é o gerenciador de pacote do Python, incluído nas versões atuais do Python. Execute pip --version para verificar se o pip já está instalado. Caso contrário, veja como instalar o pip (em inglês).

    É possível fazer upgrade do pip usando o comando a seguir:

    pip install -U pip

    Consulte a documentação do pip para mais detalhes.

  3. Instalar virtualenv
    virtualenv é uma ferramenta para criar ambientes Python isolados. Execute virtualenv --version para verificar se a virtualenv já está instalada. Caso contrário, instale virtualenv (em inglês):

    pip install --user --upgrade virtualenv

    Para criar um ambiente de desenvolvimento isolado para este guia, crie um novo ambiente virtual em virtualenv. Por exemplo, com o comando a seguir, você ativa um ambiente chamado aip-env:

    virtualenv aip-env
    source aip-env/bin/activate
  4. Neste tutorial, execute o restante dos comandos no ambiente virtual.

    Veja mais informações sobre o uso da virtualenv (em inglês). Para sair da virtualenv, execute deactivate.

Cloud Shell

  1. Abra o Console do Google Cloud.

    Console do Google Cloud

  2. Clique no botão Ativar o Cloud Shell na parte superior da janela do console.

    Ativa o Google Cloud Shell

    Uma sessão do Cloud Shell é aberta em um novo frame na parte inferior do console e um prompt de linha de comando é exibido. A inicialização da sessão do shell pode levar alguns segundos.

    Seção do Cloud Shell

    A sessão do Cloud Shell está pronta para ser usada.

  3. Configure a ferramenta de linha de comando gcloud para usar o projeto selecionado.

    gcloud config set project [selected-project-id]

    em que [selected-project-id] é o ID do projeto. Retire os colchetes incluídos.

Instalar frameworks

macOS

No seu ambiente virtual, execute o seguinte comando para instalar as versões do scikit-learn e do pandas usadas na versão 2.4 do ambiente de execução do AI Platform Training:

(aip-env)$ pip install scikit-learn==0.24.0 pandas==1.1.5

Ao fornecer os números de versão no comando anterior, você garante que as dependências em seu ambiente virtual correspondam às dependências na versão do ambiente de execução. Isso ajuda a evitar comportamentos inesperados quando o código é executado no AI Platform Training.

Para mais detalhes, opções de instalação e solução de problemas, consulte as instruções de instalação de cada framework:

Cloud Shell

Execute o seguinte comando para instalar o scikit-learn e o pandas:

pip install --user scikit-learn pandas

Para mais detalhes, opções de instalação e solução de problemas, consulte as instruções de instalação de cada framework:

Configurar o bucket do Cloud Storage

Você precisará de um bucket do Cloud Storage para armazenar o código de treinamento e as dependências. Para este tutorial, é mais fácil usar um bucket dedicado do Cloud Storage no mesmo projeto que você está utilizando no AI Platform Training.

Se você estiver usando um bucket em outro projeto, precisará garantir que sua conta de serviço do AI Platform Training acesse seu código de treinamento e dependências no Cloud Storage. Sem as permissões apropriadas, o job de treinamento falhará. Saiba como conceder permissões para armazenamento.

Use ou configure um bucket na mesma região que está sendo usada para executar os jobs de treinamento. Veja as regiões disponíveis para os serviços do AI Platform Training.

Nesta seção, você aprende a criar um novo bucket. É possível usar um bucket atual, mas ele precisa estar na mesma região em que você planeja executar os jobs do AI Platform. Além disso, se ele não fizer parte do projeto que você está usando para executar o AI Platform Training, conceda acesso explícito às contas de serviço do AI Platform Training.

  1. Especifique um nome para o novo bucket. Ele precisa ser único em todos os buckets no Cloud Storage.

    BUCKET_NAME="YOUR_BUCKET_NAME"

    Por exemplo, use o nome do seu projeto com -aiplatform anexado:

    PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    BUCKET_NAME=${PROJECT_ID}-aiplatform
  2. Verifique o nome do bucket que você criou.

    echo $BUCKET_NAME
  3. Selecione a região do bucket e defina a variável de ambiente REGION.

    Use a mesma região em que você planeja executar jobs do AI Platform Training. Veja as regiões disponíveis para os serviços do AI Platform Training.

    Por exemplo, o código a seguir cria REGION e a define como us-central1:

    REGION=us-central1
  4. Crie o novo bucket:

    gsutil mb -l $REGION gs://$BUCKET_NAME

Sobre os dados

O conjunto de dados de renda do censo usado para treinamento nesta amostra está hospedado no Repositório de machine learning da UC Irvine (páginas em inglês).

Dados do Censo por cortesia de: Lichman, M. (2013). Repositório de machine learning da UCI http://archive.ics.uci.edu/ml (em inglês). Irvine, CA: University of California, School of Information and Computer Science. Este conjunto de dados está disponível publicamente para uso por qualquer pessoa nos seguintes termos fornecidos pela fonte do conjunto de dados (http://archive.ics.uci.edu/ml, em inglês). Ele é oferecido "NA FORMA EM QUE SE ENCONTRA", sem qualquer garantia, expressa ou implícita, do Google. O Google se isenta de qualquer responsabilidade por eventuais danos, diretos ou indiretos, decorrentes do uso do conjunto de dados.

Para sua comodidade, os dados estão hospedados em um bucket público do Cloud Storage: gs://cloud-samples-data/ai-platform/sklearn/census_data/. É possível fazer o download dele no seu arquivo de treinamento em Python.

Crie o arquivo de modelo em Python

Você encontra todo o código de treinamento desta seção no GitHub: train.py (em inglês).

Nesta seção, explicamos a função do código de treinamento.

Configurar

Importe as seguintes bibliotecas do Python, do Cloud SDK e do scikit-learn. Defina uma variável para o nome do seu bucket do Cloud Storage.

import datetime
import pandas as pd

from google.cloud import storage

from sklearn.ensemble import RandomForestClassifier
from sklearn.externals import joblib
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'

Fazer o download de dados do Cloud Storage

Durante o processo de desenvolvimento típico, você faz o upload de seus próprios dados para o Cloud Storage para que o AI Platform Training possa acessá-los. Os dados deste tutorial estão hospedados em um bucket público: gs://cloud-samples-data/ai-platform/sklearn/census_data/.

Com o código abaixo, você faz download do conjunto de dados de treinamento, adult.data. Os dados de avaliação estão disponíveis em adult.test, mas não são usados neste tutorial.

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

Adicionar o código do seu modelo

O código de treinamento do modelo realiza algumas etapas básicas:

  • Definir e carregar dados
  • Converter recursos categóricos em recursos numéricos
  • Extrair recursos numéricos com um canal do scikit-learn
  • Exportar e salvar o modelo no Cloud Storage

Definir e carregar dados

# 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()

Converter recursos categóricos em recursos 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)])))

Extrair recursos numéricos com um canal do 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)
])

Exportar e salvar o modelo no Cloud Storage

Se o bucket do Cloud Storage estiver no mesmo projeto usado no AI Platform Training, o AI Platform Training poderá ler e gravar no bucket. Caso contrário, verifique se o projeto que você está usando para executar o AI Platform Training pode acessar seu bucket do Cloud Storage. Saiba como conceder permissões de armazenamento.

Certifique-se de nomear seu arquivo de modelo model.pkl ou model.joblib, se quiser usá-lo para solicitar previsões on-line com o 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)

Verificar o upload do arquivo de modelo Cloud Storage (opcional)

Na linha de comando, visualize o conteúdo da pasta de destino do modelo para verificar se o upload do arquivo de modelo para o Cloud Storage foi feito. Defina uma variável de ambiente (BUCKET_ID) para o nome do seu bucket, se ainda não tiver feito isso.

gsutil ls gs://$BUCKET_ID/census_*

A saída será assim:

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

Criar um pacote de aplicativo de treinamento

A maneira mais fácil e recomendada de criar um pacote de aplicativo de treinamento é usar o gcloud para empacotar e transferir o aplicativo quando você enviar o job de treinamento. Com esse método, você cria uma estrutura muito simples com apenas dois arquivos. Para este tutorial, a estrutura de arquivos do seu pacote de aplicativo de treinamento precisa ser similar a esta:

census_training/
    __init__.py
    train.py
  1. Crie um diretório no local:

    mkdir census_training
    
  2. Crie um arquivo em branco chamado __init__.py:

    touch census_training/__init__.py
    
  3. Salve o código de treinamento em um arquivo Python. Depois, salve esse arquivo no diretório census_training. Veja o código de exemplo de train.py (em inglês). Use cURL para fazer o download do arquivo e salvá-lo:

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

Saiba mais sobre como empacotar um aplicativo de treinamento.

Enviar o job de treinamento

Nesta seção, você usa gcloud ai-platform jobs submit training para enviar o job de treinamento.

Especificar os parâmetros do job de treinamento

Defina as variáveis de ambiente a seguir para cada parâmetro na solicitação de job de treinamento:

  • PROJECT_ID: use o PROJECT_ID que corresponde ao seu projeto do Google Cloud.
  • BUCKET_ID: o nome do bucket do Cloud Storage.
  • JOB_NAME: o nome que será usado no job. Use apenas letras maiúsculas e minúsculas, números e sublinhados, começando com uma letra. Nesse caso, census_training_$(date +"%Y%m%d_%H%M%S").
  • JOB_DIR: o caminho para o local do Cloud Storage a ser usado nos arquivos de saída do job de treinamento. Por exemplo, gs://$BUCKET_ID/scikit_learn_job_dir.
  • TRAINING_PACKAGE_PATH: o caminho local do diretório raiz do aplicativo de treinamento. Nesse caso, ./census_training/.
  • MAIN_TRAINER_MODULE: especifica qual arquivo o serviço de treinamento do AI Platform Training executará. Ele tem o formato [YOUR_FOLDER_NAME.YOUR_PYTHON_FILE_NAME]. Nesse caso, census_training.train.
  • REGION: o nome da região usada para executar o job de treinamento. Use uma das regiões disponíveis para o serviço de treinamento do AI Platform Training. Verifique se o bucket do Cloud Storage está na mesma região.
  • RUNTIME_VERSION: é necessário especificar uma versão de ambiente de execução do AI Platform Training que seja compatível com o scikit-learn. Neste exemplo, 2.4.
  • PYTHON_VERSION: a versão do Python a ser usada para o job. Para este tutorial, especifique o Python 3.7.
  • SCALE_TIER: uma especificação de cluster predefinida de máquinas para executar o job de treinamento. Nesse caso, BASIC. Também é possível usar níveis de dimensionamento personalizados para definir a própria configuração de clusters para o treinamento.

Para sua comodidade, as variáveis de ambiente deste tutorial estão listadas abaixo. Substitua [VALUES-IN-BRACKETS] pelos valores apropriados:

PROJECT_ID=[YOUR-PROJECT-ID]
BUCKET_ID=[YOUR-BUCKET-ID]
JOB_NAME=census_training_$(date +"%Y%m%d_%H%M%S")
JOB_DIR=gs://$BUCKET_ID/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.4
PYTHON_VERSION=3.7
SCALE_TIER=BASIC

Envie a solicitação:

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

O resultado será semelhante a:

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

Como visualizar os registros de treinamento (opcional)

O AI Platform Training captura todos os streams stdout e stderr e as instruções de geração de registros. Esses registros são armazenados no Logging e permanecem visíveis durante e após a execução.

Para ver os registros do job de treinamento:

Console

  1. Abra a página Jobs do AI Platform Training.

    Abrir jobs no Console do Cloud

  2. Selecione o nome do job de treinamento a ser inspecionado. Você será direcionado à página Detalhes do job correspondente ao job de treinamento selecionado.

  3. Nos detalhes do job, selecione o link Ver registros. Você será direcionado à página “Registros”, em que é possível pesquisar e filtrar os registros do job de treinamento selecionado.

gcloud

Veja os registros no terminal com gcloud ai-platform jobs stream-logs.

gcloud ai-platform jobs stream-logs $JOB_NAME

A seguir