Crea y ejecuta un trabajo que use GPUs

En este documento, se explica cómo crear y ejecutar una tarea que use una unidad de procesamiento de gráficos (GPU). Para obtener más información sobre las funciones y las restricciones de las GPUs, consulta Acerca de las GPUs en la documentación de Compute Engine.

Cuando creas un trabajo por lotes, puedes usar GPUs de forma opcional para acelerar cargas de trabajo específicas. Los casos de uso comunes para las tareas que usan GPUs incluyen el procesamiento intensivo de datos y las cargas de trabajo de inteligencia artificial (IA), como el aprendizaje automático (AA).

Antes de comenzar

  1. Si nunca usaste Batch, consulta Cómo comenzar a usar Batch y habilita Batch completando los requisitos previos para proyectos y usuarios.
  2. Para obtener los permisos que necesitas para crear un trabajo, pídele a tu administrador que te otorgue los siguientes roles de IAM:

    Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

    También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.

Crea un trabajo que use GPUs

Para crear un trabajo que use GPUs, haz lo siguiente:

  1. Planifica los requisitos de un trabajo que use GPUs.
  2. Crea un trabajo con los requisitos y métodos que identificaste. Para ver ejemplos de cómo crear un trabajo con las opciones recomendadas, consulta Cómo crear un trabajo de ejemplo que use GPUs en este documento.

Planifica los requisitos de un trabajo que use GPUs

Antes de crear un trabajo que use GPUs, planifica los requisitos del trabajo como se explica en las siguientes secciones:

  1. Selecciona el tipo de máquina de GPU y el método de aprovisionamiento
  2. Instala los controladores de GPU
  3. Define los recursos de VM compatibles

Paso 1: Selecciona el tipo de máquina de GPU y el método de aprovisionamiento

Los requisitos de un trabajo varían según el tipo de máquina de GPU y el método de aprovisionamiento que prefieras, y las opciones de cada uno pueden ser interdependientes. Según tus requisitos y prioridades, puedes seleccionar primero el tipo de máquina de GPU o el método de aprovisionamiento. En general, el tipo de máquina de GPU afecta principalmente el rendimiento y los precios base, y el método de aprovisionamiento afecta principalmente la disponibilidad de recursos y los costos o descuentos adicionales.

Selecciona el tipo de máquina de GPU

Los tipos de máquinas de GPU disponibles (las combinaciones válidas de tipo de GPU, cantidad de GPUs y tipo de máquina [CPUs virtuales y memoria]) y sus casos de uso se enumeran en la página Tipos de máquinas de GPU de la documentación de Compute Engine.

Los campos necesarios para que un trabajo especifique un tipo de máquina de GPU varían según las categorías de la siguiente tabla:

Tipos de máquinas de GPU y sus requisitos de trabajo

GPUs para VMs optimizadas para aceleradores: Las VMs con un tipo de máquina de la familia de máquinas optimizadas para aceleradores tienen un tipo y una cantidad específicos de estas GPUs conectadas automáticamente.

Para usar GPUs en VMs optimizadas para aceleradores, te recomendamos que especifiques el tipo de máquina. Cada tipo de máquina optimizada para aceleradores solo admite un tipo y una cantidad específicos de GPUs, por lo que es funcionalmente equivalente, ya sea que especifiques esos valores o no, además del tipo de máquina optimizada para aceleradores.

Específicamente, Batch también admite especificar solo el tipo y la cantidad de GPUs para las VMs optimizadas para aceleradores, pero las opciones de CPU virtual y memoria resultantes suelen ser muy limitadas. Como resultado, te recomendamos que verifiques que las opciones de vCPU y memoria disponibles sean compatibles con los requisitos de la tarea del trabajo.

GPU para VMs N1: Estas GPU requieren que especifiques el tipo y la cantidad que se conectará a cada VM, y deben conectarse a VMs con un tipo de máquina de la serie de máquinas N1.

Para usar GPUs en VMs N1, te recomendamos que especifiques, al menos, el tipo y la cantidad de GPUs. Asegúrate de que la combinación de valores coincida con una de las opciones de GPU válidas para los tipos de máquinas N1. Las opciones de CPU virtual y memoria para las VMs N1 que usan cualquier tipo y cantidad de GPUs específicas son bastante flexibles. A menos que crees el trabajo con la consola de Google Cloud, puedes permitir que Batch seleccione automáticamente un tipo de máquina que cumpla con los requisitos de la tarea.

Selecciona el método de aprovisionamiento

Batch usa diferentes métodos para aprovisionar los recursos de la VM para trabajos que usan GPUs según el tipo de recursos que solicita tu trabajo. En la siguiente tabla, se explican los métodos de aprovisionamiento disponibles y sus requisitos, que se enumeran según sus casos de uso: de la disponibilidad de recursos más alta a la más baja.

En resumen, recomendamos que la mayoría de los usuarios hagan lo siguiente:

  • Cuando quieras usar tipos de máquinas de GPU A3 sin una reserva, usa el programador dinámico de cargas de trabajo para lotes (versión preliminar).

  • Para todos los demás tipos de máquinas de GPU, usa el método de aprovisionamiento predeterminado. El método de aprovisionamiento predeterminado suele ser on demand. Una excepción es si tu proyecto tiene reservas sin usar que la tarea puede consumir automáticamente.

Métodos de aprovisionamiento y sus requisitos de trabajo

Reservas

  • Caso de uso: Te recomendamos que reserves trabajos si deseas un nivel muy alto de garantía de disponibilidad de recursos o si ya tienes reservas existentes que podrían no usarse.

  • Detalles: Una reserva incurre en los costos de las VMs especificadas al mismo precio que ejecutarlas hasta que borres la reserva. Las VMs que consumen una reserva no generan costos independientes, pero las reservas generan costos independientemente del consumo.

Por lotes, se usan reservas para trabajos que pueden consumir reservas sin usar. Para obtener más información sobre las reservas y sus requisitos, consulta la página Cómo garantizar la disponibilidad de recursos con reservas de VM.

Programador de cargas de trabajo dinámico para por lotes (Versión preliminar)

  • Caso de uso: Te recomendamos que uses el programador dinámico de cargas de trabajo si deseas usar GPUs para VMs con un tipo de máquina de la serie de máquinas A3 sin consumir una reserva.

  • Detalles: El programador de cargas de trabajo dinámico puede facilitar el acceso simultáneo a muchos recursos que aceleran las cargas de trabajo de IA y AA. Por ejemplo, el programador de cargas de trabajo dinámico puede ser útil para la programación de trabajos, ya que mitiga las demoras o los problemas que se producen por la no disponibilidad de recursos.

Por lotes, usa el programador dinámico de cargas de trabajo para los trabajos que realizan lo siguiente:

  • Especifica un tipo de máquina de GPU A3.
  • Bloquear reservas Específicamente, el trabajo debe configurar el campo reservation como NO_RESERVATION. Para obtener más información, consulta Crea y ejecuta un trabajo que no pueda consumir VMs reservadas.
  • No uses VMs Spot. Específicamente, la tarea puede omitir el campo provisioningModel o establecerlo en STANDARD.provisioningModel

A pedido

  • Caso de uso: Recomendamos la opción on demand para todos los demás trabajos.

  • Detalles: Por lo general, la forma predeterminada de acceder a las VMs de Compute Engine es a pedido. La opción On demand te permite solicitar recursos y acceder a ellos de inmediato (si están disponibles) una VM a la vez.

Batch usa el modo bajo demanda para todos los demás trabajos.

VMs Spot

  • Caso de uso: Te recomendamos que intentes usar VMs Spot para reducir los costos de las cargas de trabajo tolerantes a errores.

  • Detalles: Las VMs Spot proporcionan descuentos significativos, pero es posible que no siempre estén disponibles y se puedan interrumpir en cualquier momento. Para obtener más información, consulta VMs Spot en la documentación de Compute Engine.

Batch usa VMs Spot para los trabajos que establecen el campo provisioningModel en SPOT.

Paso 2: Instala los controladores de GPU

Para usar GPUs en un trabajo, debes instalar los controladores de GPU. Para instalar los controladores de GPU, selecciona uno de los siguientes métodos:

Paso 3: Define los recursos de VM compatibles

Para obtener información sobre los requisitos y las opciones para definir los recursos de VM de un trabajo, consulta Recursos de trabajo.

En resumen, debes hacer todo lo siguiente cuando definas los recursos de VM para un trabajo que use GPUs:

  • Asegúrate de que el tipo de máquina de GPU esté disponible en la ubicación de las VMs de tu trabajo.

    Para obtener información sobre dónde están disponibles los tipos de máquinas con GPU, consulta Disponibilidad de GPU por regiones y zonas en la documentación de Compute Engine.

  • Si especificas el tipo de máquina del trabajo, asegúrate de que tenga suficientes CPU y memoria para los requisitos de la tarea del trabajo. Especificar el tipo de máquina del trabajo es obligatorio cuando creas un trabajo con la consola de Google Cloud y se recomienda cuando creas un trabajo que usa GPUs para VMs optimizadas para aceleradores.

  • Asegúrate de definir los recursos de la VM para un trabajo con un método válido:

    • Define los recursos de la VM directamente con el campo instances[].policy (recomendado si es posible). Este método se muestra en los ejemplos.
    • Define los recursos de la VM a través de una plantilla con el campo instances[].instanceTemplate. Este método es obligatorio para instalar controladores de GPU de forma manual a través de una imagen personalizada. Para obtener más información, consulta Define los recursos de trabajo con una plantilla de instancia de VM.

Crea un trabajo de ejemplo que use GPUs

En las siguientes secciones, se explica cómo crear un trabajo de ejemplo para cada tipo de máquina de GPU con las opciones recomendadas. Específicamente, todos los trabajos de ejemplo instalan los controladores de GPU automáticamente, definen directamente los recursos de la VM y especifican el método de aprovisionamiento o usan el método de aprovisionamiento predeterminado.

Usa GPUs para VMs A3 a través del programador dinámico de cargas de trabajo para por lotes (versión preliminar)

Puedes crear un trabajo que use GPUs para VMs A3 a través del programador de cargas de trabajo dinámico con la CLI de gcloud o la API de Batch.

gcloud

  1. Crea un archivo JSON que instale controladores de GPU, especifique un tipo de máquina de la serie de máquinas A3, bloquee las reservas y se ejecute en una ubicación que tenga el tipo de máquina de GPU.

    Por ejemplo, para crear una tarea de secuencia de comandos básica que use GPUs para VMs A3 a través del programador de cargas de trabajo dinámico, crea un archivo JSON con el siguiente contenido:

    {
        "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",
                        "reservation": "NO_RESERVATION"
                    }
                }
            ],
            "location": {
                "allowedLocations": [
                    "ALLOWED_LOCATIONS"
                ]
            }
        },
        "logsPolicy": {
            "destination": "CLOUD_LOGGING"
        }
    }
    

    Reemplaza lo siguiente:

    • INSTALL_GPU_DRIVERS: Cuando se establece en true, Batch recupera los controladores necesarios para el tipo de GPU que especificas en el campo policy desde una ubicación de terceros y los instala en tu nombre. Si estableces este campo en false (configuración predeterminada), debes instalar los controladores de GPU de forma manual para usar cualquier GPU en este trabajo.

    • MACHINE_TYPE: Un tipo de máquina de la serie de máquinas A3.

    • ALLOWED_LOCATIONS: De manera opcional, puedes usar el campo allowedLocations[] para especificar una región o zonas específicas en una región en la que las VMs de tu trabajo pueden ejecutarse. Por ejemplo, regions/us-central1 permite todas las zonas de la región us-central1. Asegúrate de especificar las ubicaciones que ofrecen el tipo de máquina de GPU que deseas para este trabajo. De lo contrario, si omites este campo, asegúrate de que la ubicación del trabajo ofrezca el tipo de máquina de GPU.

  2. Para crear y ejecutar la tarea, usa el comando gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
    

    Reemplaza lo siguiente:

    • JOB_NAME: Es el nombre del trabajo.

    • LOCATION: Es la ubicación del trabajo.

    • JSON_CONFIGURATION_FILE: Es la ruta de acceso a un archivo JSON con los detalles de configuración de la tarea.

API

Realiza una solicitud POST al método jobs.create que instale controladores de GPU, especifique un tipo de máquina de la serie de máquinas A3, bloquee las reservas y se ejecute en una ubicación que tenga el tipo de máquina de GPU.

