Criar e executar um job que usa GPUs

Neste documento, explicamos como criar e executar um job que usa uma unidade de processamento gráfico (GPU).

Se quiser, é possível criar um job em lote que adiciona uma ou mais GPUs às VMs em execução no job. Os casos de uso comuns de jobs que usam GPUs incluem processamento intensivo de dados e cargas de trabalho de machine learning (ML).

Antes de começar

Criar um job que usa uma GPU

Se preferir, crie um job que adicione uma ou mais unidades de processamento gráfico (GPUs, na sigla em inglês) a cada uma das VMs que executam o job. Para criar um job que use GPUs, faça o seguinte:

  1. Consulte a seção Requisitos para que um job use GPUs para determinar os métodos que você pode usar para criar seu job.
  2. Crie um job com os métodos selecionados. Para exemplos de como criar um job usando os métodos recomendados, consulte Como criar um job que usa uma GPU.

Requisitos para que um job use GPUs

Para usar GPUs, um job precisa fazer o seguinte:

Instalar os drivers da GPU

Para instalar os drivers de GPU necessários, selecione um dos seguintes métodos:

Definir os recursos da VM

Para usar GPUs, um job precisa especificar o tipo e o número de GPUs e um tipo de máquina compatível com as VMs do job. Para definir os recursos das VMs de um job, selecione um dos seguintes métodos:

  • Definir recursos diretamente (recomendado): como mostrado nos exemplos, para definir os recursos para as VMs de um job diretamente, use o campo policy.
  • Definir recursos em um modelo: defina os recursos das VMs de um job especificando um modelo de instância do Compute Engine. Se você incluir um modelo de instância na definição do job, será necessário usar esse método.

Montar GPUs em qualquer contêiner

Se um job incluir qualquer contêiner executável em que você queira usar GPUs, também será necessário ativar as GPUs em cada contêiner executável com base na imagem da VM do job:

Como criar um job que usa uma GPU

Nesta seção, fornecemos exemplos sobre como criar um job que usa uma GPU usando os métodos recomendados: o job instala automaticamente os drivers necessários e define os recursos que ele usa diretamente. Os jobs de exemplo com executáveis de contêiner também montam as GPUs nos contêineres. Você pode criar um job que use uma GPU usando a CLI gcloud ou a API Batch.

gcloud

Para adicionar uma GPU a um job, veja um dos seguintes exemplos com base nos tipos de executáveis que você quer usar:

Adicionar uma GPU a um job de contêiner

Para criar um job de contêiner com uma GPU que usa a imagem padrão usando a CLI gcloud, use o comando gcloud batch jobs submit.

Por exemplo, para criar um job de contêiner com uma GPU:

  1. Crie um arquivo JSON no diretório atual chamado hello-world-container-job-gpu.json com o seguinte conteúdo:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "container": {
                                "imageUri": "gcr.io/google_containers/cuda-vector-add:v0.1",
                                "volumes": [
                                    "/var/lib/nvidia/lib64:/usr/local/nvidia/lib64",
                                    "/var/lib/nvidia/bin:/usr/local/nvidia/bin"
                                ],
                                "options": "--privileged"
                            }
                        }
                    ],
                },
                "taskCount": 3,
                "parallelism": 1
            }
        ],
        "allocationPolicy": {
            "instances": [
                {
                    "installGpuDrivers": INSTALL_GPU_DRIVERS,
                    "policy": {
                        "machineType": "MACHINE_TYPE",
                        "accelerators": [
                            {
                                "type": "GPU_TYPE",
                                "count": GPU_COUNT
                            }
                        ]
                    }
                }
            ],
            "location": {
                "allowedLocations": [
                    "ALLOWED_LOCATIONS"
                ]
            }
        }
    }
    

    Substitua:

    • INSTALL_GPU_DRIVERS: opcional. Quando definido como true, o Batch busca os drivers necessários para o tipo de GPU que você especifica no campo policy a partir de um local de terceiros e o Batch os instala em seu nome. Se você definir esse campo como false (padrão), será necessário instalar drivers de GPU manualmente para usar qualquer GPU para esse job.
    • MACHINE_TYPE: o tipo de máquina, que pode ser predefinido ou personalizado, para as VMs do job. O tipo de máquina restringe o tipo de GPU que pode ser usado. Para criar um job com uma GPU, este campo é obrigatório.
    • GPU_TYPE: o tipo de GPU. É possível ver uma lista dos tipos de GPU disponíveis usando o comando gcloud compute accelerator-types list. Para criar um job com uma GPU, este campo é obrigatório.
    • GPU_COUNT: o número de GPUs do tipo especificado no campo type. Para criar um job com uma GPU, este campo é obrigatório.
    • ALLOWED_LOCATIONS: opcional. Os locais em que as instâncias de VM do job podem ser executadas (por exemplo, regions/us-central1, zones/us-central1-a permite a zona us-central1-a). Se você especificar um local permitido, selecione a região e, opcionalmente, uma ou mais zonas. Os locais escolhidos precisam ter o tipo de GPU desejado para esse job. Para mais informações, consulte o campo de matriz allowedLocations.
  2. Execute este comando:

    gcloud batch jobs submit example-job-gpu \
      --location us-central1 \
      --config hello-world-container-job-gpu.json
    

