O treino de precisão mista é uma técnica utilizada na aprendizagem profunda (DL) para acelerar o treino do modelo e reduzir o consumo de memória sem afetar significativamente a precisão do modelo. Consegue isso usando estrategicamente uma combinação de diferentes formatos de precisão numérica para armazenar e computar valores dentro de uma rede neural (NN). Normalmente, isso envolve o uso do formato padrão de ponto flutuante de 32 bits (FP32 ou precisão única) para partes críticas, como o armazenamento de pesos do modelo, enquanto emprega os formatos de ponto flutuante de 16 bits mais rápidos e menos intensivos em memória (FP16 ou meia precisão e, às vezes, BF16 ou BFloat16) para cálculos durante as passagens para frente e para trás(retropropagação).
Como funciona a precisão mista
A ideia central por detrás da precisão mista é aproveitar os benefícios de velocidade e de memória dos formatos de precisão mais baixa e, ao mesmo tempo, mitigar potenciais problemas de estabilidade numérica. Uma abordagem comum envolve os seguintes passos:
- Mantém os pesos principais em FP32: Uma cópia primária dos pesos do modelo é mantida no formato FP32 padrão para garantir uma elevada precisão nas actualizações dos pesos.
- Utiliza FP16/BF16 para os cálculos: Durante o loop de treinamento, os pesos FP32 são convertidos em FP16 ou BF16 para as passagens para frente e para trás. Os cálculos que usam esses formatos de precisão mais baixa são significativamente mais rápidos em hardware moderno, como as GPUsNVIDIA equipadas com Tensor Cores, que são projetadas especificamente para acelerar multiplicações de matrizes em precisões mais baixas.
- Escala de perdas: Quando utiliza FP16, o intervalo de números representáveis é muito menor do que FP32. Isso pode fazer com que pequenos valores de gradiente calculados durante a retropropagação se tornem zero (underflow), dificultando o aprendizado. Para evitar isso, o valor da perda é escalonado antes da retropropagação, efetivamente escalonando os gradientes para um intervalo representável por FP16. Antes da atualização do peso, estes gradientes são reduzidos. O BF16, com a sua gama dinâmica mais alargada semelhante ao FP32, mas com uma precisão inferior, evita frequentemente a necessidade de escalonamento das perdas.
- Actualiza os pesos principais: Os gradientes calculados (reduzidos se tiver sido utilizado o escalonamento de perdas) são utilizados para atualizar a cópia principal dos pesos, que permanecem em FP32.
Este equilíbrio cuidadoso permite que os modelos sejam treinados mais rapidamente e utilizem menos GPU memória da GPU.
Vantagens da precisão mista
- Treino mais rápido: Os cálculos de baixa precisão (FP16/BF16) são executados muito mais rapidamente em hardware compatível, reduzindo significativamente o tempo necessário para cada época de treino. Isto permite uma iteração e experimentação mais rápidas.
- Consumo de memória reduzido: Os valores FP16/BF16 requerem metade da memória dos valores FP32. Esta redução aplica-se às activações armazenadas durante a passagem para a frente e aos gradientes calculados durante a passagem para trás. O menor uso de memória permite treinar modelos maiores ou usar tamanhos de lote maiores, o que pode melhorar o desempenho do modelo e a estabilidade do treinamento.
- Eficiência melhorada: A combinação de computação mais rápida e requisitos de largura de banda de memória mais baixos leva a uma utilização mais eficiente dos recursos de hardware, reduzindo potencialmente os custos de formação para computação em nuvem ou clusters no local.
Precisão mista vs. conceitos relacionados
- Precisão total (FP32): A formação tradicional utiliza FP32 para todo o armazenamento e computação. É geralmente mais estável em termos numéricos, mas é mais lento e consome mais memória do que a precisão mista.
- Meia precisão (FP16/BF16): Utilizar apenas FP16 ou BF16 durante o treino pode levar a uma instabilidade numérica significativa (especialmente FP16 sem técnicas como o escalonamento de perdas) e a uma potencial perda de precisão. A precisão mista é uma abordagem mais robusta que combina FP32 e FP16/BF16.
- Quantização do modelo: Normalmente, refere-se à conversão de pesos e/ou activações do modelo para formatos de precisão ainda mais baixos, como inteiros de 8 bits (INT8), principalmente para otimizar a velocidade e a eficiência da inferência, especialmente em dispositivos de ponta. Embora por vezes seja utilizada durante o treino(Quantization-Aware Training), é diferente da típica precisão mista FP32/FP16 utilizada durante as fases de treino padrão.