Por ejemplo, para crear un trabajo de secuencia de comandos básico que use GPUs para VMs A3 a través del programador de cargas de trabajo dinámico, realiza la siguiente solicitud:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
    "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",
                    "reservation": "NO_RESERVATION"
                }
            }
        ],
        "location": {
            "allowedLocations": [
                "ALLOWED_LOCATIONS"
            ]
        }
    },
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto de tu proyecto.

  • LOCATION: Es la ubicación del trabajo.

  • JOB_NAME: Es el nombre del trabajo.

  • INSTALL_GPU_DRIVERS: Cuando se establece en true, Batch recupera los controladores necesarios para el tipo de GPU que especificas en el campo policy desde una ubicación de terceros y los instala en tu nombre. Si estableces este campo en false (configuración predeterminada), debes instalar los controladores de GPU de forma manual para usar cualquier GPU en este trabajo.

  • MACHINE_TYPE: Un tipo de máquina de la serie de máquinas A3.

  • ALLOWED_LOCATIONS: De manera opcional, puedes usar el campo allowedLocations[] para especificar una región o zonas específicas en una región en la que las VMs de tu trabajo pueden ejecutarse. Por ejemplo, regions/us-central1 permite todas las zonas de la región us-central1. Asegúrate de especificar las ubicaciones que ofrecen el tipo de máquina de GPU que deseas para este trabajo. De lo contrario, si omites este campo, asegúrate de que la ubicación del trabajo ofrezca el tipo de máquina de GPU.

Usa GPUs para VMs optimizadas para aceleradores

Puedes crear un trabajo que use GPUs para VMs optimizadas para aceleradores con la consola de Google Cloud, gcloud CLI, la API de Batch, Java, Node.js o Python.

Console

Para crear un trabajo que use GPUs con la consola de Google Cloud, sigue estos pasos:

  1. En la consola de Google Cloud, ve a la página Lista de trabajos.

    Ir a la lista de trabajos

  2. Haz clic en Crear. Se abrirá la página Create batch job. En el panel izquierdo, se selecciona la página Detalles del trabajo.

  3. Configura la página Detalles del trabajo:

    1. Opcional: En el campo Nombre del trabajo, personaliza el nombre del trabajo.

      Por ejemplo, ingresa example-gpu-job.

    2. Configura la sección Detalles de la tarea:

      1. En la ventana Nuevo ejecutable, agrega al menos una secuencia de comandos o un contenedor para que se ejecute esta tarea.

        Por ejemplo, para crear un trabajo de secuencia de comandos básico, haz lo siguiente:

        1. Selecciona la casilla de verificación Secuencia de comandos. Aparecerá un campo.

        2. En el campo, ingresa la siguiente secuencia de comandos:

          echo Hello world from task ${BATCH_TASK_INDEX}.
          
        3. Haz clic en Listo.

      2. En el campo Task count, ingresa la cantidad de tareas para este trabajo.

        Por ejemplo, ingresa 3.

      3. Opcional: En el campo Paralelismo, ingresa la cantidad de tareas que se ejecutarán de forma simultánea.

        Por ejemplo, ingresa 1 (predeterminado).

  4. Configura la página Especificaciones de recursos:

    1. En el panel izquierdo, haz clic en Especificaciones de recursos. Se abrirá la página Especificaciones de recursos.

    2. Opcional: En la sección Modelo de aprovisionamiento de VMs, selecciona una de las siguientes opciones para el modelo de aprovisionamiento de las VMs de esta tarea:

      • Si tu trabajo puede soportar la preempción y deseas obtener VMs con descuento, selecciona Spot.

      • De lo contrario, selecciona Estándar (predeterminada).

    3. Selecciona la ubicación para este trabajo.

      1. En el campo Región, selecciona una región.

      2. En el campo Zona, realiza una de las siguientes acciones:

        • Si deseas restringir esta tarea para que se ejecute solo en una zona específica, selecciona una.

        • De lo contrario, selecciona cualquiera (predeterminado).

    4. Selecciona el tipo de máquina de GPU para las VMs de este trabajo:

      1. En las opciones de familia de máquinas, haz clic en GPUs.

      2. En el campo Tipo de GPU, selecciona el tipo de GPU. Luego, en el campo Cantidad de GPU, selecciona la cantidad de GPU para cada VM.

        Si seleccionaste uno de los tipos de GPU para VMs optimizadas para acelerador, el campo Tipo de máquina solo permite una opción para el tipo de máquina según el tipo y la cantidad de GPUs que seleccionaste.

      3. Para instalar automáticamente los controladores de GPU, selecciona Instalación de controladores de GPU (opción predeterminada).

    5. Configura la cantidad de recursos de VM necesarios para cada tarea:

      1. En el campo Núcleos, ingresa la cantidad de CPU virtuales por tarea.

        Por ejemplo, ingresa 1 (predeterminado).

      2. En el campo Memoria, ingresa la cantidad de RAM en GB por tarea.

        Por ejemplo, ingresa 0.5 (predeterminado).

    6. Haz clic en Listo.

  5. Opcional: Configura los otros campos para este trabajo.

  6. Opcional: Para revisar la configuración del trabajo, haz clic en Obtener vista previa en el panel izquierdo.

  7. Haz clic en Crear.

    En la página Detalles del trabajo, se muestra el trabajo que creaste.

gcloud

  1. Crea un archivo JSON que instale controladores de GPU, especifique un tipo de máquina de la familia de máquinas optimizadas para aceleradores y se ejecute en una ubicación que tenga el tipo de máquina de GPU.

    Por ejemplo, para crear una tarea de secuencia de comandos básica que use GPUs para VMs optimizadas para aceleradores, crea un archivo JSON con el siguiente contenido:

    {
        "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"
                    }
                }
            ],
            "location": {
                "allowedLocations": [
                    "ALLOWED_LOCATIONS"
                ]
            }
        },
        "logsPolicy": {
            "destination": "CLOUD_LOGGING"
        }
    }
    

    Reemplaza lo siguiente:

    • INSTALL_GPU_DRIVERS: Cuando se establece en true, Batch recupera los controladores necesarios para el tipo de GPU que especificas en el campo policy desde una ubicación de terceros y los instala en tu nombre. Si estableces este campo en false (configuración predeterminada), debes instalar los controladores de GPU de forma manual para usar cualquier GPU en este trabajo.

    • MACHINE_TYPE: Es un tipo de máquina de la familia de máquinas con optimización de acelerador.

    • ALLOWED_LOCATIONS: De manera opcional, puedes usar el campo allowedLocations[] para especificar una región o zonas específicas en una región en la que las VMs de tu trabajo pueden ejecutarse. Por ejemplo, regions/us-central1 permite todas las zonas de la región us-central1. Asegúrate de especificar las ubicaciones que ofrecen el tipo de máquina de GPU que deseas para este trabajo. De lo contrario, si omites este campo, asegúrate de que la ubicación del trabajo ofrezca el tipo de máquina de GPU.

  2. Para crear y ejecutar la tarea, usa el comando gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
    

    Reemplaza lo siguiente:

    • JOB_NAME: Es el nombre del trabajo.

    • LOCATION: Es la ubicación del trabajo.

    • JSON_CONFIGURATION_FILE: Es la ruta de acceso a un archivo JSON con los detalles de configuración de la tarea.