Adicionar uma GPU a um job de script

Para criar um job de script com uma GPU que use a imagem padrão usando a CLI gcloud, use o comando gcloud batch jobs submit.

Por exemplo, para criar um job de script com uma GPU:

  1. Crie um arquivo JSON no diretório atual chamado hello-world-script-job-gpu.json com o seguinte conteúdo:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "echo Hello world from task ${BATCH_TASK_INDEX}."
                            }
                        }
                    ]
                },
                "taskCount": 3,
                "parallelism": 1
            }
        ],
        "allocationPolicy": {
            "instances": [
                {
                    "installGpuDrivers": INSTALL_GPU_DRIVERS,
                    "policy": {
                        "machineType": "MACHINE_TYPE",
                        "accelerators":
                            {
                                "type": "GPU_TYPE",
                                "count": GPU_COUNT
                            }
                        ]
                    }
                }
            ],
            "location": {
                "allowedLocations": [
                    "ALLOWED_LOCATIONS"
                ]
            }
        }
    }
    

    Substitua:

    • INSTALL_GPU_DRIVERS: opcional. Quando definido como true, o Batch busca os drivers necessários para o tipo de GPU que você especifica no campo policy a partir de um local de terceiros e o Batch os instala em seu nome. Se você definir esse campo como false (padrão), será necessário instalar drivers de GPU manualmente para usar qualquer GPU para esse job.
    • MACHINE_TYPE: o tipo de máquina, que pode ser predefinido ou personalizado, para as VMs do job. O tipo de máquina restringe o tipo de GPU que pode ser usado. Para criar um job com uma GPU, este campo é obrigatório.
    • GPU_TYPE: o tipo de GPU. É possível ver uma lista dos tipos de GPU disponíveis usando o comando gcloud compute accelerator-types list. Para criar um job com uma GPU, este campo é obrigatório.
    • GPU_COUNT: o número de GPUs do tipo especificado no campo type. Para criar um job com uma GPU, este campo é obrigatório.
    • ALLOWED_LOCATIONS: opcional. Os locais em que as instâncias de VM do job podem ser executadas (por exemplo, regions/us-central1, zones/us-central1-a permite a zona us-central1-a). Se você especificar um local permitido, selecione a região e, opcionalmente, uma ou mais zonas. Os locais escolhidos precisam ter o tipo de GPU desejado para esse job. Para mais informações, consulte o campo de matriz allowedLocations.
  2. Execute este comando:

    gcloud batch jobs submit example-job-gpu \
      --location us-central1 \
      --config hello-world-script-job-gpu.json
    

Adicionar uma GPU a um contêiner e um job de script

Para criar um job de contêiner e script com uma GPU que usa a imagem padrão usando a CLI gcloud, use o comando gcloud batch jobs submit.

