En este instructivo, se muestra cómo entrenar un modelo de lenguaje grande (LLM) en un clúster de Slurm de varios nodos y varias GPUs en Google Cloud. El modelo que usas en este instructivo se basa en un modelo de 1,500 millones de parámetros de Qwen2. El clúster de Slurm usa dos máquinas virtuales (VM) a4-highgpu-8g, cada una con 8 GPUs NVIDIA B200.
Los dos procesos principales que se describen en este instructivo son los siguientes:
- Implementa un clúster de Slurm de alto rendimiento y apto para la producción conGoogle Cloud Cluster Toolkit. Como parte de esta implementación, crearás una imagen de VM personalizada con el software necesario preinstalado. También configurarás una instancia de Filestore compartida y redes RDMA de alta velocidad.
- Después de implementar el clúster, ejecuta un trabajo de entrenamiento previo distribuido con el conjunto de secuencias de comandos que acompañan a este instructivo. El trabajo aprovecha la biblioteca Accelerate de Hugging Face.
Este instructivo está dirigido a ingenieros e investigadores de aprendizaje automático (AA), administradores y operadores de plataformas, y especialistas en datos y en IA que deseen implementar clústeres de Slurm de alto rendimiento en Google Cloud para entrenar LLMs.
Objetivos
- Accede al modelo Qwen2 con Hugging Face.
- Prepara tu entorno.
- Crea e implementa un clúster de Slurm A4 apto para producción.
- Entrena el modelo Qwen2 con la biblioteca Accelerate .
- Supervisar tu trabajo
- Realizar una limpieza
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto,
usa la calculadora de precios.
Antes de comenzar
- Accede a tu cuenta de Google Cloud . Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
-
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Crea o selecciona un Google Cloud proyecto.
Roles necesarios para seleccionar o crear un proyecto
- Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crear un proyecto: Para crear un proyecto, necesitas el rol de Creador de proyectos (
roles/resourcemanager.projectCreator), que contiene el permisoresourcemanager.projects.create. Obtén más información para otorgar roles.
-
Crea un Google Cloud proyecto:
gcloud projects create PROJECT_ID
Reemplaza
PROJECT_IDpor un nombre para el proyecto Google Cloud que estás creando. -
Selecciona el proyecto Google Cloud que creaste:
gcloud config set project PROJECT_ID
Reemplaza
PROJECT_IDpor el nombre de tu proyecto de Google Cloud .
-
Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .
Habilita la API necesaria:
Roles necesarios para habilitar las APIs
Para habilitar APIs, necesitas el permiso
serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtener este permiso a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.gcloud services enable compute.googleapis.com file.googleapis.com logging.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com
-
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Crea o selecciona un Google Cloud proyecto.
Roles necesarios para seleccionar o crear un proyecto
- Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crear un proyecto: Para crear un proyecto, necesitas el rol de Creador de proyectos (
roles/resourcemanager.projectCreator), que contiene el permisoresourcemanager.projects.create. Obtén más información para otorgar roles.
-
Crea un Google Cloud proyecto:
gcloud projects create PROJECT_ID
Reemplaza
PROJECT_IDpor un nombre para el proyecto Google Cloud que estás creando. -
Selecciona el proyecto Google Cloud que creaste:
gcloud config set project PROJECT_ID
Reemplaza
PROJECT_IDpor el nombre de tu proyecto de Google Cloud .
-
Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .
Habilita la API necesaria:
Roles necesarios para habilitar las APIs
Para habilitar APIs, necesitas el permiso
serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtener este permiso a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.gcloud services enable compute.googleapis.com file.googleapis.com logging.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com
-
Otorga roles a tu cuenta de usuario. Ejecuta el siguiente comando una vez para cada uno de los siguientes roles de IAM:
roles/compute.admin, roles/iam.serviceAccountUser, roles/file.editor, roles/storage.admin, roles/serviceusage.serviceUsageAdmin, roles/compute.osAdminLogin, roles/iap.tunnelResourceAccessorgcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Reemplaza lo siguiente:
PROJECT_ID: ID del proyectoUSER_IDENTIFIER: Es el identificador de tu cuenta de usuario de . Por ejemplo,myemail@example.com.ROLE: Es el rol de IAM que otorgas a tu cuenta de usuario.
- Habilita la cuenta de servicio predeterminada para tu proyecto Google Cloud :
gcloud iam service-accounts enable PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --project=PROJECT_ID
Reemplaza PROJECT_NUMBER por el número del proyecto. Para revisar el número de tu proyecto, consulta Cómo obtener un proyecto existente.
- Otorga el rol de editor (
roles/editor) a la cuenta de servicio predeterminada:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role=roles/editor
- Crea credenciales de autenticación locales para tu cuenta de usuario:
gcloud auth application-default login
- Habilita el Acceso al SO para tu proyecto:
gcloud compute project-info add-metadata --metadata=enable-oslogin=TRUE
- Accede a tu cuenta de Hugging Face o crea una.
Accede a Qwen2 con Hugging Face
Para usar Hugging Face y acceder a Qwen2, haz lo siguiente:
Instala Cluster Toolkit
Cluster Toolkit es una herramienta de código abierto que simplifica la implementación de cargas de trabajo de computación de alto rendimiento (HPC), inteligencia artificial (IA) y aprendizaje automático (AA) en Google Cloud. Para obtener más información sobre el uso de gcluster y la administración de clústeres, consulta la descripción general del Cluster Toolkit.
Prepara la versión de Cluster Toolkit:
Descarga la versión:
Define la ruta
gcluster:
Prepara el entorno
Para preparar tu entorno, sigue estos pasos:
Configura las variables de entorno predeterminadas:
Reemplaza lo siguiente:
YOUR_PROJECT_ID: Es el nombre del Google Cloud proyecto en el que deseas crear el clúster de GKE.YOUR_CLUSTER_NAME: Es el nombre del clúster de Slurm que deseas crear.YOUR_ZONE: Es la zona en la que existe tu reserva.YOUR_REGION,: Es la región en la que existe tu reserva.RESERVATION_NAME: Es la URL o el nombre de la reserva que deseas usar para crear tu clúster de Slurm.YOUR_BUCKET_NAME: Es el nombre del bucket en el que almacenas los resultados del punto de control del entrenamiento. Antes de crearlo, familiarízate con los requisitos de nombres de buckets.HUGGING_FACE_TOKEN: El token de Hugging Face que creaste en un paso anterior
Crea un bucket de Cloud Storage:
Crea un clúster de Slurm A4
Para crear un clúster de Slurm A4, sigue estos pasos:
Crea el archivo
a4high-slurm-deployment.yaml:Crea los manifiestos de Terraform:
Aplica parches a los manifiestos:
Implemente el clúster:
El comando
gcluster deployes un proceso de dos fases, que se describe a continuación:En la primera fase, se compila una imagen personalizada con todo el software preinstalado, lo que puede tardar hasta 50 minutos en completarse.
En la segunda fase, se implementa el clúster con esa imagen personalizada. Por lo general, este proceso tarda menos en completarse que la primera fase.
Si la primera fase se completa correctamente, pero la segunda falla, puedes intentar implementar el clúster de Slurm nuevamente omitiendo la primera fase:
Prepara tu carga de trabajo
Para preparar tu carga de trabajo, sigue estos pasos:
Crea secuencias de comandos de carga de trabajo
Para crear las secuencias de comandos que usará tu carga de trabajo de entrenamiento, sigue estos pasos:
Para configurar el entorno virtual de Python, crea el archivo
install_environment.shcon el siguiente contenido:Para especificar la configuración de tu trabajo de ajuste, crea el archivo
accelerate_config.yamlcon el siguiente contenido:Para especificar las tareas que ejecutarán los trabajos en tu clúster de Slurm, crea el archivo
submit.slurmcon el siguiente contenido:Para especificar las dependencias de tu trabajo de ajuste, crea un archivo
requirements.txtcon el siguiente contenido:
Nota: En este instructivo, no se usan las versiones más recientes de las dependencias de NVIDIA y PyTorch. Si necesitas dependencias más recientes, consulta la documentación de NVIDIA y la documentación de Pytorch.Para descargar, tokenizar y preprocesar el conjunto de datos en un formato listo para el entrenamiento, crea un archivo
preprocess_data.pycon el siguiente contenido:Para especificar las instrucciones de tu trabajo, crea un archivo
train.pycon el siguiente contenido:
Sube secuencias de comandos al clúster de Slurm
Para subir las secuencias de comandos que creaste en la sección anterior al clúster de Slurm, sigue estos pasos:
Recupera el nombre del nodo de acceso de tu clúster para establecer la variable
LOGIN_NODE:La variable
LOGIN_NODEalmacena un valor similar a${CLUSTER_NAME}-login-001.Crea una regla de firewall:
Sube tus secuencias de comandos al directorio principal del nodo de acceso:
Conéctate al clúster de Slurm
Conéctate al clúster de Slurm conectándote al nodo de acceso a través de SSH:
Instala frameworks y herramientas
Después de conectarte al nodo de acceso, instala los frameworks y las herramientas de la siguiente manera:
Configura un entorno virtual de Python con todas las dependencias necesarias:
Comienza a entrenar previamente tu carga de trabajo
Para comenzar a entrenar tu carga de trabajo, haz lo siguiente:
Envía el trabajo al programador de Slurm:
En el nodo de acceso de tu clúster de Slurm, puedes supervisar el progreso del trabajo. Para ello, verifica los archivos de resultado creados en tu directorio
home:Si el trabajo se inicia correctamente, el archivo
.errmostrará una barra de progreso que se actualizará a medida que avance el trabajo.
Supervisa tu carga de trabajo
Puedes supervisar el uso de las GPUs en tu clúster de Slurm para verificar que tu trabajo de ajuste fino se ejecute de manera eficiente. Para ello, abre el siguiente vínculo en tu navegador:
https://console.cloud.google.com/monitoring/metrics-explorer?project=PROJECT_ID&pageState=%7B%22xyChart%22%3A%7B%22dataSets%22%3A%5B%7B%22timeSeriesFilter%22%3A%7B%22filter%22%3A%22metric.type%3D%5C%22agent.googleapis.com%2Fgpu%2Futilization%5C%22%20resource.type%3D%5C%22gce_instance%5C%22%22%2C%22perSeriesAligner%22%3A%22ALIGN_MEAN%22%7D%2C%22plotType%22%3A%22LINE%22%7D%5D%7D%7D
Como alternativa, puedes ingresar el comando directamente en la terminal:
Cuando supervisas tu carga de trabajo, puedes ver lo siguiente:
Uso de las GPUs: Para un trabajo de ajuste fino correcto, puedes esperar ver que el uso de las 16 GPUs (ocho GPUs para cada VM del clúster) aumente y se estabilice en un nivel específico durante todo el entrenamiento. PROBAR
Duración del trabajo: El trabajo debería tomar aproximadamente una hora en completarse.
Descarga tu modelo
Después de ejecutar el trabajo correctamente, el modelo entrenado se guarda en el directorio ~/qwen2-from-scratch-on-smollm-fineweb/ del nodo de acceso. Como este directorio compartido persistente se activa en todos los nodos de tu clúster, los puntos de control del modelo permanecen disponibles incluso después de que se completa el trabajo o se desasignan los nodos de procesamiento.
Puedes descargar el modelo guardado desde el nodo de acceso a tu máquina local con el comando gcloud compute scp, como se muestra en el siguiente ejemplo:
Después de descargar tu modelo, puedes hacer lo siguiente:
- Carga el modelo para la inferencia: Usa el framework de Hugging Face Transformers para cargar el directorio
qwen2-trained-model/y realizar inferencias con tu modelo de Qwen2 recién entrenado. - Ajuste adicional: Usa el punto de control guardado como punto de partida para realizar un ajuste adicional en un conjunto de datos más específico.
- Envía el modelo a Hugging Face Hub: Comparte tu modelo entrenado enviándolo a Hugging Face Hub.
Realiza una limpieza
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra tus recursos
Para borrar tu clúster de Slurm, sigue estos pasos:
Para borrar tu bucket de Cloud Storage, sigue estos pasos:
Para borrar una imagen de Packer, abre tu navegador web, navega a la siguiente página, busca tu imagen específica y haz clic en Borrar.
Para borrar todas las redes de VPC, las reglas de firewall, los routers, las IPs y las subredes asociadas con el proyecto, haz lo siguiente:
Borra tu proyecto
Borra un Google Cloud proyecto:
gcloud projects delete PROJECT_ID