API

Realiza una solicitud POST al método jobs.create que instale controladores de GPU, especifique un tipo de máquina de la familia de máquinas optimizadas para aceleradores y se ejecute en una ubicación que tenga el tipo de máquina de GPU.

Por ejemplo, para crear un trabajo de secuencia de comandos básico que use GPUs para VMs optimizadas para aceleradores, realiza la siguiente solicitud:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
    "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"
                }
            }
        ],
        "location": {
            "allowedLocations": [
                "ALLOWED_LOCATIONS"
            ]
        }
    },
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto de tu proyecto.

  • LOCATION: Es la ubicación del trabajo.

  • JOB_NAME: Es el nombre del trabajo.

  • INSTALL_GPU_DRIVERS: Cuando se establece en true, Batch recupera los controladores necesarios para el tipo de GPU que especificas en el campo policy desde una ubicación de terceros y los instala en tu nombre. Si estableces este campo en false (configuración predeterminada), debes instalar los controladores de GPU de forma manual para usar cualquier GPU en este trabajo.

  • MACHINE_TYPE: Es un tipo de máquina de la familia de máquinas con optimización de acelerador.

  • ALLOWED_LOCATIONS: De manera opcional, puedes usar el campo allowedLocations[] para especificar una región o zonas específicas en una región en la que las VMs de tu trabajo pueden ejecutarse. Por ejemplo, regions/us-central1 permite todas las zonas de la región us-central1. Asegúrate de especificar las ubicaciones que ofrecen el tipo de máquina de GPU que deseas para este trabajo. De lo contrario, si omites este campo, asegúrate de que la ubicación del trabajo ofrezca el tipo de máquina de GPU.

Java


import com.google.cloud.batch.v1.AllocationPolicy;
import com.google.cloud.batch.v1.AllocationPolicy.Accelerator;
import com.google.cloud.batch.v1.AllocationPolicy.InstancePolicy;
import com.google.cloud.batch.v1.AllocationPolicy.InstancePolicyOrTemplate;
import com.google.cloud.batch.v1.BatchServiceClient;
import com.google.cloud.batch.v1.CreateJobRequest;
import com.google.cloud.batch.v1.Job;
import com.google.cloud.batch.v1.LogsPolicy;
import com.google.cloud.batch.v1.Runnable;
import com.google.cloud.batch.v1.Runnable.Script;
import com.google.cloud.batch.v1.TaskGroup;
import com.google.cloud.batch.v1.TaskSpec;
import com.google.protobuf.Duration;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateGpuJob {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";
    // Name of the region you want to use to run the job. Regions that are
    // available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
    String region = "europe-central2";
    // The name of the job that will be created.
    // It needs to be unique for each project and region pair.
    String jobName = "JOB_NAME";
    // Optional. When set to true, Batch fetches the drivers required for the GPU type
    // that you specify in the policy field from a third-party location,
    // and Batch installs them on your behalf. If you set this field to false (default),
    // you need to install GPU drivers manually to use any GPUs for this job.
    boolean installGpuDrivers = false;
    // Accelerator-optimized machine types are available to Batch jobs. See the list
    // of available types on: https://cloud.google.com/compute/docs/accelerator-optimized-machines
    String machineType = "g2-standard-4";

    createGpuJob(projectId, region, jobName, installGpuDrivers, machineType);
  }

  // Create a job that uses GPUs
  public static Job createGpuJob(String projectId, String region, String jobName,
                                  boolean installGpuDrivers, String machineType)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (BatchServiceClient batchServiceClient = BatchServiceClient.create()) {
      // Define what will be done as part of the job.
      Runnable runnable =
          Runnable.newBuilder()
              .setScript(
                  Script.newBuilder()
                      .setText(
                          "echo Hello world! This is task ${BATCH_TASK_INDEX}. "
                                  + "This job has a total of ${BATCH_TASK_COUNT} tasks.")
                      // You can also run a script from a file. Just remember, that needs to be a
                      // script that's already on the VM that will be running the job.
                      // Using setText() and setPath() is mutually exclusive.
                      // .setPath("/tmp/test.sh")
                      .build())
              .build();

      TaskSpec task = TaskSpec.newBuilder()
                  // Jobs can be divided into tasks. In this case, we have only one task.
                  .addRunnables(runnable)
                  .setMaxRetryCount(2)
                  .setMaxRunDuration(Duration.newBuilder().setSeconds(3600).build())
                  .build();

      // Tasks are grouped inside a job using TaskGroups.
      // Currently, it's possible to have only one task group.
      TaskGroup taskGroup = TaskGroup.newBuilder()
          .setTaskCount(3)
          .setParallelism(1)
          .setTaskSpec(task)
          .build();

      // Policies are used to define on what kind of virtual machines the tasks will run.
      // Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
      InstancePolicy instancePolicy =
          InstancePolicy.newBuilder().setMachineType(machineType).build();  

      // Policies are used to define on what kind of virtual machines the tasks will run on.
      AllocationPolicy allocationPolicy =
          AllocationPolicy.newBuilder()
              .addInstances(
                  InstancePolicyOrTemplate.newBuilder()
                      .setInstallGpuDrivers(installGpuDrivers)
                      .setPolicy(instancePolicy)
                      .build())
              .build();

      Job job =
          Job.newBuilder()
              .addTaskGroups(taskGroup)
              .setAllocationPolicy(allocationPolicy)
              .putLabels("env", "testing")
              .putLabels("type", "script")
              // We use Cloud Logging as it's an out of the box available option.
              .setLogsPolicy(
                  LogsPolicy.newBuilder().setDestination(LogsPolicy.Destination.CLOUD_LOGGING))
              .build();

      CreateJobRequest createJobRequest =
          CreateJobRequest.newBuilder()
              // The job's parent is the region in which the job will run.
              .setParent(String.format("projects/%s/locations/%s", projectId, region))
              .setJob(job)
              .setJobId(jobName)
              .build();

      Job result =
          batchServiceClient
              .createJobCallable()
              .futureCall(createJobRequest)
              .get(5, TimeUnit.MINUTES);

      System.out.printf("Successfully created the job: %s", result.getName());

      return result;
    }
  }
}

