Crear y ejecutar un trabajo que use GPUs

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

Cuando creas un trabajo de Batch, puedes usar GPUs para acelerar cargas de trabajo específicas. Entre los casos prácticos habituales de las tareas que usan GPUs se incluyen el procesamiento de datos intensivo y las cargas de trabajo de inteligencia artificial (IA), como el aprendizaje automático.

Antes de empezar

  1. Si no has usado Batch antes, consulta el artículo Empezar 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, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos:

    Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

    También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Crear un trabajo que use GPUs

Para crear un trabajo que use GPUs, sigue estos pasos:

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

Planificar los requisitos de un trabajo que use GPUs

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

  1. Selecciona el tipo de máquina con GPU y el método de aprovisionamiento
  2. Instalar los controladores de la GPU
  3. Definir recursos de VM compatibles

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

Los requisitos de un trabajo varían en función del tipo de máquina con GPU y del método de aprovisionamiento que prefieras, y las opciones de cada uno pueden ser interdependientes. En función de tus requisitos y prioridades, puedes seleccionar primero el tipo de máquina con GPU o el método de aprovisionamiento. Por lo general, el tipo de máquina de GPU afecta principalmente al rendimiento y al precio base, mientras que el método de aprovisionamiento influye sobre todo en la disponibilidad de recursos y en los costes o descuentos adicionales.

Selecciona el tipo de máquina con GPU

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

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

Tipos de máquinas con 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 un número 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 un número específicos de GPUs, por lo que es funcionalmente equivalente tanto si especificas esos valores como si no, además del tipo de máquina optimizada para aceleradores.

En concreto, Batch también permite especificar solo el tipo y el número de GPUs de las VMs optimizadas para aceleradores, pero las opciones de vCPU y memoria resultantes suelen ser muy limitadas. Por lo tanto, te recomendamos que verifiques que las opciones de vCPU y memoria disponibles sean compatibles con los requisitos de las tareas del trabajo.

GPUs para máquinas virtuales N1: para usar estas GPUs, debes especificar el tipo y la cantidad que quieres conectar a cada máquina virtual. Además, deben conectarse a máquinas virtuales con un tipo de máquina de la serie N1.

Para usar GPUs en máquinas virtuales N1, te recomendamos que especifiques al menos el tipo y el número 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 vCPU y memoria de las VMs N1 que usan cualquier tipo y número de GPUs son bastante flexibles. A menos que crees el trabajo con la Google Cloud consola, puedes dejar que Batch seleccione automáticamente un tipo de máquina que cumpla los requisitos de las tareas del trabajo.

Selecciona el método de aprovisionamiento

Batch usa diferentes métodos para aprovisionar los recursos de las VMs de las tareas que usan GPUs en función del tipo de recursos que solicite tu tarea. En la siguiente tabla se explican los métodos de aprovisionamiento disponibles y sus requisitos. Se enumeran en función de sus casos prácticos, de mayor a menor disponibilidad de recursos.

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

  • Si quieres usar tipos de máquinas con GPU A3 sin reserva, usa Dynamic Workload Scheduler para Batch (vista previa).

  • En el resto de los tipos de máquinas con GPU, usa el método de aprovisionamiento predeterminado. El método de aprovisionamiento predeterminado suele ser bajo demanda, excepto si tu proyecto tiene reservas sin usar que el trabajo puede consumir automáticamente.

Métodos de aprovisionamiento y sus requisitos de trabajo

Reservas

  • Caso práctico: recomendamos las reservas para los trabajos si quieres tener un nivel de certeza muy alto de la disponibilidad de los recursos o si ya tienes reservas que podrían no usarse.

  • Detalles: una reserva incurre en los costes de las VMs especificadas al mismo precio que si se ejecutaran las VMs hasta que elimines la reserva. Las VMs que consumen una reserva no generan costes independientes, pero las reservas sí generan costes independientemente del consumo.

Batch usa reservas para las tareas que pueden consumir reservas no utilizadas. Para obtener más información sobre las reservas y sus requisitos, consulta la página Asegurar la disponibilidad de recursos mediante reservas de VMs.

