Como treinar usando o algoritmo XGBoost integrado e distribuído

O treinamento com algoritmos integrados no AI Platform Training permite enviar o conjunto de dados e treinar um modelo, sem a necessidade de escrever qualquer código de treinamento. Nesta página, explicamos como o algoritmo XGBoost integrado e distribuído funciona e como usá-lo.

Informações gerais

O algoritmo XGBoost integrado e distribuído é um wrapper do XGBoost (em inglês) compatível com a execução no AI Platform Training.

Ao contrário do algoritmo XGBoost integrado de uma única réplica, a versão distribuída permite usar várias máquinas virtuais em paralelo para realizar treinamento em grandes conjuntos de dados. Esta versão do algoritmo também permite usar GPUs no treinamento, o que pode acelerar o processo.

O AI Platform Training executa o treinamento usando o algoritmo XGBoost distribuído com base no conjunto de dados e nos parâmetros de modelo fornecidos por você. A implementação atual se baseia na versão 0.81 do XGBoost.

Limitações

Os recursos a seguir não são compatíveis com o treinamento usando o algoritmo XGBoost integrado e distribuído:

Tipos de máquina compatíveis

É possível usar qualquer nível de escalonamento do AI Platform Training ou combinação válida de tipos de máquina com este algoritmo, desde que sua configuração atenda aos requisitos a seguir:

  • Especifique um worker mestre e pelo menos um outro worker.
  • Para conseguir o melhor desempenho, especifique o mesmo tipo de máquina para o worker mestre e os demais workers.
  • Não especifique nenhum servidor de parâmetros.
  • Verifique se a memória total das máquinas virtuais que você especificou é pelo menos 20% maior do que o tamanho total do arquivo de dados de treinamento. Desse modo, as máquinas virtuais poderão carregar todos os dados de treinamento na memória e usar memória extra no treinamento.
  • Se você usar GPUs, verifique se cada máquina virtual usa apenas uma GPU e o mesmo tipo de GPU para o worker mestre e os demais workers. Confira se o tipo de máquina que você especificou é compatível com a configuração da GPU.
  • Não use nenhuma TPU.

Formatar dados de entrada

O algoritmo XGBoost integrado e distribuído funciona com dados numéricos tabulares. Em um conjunto de dados, cada linha representa uma instância e cada coluna representa um valor de recurso. A coluna de destino representa o valor que você quer prever.

Preparar os arquivos CSV

Os dados de entrada precisam estar em um ou mais arquivos CSV com codificação UTF-8. Cada arquivo precisa atender aos seguintes requisitos:

  • Os arquivos CSV não podem ter uma linha de cabeçalho. Se houver uma linha de cabeçalho rotulando cada coluna, remova-a de todos os arquivos.
  • A coluna de destino precisa ser a primeira.
  • Nos jobs de treinamento de classificação, a coluna de destino pode conter valores não numéricos. Todas as outras colunas precisam conter apenas dados numéricos.
  • Nos jobs de treinamento de regressão, normalize os valores de destino para que cada um esteja entre 0 e 1. Todas as outras colunas precisam conter apenas dados numéricos.

Dividir dados para treinamento distribuído

Para fornecer dados de vários arquivos CSV ao enviar um job de treinamento, use caracteres curinga nos caminhos do Cloud Storage que você especificar para os argumentos training_data_path e validation_data_path. É necessário que todos os arquivos CSV usem o mesmo esquema de colunas, atendendo aos requisitos descritos na seção anterior.

O algoritmo XGBoost integrado e distribuído faz a distribuição dos dados de treinamento pelas máquinas virtuais de uma das maneiras a seguir:

  • Se o número de arquivos CSV for maior ou igual ao número de máquinas virtuais, o algoritmo distribuirá os dados por arquivo em rodízio. Em outras palavras, o worker mestre carrega o primeiro arquivo CSV, o primeiro worker carrega o segundo arquivo CSV e assim por diante. Esse método de atribuição de arquivos se repete para que cada máquina virtual carregue aproximadamente o mesmo número de arquivos.

  • Se o número de arquivos CSV for menor que o número de máquinas virtuais, o algoritmo distribuirá dados por instância em rodízio. Em outras palavras, o worker mestre carrega a primeira linha de cada arquivo CSV, o primeiro worker carrega a segunda linha e assim por diante. Esse método de atribuição de instâncias se repete para que cada máquina virtual carregue aproximadamente o mesmo número de instâncias.

Se você especificar o argumento validation_data_path, o algoritmo também carregará os dados de validação seguindo um desses métodos. No entanto, o algoritmo carrega os dados de treinamento e de validação de modo independente. Por exemplo, se você fornecer muitos arquivos de dados de treinamento, mas apenas um arquivo de dados de validação, o algoritmo poderá carregar os dados de treinamento por arquivo e os dados de validação por instância.

Para conseguir o melhor desempenho, divida os dados de treinamento em vários arquivos CSV que atendam às seguintes diretrizes:

  • cada arquivo precisa ter menos de 1 GB;
  • cada arquivo precisa conter aproximadamente o mesmo número de instâncias;
  • o número de arquivos precisa ser divisível pelo número total de máquinas virtuais. Por exemplo, se você realizar treinamento com um worker mestre e outros dois workers, o número de arquivos será um múltiplo de três.

Verificar as permissões do bucket do Cloud Storage

Para armazenar seus dados, use um bucket do Cloud Storage no mesmo projeto do Google Cloud usado para executar jobs do AI Platform Training. Caso contrário, conceda acesso de treinamento do AI Platform ao intervalo do Cloud Storage em que os dados estão armazenados.

Como usar GPUs