Node.js

// Imports the Batch library
const batchLib = require('@google-cloud/batch');
const batch = batchLib.protos.google.cloud.batch.v1;

// Instantiates a client
const batchClient = new batchLib.v1.BatchServiceClient();

/**
 * TODO(developer): Update these variables before running the sample.
 */
// Project ID or project number of the Google Cloud project you want to use.
const projectId = await batchClient.getProjectId();
// Name of the region you want to use to run the job. Regions that are
// available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
const region = 'europe-central2';
// The name of the job that will be created.
// It needs to be unique for each project and region pair.
const jobName = 'batch-gpu-job';
// The GPU type. You can view a list of the available GPU types
// by using the `gcloud compute accelerator-types list` command.
const gpuType = 'nvidia-l4';
// The number of GPUs of the specified type.
const gpuCount = 1;
// Optional. When set to true, Batch fetches the drivers required for the GPU type
// that you specify in the policy field from a third-party location,
// and Batch installs them on your behalf. If you set this field to false (default),
// you need to install GPU drivers manually to use any GPUs for this job.
const installGpuDrivers = false;
// Accelerator-optimized machine types are available to Batch jobs. See the list
// of available types on: https://cloud.google.com/compute/docs/accelerator-optimized-machines
const machineType = 'g2-standard-4';

// Define what will be done as part of the job.
const runnable = new batch.Runnable({
  script: new batch.Runnable.Script({
    commands: ['-c', 'echo Hello world! This is task ${BATCH_TASK_INDEX}.'],
  }),
});

const task = new batch.TaskSpec({
  runnables: [runnable],
  maxRetryCount: 2,
  maxRunDuration: {seconds: 3600},
});

// Tasks are grouped inside a job using TaskGroups.
const group = new batch.TaskGroup({
  taskCount: 3,
  taskSpec: task,
});

// Policies are used to define on what kind of virtual machines the tasks will run on.
// In this case, we tell the system to use "g2-standard-4" machine type.
// Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
const instancePolicy = new batch.AllocationPolicy.InstancePolicy({
  machineType,
  // Accelerator describes Compute Engine accelerators to be attached to the VM
  accelerators: [
    new batch.AllocationPolicy.Accelerator({
      type: gpuType,
      count: gpuCount,
      installGpuDrivers,
    }),
  ],
});

const allocationPolicy = new batch.AllocationPolicy.InstancePolicyOrTemplate({
  instances: [{installGpuDrivers, policy: instancePolicy}],
});

const job = new batch.Job({
  name: jobName,
  taskGroups: [group],
  labels: {env: 'testing', type: 'script'},
  allocationPolicy,
  // We use Cloud Logging as it's an option available out of the box
  logsPolicy: new batch.LogsPolicy({
    destination: batch.LogsPolicy.Destination.CLOUD_LOGGING,
  }),
});
// The job's parent is the project and region in which the job will run
const parent = `projects/${projectId}/locations/${region}`;

async function callCreateBatchGPUJob() {
  // Construct request
  const request = {
    parent,
    jobId: jobName,
    job,
  };

  // Run request
  const [response] = await batchClient.createJob(request);
  console.log(JSON.stringify(response));
}

await callCreateBatchGPUJob();

Python

from google.cloud import batch_v1


def create_gpu_job(project_id: str, region: str, job_name: str) -> batch_v1.Job:
    """
    This method shows how to create a sample Batch Job that will run
    a simple command on Cloud Compute instances on GPU machines.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        region: name of the region you want to use to run the job. Regions that are
            available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
        job_name: the name of the job that will be created.
            It needs to be unique for each project and region pair.

    Returns:
        A job object representing the job created.
    """
    client = batch_v1.BatchServiceClient()

    # Define what will be done as part of the job.
    task = batch_v1.TaskSpec()
    runnable = batch_v1.Runnable()
    runnable.script = batch_v1.Runnable.Script()
    runnable.script.text = "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
    # You can also run a script from a file. Just remember, that needs to be a script that's
    # already on the VM that will be running the job. Using runnable.script.text and runnable.script.path is mutually
    # exclusive.
    # runnable.script.path = '/tmp/test.sh'
    task.runnables = [runnable]

    # We can specify what resources are requested by each task.
    resources = batch_v1.ComputeResource()
    resources.cpu_milli = 2000  # in milliseconds per cpu-second. This means the task requires 2 whole CPUs.
    resources.memory_mib = 16  # in MiB
    task.compute_resource = resources

    task.max_retry_count = 2
    task.max_run_duration = "3600s"

    # Tasks are grouped inside a job using TaskGroups.
    # Currently, it's possible to have only one task group.
    group = batch_v1.TaskGroup()
    group.task_count = 4
    group.task_spec = task

    # Policies are used to define on what kind of virtual machines the tasks will run on.
    # In this case, we tell the system to use "g2-standard-4" machine type.
    # Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
    policy = batch_v1.AllocationPolicy.InstancePolicy()
    policy.machine_type = "g2-standard-4"

    instances = batch_v1.AllocationPolicy.InstancePolicyOrTemplate()
    instances.policy = policy
    instances.install_gpu_drivers = True
    allocation_policy = batch_v1.AllocationPolicy()
    allocation_policy.instances = [instances]

    job = batch_v1.Job()
    job.task_groups = [group]
    job.allocation_policy = allocation_policy
    job.labels = {"env": "testing", "type": "container"}
    # We use Cloud Logging as it's an out of the box available option
    job.logs_policy = batch_v1.LogsPolicy()
    job.logs_policy.destination = batch_v1.LogsPolicy.Destination.CLOUD_LOGGING

    create_request = batch_v1.CreateJobRequest()
    create_request.job = job
    create_request.job_id = job_name
    # The job's parent is the region in which the job will run
    create_request.parent = f"projects/{project_id}/locations/{region}"

    return client.create_job(create_request)