Dynamic Workload Scheduler para lotes (vista previa)

  • Caso práctico: te recomendamos que uses Dynamic Workload Scheduler si quieres usar GPUs para máquinas virtuales con un tipo de máquina de la serie de máquinas A3 sin consumir una reserva.

  • Detalles: Dynamic Workload Scheduler puede facilitarte el acceso simultáneo a muchos recursos que aceleran las cargas de trabajo de IA y aprendizaje automático. Por ejemplo, Dynamic Workload Scheduler puede ser útil para programar trabajos, ya que reduce los retrasos o los problemas causados por la falta de recursos.

Batch usa Dynamic Workload Scheduler para las tareas que cumplen todos los requisitos siguientes:

  • Especifica un tipo de máquina con GPU A3.
  • Bloquear reservas En concreto, el trabajo debe asignar el valor NO_RESERVATION al campo reservation. Para obtener más información, consulta Crear y ejecutar un trabajo que no pueda consumir VMs reservadas.
  • No uses máquinas virtuales de acceso puntual. En concreto, la tarea puede omitir el campo provisioningModel o darle el valor STANDARD.provisioningModel

Bajo demanda

  • Caso práctico: recomendamos usar la opción bajo demanda para el resto de los trabajos.

  • Detalles: El acceso a las VMs de Compute Engine suele ser bajo demanda de forma predeterminada. Con la modalidad bajo demanda, puedes solicitar y (si está disponible) acceder inmediatamente a los recursos de una VM a la vez.

Batch usa el modo bajo demanda para el resto de los trabajos.

Máquinas virtuales de acceso puntual

  • Caso práctico: te recomendamos que pruebes a usar máquinas virtuales de Spot para reducir los costes de las cargas de trabajo tolerantes a fallos.

  • Detalles: Las máquinas virtuales de acceso puntual ofrecen descuentos significativos, pero puede que no siempre estén disponibles y se pueden interrumpir en cualquier momento. Para obtener más información, consulta la sección sobre VMs de acceso puntual en la documentación de Compute Engine.

Batch usa Spot VMs para las tareas que definen el campo provisioningModel como SPOT.

Paso 2: Instala los controladores de la GPU

Para usar las 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 lo siguiente al definir los recursos de la VM para un trabajo que utilice GPUs:

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

    Para saber dónde están disponibles los tipos de máquina con GPU, consulta la sección Disponibilidad de las GPU por regiones y zonas de la documentación de Compute Engine.

  • Si especificas el tipo de máquina del trabajo, asegúrate de que tenga suficientes vCPUs y memoria para los requisitos de las tareas del trabajo. Es obligatorio especificar el tipo de máquina del trabajo cuando creas un trabajo con la consola de Google Cloud y se recomienda hacerlo cuando creas un trabajo que usa GPUs para máquinas virtuales optimizadas para aceleradores.

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

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

Crear 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 con GPU mediante las opciones recomendadas. En concreto, todas las tareas de ejemplo instalan automáticamente los controladores de GPU, definen directamente los recursos de la VM y especifican el método de aprovisionamiento o usan el método de aprovisionamiento predeterminado.

Usar GPUs para máquinas virtuales A3 a través de Dynamic Workload Scheduler para Batch (vista previa)

Puedes crear un trabajo que use GPUs para máquinas virtuales A3 a través de Dynamic Workload Scheduler con la CLI de gcloud o la API Batch.

gcloud

  1. Crea un archivo JSON que instale controladores de GPU, especifique un tipo de máquina de la serie 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 máquinas virtuales A3 a través de Dynamic Workload Scheduler, 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"
        }
    }
    

    Haz los cambios siguientes:

    • INSTALL_GPU_DRIVERS: si se le asigna el valor true, Batch obtiene los controladores necesarios para el tipo de GPU que especifiques en el campo policy de una ubicación de terceros y los instala en tu nombre. Si asignas el valor false (predeterminado) a este campo, tendrás que instalar los controladores de GPU manualmente para usar cualquier GPU en este trabajo.

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

    • ALLOWED_LOCATIONS: También puedes usar el campo allowedLocations[] para especificar una región o zonas concretas de una región en las que se puedan ejecutar las VMs de tu trabajo. Por ejemplo, regions/us-central1 permite todas las zonas de la región us-central1. Asegúrate de especificar ubicaciones que ofrezcan el tipo de máquina con GPU que quieras usar en este trabajo. De lo contrario, si omite este campo, asegúrese de que la ubicación del trabajo ofrezca el tipo de máquina con GPU.

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

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

    Haz los cambios siguientes:

    • JOB_NAME: el nombre del puesto.

    • LOCATION: la ubicación del puesto.

    • JSON_CONFIGURATION_FILE: la ruta de un archivo JSON con los detalles de configuración del trabajo.

