O formato numérico bfloat16
Usar números de ponto flutuante de precisão reduzida é um método comum usado para diminuir o tempo de convergência sem perder a precisão. As TPUs usam o formato de número bfloat16
ao realizar operações de matriz. Operações de multiplicação de matriz são executadas em valores bfloat16
, e acumulações são realizadas em valores float32
do IEEE.
bfloat16
é um formato de ponto flutuante personalizado de 16 bits para machine learning composto por um bit de sinal, oito bits expoentes e sete bits de mantissa. O diagrama a seguir mostra os componentes internos de três formatos de ponto flutuante: float32
: precisão única de IEEE, float16
: meia precisão de IEEE e bfloat16
.
O intervalo dinâmico de bfloat16
e float32
é equivalente. No entanto, bfloat16
ocupa metade do espaço de memória. Para mais informações sobre o desempenho de bfloat16
, consulte Um estudo de BFLOAT16 para treinamento de aprendizado profundo.
Como escolher bfloat16
A equipe de hardware do Google escolheu bfloat16
para Cloud TPUs para melhorar a eficiência do hardware e manter a capacidade de treinar modelos de aprendizado profundo com precisão, tudo com custos mínimos de mudança no float32
. O tamanho físico de um multiplicador
de hardware é escalonado com o quadrado da largura da mantissa. Com menos bits mantissa
do que FP16
, os multiplicadores bfloat16
têm cerca de metade do tamanho em silício de um
multiplicador FP16
típico, e são oito vezes menores que um float32
multiplicador.
As redes neurais são mais sensíveis ao tamanho do expoente do que do mantissa. Para garantir um comportamento idêntico para subfluxos, estouros e NaNs,
bfloat16
tem o mesmo tamanho do expoente que float32
. bfloat16
processa desnormalizações
de maneira diferente de float32
. Ele as limpa para zero. Ao contrário de float16
, que normalmente requer tratamento especial, como escalonamento de perdas, bfloat16
é uma substituição drop-in para float32
ao treinar e executar redes neurais profundas.
Treinamento de precisão mista
A maioria dos cálculos em uma rede neural profunda pode realizar uma tarefa com a mesma precisão usando valores de precisão mais baixos. Alguns modelos podem até mesmo alcançar uma precisão maior com valores de precisão mais baixos.
Ao programar Cloud TPUs, o compilador XLA converte automaticamente valores entre float32
e bfloat16
.
Detalhes sobre a conversão de formato
A conversão de formato de float32 para bfloat16 é inserida automaticamente pelo compilador XLA. Na TPU, o esquema de arredondamento na conversão é arredondado para o valor mais próximo e transbordamento para infla. Além disso, o bfloat16 no Cloud TPU não é compatível com subnormales. Por isso, todos os subnormales são zerados durante a conversão. Valores especiais, como NaN e inf, são preservados na conversão.
A conversão de formato de bfloat16 para float32 também é inserida automaticamente pelo compilador XLA. Como o float32 pode representar todos os valores exatos em bfloat16, a conversão simplesmente preenche 16 zeros nos bits de mantissa. Os valores especiais são preservados na conversão.
Portabilidade de modelo
Os valores de parâmetros e ativações em um modelo podem ser armazenados no formato de 32 bits porque o hardware da TPU pode transmitir automaticamente esses valores para bfloat16
.
Os checkpoints recebidos de um modelo treinado em Cloud TPUs podem ser implantados em outras plataformas de hardware, como inferência ou ajuste em CPUs ou GPUs, sem conversões manuais extensas.
Como melhorar o desempenho com o bfloat16
Embora a conversão automática de formato em TPUs permita evitar a pensar na precisão numérica, outras melhorias de desempenho podem ser alcançadas ao transmitir valores explicitamente para bfloat16
. Há dois motivos para transmitir explicitamente
os valores para bfloat16
:
Armazenar valores no formato
bfloat16
economiza memória no chip, permitindo que as Cloud TPUs treinem modelos maiores ou usem tamanhos de lote maiores.Algumas operações são vinculadas à largura de banda, o que significa que o tempo necessário para carregar dados da memória pode diminuir o tempo total gasto na execução do cálculo. Armazenar operandos e saídas dessas operações no formato
bfloat16
reduz a quantidade de dados que precisam ser transferidos, melhorando a velocidade geral.
Para começar, recomendamos ter uma experiência prática com um dos modelos de referência ativados para bfloat16
que foram otimizados para Cloud TPUs. Em seguida, nosso guia de desempenho, o guia de ferramentas de criação de perfil e o guia de solução de problemas fornecem informações técnicas detalhadas para ajudar você a criar e otimizar modelos de machine learning por conta própria.