Usa GPUs para VMs N1

Puedes crear un trabajo que use GPUs para VMs N1 con la consola de Google Cloud, gcloud CLI, la API de Batch, Java, Node.js o Python.

Console

Para crear un trabajo que use GPUs con la consola de Google Cloud, sigue estos pasos:

  1. En la consola de Google Cloud, ve a la página Lista de trabajos.

    Ir a la lista de trabajos

  2. Haz clic en Crear. Se abrirá la página Create batch job. En el panel izquierdo, se selecciona la página Detalles del trabajo.

  3. Configura la página Detalles del trabajo:

    1. Opcional: En el campo Nombre del trabajo, personaliza el nombre del trabajo.

      Por ejemplo, ingresa example-gpu-job.

    2. Configura la sección Detalles de la tarea:

      1. En la ventana Nuevo ejecutable, agrega al menos una secuencia de comandos o un contenedor para que se ejecute esta tarea.

        Por ejemplo, para crear un trabajo de secuencia de comandos básico, haz lo siguiente:

        1. Selecciona la casilla de verificación Secuencia de comandos. Aparecerá un campo.

        2. En el campo, ingresa la siguiente secuencia de comandos:

          echo Hello world from task ${BATCH_TASK_INDEX}.
          
        3. Haz clic en Listo.

      2. En el campo Task count, ingresa la cantidad de tareas para este trabajo.

        Por ejemplo, ingresa 3.

      3. Opcional: En el campo Paralelismo, ingresa la cantidad de tareas que se ejecutarán de forma simultánea.

        Por ejemplo, ingresa 1 (predeterminado).

  4. Configura la página Especificaciones de recursos:

    1. En el panel izquierdo, haz clic en Especificaciones de recursos. Se abrirá la página Especificaciones de recursos.

    2. Opcional: En la sección Modelo de aprovisionamiento de VMs, selecciona una de las siguientes opciones para el modelo de aprovisionamiento de las VMs de esta tarea:

      • Si tu trabajo puede soportar la preempción y deseas obtener VMs con descuento, selecciona Spot.

      • De lo contrario, selecciona Estándar (predeterminada).

    3. Selecciona la ubicación para este trabajo.

      1. En el campo Región, selecciona una región.

      2. En el campo Zona, realiza una de las siguientes acciones:

        • Si deseas restringir esta tarea para que se ejecute solo en una zona específica, selecciona una.

        • De lo contrario, selecciona cualquiera (predeterminado).

    4. Selecciona el tipo de máquina de GPU para las VMs de este trabajo:

      1. En las opciones de familia de máquinas, haz clic en GPUs.

      2. En el campo Tipo de GPU, selecciona el tipo de GPU.

        Si seleccionaste uno de los tipos de GPU para VMs N1, el campo Serie se establece en N1.

      3. En el campo Cantidad de GPU, selecciona la cantidad de GPUs para cada VM.

      4. En el campo Tipo de máquina, selecciona el tipo de máquina.

      5. Para instalar automáticamente los controladores de GPU, selecciona Instalación de controladores de GPU (opción predeterminada).

    5. Configura la cantidad de recursos de VM necesarios para cada tarea:

      1. En el campo Núcleos, ingresa la cantidad de CPU virtuales por tarea.

        Por ejemplo, ingresa 1 (predeterminado).

      2. En el campo Memoria, ingresa la cantidad de RAM en GB por tarea.

        Por ejemplo, ingresa 0.5 (predeterminado).

    6. Haz clic en Listo.

  5. Opcional: Configura los otros campos para este trabajo.

  6. Opcional: Para revisar la configuración del trabajo, haz clic en Obtener vista previa en el panel izquierdo.

  7. Haz clic en Crear.

    En la página Detalles del trabajo, se muestra el trabajo que creaste.

gcloud

  1. Crea un archivo JSON que instale los controladores de GPU, defina los subcampos type y count del campo accelerators[] y se ejecute en una ubicación que tenga el tipo de máquina de GPU.

    Por ejemplo, para crear una tarea de secuencia de comandos básica que use GPUs para VMs N1 y permita que Batch seleccione el tipo de máquina N1 exacto, crea un archivo JSON con el siguiente contenido:

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

    Reemplaza lo siguiente:

    • INSTALL_GPU_DRIVERS: Cuando se establece en true, Batch recupera los controladores necesarios para el tipo de GPU que especificas en el campo policy desde una ubicación de terceros y los instala en tu nombre. Si estableces este campo en false (configuración predeterminada), debes instalar los controladores de GPU de forma manual para usar cualquier GPU en este trabajo.

    • GPU_TYPE: Es el tipo de GPU. Puedes ver una lista de los tipos de GPU disponibles con el comando gcloud compute accelerator-types list. Usa este campo solo para las GPUs de las VMs N1.

    • GPU_COUNT: Es la cantidad de GPUs del tipo especificado. Para obtener más información sobre las opciones válidas, consulta los tipos de máquinas de GPU para la serie de máquinas N1. Usa este campo solo para las GPUs de las VMs N1.

    • ALLOWED_LOCATIONS: De manera opcional, puedes usar el campo allowedLocations[] para especificar una región o zonas específicas en una región en la que las VMs de tu trabajo pueden ejecutarse. Por ejemplo, regions/us-central1 permite todas las zonas de la región us-central1. Asegúrate de especificar las ubicaciones que ofrecen el tipo de máquina de GPU que deseas para este trabajo. De lo contrario, si omites este campo, asegúrate de que la ubicación del trabajo ofrezca el tipo de máquina de GPU.

  2. Para crear y ejecutar la tarea, usa el comando gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
    

    Reemplaza lo siguiente:

    • JOB_NAME: Es el nombre del trabajo.

    • LOCATION: Es la ubicación del trabajo.

    • JSON_CONFIGURATION_FILE: Es la ruta de acceso a un archivo JSON con los detalles de configuración de la tarea.

API

Realiza una solicitud POST al método jobs.create que instale los controladores de GPU, defina los subcampos type y count del campo accelerators[] y use una ubicación que tenga el tipo de máquina de GPU.

