
Añadimos un LLM personalizado a un robot comercial (Parte 4): Entrena tu propio LLM con GPU
Tabla de contenidos:
- Introducción
- Preparativos
- Configuración de hardware
- Entorno de desarrollo
- Entrenando el modelo
- Resumen
Introducción
En el artículo anterior, explicamos brevemente cómo crear conjuntos de datos para grandes modelos lingüísticos y demostramos cómo entrenar un modelo lingüístico utilizando sólo una CPU con un ejemplo sencillo. Sin embargo, no probamos el modelo porque, en términos reales, sólo era un modelo preentrenado. En este artículo, continuamos nuestro análisis sobre el entrenamiento de modelos, esta vez utilizando las GPU para acelerar el proceso. Es importante señalar que, como ejemplo de demostración, este modelo aún no es lo suficientemente potente, por lo que no cubriremos las pruebas del modelo en este artículo. Las pruebas se abordarán en artículos posteriores.
En la segunda parte de esta serie ya tratamos la configuración de los entornos de aceleración CUDA. Ahora, nos centraremos en el uso de tarjetas gráficas AMD para acelerar el entrenamiento, que sirve como complemento a ese artículo anterior. Actualmente, configurar un entorno para tarjetas gráficas NVIDIA es relativamente sencillo, mientras que configurar un entorno para tarjetas AMD puede presentar diversos retos. En este artículo, proporcionaremos soluciones a problemas comunes, permitiéndole acelerar sin problemas la formación de su propio modelo de lenguaje financiero utilizando tarjetas gráficas AMD. Si utilizas tarjetas gráficas NVIDIA, no te preocupes: los métodos de entrenamiento son los mismos. Siempre y cuando ya hayas configurado el entorno CUDA, puedes seguir las instrucciones de formación proporcionadas en este artículo sin necesidad de centrarte en los pasos de configuración específicos para las tarjetas AMD.
¿Listo para partir?
Preparativos
En un artículo anterior de esta serie, tratamos la configuración de los entornos NVIDIA. Sin embargo, no debemos pasar por alto el hecho de que algunos usuarios trabajan con hardware AMD. Por lo tanto, también hablaremos de la configuración del entorno informático de aceleración ROCm (Radeon Open Compute). Por el momento, no existe ninguna versión de PyTorch para Windows compatible con ROCm, y WSL (Windows Subsystem for Linux) tampoco es compatible con ROCm. Así pues, si desea utilizar ROCm para entrenar modelos de gran tamaño, Linux (concretamente Ubuntu) es actualmente la opción viable (como nota positiva, es posible que la próxima versión de ROCm añada compatibilidad con WSL en el futuro, pero la última versión actual es la 6.1.2, y no espero que la primera versión compatible sea la óptima). Durante mi uso, me encontré con varios problemas relacionados con el hardware de AMD a los que no me había enfrentado con NVIDIA. Voy a compartir algunas soluciones que creo que pueden ser útiles para los usuarios de AMD. Aunque pueda resultar un poco engorroso, recuerda que estamos ahorrando dinero, ¿verdad? Ajá...
Así pues, si quieres acelerar el entrenamiento de grandes modelos lingüísticos utilizando tarjetas gráficas AMD, aquí tienes los preparativos necesarios:
1. Instala Ubuntu
Necesitarás instalar un sistema Ubuntu. Configurar un sistema de arranque dual con Windows y Ubuntu en el mismo PC es factible y recomendable. Es posible que necesitemos acceder a datos del sistema Windows, por lo que disponer de ambas opciones de SO resulta útil. En Internet se pueden encontrar tutoriales detallados para configurar un sistema de arranque dual. Alternativamente, puede implementar su dispositivo AMD como un host remoto Ubuntu y utilizarlo como un entorno de desarrollo remoto. A continuación, puede conectarse al host remoto a través de SSH desde su sistema Windows. Este enfoque es similar al uso de WSL en Windows, con la diferencia clave de que las tarjetas gráficas AMD no son compatibles con WSL. He preguntado a los desarrolladores de ROCm al respecto, y me han comentado que la compatibilidad con WSL está actualmente en desarrollo (posiblemente disponible en la próxima versión). Sin embargo, ten en cuenta que esta solución puede requerir que tengas varios ordenadores. Personalmente, utilizo este método.
2. Comprobar la configuración del hardware
Tenga cuidado con la configuración de su hardware. Por ejemplo, mi tarjeta gráfica 7900XTX se bloquea con frecuencia. Inicialmente, utilicé una fuente de alimentación de 850 W, que debería haber sido suficiente para una sola GPU. Sin embargo, no consideré que los fallos de los controladores pudieran estar relacionados con problemas de alimentación. Después de probar varias soluciones sin éxito, un amigo sugirió actualizar a una fuente de alimentación de 1250 W, y todo funcionó sin problemas.
Así que aquí va un consejo sincero para todos los usuarios de hardware AMD: Asegúrate de que tu fuente de alimentación puede con tus dispositivos.
3. ROCM e HIP
Si prefieres una configuración de entorno menos complicada, puedes utilizar la imagen Docker oficial de AMD. Simplemente extraiga la imagen de contenedor oficial de ROCm utilizando Docker. La mayoría de las configuraciones de entorno necesarias ya están establecidas en la imagen Docker, por lo que recomiendo este enfoque.
4. Configuración de hardware
Durante mi uso del dispositivo, noté que la optimización del controlador de GPU de AMD en Ubuntu no es tan buena. Tomemos como ejemplo mi 7900XTX: Aunque puede consumir 350 W, el límite por defecto es de 303 W. Además, incluso a plena carga, la velocidad del ventilador era inferior al 45 % y la temperatura del núcleo se mantenía en 100 °C. Para el entrenamiento de modelos realmente grandes, que pueden funcionar de forma continua durante varias horas o incluso días, mantener temperaturas tan altas es arriesgado para el aparato.
¿Sientes ahora la tentación de cambiar de dispositivo de hardware? Créeme, hay más por venir...
Configuración de hardware
1. Configuración del controlador
Hasta ahora, el controlador de AMD en Ubuntu proporciona algunas interfaces externas para la configuración de la GPU. Los archivos de configuración se encuentran en «/sys/class/drm/card0/device/hwmon/hwmon2/». Tenga en cuenta que «hwmon2» puede variar; podría ser «hwmon1» u otro valor. Le recomiendo que ajuste la velocidad del ventilador y la potencia adecuadamente, pero evite modificar otros ajustes.
Veamos cómo ajustar la velocidad del ventilador. Estas operaciones de archivo requieren privilegios de administrador, de lo contrario, no podrá realizar cambios. Recomiendo usar el usuario administrador (root) para las modificaciones:
- En primer lugar, active pwm1:echo "1" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable
- Aplique la configuración: echo "c" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable
Ajuste la velocidad del ventilador a 128. El valor puede oscilar entre 0 y 255, donde 255 corresponde a la velocidad máxima del ventilador.
- Ajústelo según sus necesidades: echo "128" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
- Aplique el ajuste: echo "c" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
Ajusta el límite de potencia. Por ejemplo, si tu 7900XTX tiene una potencia máxima de 350 W y por defecto es de 303 W:
- Modifícalo a 330 W: echo "330000000" > /sys/class/drm/card0/device/hwmon/hwmon2/power1_cap
- Aplique el ajuste: echo "c" > /sys/class/drm/card0/device/hwmon/hwmon2/power1_cap
Nota:
1. Para revertir la configuración, utilice echo "r" > seguido de la ruta correspondiente (por ejemplo, echo "r" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable).
2. Evite configurar las velocidades de los ventiladores simultáneamente a través de las interfaces "pwm1" y "fan[1-*]_target", ya que esta última anulará a la primera.
2. Configuración de ROCM-SMI
A continuación se muestran los comandos más utilizados para ROCM-SMI:
usage: rocm-smi [-h] [-V] [-d DEVICE [DEVICE ...]] [--alldevices] [--showhw] [-a] [-i] [-v] [-e [EVENT ...]]
[--showdriverversion] [--showtempgraph] [--showfwinfo [BLOCK ...]] [--showmclkrange] [--showmemvendor]
[--showsclkrange] [--showproductname] [--showserial] [--showuniqueid] [--showvoltagerange] [--showbus]
[--showpagesinfo] [--showpendingpages] [--showretiredpages] [--showunreservablepages] [-f] [-P] [-t]
[-u] [--showmemuse] [--showvoltage] [-b] [-c] [-g] [-l] [-M] [-m] [-o] [-p] [-S] [-s]
[--showmeminfo TYPE [TYPE ...]] [--showpids [VERBOSE]] [--showpidgpus [SHOWPIDGPUS ...]]
[--showreplaycount] [--showrasinfo [SHOWRASINFO ...]] [--showvc] [--showxgmierr] [--showtopo]
[--showtopoaccess] [--showtopoweight] [--showtopohops] [--showtopotype] [--showtoponuma]
[--showenergycounter] [--shownodesbw] [--showcomputepartition] [--showmemorypartition] [-r]
[--resetfans] [--resetprofile] [--resetpoweroverdrive] [--resetxgmierr] [--resetperfdeterminism]
[--resetcomputepartition] [--resetmemorypartition] [--setclock TYPE LEVEL] [--setsclk LEVEL [LEVEL ...]]
[--setmclk LEVEL [LEVEL ...]] [--setpcie LEVEL [LEVEL ...]] [--setslevel SCLKLEVEL SCLK SVOLT]
[--setmlevel MCLKLEVEL MCLK MVOLT] [--setvc POINT SCLK SVOLT] [--setsrange SCLKMIN SCLKMAX]
[--setextremum min|max sclk|mclk CLK] [--setmrange MCLKMIN MCLKMAX] [--setfan LEVEL]
[--setperflevel LEVEL] [--setoverdrive %] [--setmemoverdrive %] [--setpoweroverdrive WATTS]
[--setprofile SETPROFILE] [--setperfdeterminism SCLK]
[--setcomputepartition {CPX,SPX,DPX,TPX,QPX,cpx,spx,dpx,tpx,qpx}]
[--setmemorypartition {NPS1,NPS2,NPS4,NPS8,nps1,nps2,nps4,nps8}] [--rasenable BLOCK ERRTYPE]
[--rasdisable BLOCK ERRTYPE] [--rasinject BLOCK] [--gpureset] [--load FILE | --save FILE]
[--autorespond RESPONSE] [--loglevel LEVEL] [--json] [--csv]
Establecer opciones:
--setclock TYPE LEVEL Establecer nivel(es) de frecuencia de reloj para el reloj especificado (requiere nivel de Perf manual)
--setsclk LEVEL [LEVEL ...] Establecer nivel(es) de frecuencia de reloj de GPU (requiere nivel de Perf manual)
--setmclk LEVEL [LEVEL ...] Establecer nivel(es) de frecuencia de reloj de memoria de GPU (requiere nivel de Perf manual)
--setpcie LEVEL [LEVEL ...] Establecer nivel(es) de frecuencia de reloj PCIE (requiere nivel de Perf manual)
--setslevel SCLKLEVEL SCLK SVOLT Cambiar la frecuencia de reloj de la GPU (MHz) y el voltaje (mV) para un nivel específico
--setmlevel MCLKLEVEL MCLK MVOLT Cambiar la frecuencia de reloj de la memoria de la GPU (MHz) y el voltaje para (mV) un nivel específico
--setvc POINT SCLK SVOLT Cambiar la curva de tensión SCLK (MHz mV) para un punto específico
--setsrange SCLKMIN SCLKMAX Configurar velocidad SCLK mínima y máxima
--setextremum min|max sclk|mclk CLK Ajuste mín./máx. de la velocidad SCLK/MCLK
--setmrange MCLKMIN MCLKMAX Configurar velocidad MCLK mínima y máxima
--setfan LEVEL Ajustar la velocidad del ventilador de la GPU (Nivel o %)
--setperflevel LEVEL Nivel de rendimiento
--setoverdrive % Establecer el nivel de GPU OverDrive (requiere manual|nivel de Perf alto)
--setmemoverdrive % Establecer el nivel de Overclock de la memoria de la GPU (requiere manual|nivel de Perf alto)
--setpoweroverdrive WATTS Configura la potencia máxima de la GPU mediante Power OverDrive en vatios
--setprofile SETPROFILE Especifique el nivel de perfil de potencia (#) o una cadena entrecomillada de atributos de perfil PERSONALIZADOS «# # # #...» (requiere nivel Perf manual)
--setperfdeterminism SCLK Establece un límite de frecuencia de reloj para obtener una variación mínima del rendimiento
--setcomputepartition {CPX,SPX,DPX,TPX,QPX,cpx,spx,dpx,tpx,qpx} Set compute partition
Establecer partición de memoria --setmemorypartition {NPS1,NPS2,NPS4,NPS8,nps1,nps2,nps4,nps8} Establecer partición de memoria
--rasenable BLOCK ERRTYPE Habilitar RAS para el bloque y el tipo de error especificados
--rasdisable BLOCK ERRTYPE Desactivar RAS para el bloque y el tipo de error especificados
--rasinject BLOCK Inyectar veneno RAS para el bloque especificado (SÓLO FUNCIONA EN UNSECURE BOARDS)
Opciones de reinicio:
-r, --resetclocks Restablecer relojes y OverDrive por defecto
--resetfans Reajuste de los ventiladores a control automático (controlador)
--resetprofile Restablecer el perfil de energía predeterminado
--resetpoweroverdrive Devuelve la potencia máxima de la GPU al estado sordo del dispositivo
--resetxgmierr Restablecer recuento de errores XGMI
--resetperfdeterminism Desactivar el determinismo del rendimiento
--resetcomputepartition Restablece el estado de la partición de computación de arranque
--resetmemorypartition Restablece el estado de la partición de memoria de arranque
Opciones de respuesta automática:
--autorespond RESPONSE Respuesta para proporcionar automáticamente para todas las indicaciones (NO RECOMENDADO)
Opciones de salida:
--loglevel LEVEL Cuánta salida se imprimirá para lo que el programa está haciendo, uno de debug/info/warning/error/critical
--json Imprimir salida en formato JSON
--csv Imprimir salida en formato CSV
3. Configuración de AMD-SMI
Teniendo en cuenta la actual dirección de desarrollo de ROCm, es posible que amd-smi sustituya a rocm-smi. A continuación se muestran los comandos más utilizados para amd-smi:
usage: amd-smi set [-h] -g GPU [GPU ...] [-f %] [-l LEVEL] [-P SETPROFILE] [-d SCLKMAX]
[-C PARTITION] [-M PARTITION] [-o WATTS] [-p POLICY_ID] [-x POLICY_ID]
[--json | --csv] [--file FILE] [--loglevel LEVEL]
Se debe especificar una GPU para establecer una configuración.
Debe proporcionarse un argumento de conjunto; se aceptan varios argumentos de conjunto.
.
Establecer argumentos:
-h, --help Muestra este mensaje de ayuda y sale
-g, --gpu GPU [GPU ...] Seleccione un ID de GPU, BDF o UUID entre las opciones posibles
-f, --fan % Ajustar la velocidad del ventilador de la GPU (0-255 o 0-100%)
-l, --perf-level LEVEL Establecer el nivel de rendimiento
-P, --profile SETPROFILE Establecer el nivel de perfil de potencia (#) o una cadena entre comillas de atributos de perfil personalizados
-d, --perf-determinism SCLKMAX Establece el límite de frecuencia de reloj de la GPU y el nivel de rendimiento en determinismo para obtener una variación mínima del rendimiento
. -C, --compute-partition PARTITION Establezca uno de los siguientes modos de partición de cálculo: CPX, SPX, DPX, TPX, QPX
-M, --memory-partition PARTITION Establezca uno de los siguientes modos de partición de memoria: NPS1, NPS2, NPS4, NPS8
-o, --power-cap WATTS Establecer límite de capacidad de potencia
-p, --dpm-policy POLICY_ID Establecer la política GPU DPM utilizando la ID de directiva
-x, --xgmi-plpd POLICY_ID Establezca la política de apagado por enlace de la GPU XGMI utilizando la ID de directiva
.
.
Modificadores de comandos:
--json Muestra la salida en formato JSON (legible por humanos por defecto).
--csv Muestra la salida en formato CSV (legible por humanos por defecto).
--file FILE Guarda la salida en un archivo en la ruta proporcionada (stdout por defecto).
--loglevel LEVEL Establezca el nivel de registro entre las opciones posibles: DEBUG, INFO, WARNING, ERROR, CRITICAL
Nota:
Vale la pena mencionar que algunas configuraciones fallan cuando se utiliza amd-smi, pero tienen éxito con rocm-smi. Por ejemplo: sudo amd-smi set -g 0 -f 90% failed: «ValueError: Unable to set fan speed 229 on GPU ID: 0 BDF:0000:03:00.0».En tales casos, cambie al uso de rocm-smi: sudo rocm-smi --setfan 90%. ¡Funciona!
4. Software de soporte para la configuración del hardware
En Ubuntu, también existen herramientas de gestión basadas en la interfaz de usuario. Aunque no profundizaremos en ellas en este artículo, los usuarios interesados pueden explorar las siguientes opciones:
LACT: https://github.com/ilya-zlobintsev/LACT
radeon-profile: https://github.com/marazmista/radeon-profile
Entorno de desarrollo
Una vez configurado el hardware, tendrás que configurar el siguiente entorno en tu sistema para la aceleración de la GPU. Sigamos utilizando los dispositivos AMD como ejemplo:
- Compatibilidad de controladores para computación acelerada: Es necesario instalar el controlador 'amdgpu DKMS' y el SDK 'ROCm HIP'.
- Para las bibliotecas de Python que admiten computación acelerada: PyTorch compilado con ROCm. Si necesita cuantificación para modelos, considere usar bitsandbytes (compilado con ROCm). Para un cálculo acelerado, es posible que necesite flash-attention y triton (ambos compilados con ROCm). Durante las pruebas de inferencia, puedes utilizar vllm. En nuestro ejemplo, instalar PyTorch debería ser suficiente.
1. Instalación de controladores y dependencias
Compruebe si su hardware y sistema son compatibles con la última versión de ROCm. De lo contrario, explora versiones anteriores de ROCm. Si ninguna versión es compatible con tu dispositivo, felicitaciones: ¡finalmente estás libre del tormento de AMD! Considere explorar otras marcas. Si su dispositivo es compatible con ROCm, tiene dos opciones: Implementar el entorno usando Docker ro install directamente en el host local. Los pasos son similares ya sea que estés instalando localmente o dentro de un contenedor Docker. Sin embargo, recomiendo encarecidamente utilizar Docker. Si comete errores durante las operaciones, puede simplemente eliminar el contenedor y ejecutar uno nuevo desde la imagen de Ubuntu ya extraída, ¡sin necesidad de reinstalar el sistema! Por lo tanto, este artículo se centra en la implementación del entorno de desarrollo mediante Docker. Al instalar Docker, utilice Docker Engine (no Docker Desktop). Consulte la guía de instalación:https://docs.docker.com/engine/install.
2. Extraer la imagen base
Extraiga la imagen base de Ubuntu 22.04: docker pull ubuntu:22.04
Nota:
Si prefiere una implementación no personalizada, extraiga directamente la imagen ROCm/PyTorch:docker pull rocm/pytorch:latest.
Luego ejecuta el contenedor:
docker run -it --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
--device=/dev/kfd --device=/dev/dri --group-add video \
--ipc=host --network=host --shm-size 8G rocm/pytorch:latest
Dentro del contenedor Docker, la mayoría de los entornos de desarrollo ya están configurados. Puedes copiar llm.c en el contenedor o clonarlo desde el repositorio oficial usando Git. Luego proceda directamente a la sección de entrenamiento del modelo. Sin embargo, si encuentra problemas poco comunes, no sabrá cómo solucionarlos. Por eso, mi recomendación es ir implementando paso a paso, así siempre sabremos dónde encontrar soluciones.
3. Crear un contenedor
Ejecute el siguiente comando para crear un contenedor (puede elegir un nombre diferente si lo desea):
docker run -it --name llmc --cap-add=SYS_PTRACE --ipc=host --network=host \
--security-opt seccomp=unconfined --device=/dev/kfd --device=/dev/dri --group-add video ubuntu:22.04
Nota:
"--name llmc" es opcional, nombra el contenedor creado "llmc". Si omite este parámetro, el contenedor tendrá un nombre aleatorio. Recomiendo utilizar --network=host para simplificar el acceso a la red desde el contenedor al host. De lo contrario, el modo de red predeterminado está puenteado, lo que complica el acceso a la red del contenedor al host (por ejemplo, acceder al proxy de red del host). "--ipc=host" permite que el contenedor comparta memoria con el host, lo que mejora la eficiencia. Sin embargo, reduce la seguridad. Úselo según sus necesidades.
4. Instalación del controlador y configuración de ROCm
Instalar las dependencias de software necesarias. Si está instalando en el host, anteponga el comando sudo:
apt install wget apt install gpg
Configurar el repositorio APT de amdgpu:
wget https://repo.radeon.com/rocm/rocm.gpg.key -O - | gpg --dearmor | tee /etc/apt/keyrings/rocm.gpg > /dev/null echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/amdgpu/6.1.1/ubuntu jammy main" \ | tee /etc/apt/sources.list.d/amdgpu.list apt update echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/6.1.1 jammy main" \ | tee --append /etc/apt/sources.list.d/rocm.list echo -e 'Package: *\nPin: release o=repo.radeon.com\nPin-Priority: 600' \ | tee /etc/apt/preferences.d/rocm-pin-600 apt update
Instalar el controlador amdgpu:
apt install amdgpu-dkms
Si está instalando en el host local, reinicie el sistema: reiniciar.
Instalar ROCm (he elegido rocm-hip-sdk):
apt install rocm-hip-sdk
Por supuesto, también tienes otras opciones:
- rocm: Todos los paquetes, herramientas y bibliotecas principales de ROCm.
- rocm-language-runtime: Entorno de ejecución de ROCm.
- rocm-developer-tools: Depurar y perfilar aplicaciones HIP.
- rocm-hip-runtime: Ejecuta aplicaciones HIP escritas para la plataforma AMD.
- rocm-hip-runtime-devel: Desarrolla aplicaciones en HIP o porta desde CUDA.
- rocm-opencl-runtime: Ejecuta aplicaciones basadas en OpenCL en la plataforma AMD.
- rocm-opencl-sdk: Desarrollar aplicaciones basadas en OpenCL para la plataforma AMD.
- rocm-hip-libraries: Bibliotecas HIP optimizadas para la plataforma AMD.
- rocm-hip-sdk: Desarrollar o portar aplicaciones y bibliotecas HIP para la plataforma AMD.
- rocm-ml-libraries: Bibliotecas clave de aprendizaje automático. Incluye MIOpen.
- rocm-ml-sdk: Desarrollar y ejecutar aplicaciones de aprendizaje automático para AMD.
- rocm-openmp-runtime: Ejecuta aplicaciones basadas en OpenMP en la plataforma AMD.
- rocm-openmp-sdk: Desarrollar aplicaciones basadas en OpenMP para el software AMD.
Después de la instalación, agregue las siguientes variables de entorno:
tee --append /etc/ld.so.conf.d/rocm.conf <<EOF /opt/rocm/lib/opt/rocm/lib64EOF ldconfig
Comprobar el estado de DKMS:
dkms status
Agregue rutas binarias a la variable de entorno PATH:
export PATH=$PATH:/opt/rocm-6.1.1/bin
Verifique la instalación: /opt/rocm-6.1.1/bin/rocminfo /opt/rocm-6.1.1/bin/clinfo
5. Instalación de PyTorch
Si Python no está instalado, use apt para instalarlo o configure un entorno Conda (Miniconda): apt install libjpeg-dev python3-dev python3-pip
A continuación, consulte el sitio web oficial de PyTorch para ver si su versión de ROCm es compatible. A partir de ahora, la versión oficial no es compatible con ROCm 6.1.1, por lo que instalaremos la versión preliminar:
pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.1/
Si su versión de ROCm es inferior a la versión oficialmente compatible, ajuste el comando de instalación en consecuencia. Por ejemplo, si el comando de lanzamiento oficial es: pip3 install Torch --index-url https://download.pytorch.org/whl/rocm6.0, y su versión de ROCm es "5.7.*", puede instalarlo de la siguiente manera:
pip3 install torch --index-url https://download.pytorch.org/whl/rocm5.7
Si encuentra un problema "NameError: name ‘amdsmi’ is not defined", es porque las versiones más nuevas de Torch requieren compatibilidad con Python para amd-smi. Lamentablemente, usar pip directamente no funcionará. Necesitará compilarlo e instalarlo localmente. Navegue a /opt/rocm/share/amd_smi e instale amd-smi-lib:
apt install amd-smi-lib
Si está instalando la versión de Python predeterminada del host:
python3 -m pip install --user .
Si encuentra un error de permiso como:
error: Cannot update time stamp of directory 'amdsmi.egg-info' error: could not create 'amdsmi.egg-info': Permission denied
Ejecute el siguiente comando con privilegios de root:
sudo python3 -m pip install --user .
Si no se encuentra Python3, utilice:
sudo -H python3 -m pip install --user .
Si está utilizando un entorno Conda (por ejemplo, llamado "train_llm"), instálelo de la siguiente manera:
sudo /home/deeper/miniconda/envs/train_llm/bin/python -m pip install .
Reemplace la ruta con la ruta de Python de su entorno virtual específico.
Por último, vuelve a intentarlo:
pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.1/
Entrenando el modelo
Al igual que en el artículo anterior, continuaremos utilizando el proyecto de código abierto “llm.c”. Personalmente, este proyecto me parece excelente: la lógica del código es clara y los comentarios son detallados, lo que hace que sea fácil de leer. Los lectores interesados pueden explorar el código fuente completo de este proyecto para obtener una comprensión clara de todo el proceso de entrenamiento de modelos de lenguaje grandes. No reiteraré el código para cada paso de entrenamiento aquí, los comentarios en el código fuente ya son bastante explícitos.
Para descargar el repositorio «llm.c», cabe señalar aquí que no se debe gitear directamente el repositorio oficial, sino utilizar el proyecto «https://github.com/anthonix/llm.c» que soporta dispositivos AMD. Si tienes algún problema con la formación, puedes cambiar a la versión del código fuente que utilizo, la versión actual que estoy utilizando es «37dfcf6»:
cd llm.c
git checkout 37dfcf6
Si necesita cambiar de versión, utilice la siguiente línea de comando para cambiar después de git clone down el proyecto:
1. Instalar dependencias del proyecto
Primero, instale las dependencias del proyecto:
pip install -r requirements.txt
Tenga en cuenta que debe instalar Torch primero antes de instalar las dependencias de requirements.txt para evitar conflictos de versiones.
A continuación, compile el proyecto:
make train_gpt2amd AMDGPU_TARGETS=gfx1100
Para determinar su ISA (Instruction Set Architecture) específica, use rocminfo y filtre la salida con grep:
rocminfo | grep Name:
2. Prepárese para el entrenamiento
Este paso es similar al entrenamiento en una CPU, por lo que no entraré en detalles aquí. Si necesita una explicación completa, consulte el artículo anterior. A continuación se muestra el comando de entrenamiento.
Obtener los datos:
python data_enc
Prepárese para el entrenamiento:
python train_gpt2.py --input_bin data/val_data.bin
Reemplace "data/val_data.bin" con la ruta de salida de la ejecución de data_enc.
Ejecute el siguiente comando:
make train_gpt2amd AMDGPU_TARGETS=gfx1100
Nuevamente, reemplace gfx1100 con su ISA específica obtenida de rocminfo.
Nota:
Ignore las "4 advertencias generadas al compilar para el host". Ejecute el siguiente comando:Si se encuentra con un «fatal error: ‘cmath’ file not found», es probable que se deba a una versión de g++ no coincidente. Algunas versiones de Ubuntu vienen con g++11, pero no con g++12. Instale g++12 y configúrelo como la versión predeterminada:
apt install g++-12 update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 60 --slave /usr/bin/g++ g++ /usr/bin/g++-12
./train_gpt2amd
Cuando ejecuté el último comando, recibí un error de programa con "[CUDA ERROR] at file build/hip/llmc/layernorm.cuh:400". Si a estas alturas te arrepientes de haber elegido el hardware de AMD, créeme, esto es sólo el principio: te esperan muchos más retos... ¡El viaje con el hardware de AMD no ha hecho más que empezar!
Si consigue ejecutarlo con éxito, ¡genial! Si no, no te desanimes, aún podemos utilizar scripts de Python para entrenar el modelo.
Para entrenar el modelo mediante scripts Python, puede ejecutar el siguiente comando:
python train_gpt2.py \ --input_bin "./data/train_data.bin" \ --input_val_bin "./data/val_data.bin" \ --val_loss_every 10 \ --sample_every 0 \ --output_dir pylog124M \ --write_tensors 0 \ --model d12 \ --batch_size 16 \ --sequence_length 128 \ --total_batch_size 4096 \ --dtype bfloat16 \ --compile 1 \ --tensorcores 1 \ --flash 1 \ --num_iterations 100 \ --weight_decay 0.1 \ --zero_stage 1 \ --learning_rate 0.0006 \ --warmup_iters 0 \ --learning_rate_decay_frac 0.0 \ --overfit_single_batch 0
He aquí algunos parámetros que conviene mencionar:
- –input_bin "./data/train_data.bin" Este es nuestro conjunto de datos de entrenamiento;
- –input_val_bin "./data/val_data.bin" Este es nuestro conjunto de datos de validación;
- –val_loss_every 10 Imprime la pérdida cada cierto número de pasos;
- –batch_size 16 Este valor debe ser una potencia de 2, de lo contrario se producirá un error, ya que sólo estamos probando y el conjunto de datos no es grande, no hay necesidad de que sea demasiado grande;
- –sequence_length 128 Este valor debe ser una potencia de 2, de lo contrario se producirá un error, ya que la longitud de secuencia de nuestro conjunto de datos es de 64, por lo que aquí lo establezco en 128;
- –total_batch_size 4096 Sólo estamos probando, por lo que este valor no necesita ser demasiado grande, del mismo modo, este valor debe ser una potencia de 2 de lo contrario se producirá un error;
- –num_iterations 100 Este es el número de pasos de entrenamiento, de manera similar, ya que es una prueba, simplemente lo puse a 100;
- –flash 1 Este valor indica si se debe activar la atención de flash, «1» es para activar, «0» es para desactivar.
Los resultados:
Como puede ver, hemos entrenado con éxito un modelo de lenguaje financiero exclusivo para nosotros utilizando la GPU. Ahora vamos a quitar el tiempo que utilizamos para entrenar con la CPU para comparar:
Originalmente, nuestro proceso de entrenamiento en la CPU tardaba una media de unos 8.000 ms por paso, mientras que el entrenamiento en la GPU tardaba menos de 80 ms por paso.
Aunque algunos parámetros pueden haber cambiado un poco, no es difícil ver en el tiempo de cada paso de entrenamiento que el uso de la GPU acelerará enormemente el proceso de entrenamiento, ¡casi se acelera más de 100 veces!
Dado que nuestro modelo es sólo un simple ejemplo entrenado, y no ha sido optimizado, no hay necesidad de crear una estrategia EA para la prueba, como se puede imaginar el resultado debe ser muy malo.
Pero no se preocupe, los siguientes artículos tratarán sobre cómo afinar un gran modelo lingüístico utilizando nuestros propios datos, y después crear un EA y probarlo.
Nota:
Si este lugar informa de un error RuntimeError: Error HIP: la operación no puede realizarse en el estado actual. Compilar con TORCH_USE_HIP_DSA para activar las afirmaciones del lado del dispositivo.
Prueba a añadir variables de entorno:
export HSA_OVERRIDE_GFX_VERSION=11.0.0 export HIP_VISIBLE_DEVICES=0 export ROCM_PATH=/opt/rocm export AMDGPU_TARGETS=gfx1100
O añade el siguiente código al principio de train_gpt2.py:
from os import putenv putenv(“HSA_OVERRIDE_GFX_VERSION”, “11.0.0”)
Donde 11.0.0 es el HSA del 7900XTX, necesitas comprobar el HSA de acuerdo a tu propio dispositivo y cambiarlo al valor apropiado. La gfx1100 es la ISA de la 7900XTX, necesitas cambiar el valor apropiado de acuerdo a tu propio hardware.
Resumen
En este artículo, hablamos de cómo entrenar un gran modelo lingüístico exclusivo para nosotros en una tarjeta gráfica utilizando nuestro propio conjunto de datos diseñado. Por supuesto, también discutimos la configuración del entorno de desarrollo en la computación acelerada de las tarjetas gráficas AMD, complementamos la parte que no se mencionó en la segunda parte de esta serie, y también completamos la configuración del entorno de las dos tarjetas gráficas principales (amd y nvidia) en el mercado actual para la computación acelerada.
Pero debido a que este ejemplo de demostración no ha sido optimizado, el mismo no evaluó el modelo, ni formuló una estrategia EA basada en el modelo y la probó en el cliente MetaTrader, ya que en la actualidad este modelo de demostración se encuentra sólo en la etapa de pre-entrenamiento, por lo que estas operaciones son innecesarias y no han alcanzado un nivel práctico. En los siguientes artículos, analizaremos el ajuste fino de grandes modelos de lenguaje y formularemos estrategias de EA correspondientes para probarlas en el cliente de MetaTrader.
¡Nos vemos en nuestro próximo artículo!
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/13498





- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso