[Aprendizaje profundo] Entrenamiento de precisión mixto y análisis de memoria de video

Entrenamiento de precisión mixto y análisis de memoria de video.

Para obtener una introducción a la precisión de los parámetros, consulte el artículo https://zhuanlan.zhihu.com/p/604338403

Blog relacionado
[Megatron-DeepSpeed] Código de herramienta paralela de tensor Mpu Explicación detallada (3): Implementación y prueba de la capa paralela de tensor
[Megatron-DeepSpeed] Código de herramienta paralela de tensor Mpu Explicación detallada (1): Inicialización del entorno paralelo
[Megatron-DeepSpeed] Tensor Código de herramienta paralela mpu Explicación detallada (2): Mapeos de encapsulación de operaciones de comunicación colectiva
[Aprendizaje profundo] [Capacitación distribuida] DeepSpeed: AllReduce y ZeRO-DP
[Aprendizaje profundo] Entrenamiento de precisión mixto y análisis de memoria de video
[Aprendizaje profundo] [Capacitación distribuida] Capacitación] Operación de comunicación colectiva y ejemplo de Pytorch
[Procesamiento del lenguaje natural] [Modelo grande] Modelo de lenguaje grande Prueba de herramienta de razonamiento BLOOM
[Procesamiento del lenguaje natural] [Modelo grande] GLM-130B: un modelo de lenguaje bilingüe previamente entrenado de código abierto
[Procesamiento del lenguaje natural ] [Modelo grande] Introducción a la multiplicación de matrices de 8 bits para transformadores grandes
[Procesamiento del lenguaje natural] [Modelo grande] BLOOM: Un modelo multilingüe con 176B de parámetros y acceso abierto

1. ¿Cómo se entrena el modelo?

Aquí se presenta una breve introducción al proceso de propagación hacia adelante, propagación hacia atrás y optimización, que facilita la comprensión del entrenamiento de precisión mixto posterior y el análisis de la memoria de video.

1. Propagación hacia adelante

Las redes neuronales pueden verse como funciones de ajuste de gran tamaño. Supongamos que la red neuronal es f ( x ; θ ) = g ( z ) , z = h ( x ) f(x;\theta)=g(z),z=h(x)f ( x ;yo )=gramo ( z ) ,z=h ( x ) . Luego, el proceso de propagación hacia adelante de la red neuronal: la muestraxxx se introduce en la funciónhhh , obtenga la salidaz = h ( x ) z=h(x)z=h ( x ) ; entonces generarázzz se envía a la funciónggg obtiene el resultado finalg ( z ) g(z)gramo ( z ) . Todo el proceso se simplifica comof ( x ; θ ) f(x;\theta)f ( x ;θ )θ \thetaθ es el parámetro a aprender del modelo.

2. Propagación hacia atrás