Por ejemplo, para crear un trabajo de secuencia de comandos básico que use GPUs para VMs N1 y permita que Batch seleccione el tipo de máquina N1 exacto, realiza la siguiente solicitud:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

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

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto de tu proyecto.

  • LOCATION: Es la ubicación del trabajo.

  • JOB_NAME: Es el nombre del trabajo.

  • INSTALL_GPU_DRIVERS: Cuando se establece en true, Batch recupera los controladores necesarios para el tipo de GPU que especificas en el campo policy desde una ubicación de terceros y los instala en tu nombre. Si estableces este campo en false (configuración predeterminada), debes instalar los controladores de GPU de forma manual para usar cualquier GPU en este trabajo.

  • GPU_TYPE: Es el tipo de GPU. Puedes ver una lista de los tipos de GPU disponibles con el comando gcloud compute accelerator-types list. Usa este campo solo para las GPUs de las VMs N1.

  • GPU_COUNT: Es la cantidad de GPUs del tipo especificado. Para obtener más información sobre las opciones válidas, consulta Tipos de máquinas de GPU para la serie de máquinas N1. Usa este campo solo para las GPUs de las VMs N1.

  • ALLOWED_LOCATIONS: De manera opcional, puedes usar el campo allowedLocations[] para especificar una región o zonas específicas en una región en la que las VMs de tu trabajo pueden ejecutarse. Por ejemplo, regions/us-central1 permite todas las zonas de la región us-central1. Asegúrate de especificar las ubicaciones que ofrecen el tipo de máquina de GPU que deseas para este trabajo. De lo contrario, si omites este campo, asegúrate de que la ubicación del trabajo ofrezca el tipo de máquina de GPU.

Java


import com.google.cloud.batch.v1.AllocationPolicy;
import com.google.cloud.batch.v1.AllocationPolicy.Accelerator;
import com.google.cloud.batch.v1.AllocationPolicy.InstancePolicy;
import com.google.cloud.batch.v1.AllocationPolicy.InstancePolicyOrTemplate;
import com.google.cloud.batch.v1.BatchServiceClient;
import com.google.cloud.batch.v1.CreateJobRequest;
import com.google.cloud.batch.v1.Job;
import com.google.cloud.batch.v1.LogsPolicy;
import com.google.cloud.batch.v1.Runnable;
import com.google.cloud.batch.v1.Runnable.Script;
import com.google.cloud.batch.v1.TaskGroup;
import com.google.cloud.batch.v1.TaskSpec;
import com.google.protobuf.Duration;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateGpuJobN1 {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";
    // Name of the region you want to use to run the job. Regions that are
    // available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
    String region = "europe-central2";
    // The name of the job that will be created.
    // It needs to be unique for each project and region pair.
    String jobName = "JOB_NAME";
    // Optional. When set to true, Batch fetches the drivers required for the GPU type
    // that you specify in the policy field from a third-party location,
    // and Batch installs them on your behalf. If you set this field to false (default),
    // you need to install GPU drivers manually to use any GPUs for this job.
    boolean installGpuDrivers = false;
    // The GPU type. You can view a list of the available GPU types
    // by using the `gcloud compute accelerator-types list` command.
    String gpuType = "nvidia-tesla-t4";
    // The number of GPUs of the specified type.
    int gpuCount = 2;

    createGpuJob(projectId, region, jobName, installGpuDrivers, gpuType, gpuCount);
  }

  // Create a job that uses GPUs
  public static Job createGpuJob(String projectId, String region, String jobName,
                                  boolean installGpuDrivers, String gpuType, int gpuCount)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (BatchServiceClient batchServiceClient = BatchServiceClient.create()) {
      // Define what will be done as part of the job.
      Runnable runnable =
          Runnable.newBuilder()
              .setScript(
                  Script.newBuilder()
                      .setText(
                          "echo Hello world! This is task ${BATCH_TASK_INDEX}. "
                                  + "This job has a total of ${BATCH_TASK_COUNT} tasks.")
                      // You can also run a script from a file. Just remember, that needs to be a
                      // script that's already on the VM that will be running the job.
                      // Using setText() and setPath() is mutually exclusive.
                      // .setPath("/tmp/test.sh")
                      .build())
              .build();

      TaskSpec task = TaskSpec.newBuilder()
                  // Jobs can be divided into tasks. In this case, we have only one task.
                  .addRunnables(runnable)
                  .setMaxRetryCount(2)
                  .setMaxRunDuration(Duration.newBuilder().setSeconds(3600).build())
                  .build();

      // Tasks are grouped inside a job using TaskGroups.
      // Currently, it's possible to have only one task group.
      TaskGroup taskGroup = TaskGroup.newBuilder()
          .setTaskCount(3)
          .setParallelism(1)
          .setTaskSpec(task)
          .build();

      // Accelerator describes Compute Engine accelerators to be attached to the VM.
      Accelerator accelerator = Accelerator.newBuilder()
          .setType(gpuType)
          .setCount(gpuCount)
          .build();

      // Policies are used to define on what kind of virtual machines the tasks will run on.
      AllocationPolicy allocationPolicy =
          AllocationPolicy.newBuilder()
              .addInstances(
                  InstancePolicyOrTemplate.newBuilder()
                      .setInstallGpuDrivers(installGpuDrivers)
                      .setPolicy(InstancePolicy.newBuilder().addAccelerators(accelerator))
                      .build())
              .build();

      Job job =
          Job.newBuilder()
              .addTaskGroups(taskGroup)
              .setAllocationPolicy(allocationPolicy)
              .putLabels("env", "testing")
              .putLabels("type", "script")
              // We use Cloud Logging as it's an out of the box available option.
              .setLogsPolicy(
                  LogsPolicy.newBuilder().setDestination(LogsPolicy.Destination.CLOUD_LOGGING))
              .build();

      CreateJobRequest createJobRequest =
          CreateJobRequest.newBuilder()
              // The job's parent is the region in which the job will run.
              .setParent(String.format("projects/%s/locations/%s", projectId, region))
              .setJob(job)
              .setJobId(jobName)
              .build();

      Job result =
          batchServiceClient
              .createJobCallable()
              .futureCall(createJobRequest)
              .get(5, TimeUnit.MINUTES);

      System.out.printf("Successfully created the job: %s", result.getName());

      return result;
    }
  }
}

Node.js

// Imports the Batch library
const batchLib = require('@google-cloud/batch');
const batch = batchLib.protos.google.cloud.batch.v1;