Por exemplo, para criar um contêiner e um job de script com uma GPU:

  1. Crie um arquivo JSON no diretório atual chamado hello-world-container-script-job-gpu.json com o seguinte conteúdo:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "container": {
                                "imageUri": "gcr.io/google_containers/cuda-vector-add:v0.1",
                                "options": "--gpus all"
                            }
                        },
                        {
                            "script": {
                                "text": "echo Hello world from script task ${BATCH_TASK_INDEX}."
                            }
                        }
                    ]
                },
                "taskCount": 3,
                "parallelism": 1
            }
        ],
        "allocationPolicy": {
            "instances": [
                {
                    "installGpuDrivers": INSTALL_GPU_DRIVERS,
                    "policy": {
                        "machineType": "MACHINE_TYPE",
                        "accelerators": [
                            {
                                "type": "GPU_TYPE",
                                "count": GPU_COUNT
                            }
                        ]
                    }
                }
            ],
            "location": {
                "allowedLocations": [
                    "ALLOWED_LOCATIONS"
                ]
            }
        }
    }
    

    Substitua:

    • INSTALL_GPU_DRIVERS: opcional. Quando definido como true, o Batch busca os drivers necessários para o tipo de GPU que você especifica no campo policy a partir de um local de terceiros e o Batch os instala em seu nome. Se você definir esse campo como false (padrão), será necessário instalar drivers de GPU manualmente para usar qualquer GPU para esse job.
    • MACHINE_TYPE: o tipo de máquina, que pode ser predefinido ou personalizado, para as VMs do job. O tipo de máquina restringe o tipo de GPU que pode ser usado. Para criar um job com uma GPU, este campo é obrigatório.
    • GPU_TYPE: o tipo de GPU. É possível ver uma lista dos tipos de GPU disponíveis usando o comando gcloud compute accelerator-types list. Para criar um job com uma GPU, este campo é obrigatório.
    • GPU_COUNT: o número de GPUs do tipo especificado no campo type. Para criar um job com uma GPU, este campo é obrigatório.
    • ALLOWED_LOCATIONS: opcional. Os locais em que as instâncias de VM do job podem ser executadas (por exemplo, regions/us-central1, zones/us-central1-a permite a zona us-central1-a). Se você especificar um local permitido, selecione a região e, opcionalmente, uma ou mais zonas. Os locais escolhidos precisam ter o tipo de GPU desejado para esse job. Para mais informações, consulte o campo de matriz allowedLocations.
  2. Execute este comando:

    gcloud batch jobs submit example-job-gpu \
      --location us-central1 \
      --config hello-world-container-script-job-gpu.json
    

API

Para adicionar uma GPU a um job, veja um dos seguintes exemplos com base nos tipos de executáveis que você quer usar:

Adicionar uma GPU a um job de contêiner

Para criar um job de contêiner com uma GPU que use a imagem padrão usando a API Batch, use o método jobs.create.

Por exemplo, para criar um job de contêiner com uma GPU, faça a seguinte solicitação:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/jobs?job_id=example-job-gpu

{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "container": {
                            "imageUri": "gcr.io/google_containers/cuda-vector-add:v0.1",
                            "volumes": [
                                "/var/lib/nvidia/lib64:/usr/local/nvidia/lib64",
                                "/var/lib/nvidia/bin:/usr/local/nvidia/bin"
                            ],
                            "options": "--privileged"
                        }
                    }
                ],
            },
            "taskCount": 3,
            "parallelism": 1
        }
    ],
    "allocationPolicy": {
        "instances": [
            {
                "installGpuDrivers": INSTALL_GPU_DRIVERS,
                "policy": {
                    "machineType": "MACHINE_TYPE",
                    "accelerators": [
                        {
                            "type": "GPU_TYPE",
                            "count": GPU_COUNT
                        }
                    ]
                }
            }
        ],
        "location": {
            "allowedLocations": [
                "ALLOWED_LOCATIONS"
            ]
        }
    }
}

Substitua:

  • PROJECT_ID: o ID do projeto.
  • INSTALL_GPU_DRIVERS: opcional. Quando definido como true, o Batch busca os drivers necessários para o tipo de GPU que você especifica no campo policy a partir de um local de terceiros e o Batch os instala em seu nome. Se você definir esse campo como false (padrão), será necessário instalar drivers de GPU manualmente para usar qualquer GPU para esse job.
  • MACHINE_TYPE: o tipo de máquina, que pode ser predefinido ou personalizado, para as VMs do job. O tipo de máquina restringe o tipo de GPU que pode ser usado. Para criar um job com uma GPU, este campo é obrigatório.
  • GPU_TYPE: o tipo de GPU. É possível ver uma lista dos tipos de GPU disponíveis usando o comando gcloud compute accelerator-types list. Para criar um job com uma GPU, este campo é obrigatório.
  • GPU_COUNT: o número de GPUs do tipo especificado no campo type. Para criar um job com uma GPU, este campo é obrigatório.
  • ALLOWED_LOCATIONS: opcional. Os locais em que as instâncias de VM do job podem ser executadas (por exemplo, regions/us-central1, zones/us-central1-a permite a zona us-central1-a). Se você especificar um local permitido, selecione a região e, opcionalmente, uma ou mais zonas. Os locais escolhidos precisam ter o tipo de GPU desejado para esse job. Para mais informações, consulte o campo de matriz allowedLocations.

Adicionar uma GPU a um job de script

Para criar um job de script com uma GPU que use a imagem padrão usando a API em lote, use o método jobs.create.

Por exemplo, para criar um job de script com uma GPU, faça a seguinte solicitação:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/jobs?job_id=example-job-gpu

