Cloud Batch — Parte 3 — Adicionando GPUs ao Job

Bruno Patrocinio
google-cloud-brasil
4 min readOct 24, 2023
Google Cloud Batch

Introdução

Para esse e outros tutoriais do Google Cloud, você pode criar uma conta e receber US$ 300 em créditos para aprender e praticar! Saiba mais neste guia.

Em nosso segundo artigo sobre Cloud Batch, vimos como executar containers no Cloud Batch.

Neste artigo, veremos como adicionar GPUs ao Cloud Batch para acelerar tarefas que requerem este tipo de recurso.

Alguns exemplos de tarefas que podem ser aceleradas por GPUs:

  • Aprendizado de máquina: GPUs podem ser usadas para acelerar o treinamento de modelos de aprendizado de máquina, como redes neurais. Isso pode ser útil para tarefas como reconhecimento de imagens, tradução automática e diagnóstico médico.
  • Processamento de imagens: GPUs podem ser usadas para acelerar tarefas de processamento de imagens, como reconhecimento facial, segmentação de imagens e detecção de objetos.
  • Renderização de gráficos: GPUs são essenciais para renderizar gráficos 3D em tempo real. Elas são usadas em jogos, aplicativos de realidade virtual e aumentada, e em animações.

Bora praticar?

Iremos executar todos os passos utilizando o próprio Cloud Shell dentro do console do Google Cloud.

Cloud Shell é um ambiente de desenvolvimento e operações on-line acessível pelo navegador em qualquer lugar.

É possível gerenciar os recursos com este terminal on-line pré-carregado com utilitários como a ferramenta de linha de comando gcloud, kubectl e muito mais.

Você também pode desenvolver, criar, depurar e implantar aplicativos nativos da nuvem usando o Editor do Cloud Shell on-line.

Para ativá-lo, basta clicar no ícone do cloud shell no canto superior direito.

Após o shell ser disponibilizado, a primeira atividade é criar um novo projeto, pois ao final desse tutorial, e se quisermos, podemos remover todos os recursos de uma só vez.

Para criar um novo projeto vamos utilizar o seguinte comando:

gcloud projects create [PROJECT_ID]

Substitua o [PROJECT_ID] por um de sua preferência, ele será o mesmo utilizado pelo resto deste artigo.

Para alterar o projeto default do gcloud, execute:

gcloud config set project [PROJECT_ID]

Um ponto importante: Garanta que o billing está ativo para o projeto. Saiba como verificar se o billing está ativo no projeto e caso não esteja, saiba como ativa-lo.

Ativando as APIs

Precisamos ativar a api:

  • Batch — para executar o container
gcloud services enable \
batch.googleapis.com

Preparando o ambiente

Os arquivos e scripts que vamos utilizar a partir de agora, estão neste repositório:

https://github.com/GoogleCloudPlatform/batch-samples

Vamos copiá-los para dentro do cloud shell:

git clone https://github.com/GoogleCloudPlatform/batch-samples
cd api-samples/gpu

Tudo pronto, agora podemos focar no Batch!

Hora do Job!

Dentro deste diretório já existe um exemplo de job para ser executado utilizando GPU.

Este job tem algumas variáveis:

  • MACHINE_TYPE: Vamos utilizar para especificar o tipo de máquina a ser usada para execução do job.
  • GPU_TYPE: Aqui vamos especificar o tipo de GPU a ser usado.
  • GPU_COUNT: A quantidade de GPUs.

O arquivo gpu_job_with_driver_installation.json está assim:

{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "echo hello world >> output_task_${BATCH_TASK_INDEX}.txt"
}
}
]
},
"taskCount": 3,
"parallelism": 1
}
],
"allocationPolicy": {
"instances": [
{
"installGpuDrivers": ${INSTALL_GPU_DRIVERS},
"policy": {
"machineType": "${MACHINE_TYPE}",
"accelerators": [
{
"type": "${GPU_TYPE}",
"count": "${GPU_COUNT}"
}
]
}
}
],
"location": {
"allowedLocations": [
"${ALLOWED_LOCATION}"
]
}
},
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}

Dentro da mesma pasta existe um arquivo executável onde podemos definir o valor para as variaveis:

#!/bin/bash

# Export all variables.
set -o allexport

# Common variables.
source ../env.sh

# UPDATE TO MATCH YOUR SETTINGS.
# Variables for this sample.
# -----------------------------------------
# Google Batch supports jobs with GPU, by indicating `INSTALL_GPU_DRIVERS` as true, Batch
# will fetch the drivers required for the GPU type that you specify in the policy field
# from a third-party location, and install them on your behalf. Otherwise, you need to
# install GPU drivers manually to use any GPUs for this job.
INSTALL_GPU_DRIVERS=true
# MACHINE_TYPE you choose must support the GPU type you want for this job.
# https://cloud.google.com/compute/docs/gpus
MACHINE_TYPE=n1-standard-1
# GPU_TYPE being used in this job.
GPU_TYPE=nvidia-tesla-t4
# GPU_COUNT being used in this job.
GPU_COUNT=1
# ALLOWED_LOCATION you choose must have the GPU type you want for this job.
# https://cloud.google.com/compute/docs/gpus/gpu-regions-zones
ALLOWED_LOCATION=regions/us-central1

# Turn OFF the allexport option
set +o allexport

gcloud batch jobs submit --job-prefix=gcs --location=${Location} --project=${ProjectID} --config - <<EOF
$(envsubst '$INSTALL_GPU_DRIVERS','$MACHINE_TYPE','$GPU_TYPE','$GPU_COUNT','$ALLOWED_LOCATION' < ./gpu_job_with_driver_installation.json)
EOF

Para executar o job, altere os valores de Location e ProjectID, além disso é necessário dar permissão de execução do arquivo .sh

chmod +x submit.sh
./submit.sh

O Job será executado utilizando a GPU especificada no script.

Limpando tudo

O Batch automaticamente deleta as instâncias que criou para executar os jobs automaticamente, porém você ainda pode ser cobrado pelos arquivos que estiverem armazenados no Cloud Storage.

Por este motivo, iremos deletar o projeto para evitar quaisquer custos adicionais.

gcloud projects delete [PROJECT_ID]

Recap

Então é isso pessoal! Neste post você aprendeu como adicionar GPUs a um job no Batch. Parabéns!

Convido vocês a substituir algum processo assíncrono nos seus ambientes de testes pelo Cloud Batch, para testá-lo na prática e ver como ele pode ajudar no dia-a-dia.

Nos próximos posts desta série iremos abordar ainda:

  • Como utilizar o Cloud Batch para HPC
  • Como agendar uma execução de job
  • Como orquestrar jobs via eventos como Cloud Workflows
  • Como provisionar tudo isso via Infra as a Code

Um abraço e até láaaaa!

--

--