API

Haz una solicitud POST al método jobs.create que instale los 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 con GPU.

Por ejemplo, para crear un trabajo de script básico que use GPUs para máquinas virtuales A3 a través de Dynamic Workload Scheduler, haz 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"
    }
}

Haz los cambios siguientes:

  • PROJECT_ID: el ID de proyecto de tu proyecto.

  • LOCATION: la ubicación del puesto.

  • JOB_NAME: el nombre del puesto.

  • INSTALL_GPU_DRIVERS: si se le asigna el valor true, Batch obtiene los controladores necesarios para el tipo de GPU que especifiques en el campo policy de una ubicación de terceros y los instala en tu nombre. Si asignas el valor false (predeterminado) a este campo, tendrás que instalar los controladores de GPU manualmente para usar cualquier GPU en este trabajo.

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

  • ALLOWED_LOCATIONS: También puedes usar el campo allowedLocations[] para especificar una región o zonas concretas de una región en las que se puedan ejecutar las VMs de tu trabajo. Por ejemplo, regions/us-central1 permite todas las zonas de la región us-central1. Asegúrate de especificar ubicaciones que ofrezcan el tipo de máquina con GPU que quieras usar en este trabajo. De lo contrario, si omite este campo, asegúrese de que la ubicación del trabajo ofrezca el tipo de máquina con GPU.

Usar GPUs en máquinas virtuales optimizadas para aceleradores

Puedes crear una tarea que use GPUs para máquinas virtuales optimizadas para aceleradores mediante laGoogle Cloud consola, la CLI de gcloud, la API Batch, Java, Node.js o Python.

Consola

Para crear un trabajo que use GPUs con la consola de Google Cloud , haz lo siguiente:

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

    Ir a la lista de tareas

  2. Haz clic en Crear. Se abrirá la página Crear tarea por lotes. En el panel de la izquierda, se selecciona la página Detalles de la tarea.

  3. Configura la página Detalles del empleo:

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

      Por ejemplo, escribe example-gpu-job.

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

      1. En la ventana Nuevo ejecutable, añade al menos una secuencia de comandos o un contenedor para que se ejecute este trabajo.

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

        1. Seleccione la casilla Secuencia de comandos. Aparecerá un campo.

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

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

      2. En el campo Número de tareas, introduce el número de tareas de este trabajo.

        Por ejemplo, escribe 3.

      3. Opcional: En el campo Paralelismo, introduce el número de tareas que se van a ejecutar simultáneamente.

        Por ejemplo, introduce 1 (valor predeterminado).

  4. Configura la página Especificaciones de recursos:

    1. En el panel de la izquierda, haga clic en Especificaciones de recursos. Se abrirá la página Especificaciones de los 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 este trabajo:

      • Si tu tarea puede tolerar la interrupción temporal y quieres máquinas virtuales con descuento, selecciona Spot.

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

    3. Selecciona la ubicación de este trabajo.

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

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

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

        • De lo contrario, selecciona cualquiera (opción predeterminada).

    4. Selecciona el tipo de máquina con 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. A continuación, en el campo Número de GPUs, selecciona el número de GPUs de cada VM.

        Si has seleccionado uno de los tipos de GPU para las VMs optimizadas para aceleradores, el campo Tipo de máquina solo permite una opción para el tipo de máquina en función del tipo y el número de GPUs que hayas seleccionado.

      3. Para instalar automáticamente los controladores de la 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 Cores (Núcleos), introduce la cantidad de vCPUs por tarea.

        Por ejemplo, introduce 1 (valor predeterminado).

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

        Por ejemplo, introduce 0.5 (valor predeterminado).

    6. Haz clic en Listo.

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

  6. Opcional: Para revisar la configuración del trabajo, en el panel de la izquierda, haz clic en Vista previa.

  7. Haz clic en Crear.

    En la página Detalles de la tarea se muestra la tarea que has creado.

gcloud

  1. Crea un archivo JSON que instale los controladores de la 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 la GPU.

    Por ejemplo, para crear un trabajo de secuencia de comandos básico que use GPUs para máquinas virtuales 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"
        }
    }
    

    Haz los cambios siguientes:

    • INSTALL_GPU_DRIVERS: si se le asigna el valor true, Batch obtiene los controladores necesarios para el tipo de GPU que especifiques en el campo policy de una ubicación de terceros y los instala en tu nombre. Si asignas el valor false (predeterminado) a este campo, tendrás que instalar los controladores de GPU manualmente para usar cualquier GPU en este trabajo.

    • MACHINE_TYPE: un tipo de máquina de la familia de máquinas optimizadas para aceleradores.

    • ALLOWED_LOCATIONS: También puedes usar el campo allowedLocations[] para especificar una región o zonas concretas de una región en las que se puedan ejecutar las VMs de tu trabajo. Por ejemplo, regions/us-central1 permite todas las zonas de la región us-central1. Asegúrate de especificar ubicaciones que ofrezcan el tipo de máquina con GPU que quieras usar en este trabajo. De lo contrario, si omite este campo, asegúrese de que la ubicación del trabajo ofrezca el tipo de máquina con GPU.

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

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

    Haz los cambios siguientes:

    • JOB_NAME: el nombre del puesto.

    • LOCATION: la ubicación del puesto.

    • JSON_CONFIGURATION_FILE: la ruta de un archivo JSON con los detalles de configuración del trabajo.

API

Haz una solicitud POST al método jobs.create que instale los 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 con GPU.

Por ejemplo, para crear un trabajo de secuencia de comandos básico que use GPUs para máquinas virtuales optimizadas para aceleradores, haz 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"
    }
}

Haz los cambios siguientes:

  • PROJECT_ID: el ID de proyecto de tu proyecto.

  • LOCATION: la ubicación del puesto.

  • JOB_NAME: el nombre del puesto.

  • INSTALL_GPU_DRIVERS: si se le asigna el valor true, Batch obtiene los controladores necesarios para el tipo de GPU que especifiques en el campo policy de una ubicación de terceros y los instala en tu nombre. Si asignas el valor false (predeterminado) a este campo, tendrás que instalar los controladores de GPU manualmente para usar cualquier GPU en este trabajo.

  • MACHINE_TYPE: un tipo de máquina de la familia de máquinas optimizadas para aceleradores.

  • ALLOWED_LOCATIONS: También puedes usar el campo allowedLocations[] para especificar una región o zonas concretas de una región en las que se puedan ejecutar las VMs de tu trabajo. Por ejemplo, regions/us-central1 permite todas las zonas de la región us-central1. Asegúrate de especificar ubicaciones que ofrezcan el tipo de máquina con GPU que quieras usar en este trabajo. De lo contrario, si omite este campo, asegúrese de que la ubicación del trabajo ofrezca el tipo de máquina con 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)

Usar GPUs en máquinas virtuales N1

Puedes crear una tarea que use GPUs para máquinas virtuales N1 mediante la Google Cloud consola, la CLI de gcloud, la API Batch, Java, Node.js o Python.

Consola

Para crear un trabajo que use GPUs con la consola de Google Cloud , haz lo siguiente:

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

    Ir a la lista de tareas

  2. Haz clic en Crear. Se abrirá la página Crear tarea por lotes. En el panel de la izquierda, se selecciona la página Detalles de la tarea.

  3. Configura la página Detalles del empleo:

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

      Por ejemplo, escribe example-gpu-job.

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

      1. En la ventana Nuevo ejecutable, añade al menos una secuencia de comandos o un contenedor para que se ejecute este trabajo.

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

        1. Seleccione la casilla Secuencia de comandos. Aparecerá un campo.

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

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

      2. En el campo Número de tareas, introduce el número de tareas de este trabajo.

        Por ejemplo, escribe 3.

      3. Opcional: En el campo Paralelismo, introduce el número de tareas que se van a ejecutar simultáneamente.

        Por ejemplo, introduce 1 (valor predeterminado).

  4. Configura la página Especificaciones de recursos:

    1. En el panel de la izquierda, haga clic en Especificaciones de recursos. Se abrirá la página Especificaciones de los 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 este trabajo:

      • Si tu tarea puede tolerar la interrupción temporal y quieres máquinas virtuales con descuento, selecciona Spot.

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

    3. Selecciona la ubicación de este trabajo.

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

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

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

        • De lo contrario, selecciona cualquiera (opción predeterminada).

    4. Selecciona el tipo de máquina con 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 has seleccionado uno de los tipos de GPU para máquinas virtuales N1, el campo Serie se define como N1.

      3. En el campo Número de GPUs, selecciona el número de GPUs de cada VM.

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

      5. Para instalar automáticamente los controladores de la 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 Cores (Núcleos), introduce la cantidad de vCPUs por tarea.

        Por ejemplo, introduce 1 (valor predeterminado).

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

        Por ejemplo, introduce 0.5 (valor predeterminado).

    6. Haz clic en Listo.

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

  6. Opcional: Para revisar la configuración del trabajo, en el panel de la izquierda, haz clic en Vista previa.

  7. Haz clic en Crear.

    En la página Detalles de la tarea se muestra la tarea que has creado.

gcloud

  1. Crea un archivo JSON que instale 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 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, 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"
        }
    }
    

    Haz los cambios siguientes:

    • INSTALL_GPU_DRIVERS: si se le asigna el valor true, Batch obtiene los controladores necesarios para el tipo de GPU que especifiques en el campo policy de una ubicación de terceros y los instala en tu nombre. Si asignas el valor false (predeterminado) a este campo, tendrás que instalar los controladores de GPU manualmente para usar cualquier GPU en este trabajo.

    • GPU_TYPE: el tipo de GPU. Para ver una lista de los tipos de GPU disponibles, usa el comando gcloud compute accelerator-types list. Solo se debe usar este campo para las GPUs de las VMs N1.

    • GPU_COUNT: número de GPUs del tipo especificado. Para obtener más información sobre las opciones válidas, consulta los tipos de máquinas con GPU de la serie de máquinas N1. Solo se debe usar este campo para las GPUs de las VMs N1.

    • ALLOWED_LOCATIONS: También puedes usar el campo allowedLocations[] para especificar una región o zonas concretas de una región en las que se puedan ejecutar las VMs de tu trabajo. Por ejemplo, regions/us-central1 permite todas las zonas de la región us-central1. Asegúrate de especificar ubicaciones que ofrezcan el tipo de máquina con GPU que quieras usar en este trabajo. De lo contrario, si omite este campo, asegúrese de que la ubicación del trabajo ofrezca el tipo de máquina con GPU.

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

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

    Haz los cambios siguientes:

    • JOB_NAME: el nombre del puesto.

    • LOCATION: la ubicación del puesto.

    • JSON_CONFIGURATION_FILE: la ruta de un archivo JSON con los detalles de configuración del trabajo.

API

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

Por ejemplo, para crear una tarea de script básica que use GPUs para máquinas virtuales N1 y permita que Batch seleccione el tipo de máquina N1 exacto, haz 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"
    }
}

Haz los cambios siguientes:

  • PROJECT_ID: el ID de proyecto de tu proyecto.

  • LOCATION: la ubicación del puesto.

  • JOB_NAME: el nombre del puesto.

  • INSTALL_GPU_DRIVERS: si se le asigna el valor true, Batch obtiene los controladores necesarios para el tipo de GPU que especifiques en el campo policy de una ubicación de terceros y los instala en tu nombre. Si asignas el valor false (predeterminado) a este campo, tendrás que instalar los controladores de GPU manualmente para usar cualquier GPU en este trabajo.

  • GPU_TYPE: el tipo de GPU. Para ver una lista de los tipos de GPU disponibles, usa el comando gcloud compute accelerator-types list. Solo se debe usar este campo para las GPUs de las VMs N1.

  • GPU_COUNT: número de GPUs del tipo especificado. Para obtener más información sobre las opciones válidas, consulta Tipos de máquinas con GPU para la serie de máquinas N1. Solo se debe usar este campo para las GPUs de las VMs N1.

  • ALLOWED_LOCATIONS: También puedes usar el campo allowedLocations[] para especificar una región o zonas concretas de una región en las que se puedan ejecutar las VMs de tu trabajo. Por ejemplo, regions/us-central1 permite todas las zonas de la región us-central1. Asegúrate de especificar ubicaciones que ofrezcan el tipo de máquina con GPU que quieras usar en este trabajo. De lo contrario, si omite este campo, asegúrese de que la ubicación del trabajo ofrezca el tipo de máquina con 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)

Siguientes pasos