Los clústeres de entrenamiento de Vertex AI usan Simple Linux Utility for Resource Management (Slurm) como el orquestador para administrar y programar trabajos en tu clúster.
Slurm es un sistema de código abierto muy utilizado para la administración de clústeres y la programación de trabajos, conocido por su escalabilidad y tolerancia a fallas.
Funciones clave de Slurm
- Slurm asigna un conjunto de nodos de procesamiento para el uso exclusivo de un trabajo específico durante un período definido. Esto garantiza que un trabajo tenga acceso exclusivo a los recursos que necesita para ejecutarse sin interferencias.
- Slurm proporciona un marco de trabajo para administrar el ciclo de vida completo de un trabajo, desde el envío y la ejecución hasta la supervisión y la finalización. Este sistema está diseñado específicamente para controlar trabajos paralelos que se ejecutan en un conjunto de nodos asignados.
- Slurm mantiene una cola de trabajos pendientes y usa un sofisticado motor de priorización para arbitrar el acceso a los recursos de procesamiento. Al tener en cuenta factores como el tamaño del trabajo, la prioridad del usuario y el tiempo de espera, este sistema garantiza un uso justo y eficiente de los recursos en todo el clúster.
Configuración básica del clúster
Antes de ejecutar trabajos, debes definir la estructura fundamental de tu clúster de Slurm. En esta sección, se detallan los parámetros de configuración esenciales, incluida la forma de organizar los nodos de procesamiento en particiones, especificar un grupo de nodos de acceso dedicados y configurar un directorio principal compartido para tus usuarios.
Particiones
Las particiones agrupan los nodos en conjuntos lógicos, lo que puede ser útil para administrar diferentes tipos de máquinas o niveles de acceso. Se definen como una lista dentro del campo de particiones del slurm_spec.
Cada objeto de partición tiene los siguientes campos obligatorios:
id: Es un identificador único para la partición.node_pool_ids: Es una lista que contiene los IDs de uno o más grupos de nodos que pertenecen a esta partición.
Por ejemplo:
"partitions": [
{
"id": "a4",
"node_pool_ids": [ "a4" ]
}
]
Nodos de acceso
El grupo de nodos de acceso 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 principal
El campo home_directory_storage especifica la instancia de Filestore que se activará como el directorio /home en todos los nodos del clúster. Esto proporciona un directorio principal compartido y persistente para todos los usuarios.
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 selecto de parámetros de slurm.conf, pero ten en cuenta que estos parámetros 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 hacer un seguimiento del uso de recursos dentro de tu clúster. Para obtener una guía completa sobre cómo supervisar métricas como el tiempo de CPU específico del trabajo 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 y prioridad
Para administrar cómo se programan y priorizan los trabajos, los clústeres de entrenamiento de Vertex AI te permiten configurar la preferencia de trabajos de Slurm. La expulsión anticipada funciona con el complemento de prioridad multifactor para determinar si se deben pausar los trabajos en ejecución para dar lugar a trabajos de mayor prioridad.
Para obtener una descripción general conceptual completa, revisa la documentación oficial de Slurm sobre el complemento de prioridad multifactor y la preemption.
Parámetros de preferencia
| Parámetro | Valor | Ejemplo |
|---|---|---|
| PREEMPT_TYPE | String | preempt/partition_prio |
| PREEMPT_MODE | Cadenas separadas por comas | SUSPEND,GANG |
| PREEMPT_EXEMPT_TIME | String | 00:00:00 |
Parámetros de prioridad
| Parámetro | Valor | Ejemplo |
|---|---|---|
| PRIORITY_TYPE | String | priority/multifactor |
| PRIORITY_WEIGHT_AGE | Número entero | 0 |
| PRIORITY_WEIGHT_ASSOC | Número entero | 0 |
| PRIORITY_WEIGHT_FAIRSHARE | Número entero | 0 |
| PRIORITY_WEIGHT_JOB_SIZE | Número entero | 0 |
| PRIORITY_WEIGHT_PARTITION | Número entero | 0 |
| PRIORITY_WEIGHT_QOS | Número entero | 0 |
| PRIORITY_WEIGHT_TRES | Cadenas separadas por comas | cpu=100,mem=150 |
Secuencias de comandos de prólogo y epílogo
Puedes configurar secuencias de comandos de Bash personalizadas para que se ejecuten automáticamente al inicio (prólogo) y al final (epílogo) de cada trabajo con los siguientes campos:
prolog_bash_scripts: Es una lista de cadenas, en la que cada cadena contiene el contenido completo de una secuencia de comandos de Bash que se ejecutará antes de que comience el trabajo.epilog_bash_scripts: Es una lista de cadenas, en la que cada cadena contiene el contenido completo de una secuencia de comandos de Bash que se ejecutará después de que se complete el trabajo.
Esto es útil para configurar un entorno de trabajo único o realizar tareas de limpieza automatizadas.
Ejemplo de especificación del clúster
En el siguiente ejemplo, se muestra una configuración JSON completa para crear un clúster de entrenamiento. Puedes adaptar esta especificación a tus 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 ... } } }
Administración y operaciones de clústeres
Administra un clúster en ejecución
Una vez que se cree el clúster con la configuración de contabilidad y preferencia elegida, podrás usar las herramientas de línea de comandos de Slurm para administrar las cuentas de usuario y supervisar la programación de trabajos.
Administración de cuentas con sacctmgr
El comando sacctmgr es la herramienta principal para administrar la información de usuarios y cuentas en la base de datos de Slurm. Por ejemplo, para agregar un usuario nuevo a una cuenta y otorgarle acceso a una partición, ejecuta el siguiente comando:
sudo sacctmgr add User Accounts=<account> Partition=<partition> <user>
Para obtener una lista completa de todas las opciones de sacctmgr, consulta la documentación oficial de contabilidad de Slurm.
Cómo verificar la prioridad del trabajo
Para verificar los componentes de prioridad de cada trabajo en la cola, usa la utilidad sprio. Esto es útil para comprender por qué ciertos trabajos se programan para ejecutarse antes que otros.
Consulta la documentación de la utilidad sprio para obtener información detallada sobre su uso.
Ejemplos de interrupciones
La documentación oficial de Slurm proporciona varios ejemplos prácticos de diferentes estrategias de preferencia. Puedes encontrarlos en la página Slurm Preemption.
¿Qué sigue?
A continuación, nos enfocaremos en los pasos finales del ciclo de vida del aprendizaje automático: la administración, la implementación y la supervisión de los modelos entrenados.
- Implementa tu modelo para la inferencia: Implementa tu modelo entrenado en un extremo de Vertex AI para atender solicitudes de inferencia en línea a gran escala.
- Administra el ciclo de vida de tu modelo: Usa Vertex AI Model Registry para controlar las versiones, comparar y administrar tus modelos. Se puede configurar una canalización para registrar automáticamente un modelo nuevo después de un entrenamiento exitoso.
- Supervisa las ejecuciones de la canalización y el rendimiento del modelo:
- Supervisión de canalizaciones: Realiza un seguimiento del grafo de ejecución, los artefactos y el rendimiento de las ejecuciones de tu canalización para depurar problemas y optimizar tu orquestación.
- Model Monitoring: Después de la implementación, configura la supervisión para detectar desvíos y anomalías en el rendimiento de la predicción del modelo, lo que ayuda a mantener la precisión del modelo con el tiempo.
- Optimiza los costos y administra el ciclo de vida del clúster: Cuando uses canalizaciones automatizadas, administra el ciclo de vida del clúster teniendo en cuenta la frecuencia de ejecución.
- Para las ejecuciones poco frecuentes, agrega un paso final a la canalización para borrar el clúster y ahorrar costos. Por lo general, esto implica crear un componente de canalización personalizado que llame a la función de eliminación.
- Para las ejecuciones frecuentes, deja el clúster activo para reducir el tiempo de inicio del trabajo.