{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "script": {
                            "text": "echo Hello world from task ${BATCH_TASK_INDEX}."
                        }
                    }
                ]
            },
            "taskCount": 3,
            "parallelism": 1
        }
    ],
    "allocationPolicy": {
        "instances": [
            {
                "installGpuDrivers": INSTALL_GPU_DRIVERS,
                "policy": {
                    "machineType": "MACHINE_TYPE",
                    "accelerators": [
                        {
                            "type": "GPU_TYPE",
                            "count": GPU_COUNT
                        }
                    ]
                }
            }
        ],
        "location": {
            "allowedLocations": [
                "ALLOWED_LOCATIONS"
            ]
        }
    }
}

Substitua:

  • PROJECT_ID: o ID do projeto.
  • INSTALL_GPU_DRIVERS: opcional. Quando definido como true, o Batch busca os drivers necessários para o tipo de GPU que você especifica no campo policy a partir de um local de terceiros e o Batch os instala em seu nome. Se você definir esse campo como false (padrão), será necessário instalar drivers de GPU manualmente para usar qualquer GPU para esse job.
  • MACHINE_TYPE: o tipo de máquina, que pode ser predefinido ou personalizado, para as VMs do job. O tipo de máquina restringe o tipo de GPU que pode ser usado. Para criar um job com uma GPU, este campo é obrigatório.
  • GPU_TYPE: o tipo de GPU. É possível ver uma lista dos tipos de GPU disponíveis usando o comando gcloud compute accelerator-types list. Para criar um job com uma GPU, este campo é obrigatório.
  • GPU_COUNT: o número de GPUs do tipo especificado no campo type. Para criar um job com uma GPU, este campo é obrigatório.
  • ALLOWED_LOCATIONS: opcional. Os locais em que as instâncias de VM do job podem ser executadas (por exemplo, regions/us-central1, zones/us-central1-a permite a zona us-central1-a). Se você especificar um local permitido, selecione a região e, opcionalmente, uma ou mais zonas. Os locais escolhidos precisam ter o tipo de GPU desejado para esse job. Para mais informações, consulte o campo de matriz allowedLocations.

Adicionar uma GPU a um contêiner e um job de script

Para criar um job de contêiner e script com uma GPU que usa a imagem padrão usando a API Batch, use o método jobs.create.

Por exemplo, para criar um job de contêiner e script com uma GPU, faça a seguinte solicitação:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/jobs?job_id=example-job-gpu

{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "container": {
                            "imageUri": "gcr.io/google_containers/cuda-vector-add:v0.1",
                            "options": "--gpus all"
                        }
                    },
                    {
                        "script": {
                            "text": "echo Hello world from script task ${BATCH_TASK_INDEX}."
                        }
                    }
                ]
            },
            "taskCount": 3,
            "parallelism": 1
        }
    ],
    "allocationPolicy": {
        "instances": [
            {
                "installGpuDrivers": INSTALL_GPU_DRIVERS,
                "policy": {
                    "machineType": "MACHINE_TYPE",
                    "accelerators": [
                        {
                            "type": "GPU_TYPE",
                            "count": GPU_COUNT
                        }
                    ]
                }
            }
        ],
        "location": {
            "allowedLocations": [
                "ALLOWED_LOCATIONS"
            ]
        }
    }
}

Substitua:

  • PROJECT_ID: o ID do projeto.
  • INSTALL_GPU_DRIVERS: opcional. Quando definido como true, o Batch busca os drivers necessários para o tipo de GPU que você especifica no campo policy a partir de um local de terceiros e o Batch os instala em seu nome. Se você definir esse campo como false (padrão), será necessário instalar drivers de GPU manualmente para usar qualquer GPU para esse job.
  • MACHINE_TYPE: o tipo de máquina, que pode ser predefinido ou personalizado, para as VMs do job. O tipo de máquina restringe o tipo de GPU que pode ser usado. Para criar um job com uma GPU, este campo é obrigatório.
  • GPU_TYPE: o tipo de GPU. É possível ver uma lista dos tipos de GPU disponíveis usando o comando gcloud compute accelerator-types list. Para criar um job com uma GPU, este campo é obrigatório.
  • GPU_COUNT: o número de GPUs do tipo especificado no campo type. Para criar um job com uma GPU, este campo é obrigatório.
  • ALLOWED_LOCATIONS: opcional. Os locais em que as instâncias de VM do job podem ser executadas (por exemplo, regions/us-central1, zones/us-central1-a permite a zona us-central1-a). Se você especificar um local permitido, selecione a região e, opcionalmente, uma ou mais zonas. Os locais escolhidos precisam ter o tipo de GPU desejado para esse job. Para mais informações, consulte o campo de matriz allowedLocations.

A seguir