Conforme descrito na seção anterior sobre os tipos de máquina, o algoritmo XGBoost integrado e distribuído é compatível com o uso de uma única GPU por máquina virtual para treinamento.

Para aproveitar as vantagens das GPUs, defina o hiperparâmetro tree_method como gpu_exact ou gpu_hist ao enviar seu job de treinamento.

Saiba mais sobre a compatibilidade do XGBoost com GPUs (em inglês).

Enviar um job de treinamento com XGBoost distribuído

Nesta seção, explicamos como enviar um job de treinamento com o algoritmo XGBoost integrado e distribuído. Use o Console do Google Cloud ou a Google Cloud CLI para enviar o job.

Consulte a referência do algoritmo XGBoost integrado e distribuído para ver descrições abrangentes de hiperparâmetros e outros argumentos que podem ser ajustados para esse algoritmo.

No exemplo a seguir, supõe-se que você esteja treinando um classificador com os dados de censo divididos em três arquivos de dados de treinamento e três arquivos de dados de validação:

  • train-0.csv
  • train-1.csv
  • train-2.csv
  • eval-0.csv
  • eval-1.csv
  • eval-2.csv

Suponha que nenhum desses arquivos tenha linhas de cabeçalho e que você fez upload deles para o Cloud Storage. O exemplo cria um job de treinamento que utiliza três máquinas virtuais, cada uma usando uma GPU NVIDIA Tesla P100. O job é executado na região us-central1.

Console do Google Cloud

  1. Acesse a página Jobs do AI Platform Training no Console do Google Cloud:

    Página "Jobs" do AI Platform Training

  2. Clique no botão Novo job de treinamento. Nas opções exibidas, clique em Treinamento de algoritmo integrado.

  3. Na página Criar um novo job de treinamento, abra a lista suspensa Selecionar um algoritmo e selecioneXGBoost distribuído. Clique em Avançar.

  4. Na seção Dados de treinamento, selecione Usar vários arquivos armazenados em um diretório do Cloud Storage na lista suspensa. Use o campo Caminho do diretório para selecionar o diretório do Cloud Storage onde estão seus arquivos de treinamento. No campo Nome do caractere curinga, insira train-*.csv.

  5. Na seção Dados de treinamento (opcional), selecione Usar vários arquivos armazenados em um diretório do Cloud Storage na lista suspensa. Use o campo Caminho do diretório para selecionar o diretório do Cloud Storage onde estão seus arquivos de validação. No campo Nome do caractere curinga, insira eval-*.csv.

  6. Na seção Saída de treinamento, use o campo Diretório de saída para selecionar um diretório diferente no seu bucket do Cloud Storage para armazenar a saída do treinamento. Clique em Next.

  7. Personalize os Argumentos do algoritmo do seu job de treinamento ou mantenha os valores padrão. Para saber mais sobre os argumentos, siga os links no console do Google Cloud e consulte a referência do algoritmo XGBoost integrado e distribuído. Clique em Next.

  8. Insira um nome de sua escolha no campo ID do job. Na lista suspensa Região, selecione us-central1.

    Na lista suspensa Nível de escalonamento, selecione CUSTOM. Na seção Configuração de cluster personalizada, selecione standard_p100 nas listas suspensas Tipo de mestre e Tipo de worker. No campo Contagem de workers, insira 2. Clique em Concluído.

  9. Na página Jobs, clique no ID do job novo para ver a respectiva página Detalhes do job. Em seguida, clique em Ver registros para ver os registros do treinamento.

Ferramenta gcloud

  1. Defina variáveis de ambiente para o job, substituindo BUCKET pelo nome do intervalo do Cloud Storage e DATA_DIRECTORY pelo caminho para o diretório no intervalo que contém os dados:

    # Specify the Docker container for your built-in algorithm selection.
    IMAGE_URI='gcr.io/cloud-ml-algos/xgboost_dist:latest'
    
    # Specify the Cloud Storage wildcard paths to your training and validation data.
    TRAINING_DATA='gs://BUCKET/DATA_DIRECTORY/train-*.csv'
    VALIDATION_DATA='gs://BUCKET/DATA_DIRECTORY/eval-*.csv'
    
    # Variables for constructing descriptive names for JOB_ID and JOB_DIR
    DATASET_NAME='census'
    ALGORITHM='xgboost_dist'
    MODEL_TYPE='classification'
    DATE='date '+%Y%m%d_%H%M%S''
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}_${MODEL_TYPE}"
    
    # Specify an ID for this job
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Specify the directory where you want your training outputs to be stored
    JOB_DIR="gs://BUCKET/algorithm_training/${MODEL_NAME}/${DATE}"
    
  2. Envie o job de treinamento usando o comando gcloud ai-platform jobs training submit:

    gcloud ai-platform jobs submit training $JOB_ID \
      --region=us-central1 \
      --master-image-uri=$IMAGE_URI \
      --job-dir=$JOB_DIR \
      --scale-tier=CUSTOM \
      --master-machine-type=n1-standard-4 \
      --master-accelerator count=1,type=nvidia-tesla-p100 \
      --worker-machine-type=n1-standard-4 \
      --worker-count=2 \
      --worker-accelerator count=1,type=nvidia-tesla-p100 \
      -- \
      --training_data_path=$TRAINING_DATA \
      --validation_data_path=$VALIDATION_DATA \
      --objective=binary:logistic \
      --tree_method=gpu_hist
    
  3. Monitore o status do job de treinamento visualizando os registros com gcloud. Consulte gcloud ai-platform jobs describe e gcloud ai-platform jobs stream-logs.

    gcloud ai-platform jobs describe ${JOB_ID}
    gcloud ai-platform jobs stream-logs ${JOB_ID}
    

A seguir