// Instantiates a client
const batchClient = new batchLib.v1.BatchServiceClient();

/**
 * TODO(developer): Update these variables before running the sample.
 */
// Project ID or project number of the Google Cloud project you want to use.
const projectId = await batchClient.getProjectId();
// Name of the region you want to use to run the job. Regions that are
// available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
const region = 'europe-central2';
// The name of the job that will be created.
// It needs to be unique for each project and region pair.
const jobName = 'batch-gpu-job-n1';
// The GPU type. You can view a list of the available GPU types
// by using the `gcloud compute accelerator-types list` command.
const gpuType = 'nvidia-tesla-t4';
// The number of GPUs of the specified type.
const gpuCount = 1;
// Optional. When set to true, Batch fetches the drivers required for the GPU type
// that you specify in the policy field from a third-party location,
// and Batch installs them on your behalf. If you set this field to false (default),
// you need to install GPU drivers manually to use any GPUs for this job.
const installGpuDrivers = false;
// Accelerator-optimized machine types are available to Batch jobs. See the list
// of available types on: https://cloud.google.com/compute/docs/accelerator-optimized-machines
const machineType = 'n1-standard-16';

// Define what will be done as part of the job.
const runnable = new batch.Runnable({
  script: new batch.Runnable.Script({
    commands: ['-c', 'echo Hello world! This is task ${BATCH_TASK_INDEX}.'],
  }),
});

const task = new batch.TaskSpec({
  runnables: [runnable],
  maxRetryCount: 2,
  maxRunDuration: {seconds: 3600},
});

// Tasks are grouped inside a job using TaskGroups.
const group = new batch.TaskGroup({
  taskCount: 3,
  taskSpec: task,
});

// Policies are used to define on what kind of virtual machines the tasks will run on.
// In this case, we tell the system to use "g2-standard-4" machine type.
// Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
const instancePolicy = new batch.AllocationPolicy.InstancePolicy({
  machineType,
  // Accelerator describes Compute Engine accelerators to be attached to the VM
  accelerators: [
    new batch.AllocationPolicy.Accelerator({
      type: gpuType,
      count: gpuCount,
      installGpuDrivers,
    }),
  ],
});

const allocationPolicy = new batch.AllocationPolicy.InstancePolicyOrTemplate({
  instances: [{installGpuDrivers, policy: instancePolicy}],
});

const job = new batch.Job({
  name: jobName,
  taskGroups: [group],
  labels: {env: 'testing', type: 'script'},
  allocationPolicy,
  // We use Cloud Logging as it's an option available out of the box
  logsPolicy: new batch.LogsPolicy({
    destination: batch.LogsPolicy.Destination.CLOUD_LOGGING,
  }),
});
// The job's parent is the project and region in which the job will run
const parent = `projects/${projectId}/locations/${region}`;

async function callCreateBatchGPUJobN1() {
  // Construct request
  const request = {
    parent,
    jobId: jobName,
    job,
  };

  // Run request
  const [response] = await batchClient.createJob(request);
  console.log(JSON.stringify(response));
}

await callCreateBatchGPUJobN1();

Python

from google.cloud import batch_v1


def create_gpu_job(
    project_id: str, region: str, zone: str, job_name: str
) -> batch_v1.Job:
    """
    This method shows how to create a sample Batch Job that will run
    a simple command on Cloud Compute instances on GPU machines.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        region: name of the region you want to use to run the job. Regions that are
            available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
        zone: name of the zone you want to use to run the job. Important in regard to GPUs availability.
            GPUs availability can be found here: https://cloud.google.com/compute/docs/gpus/gpu-regions-zones
        job_name: the name of the job that will be created.
            It needs to be unique for each project and region pair.

    Returns:
        A job object representing the job created.
    """
    client = batch_v1.BatchServiceClient()

    # Define what will be done as part of the job.
    task = batch_v1.TaskSpec()
    runnable = batch_v1.Runnable()
    runnable.script = batch_v1.Runnable.Script()
    runnable.script.text = "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
    # You can also run a script from a file. Just remember, that needs to be a script that's
    # already on the VM that will be running the job. Using runnable.script.text and runnable.script.path is mutually
    # exclusive.
    # runnable.script.path = '/tmp/test.sh'
    task.runnables = [runnable]

    # We can specify what resources are requested by each task.
    resources = batch_v1.ComputeResource()
    resources.cpu_milli = 2000  # in milliseconds per cpu-second. This means the task requires 2 whole CPUs.
    resources.memory_mib = 16  # in MiB
    task.compute_resource = resources

    task.max_retry_count = 2
    task.max_run_duration = "3600s"

    # Tasks are grouped inside a job using TaskGroups.
    # Currently, it's possible to have only one task group.
    group = batch_v1.TaskGroup()
    group.task_count = 4
    group.task_spec = task

    # Policies are used to define on what kind of virtual machines the tasks will run on.
    # Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
    policy = batch_v1.AllocationPolicy.InstancePolicy()
    policy.machine_type = "n1-standard-16"

    accelerator = batch_v1.AllocationPolicy.Accelerator()
    # Note: not every accelerator is compatible with instance type
    # Read more here: https://cloud.google.com/compute/docs/gpus#t4-gpus
    accelerator.type_ = "nvidia-tesla-t4"
    accelerator.count = 1

    policy.accelerators = [accelerator]
    instances = batch_v1.AllocationPolicy.InstancePolicyOrTemplate()
    instances.policy = policy
    instances.install_gpu_drivers = True
    allocation_policy = batch_v1.AllocationPolicy()
    allocation_policy.instances = [instances]

    location = batch_v1.AllocationPolicy.LocationPolicy()
    location.allowed_locations = ["zones/us-central1-b"]
    allocation_policy.location = location

    job = batch_v1.Job()
    job.task_groups = [group]
    job.allocation_policy = allocation_policy
    job.labels = {"env": "testing", "type": "container"}
    # We use Cloud Logging as it's an out of the box available option
    job.logs_policy = batch_v1.LogsPolicy()
    job.logs_policy.destination = batch_v1.LogsPolicy.Destination.CLOUD_LOGGING

    create_request = batch_v1.CreateJobRequest()
    create_request.job = job
    create_request.job_id = job_name
    # The job's parent is the region in which the job will run
    create_request.parent = f"projects/{project_id}/locations/{region}"

    return client.create_job(create_request)

¿Qué sigue?