Los clústeres de entrenamiento de Vertex AI usan Simple Linux Utility for Resource Management (Slurm) como orquestador para gestionar y programar tareas en tu clúster.
Slurm es un sistema de gestión de clústeres y programación de tareas de código abierto muy utilizado que destaca por su escalabilidad y tolerancia a fallos.
Funciones clave de Slurm
- Slurm asigna un conjunto de nodos de cálculo para el uso exclusivo de un trabajo específico durante un periodo definido. De esta forma, un trabajo tiene acceso exclusivo a los recursos que necesita para ejecutarse sin interferencias.
- Slurm proporciona un marco para gestionar el ciclo de vida completo de un trabajo, desde el envío y la ejecución hasta la monitorización y la finalización. Este sistema se ha diseñado específicamente para gestionar tareas paralelas que se ejecutan en un conjunto de nodos asignados.
- Slurm mantiene una cola de tareas pendientes y usa un sofisticado motor de priorización para arbitrar el acceso a los recursos de computación. Al tener en cuenta factores como el tamaño del trabajo, la prioridad del usuario y el tiempo de espera, este sistema asegura un uso justo y eficiente de los recursos en todo el clúster.
Configuración básica de clústeres
Para poder ejecutar trabajos, debes definir la estructura fundamental de tu clúster de Slurm. En esta sección se detallan los ajustes de configuración esenciales, como la forma de organizar los nodos de computación en particiones, especificar un grupo de nodos de inicio de sesión dedicado y configurar un directorio principal compartido para los usuarios.
Particiones
Las particiones agrupan los nodos en conjuntos lógicos, lo que puede ser útil para gestionar diferentes tipos de máquinas o niveles de acceso. Se definen como una lista en el campo partitions de slurm_spec.
Cada objeto de partición tiene los siguientes campos obligatorios:
id: identificador único de la partición.node_pool_ids: lista que contiene los IDs de uno o varios grupos de nodos que pertenecen a esta partición.
Por ejemplo:
"partitions": [
{
"id": "a4",
"node_pool_ids": [ "a4" ]
}
]
Nodos de inicio de sesión
El grupo de nodos de inicio de sesión proporciona nodos dedicados que sirven como punto de entrada principal para que los usuarios interactúen con el clúster. El campo login_node_pool_id especifica el identificador único de este grupo.
Por ejemplo:
"login_node_pool_id": "login"
Almacenamiento del directorio de inicio
El campo home_directory_storage especifica la instancia de Filestore que se va a montar como el directorio /home en todos los nodos del clúster. De esta forma, todos los usuarios tienen un directorio principal compartido y persistente.
Debes proporcionar el nombre completo del recurso de la instancia de Filestore para este valor.
Por ejemplo:
"home_directory_storage": "projects/PROJECT_ID/locations/REGION-ZONE/instances/FILESTORE_INSTANCE_NAME"
Configuración avanzada de Slurm
Los clústeres de entrenamiento de Vertex AI te permiten personalizar un conjunto de parámetros slurm.conf, pero ten en cuenta que estos ajustes solo se pueden configurar durante la creación inicial del clúster y no se pueden cambiar después.
Contabilidad
Los clústeres de entrenamiento de Vertex AI te permiten usar funciones de contabilidad integradas para monitorizar el uso de recursos en tu clúster. Para obtener una guía completa sobre cómo monitorizar métricas como el tiempo de CPU específico de una tarea y el uso de memoria, consulta la documentación oficial de contabilidad de Slurm.
| Parámetro | Valor | Ejemplo |
|---|---|---|
| AccountingStorageEnforce | Cadenas separadas por comas | associations,limits,qos |
Interrupción temporal y prioridad
Para gestionar cómo se programan y priorizan las tareas, los clústeres de entrenamiento de Vertex AI te permiten configurar la apropiación de tareas de Slurm. La suspensión funciona con el complemento de prioridad multifactor para determinar si se deben pausar los trabajos en ejecución para dejar paso a trabajos de mayor prioridad.
Para obtener una descripción general completa, consulta la documentación oficial de Slurm sobre el complemento de prioridad multifactor y la expropiación.
Parámetros de preferencia
| Parámetro | Valor | Ejemplo |
|---|---|---|
| PREEMPT_TYPE | Cadena | preempt/partition_prio |
| PREEMPT_MODE | Cadenas separadas por comas | SUSPEND,GANG |
| PREEMPT_EXEMPT_TIME | Cadena | 00:00:00 |
Parámetros de prioridad
| Parámetro | Valor | Ejemplo |
|---|---|---|
| PRIORITY_TYPE | Cadena | priority/multifactor |
| PRIORITY_WEIGHT_AGE | Entero | 0 |
| PRIORITY_WEIGHT_ASSOC | Entero | 0 |
| PRIORITY_WEIGHT_FAIRSHARE | Entero | 0 |
| PRIORITY_WEIGHT_JOB_SIZE | Entero | 0 |
| PRIORITY_WEIGHT_PARTITION | Entero | 0 |
| PRIORITY_WEIGHT_QOS | Entero | 0 |
| PRIORITY_WEIGHT_TRES | Cadenas separadas por comas | cpu=100,mem=150 |
Secuencias de comandos de prólogo y epílogo
Puede configurar scripts Bash personalizados para que se ejecuten automáticamente al principio (prólogo) y al final (epílogo) de cada trabajo mediante los siguientes campos:
prolog_bash_scripts: lista de cadenas, donde cada cadena contiene el contenido completo de una secuencia de comandos Bash que se ejecutará antes de que empiece el trabajo.epilog_bash_scripts: lista de cadenas, donde cada cadena contiene el contenido completo de una secuencia de comandos de Bash que se ejecutará una vez que se haya completado el trabajo.
Esto resulta útil para configurar un entorno de trabajo único o realizar tareas de limpieza automatizadas.
Ejemplo de especificación de clúster
En el siguiente ejemplo se muestra una configuración JSON completa para crear un clúster de entrenamiento. Puede adaptar esta especificación a sus necesidades.
{ // ... other cluster configurations ... "orchestratorSpec": { "slurmSpec": { "partitions": [ { "id": "a4", "node_pool_ids": ["a4"] } ], "login_node_pool_id": "login", "home_directory_storage": "projects/PROJECT_ID/locations/REGION-ZONE/instances/FILESTORE_INSTANCE_ID", "accounting": { "accounting_storage_enforce": "ACCOUNTING_STORAGE_ENFORCE" }, "scheduling": { "priority_type": "PRIORITY_TYPE", "priority_weight_age": PRIORITY_WEIGHT_AGE, "priority_weight_assoc": PRIORITY_WEIGHT_ASSOC, "priority_weight_fairshare": PRIORITY_WEIGHT_FAIRSHARE, "priority_weight_job_size": PRIORITY_WEIGHT_JOB_SIZE, "priority_weight_partition": PRIORITY_WEIGHT_PARTITION, "priority_weight_qos": PRIORITY_WEIGHT_QOS, "priority_weight_tres": "PRIORITY_WEIGHT_TRES", "preempt_type": "PREEMPT_TYPE", "preempt_mode": "PREEMPT_MODE", "preempt_exempt_time": "PREEMPT_EXEMPT_TIME" }, "prolog_bash_scripts": [ "#!/bin/bash\necho 'First prolog script running'", "#!/bin/bash\necho 'Second prolog script running'" ], "epilog_bash_scripts": [ "#!/bin/bash\necho 'Epilog script running'" ] // ... other Slurm settings ... } } }
Gestión y operaciones de clústeres
Gestionar un clúster en ejecución
Una vez que se haya creado el clúster con los ajustes de contabilidad y de preferencia elegidos, podrás usar las herramientas de línea de comandos de Slurm para gestionar las cuentas de usuario y monitorizar la programación de los trabajos.
Gestión de cuentas con sacctmgr
El comando sacctmgr es la herramienta principal para gestionar la información de usuarios y cuentas en la base de datos de Slurm. Por ejemplo, para añadir un usuario a una cuenta y darle acceso a una partición, ejecuta el siguiente comando:
sudo sacctmgr add User Accounts=<account> Partition=<partition> <user>
Para ver una lista completa de todas las opciones de sacctmgr, consulta la documentación oficial de contabilidad de Slurm.
Comprobar la prioridad de un trabajo
Para comprobar los componentes de prioridad de cada trabajo de la cola, usa la utilidad sprio. Esta información es útil para saber por qué se programan determinadas tareas para que se ejecuten antes que otras.
Consulta la documentación de la utilidad sprio para obtener información detallada sobre su uso.
Ejemplos de preferencia
En la documentación oficial de Slurm se proporcionan varios ejemplos prácticos de diferentes estrategias de preferencia. Puedes encontrarlos en la página Slurm Preemption.
Siguientes pasos
En este artículo se explican los pasos finales del ciclo de vida del aprendizaje automático: la gestión, el despliegue y la monitorización de los modelos entrenados.
- Despliega tu modelo para la inferencia: despliega tu modelo entrenado en un endpoint de Vertex AI para atender solicitudes de inferencia online a gran escala.
- Gestiona el ciclo de vida de tu modelo: usa Vertex AI Model Registry para crear versiones, comparar y gestionar tus modelos. Se puede configurar una canalización para registrar automáticamente un nuevo modelo cuando el entrenamiento se haya completado correctamente.
- Monitoriza las ejecuciones de tu flujo de trabajo y el rendimiento de tu modelo:
- Monitorización de la canalización: haz un seguimiento del gráfico de ejecución, los artefactos y el rendimiento de las ejecuciones de tu canalización para depurar problemas y optimizar la orquestación.
- Monitorización de modelos: después de la implementación, configura la monitorización para detectar desviaciones y anomalías en el rendimiento de las predicciones de tu modelo, lo que te ayudará a mantener la precisión del modelo a lo largo del tiempo.
- Optimizar los costes y gestionar el ciclo de vida del clúster: cuando se usan las canalizaciones automatizadas, se gestiona el ciclo de vida del clúster teniendo en cuenta la frecuencia de ejecución.
- Si las ejecuciones no son frecuentes, añade un paso final a la canalización para eliminar el clúster y ahorrar costes. Normalmente, esto implica crear un componente de la canalización personalizado que llame a la función de eliminación.
- Si vas a ejecutar el clúster con frecuencia, déjalo activo para reducir el tiempo de inicio de los trabajos.