​ La retropropagación aquí todavía sigue los supuestos anteriores: red neuronal f ( x ; θ ) f(x;\theta)f ( x ;yo ) ,xxx es la entrada,θ \thetaθ es un parámetro. Además, supongamos que hayun NNN muestras etiquetadas{ ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } \{(x_1,y_1),(x_2,y_2),\dots, (x_N, y_N)\}{( x1,y1) ,( x2,y2) ,,( xnorte,ynorte)} , entre los cualesxi x_iXyoderecha iiEl valor de i muestras,yi y_iyyoes la etiqueta correspondiente. Ahora, de NNSeleccione mm de N muestrasm muestras para formar un lote{ ( x 1 ′ , y 1 ′ ) , ( x 2 ′ , y 2 ′ ) , … , ( xm ′ , ym ′ ) } \{(x_1',y_1'),(x_2 ' ,y_2'),\puntos,(x_m',y_m')\}{( x1,y1) ,( x2,y2) ,,( xmetro,ymetro)} . Entonces el modelo está aquímmEl gradiente en m muestras es g ^ = 1 m ∇ θ ∑ i = 1 m L ( f ( xi ′ ; θ ) , yi ′ ) \hat{g}=\frac{1}{m}\nabla_{\ theta }\sum_{i=1}^m L(f(x_i';\theta),y_i')gramo^=metro1iyo = 1mL ( f ( xi;yo ) ,yi)

  • SGD

    lr lrl r es la tasa de aprendizaje del modelo, entonces el proceso de optimización del modelo es:
    θ ← θ − lr × g ^ \theta\leftarrow\theta-lr\times\hat{g}iil r×gramo^

  • Adán

    En comparación con el proceso de optimización de SGD, Adam resuelve los problemas de oscilación de gradiente y tasa de aprendizaje dinámico introduciendo dos variables. Específicamente, inicialice dos variables v = 0 v=0v=0 yr = 0 r=0r=0 y especifique dos hiperparámetrosβ 1 \beta_1b1y β 2 \beta_2b2. Supongamos que ahora es t + 1 t+1t+Actualización en 1 paso y gradiente por lotesg ^ \hat{g}gramo^Definiciones:
    v = β 1 ⋅ v + ( 1 − β 1 ) ⋅ g^r = β 2 ⋅ r + ( 1 − β 2 ) ⋅ g^⊙ g^v^ = v 1 − β 1 tr ^ = r 1 − β 2 t Δ θ = v ^ r ^ + δ v=\beta_1\cdot v + (1-\beta_1)\cdot\hat{g}\\ r=\beta_2\cdot r+(1- \beta_2)\ cdot \hat{g}\odot\hat{g} \\ \hat{v}=\frac{v}{1-\beta_1^t} \\\hat{r}=\frac{r }{1- \beta_2^t}\\\Delta\theta=\frac{\hat{v}}{\sqrt{\hat{r}}+\delta}v=b1v+( 1b1)gramo^r=b2r+( 1b2)gramo^gramo^v^=1b1tvr^=1b2tryo _=r^ +dv^
    Entre ellos, δ \deltaδ es una pequeña constante, generalmente establecida en1 0 − 8 10^{-8}1 0−8._ _ _ El proceso de actualización de los parámetros del modelo es:
    θ = θ − lr × Δ θ \theta = \theta - lr\times \Delta\thetai=il r×yo _

2. Entrenamiento de precisión mixto

1. Precisión

Por lo general, el modelo se entrenará con precisión float32, pero a medida que el modelo se hace más grande, el costo del hardware y el tiempo de entrenamiento aumentan considerablemente. Entonces, ¿es posible utilizar float16 para entrenar? La respuesta es no .

​ El rango de representación de float16 es [ − 65504 ∼ 66504 ] [-65504\sim 66504][ -65504 _66504 ] , lo que indica que la precisión es2 − 24 2^{-24}224 .

  • Ventajas del flotador16
    • Reduzca el uso de la memoria de video ; float16 es la mitad más pequeño que float32 y todo el uso de la memoria de video se puede reducir a la mitad;
    • Reducir la sobrecarga de comunicación de la red ;
    • El hardware está optimizado para float16 y la velocidad es más rápida ;
  • Desventajas del flotador16
    • desbordamiento . Para el aprendizaje profundo, el mayor problema con float16 es el "desbordamiento insuficiente". La actualización del modelo suele ser gradiente × lr \text{gradient}\times\text{lr}degradado×lr , a medida que se entrena el modelo, este valor tiende a ser pequeño y puede exceder la precisión representada por float16. El resultado es:la mayoría de los pesos del modelo ya no se actualizan y el modelo es difícil de converger.
    • Error de redondeo . La diferencia entre el peso del modelo y el gradiente es demasiado grande. Cuando el peso se actualiza mediante el gradiente y se redondea, es posible que el peso antes y después de la actualización no cambie.

2. Principio

Para aprovechar las ventajas de float16 y evitar las desventajas se propone un entrenamiento de precisión mixto. En general, float16 se usa para pesos y gradientes de modelos en entrenamiento de precisión mixta, y float32 se usa para parámetros del optimizador. Además, el optimizador también necesita guardar una versión float32 de los pesos.

inserte la descripción de la imagen aquí

El proceso específico de precisión mixta es el siguiente:

  • Propagación hacia adelante utilizando pesos float16;
  • La retropropagación obtiene el gradiente de float16;
  • Calcule la cantidad de actualización de peso de la precisión float32 a través del optimizador;
  • Actualizar pesos float32;
  • Convertir pesos float32 a float16;

3. Combate real

  • ápice

    Apex es una herramienta de entrenamiento de precisión mixta desarrollada por NVIDIA, que permite a los usuarios implementar rápidamente un entrenamiento de precisión mixta. A continuación se muestra cómo llamar a Apex para lograr un entrenamiento de precisión mixto:

from apex import amp

###########
# 其他代码 #
###########

# 利用amp.initialize重新封装model和optimizer
model, optimizer = amp.initialize(model, optimizer, opt_level="O1")

# 其他训练代码

with amp.scale_loss(loss, optimizer) as scaled_loss:
    scaled_loss.backward() #梯度自动缩放
optimizer.step() #优化器更新梯度
optimizer.zero_grad()

###########
# 其他代码 #
###########

​,amp.initialize(model, optimizer, opt_level="O1") aquí se especificará el registro de precisión mixta, y hay 4 niveles en total:

O0: entrenamiento de precisión puro float32, que se puede utilizar como línea base de referencia;
O1: determina automáticamente si usar float16 o float32 de acuerdo con la lista blanca y negra (recomendado);

O2: La mayoría usa float16, excepto la norma por lotes;

​ O3: flotación pura16, entrenamiento inestable;

  • nativo de pytorch

    Pytorch admite el entrenamiento de precisión mixto después de la versión 1.6. A continuación se muestra el código de muestra.

    from torch.cuda.amp import autocast as autocast, GradScaler
     
    ###########
    # 其他代码 #
    ###########
     
    scaler = GradScaler()
     
    ###########
    # 其他代码 #
    ###########
            
    # 前向传播过程中开启
    with autocast():
        output = model(input)
        loss = loss_fn(output, target)
     
    # float16精度范围有限,需要放大
    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()
     
     
    ###########
    # 其他代码 #
    ###########
    

3. ¿Dónde está la memoria de vídeo?

En la actualidad, el entrenamiento de modelos grandes utiliza básicamente entrenamiento de precisión mixta. Con base en la introducción anterior al entrenamiento de precisión mixta, analizaremos más a fondo la ubicación de la memoria de video.

1. Consumo de memoria principal

​ Supongamos que hay una cantidad de parámetro Ψ \PsiΨ y utilice Aadm como optimizador. En primer lugar, dado que los parámetros y gradientes del modelo usan float16, el consumo de memoria es2 Ψ 2\Psi2 Ψ 2\Psi . Aadm mantendrá una copia del modelo float32, que consumirá4 Ψ 4\Psi . Además, según el optimizador Aadm presentado anteriormente, Adam necesita mantener dos variables de estadovvv yrrr . debido avvv yrrr es float32, por lo que el uso de la memoria de video es4 Ψ + 4 Ψ 4\Psi+4\Psi4P+ . En general, el modelo consume 2 Ψ + 2 Ψ = 4 Ψ 2\Psi+2\Psi=4\Psi2P+2P=Memoria de video 4Ψ , el optimizador Aadm consume4 Ψ + 4 Ψ + 4 Ψ = 12 Ψ 4\Psi+4\Psi+4\Psi=12\Psi4P+4P+4P=12Ψ de memoria de vídeo. Finalmente, el consumo total de memoria de video es4 Ψ + 12 Ψ = 16 Ψ 4\Psi+12\Psi=16\Psi4P+12 libras=16Ψ . Para un modelo con parámetros de 1.5B como GPT-2, el consumo de memoria es de al menos24 GB 24 GB24 GB .

2. El consumo restante de memoria de video.

​Activaciones . La activación es z = h ( x ) z=h(x) introducida en el proceso anterior de "propagación hacia adelante"z=h ( x ) , después de completarg ( z ) g(z)La tarjeta gráfica necesita guardar zzantes de g ( z ).z . Evidentemente, las activaciones también consumen mucha memoria de vídeo durante el entrenamiento. Un ejemplo específico, el modelo es GPT-2 de 1.5B, la longitud de la secuencia es 1K y el tamaño del lote es 32, luego el consumo de memoria es 60GB. El punto de control de activación (o recálculo de activación) es un método común para reducir el uso de memoria de la activación. Este método reduce el uso de memoria de las activaciones a una división uniforme del total de activaciones a costa de un 33% de recálculo. Es decir, el uso de la memoria de vídeo activa se reduce de 60 GB a 8 GB.

​ Aunque la huella de memoria de las activaciones se ha reducido significativamente, también pueden ser muy grandes para modelos más grandes. Por ejemplo, para un modelo GPT con 100B de parámetros y un tamaño de lote de 32, incluso si se usa para puntos de control de activación, el uso de memoria de video aún necesita 60 GB.

​Refugios temporales . Para modelos grandes, el búfer temporal utilizado para almacenar resultados intermedios también consume mucha memoria de video. Por ejemplo, en all-reduce, se requiere un búfer plano para fusionar todos los gradientes, mejorando así el rendimiento. Por ejemplo, las operaciones de reducción total en todos los dispositivos aumentan con el tamaño del mensaje. Aunque el gradiente en este artículo es un tensor de fp16, el búfer que puede necesitar fusionarse en algunas operaciones es fp32. Cuando el tamaño del modelo es grande, el búfer temporal no es pequeño. Por ejemplo, para un modelo con parámetros de 1,5 B, un búfer fp32 requiere 6 GB de memoria de video.

Fragmentación de la memoria de vídeo . Incluso si hay suficiente memoria de video, esto puede provocar falta de memoria, lo cual es causado por la fragmentación de la memoria de video. Cuando un proceso realiza una solicitud de memoria de video, si no hay memoria de video contigua para satisfacer la solicitud, incluso si la memoria de video total sigue siendo suficiente, la solicitud fallará. Se puede observar una fragmentación significativa de la memoria al entrenar modelos muy grandes. En casos extremos, puede provocar una fragmentación de la memoria de vídeo del 30 %.

Referencias

https://arxiv.org/pdf/1910.02054.pdf

https://zhuanlan.zhihu.com/p/103685761

https://zhuanlan.zhihu.com/p/604338403

https://blog.csdn.net/flyingluohaipeng/article/details/128095936

https://zhuanlan.zhihu.com/p/406319979

Supongo que te gusta

Origin blog.csdn.net/bqw18744018044/article/details/131030255
Recomendado
Clasificación