Configura la comunicación de tareas con una biblioteca de la MPI

En este documento, se explica cómo configurar un trabajo por lotes con tareas estrechamente vinculadas que se comunican entre sí en diferentes VM mediante una biblioteca de interfaz de envío de mensajes (MPI).

En el caso de los trabajos por lotes, el acoplamiento describe las tareas de interdependencia; esto influye en la forma en que configuras la cantidad de tareas que se pueden ejecutar en paralelo (en lugar de de forma secuencial) mediante el campo parallelism de un trabajo. Las tareas se pueden describir con los siguientes tipos de acoplamiento:

  • Tareas con acoplamiento bajo: Tareas que se pueden ejecutar de forma independiente.
  • Tareas estrechamente vinculadas: Tareas que dependen unas de otras para ejecutarse.

De manera opcional, puedes crear un trabajo que use una biblioteca de la MPI para permitir que las tareas estrechamente acopladas se comuniquen entre sí en diferentes instancias de VM. Un caso de uso común para la MPI son las cargas de trabajo de computación de alto rendimiento (HPC) con acoplamiento alto.

Antes de comenzar

Crear y ejecutar un trabajo que use la MPI para tareas estrechamente vinculadas

En esta sección, se proporcionan ejemplos de cómo crear un trabajo que puede usar la MPI. En particular, el trabajo de ejemplo tiene 3 ejecubles:

  • El primer ejecutable es una secuencia de comandos que prepara el trabajo para la MPI mediante la inhabilitación del multiprocesamiento simultáneo y la instalación de Intel MPI.
  • El segundo ejecutable es una barrera ejecutable vacía (con formato { "barrier": {} }), que garantiza que todas las tareas terminen de configurar la MPI antes de continuar con ejecutables futuros.
  • El tercer ejecutable (y cualquier ejecutable posterior) está disponible para la carga de trabajo del trabajo.

Puedes crear un trabajo que use la MPI para tareas estrechamente vinculadas mediante gcloud CLI o la API de Batch.

gcloud

Si deseas crear un trabajo de secuencia de comandos que use la MPI para tareas estrechamente vinculadas mediante gcloud CLI, haz lo siguiente:

  1. Crea un archivo de configuración JSON con el siguiente contenido:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                            }
                        },
                        { "barrier": {} },
                        {
                            "script": {
                                SCRIPT
                            }
                        }
                    ]
                },
                "taskCount": TASK_COUNT,
                "taskCountPerNode": TASK_COUNT_PER_NODE,
                "requireHostsFile": REQUIRE_HOSTS_FILE,
                "permissiveSsh": PERMISSIVE_SSH
            }
        ]
    }
    

    Reemplaza lo siguiente:

    • SCRIPT: Es una secuencia de comandos ejecutable para una carga de trabajo que usa la MPI.
    • TASK_COUNT: Es la cantidad de tareas para el trabajo. El valor debe ser un número entero que se encuentre entre 1 y el límite de tareas por grupo de tareas. Para usar las bibliotecas de la MPI que proporciona Batch, este campo es obligatorio y se debe configurar como 2 o superior.
    • TASK_COUNT_PER_NODE: Es la cantidad de tareas que un trabajo puede ejecutar en simultáneo en una instancia de VM. Para usar las bibliotecas de la MPI que proporciona Batch, este campo es obligatorio y se debe establecer en 1, que equivale a ejecutar una instancia de VM por tarea.
    • REQUIRE_HOSTS_FILE: Cuando se establece en true, el trabajo crea un archivo que enumera las instancias de VM que se ejecutan en un grupo de tareas. La ruta del archivo se almacena en la variable de entorno BATCH_HOSTS_FILE. Para usar las bibliotecas de la MPI que proporciona Batch, este campo se debe configurar como verdadero.
    • PERMISSIVE_SSH: Cuando se establece en true, Batch configura SSH para permitir la comunicación sin contraseña entre las instancias de VM que se ejecutan en un grupo de tareas. Para usar las bibliotecas de la MPI que proporciona Batch, este campo se debe configurar como verdadero.
  2. Para crear el trabajo, 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 de un archivo JSON con los detalles de configuración del trabajo.

De manera opcional, puedes aumentar el rendimiento de las bibliotecas de la MPI que proporciona Batch si sigues estos pasos:

Por ejemplo, para crear un trabajo de secuencia de comandos a partir de una plantilla de instancias que usa la MPI y hace que 1 tarea genere el nombre de host de las 3 tareas del grupo de tareas, haz lo siguiente:

  1. Crea un archivo JSON en el directorio actual llamado example-job-uses-mpi.json con el siguiente contenido:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                            }
                        },
                        { "barrier": {} },
                        {
                            "script": {
                                "text":
                                    "if [ $BATCH_TASK_INDEX = 0 ]; then
                                    mpirun -hostfile $BATCH_HOSTS_FILE -np 3 hostname;
                                    fi"
                            }
                        },
                        { "barrier": {} }
                    ]
                },
                "taskCount": 3,
                "taskCountPerNode": 1,
                "requireHostsFile": true,
                "permissiveSsh": true
            }
        ],
        "allocationPolicy": {
            "instances": [
                {
                    "instanceTemplate": "example-template-job-uses-mpi"
                }
            ]
        },
        "logsPolicy": {
            "destination": "CLOUD_LOGGING"
        }
    }
    
  2. Ejecuta el siguiente comando:

    gcloud batch jobs submit example-template-job-uses-mpi \
      --location us-central1 \
      --config example-job-uses-mpi.json
    

API

Si deseas crear un trabajo de secuencia de comandos que use una MPI para tareas estrechamente vinculadas mediante la API de Batch, usa el método jobs.create y especifica los campos permissiveSsh, requireHostsFile, taskCount y taskCountPerNode.

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

{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "script": {
                            "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                        }
                    },
                    { "barrier": {} },
                    {
                        "script": {
                            SCRIPT
                        }
                    }
                ]
            },
            "taskCount": TASK_COUNT,
            "taskCountPerNode": TASK_COUNT_PER_NODE,
            "requireHostsFile": REQUIRE_HOSTS_FILE,
            "permissiveSsh": PERMISSIVE_SSH
        }
    ]
}

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto.
  • LOCATION: Es la ubicación del trabajo.
  • JOB_NAME: Es el nombre del trabajo.
  • SCRIPT: Es la secuencia de comandos ejecutable para una carga de trabajo que usa la MPI.
  • TASK_COUNT: Es la cantidad de tareas para el trabajo. El valor debe ser un número entero entre 1 y el límite de tareas por grupo de tareas. Para usar las bibliotecas de la MPI que proporciona Batch, este campo es obligatorio y se debe configurar como 2 o superior.
  • TASK_COUNT_PER_NODE: Es la cantidad de tareas que un trabajo puede ejecutar en simultáneo en una instancia de VM. Para usar las bibliotecas de la MPI que proporciona Batch, este campo es obligatorio y se debe establecer en 1, que equivale a ejecutar una instancia de VM por tarea.
  • REQUIRE_HOSTS_FILE: Cuando se establece en true, el trabajo crea un archivo que enumera las instancias de VM que se ejecutan en un grupo de tareas. La ruta del archivo se almacena en la variable de entorno BATCH_HOSTS_FILE. Para usar las bibliotecas de la MPI que proporciona Batch, este campo se debe configurar como verdadero.
  • PERMISSIVE_SSH: Cuando se establece en true, Batch configura la conexión SSH para permitir la comunicación sin contraseña entre las instancias de VM que se ejecutan en un grupo de tareas. Para usar las bibliotecas de la MPI que proporciona Batch, este campo se debe configurar como verdadero.

De manera opcional, puedes aumentar el rendimiento de las bibliotecas de la MPI que proporciona Batch si sigues estos pasos:

Por ejemplo, para crear un trabajo de secuencia de comandos a partir de una plantilla de instancias que use la MPI y haga que el resultado de 1 tarea sea el nombre de host de las 3 tareas del grupo, usa la siguiente solicitud:

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

{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "script": {
                            "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                        }
                    },
                    { "barrier": {} },
                    {
                        "script": {
                            "text":
                                "if [ $BATCH_TASK_INDEX = 0 ]; then
                                mpirun -hostfile $BATCH_HOSTS_FILE -np 3 hostname;
                                fi"
                        }
                    },
                    { "barrier": {} }
                ]
            },
            "taskCount": 3,
            "taskCountPerNode": 1,
            "requireHostsFile": true,
            "permissiveSsh": true
        }
    ],
    "allocationPolicy": {
        "instances": [
            {
                "instanceTemplate": "example-template-job-uses-mpi"
            }
        ]
    },
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

En el ejemplo anterior, PROJECT_ID es el ID del proyecto.

¿Qué sigue?