Apresentando o Packed BERT para 2x Aceleração do Treinamento em Processamento de Linguagem Natural

Nó Fonte: 1062065

Apresentando o Packed BERT para 2x Aceleração do Treinamento em Processamento de Linguagem Natural

Confira este novo algoritmo de empacotamento de BERT para um treinamento mais eficiente.


By Dr. Mário Michael Krell, Principal líder de aprendizado de máquina da Graphcore & Matej Kosec, Especialista em aplicações de IA na Graphcore


Imagem de cabeçalho
Imagem do autor.

 

Usando um novo algoritmo de empacotamento, aceleramos o processamento de linguagem natural em mais de 2 vezes durante o treinamento do BERT-Large. Nossa nova técnica de embalagem remove o enchimento, permitindo um cálculo significativamente mais eficiente.

Suspeitamos que isso também poderia ser aplicado a modelos de enovelamento de proteína e genômica e outros modelos com distribuições de comprimento enviesadas para causar um impacto muito mais amplo em diferentes setores e aplicações.

Introduzimos o algoritmo de Histogram-Packing de Mínimos Quadrados Não Negativos altamente eficiente do Graphcore (ou NNLSHP), bem como nosso algoritmo BERT aplicado a sequências compactadas em um novo artigo [1].

Desperdício computacional em PNL devido ao preenchimento de sequência

 
 
Começamos a investigar novas maneiras de otimizar o treinamento de BERT enquanto trabalhamos em nosso recente envios de benchmark para MLPerf ™. O objetivo era desenvolver otimizações úteis que pudessem ser facilmente adotadas em aplicativos do mundo real. O BERT foi uma escolha natural como um dos modelos em que focar nessas otimizações, visto que é amplamente utilizado na indústria e por muitos de nossos clientes.

Realmente nos surpreendeu saber que em nosso próprio aplicativo de treinamento BERT-Large usando o conjunto de dados da Wikipedia, 50% dos tokens no conjunto de dados eram preenchidos - resultando em muito desperdício de computação.

Preencher sequências para alinhá-las todas com o mesmo comprimento é uma abordagem comum usada com GPUs, mas achamos que valeria a pena tentar uma abordagem diferente.

As sequências têm uma grande variação de comprimento por dois motivos:

  1. Os dados subjacentes da Wikipedia mostram uma grande variação no comprimento do documento
  2. O próprio pré-processamento de BERT reduz aleatoriamente o tamanho dos documentos extraídos que são combinados para gerar uma sequência de treinamento

Preencher o comprimento até o comprimento máximo de 512 resulta em 50% de todos os tokens sendo tokens de preenchimento. Substituir os 50% de preenchimento por dados reais pode resultar em 50% a mais de dados sendo processados ​​com o mesmo esforço computacional e, portanto, 2x a velocidade em condições ideais.



Figura 1: distribuições do conjunto de dados da Wikipedia. Imagem do autor.

 

Isso é específico da Wikipedia? Não.

Bem, então é específico da linguagem? Não.

Na verdade, distribuições distorcidas de comprimento são encontradas em todos os lugares: na linguagem, na genômica e no enovelamento de proteínas. As Figuras 2 e 3 mostram as distribuições para o conjunto de dados SQuAD 1.1 e conjuntos de dados GLUE.



Figura 2: Histograma de comprimento de sequência do conjunto de dados de pré-treinamento do SQuAD 1.1 BERT para comprimento máximo de sequência de 384. Imagem do autor.

 


Figura 3: histogramas de comprimento de sequência do conjunto de dados GLUE para comprimento máximo de sequência de 128. Imagem do autor.

 

Como podemos lidar com os diferentes comprimentos, evitando o desperdício computacional?

As abordagens atuais exigem kernels computacionais diferentes para comprimentos diferentes ou que o engenheiro remova o preenchimento programaticamente e, em seguida, adicione-o de volta repetidamente para cada bloco de atenção e cálculo de perda. Salvar computação explodindo o código e tornando-o mais complexo não era atraente, então procuramos algo melhor. Não podemos simplesmente colocar várias sequências juntas em um pacote com um comprimento máximo e processar tudo junto? Acontece que podemos!

Esta abordagem requer três ingredientes principais:

  1. Um algoritmo eficiente para decidir quais amostras juntar para ter o mínimo de preenchimento restante possível
  2. Ajustando o modelo de BERT para processar pacotes em vez de sequências
  3. E ajustando os hiperparâmetros

Embalagem

 
 
No início, parecia improvável que você fosse capaz de empacotar um grande conjunto de dados como a Wikipedia de forma muito eficiente. Esse problema é comumente conhecido como embalagem do lixo. Mesmo quando o empacotamento é limitado a três sequências ou menos, o problema resultante ainda seria fortemente NP-completo, sem uma solução algorítmica eficiente. Os algoritmos de empacotamento heurísticos existentes não eram promissores porque tinham uma complexidade de pelo menos O(n registro(n)), Onde n é o número de sequências (~ 16M para Wikipedia). Estávamos interessados ​​em abordagens que se adaptassem bem a milhões de sequências.

Dois truques nos ajudaram a reduzir drasticamente a complexidade:

  1. Limitar o número de sequências em um pacote a três (para nossa primeira abordagem de solução)
  2. Operando unicamente no histograma de comprimento de sequência com um bin para cada comprimento de ocorrência

Nosso comprimento máximo de sequência era 512. Portanto, passar para o histograma reduziu a dimensão e a complexidade de 16 milhões de sequências para 512 contagens de comprimento. Permitir um máximo de três sequências em um pacote reduziu o número de combinações de comprimento permitidas para 22K. Isso já incluía o truque para exigir que as sequências fossem classificadas por comprimento no pacote. Então, por que não tentar 4 sequências? Isso aumentou o número de combinações de 22K para 940K, o que era demais para nossa primeira abordagem de modelagem. Além disso, a profundidade 3 já alcançou eficiência de embalagem notavelmente alta.

Originalmente, pensamos que o uso de mais de três sequências em um pacote aumentaria a sobrecarga computacional e afetaria o comportamento de convergência durante o treinamento. No entanto, para oferecer suporte a aplicativos como inferência, que exigem empacotamento ainda mais rápido e em tempo real, desenvolvemos o algoritmo NNLSHP (Non-Negative Least Squares Histogram-Packing) altamente eficiente.

Pacote de histograma de mínimos quadrados não negativos (NNLSHP)

 
 
O empacotamento do lixo é freqüentemente formulado como um problema de otimização matemática. No entanto, com 16 milhões de sequências (ou mais), isso não é prático. As variáveis ​​do problema sozinhas excederiam a memória da maioria das máquinas. O programa matemático para uma abordagem baseada em histograma é bastante simples. Para simplificar, decidimos por uma abordagem de mínimos quadrados (Axe = b) com vetor de histograma b. Nós o estendemos solicitando o vetor de estratégia x para ser não negativo e adicionar pesos para permitir um preenchimento menor.

A parte complicada era a matriz de estratégia. Cada coluna tem uma soma máxima de três e codifica quais sequências são agrupadas para corresponder exatamente ao comprimento total desejado; 512 em nosso caso. As linhas codificam cada uma das combinações potenciais para atingir um comprimento igual ao comprimento total. O vetor de estratégia x é o que estávamos procurando, que descreve a frequência com que escolhemos qualquer uma das combinações de 20k. Curiosamente, apenas cerca de 600 combinações foram selecionadas no final. Para obter uma solução exata, a estratégia conta em x teriam que ser inteiros positivos, mas percebemos que uma solução arredondada aproximada com apenas números não negativos x era suficiente. Para obter uma solução aproximada, um solucionador simples e pronto para uso pode ser usado para obter um resultado em 30 segundos.



Figura 4: Exemplo de uma matriz de estratégia para comprimento de sequência 8 e profundidade de empacotamento 3. As linhas representam as sequências de comprimento 1-8 que são agrupadas e as colunas representam todas as combinações de comprimento possíveis em um pacote sem nenhuma ordem particular. Imagem do autor.

 

No final, tivemos que consertar algumas amostras que não receberam uma estratégia atribuída, mas eram mínimas. Também desenvolvemos um solver variante que impõe que cada sequência seja compactada, potencialmente com preenchimento, e tem uma ponderação dependente do preenchimento. Demorou muito mais e a solução não foi muito melhor.

Embalagem do histograma do pacote mais curto primeiro

 
 
A NNLSHP forneceu uma abordagem de embalagem suficiente para nós. No entanto, estávamos nos perguntando se poderíamos teoricamente obter uma abordagem capaz online mais rápida e remover a limitação de colocar apenas 3 sequências juntas.

Portanto, nos inspiramos nos algoritmos de empacotamento existentes, mas ainda nos concentramos nos histogramas.

Existem quatro ingredientes para nosso primeiro algoritmo, Shortest-pack-first histogram-pack (SPFHP):

  1. Operar nas contagens do histograma das sequências mais longas para as mais curtas
  2. Se o comprimento da sequência atual não couber em nenhum pacote, comece um novo conjunto de pacotes
  3. Se houver vários ajustes, pegue o pacote em que a soma do comprimento da sequência é o mais curto e modifique as contagens respectivamente
  4. Verifique novamente se há ajustes nas contagens restantes

Essa abordagem foi a mais direta de implementar e levou apenas 0.02 segundos.

Uma variante era pegar a maior soma do comprimento da sequência em vez da contagem mais curta e dividir para obter ajustes mais perfeitos. No geral, isso não mudou muito a eficiência, mas aumentou muito a complexidade do código.



Como funciona a compactação do histograma do pacote mais curto. Animação do autor.

 

Wikipedia, SQuAD 1.1, resultados de empacotamento de GLUE

 
 
As Tabelas 1, 2 e 3 mostram os resultados de empacotamento de nossos dois algoritmos propostos. Profundidade de embalagem descreve o número máximo de sequências compactadas. A profundidade de empacotamento 1 é a implementação do BERT de base. A profundidade máxima de empacotamento que ocorre, quando nenhum limite é definido, é indicada com um “máximo” adicional. o número de embalagens descreve o comprimento do novo conjunto de dados compactado. Eficiência é a porcentagem de tokens reais no conjunto de dados compactado. o fator de embalagem descreve a aceleração potencial resultante em comparação com a profundidade de empacotamento 1.

Tivemos quatro observações principais:

  1. Quanto mais distorcida for uma distribuição, maiores serão os benefícios da embalagem.
  2. Todos os conjuntos de dados se beneficiam da embalagem. Alguns até por mais de um fator de 2.
  3. O SPFHP fica mais eficiente quando a profundidade do empacotamento não é limitada.
  4. Para um número máximo de 3 sequências compactadas, quanto mais complexo o NNLSHP, mais eficiente ele é (99.75 vs. 89.44).



Tabela 1: Principais resultados de desempenho dos algoritmos de empacotamento propostos (SPFHP e NNLSHP) na Wikipedia. Imagem do autor.

 


Tabela 2: Resultados de desempenho dos algoritmos de empacotamento propostos para o pré-treinamento SQUaD 1.1 BERT. Imagem do autor.

 


Tabela 3: Resultados de desempenho dos algoritmos de empacotamento propostos para o conjunto de dados GLUE. Apenas a linha de base e os resultados do empacotamento SPFHP sem limitar a profundidade do empacotamento são exibidos. Imagem do autor.

 

Ajuste de processamento de BERT

 
 
Algo interessante sobre a arquitetura BERT é que a maior parte do processamento acontece em um nível de token, o que significa que não interfere em nosso empacotamento. Existem apenas quatro componentes que precisam de um ajuste: a máscara de atenção, a perda de MLM, a perda de NSP e a precisão.

A chave para todas as quatro abordagens para lidar com diferentes números de sequências era a vetorização e o uso de um número máximo de sequências que podem ser concatenadas. Para chamar a atenção, já tínhamos uma máscara para tratar do preenchimento. Estender isso para várias sequências foi simples, como pode ser visto no seguinte pseudocódigo do TensorFlow. O conceito é que nos certificamos de que a atenção é limitada às sequências separadas e não pode se estender além disso.

Amostra de código de máscara de atenção.


 


Figura 5: Exemplo de máscara zero-um

 

Para o cálculo das perdas, a princípio descompactamos as sequências e calculamos as perdas separadas, eventualmente obtendo a média das perdas sobre as sequências (ao invés dos pacotes).

Para a perda de MLM, o código se parece com:

Amostra de código de cálculo de perda.


 

Para a perda de NSP e a precisão, o princípio é o mesmo. Em nossos exemplos públicos, você pode encontrar o respectivo código com nosso sistema interno Estrutura PopART.

Sobrecarga da Wikipedia e estimativa de aumento de velocidade

 
 
Com nossa modificação de BERT, tínhamos duas perguntas:

  1. Quanta sobrecarga isso acarreta?
  2. Quanto a sobrecarga depende do número máximo de sequências reunidas em um pacote?

Como a preparação de dados em BERT pode ser complicada, usamos um atalho e compilamos o código para várias profundidades de empacotamento diferentes e comparamos os respectivos ciclos (medidos). Os resultados são exibidos na Tabela 4. Com em cima, denotamos a redução percentual na taxa de transferência devido a alterações no modelo para habilitar o empacotamento (como o esquema de mascaramento para atenção e o cálculo de perda alterado). o aceleração percebida é a combinação da aceleração devido à embalagem (o fator de embalagem) e a diminuição na taxa de transferência devido ao em cima.



Tabela 4: Comparação de aceleração estimada de algoritmos de empacotamento propostos (SPFHP e NNLSHP) na Wikipedia. Imagem do autor.

 

Graças à técnica de vetorização, o overhead é surpreendentemente pequeno e não há nenhuma desvantagem em compactar muitas sequências juntas.

Ajustes de hiperparâmetros

 
 
Com a embalagem, estamos dobrando o tamanho efetivo do lote (em média). Isso significa que precisamos ajustar os hiperparâmetros de treinamento. Um truque simples é cortar a contagem de acúmulo de gradiente pela metade para manter o mesmo tamanho de lote médio efetivo de antes do treinamento. Usando uma configuração de benchmark com pontos de verificação pré-treinados, podemos ver que as curvas de precisão combinam perfeitamente.



Figura 6: Comparação de curvas de aprendizagem para processamento empacotado e desempacotado com tamanho de lote reduzido para a abordagem compacta. Imagens do autor.

 

A precisão corresponde: a perda de treinamento de MLM pode ser ligeiramente diferente no início, mas alcança rapidamente. Essa diferença inicial pode vir de pequenos ajustes nas camadas de atenção, que podem ter sido tendenciosas para sequências curtas no treinamento anterior.

Para evitar lentidão, às vezes ajuda manter o mesmo tamanho do lote original e ajustar os hiperparâmetros para o tamanho de lote efetivo aumentado (dobrado). Os principais hiperparâmetros a serem considerados são os parâmetros beta e as taxas de aprendizado. Uma abordagem comum é dobrar o tamanho do lote, o que em nosso caso diminuiu o desempenho. Olhando as estatísticas do otimizador LAMB, podemos provar que elevar o parâmetro beta à potência do fator de empacotamento corresponde a treinar vários lotes consecutivamente para manter o impulso e a velocidade comparáveis.



Figura 7: Comparação de curvas de aprendizagem para processamento empacotado e desempacotado com heurística aplicado. Imagens do autor.

 

Nossos experimentos mostraram que elevar o beta à potência de dois é uma boa heurística. Neste cenário, não se espera que as curvas coincidam porque aumentar o tamanho do lote geralmente diminui a velocidade de convergência no sentido de amostras / épocas até que uma precisão alvo seja alcançada.

Agora, a questão é se, no cenário prático, realmente conseguimos a aceleração esperada?



Figura 8: Comparação de curvas de aprendizagem para processamento empacotado e desempacotado no configuração otimizada. Imagens do autor.

 

Sim nós fazemos! Ganhamos uma aceleração adicional porque comprimimos a transferência de dados.

Conclusão

 
 
Juntar frases pode economizar esforço de computação e o meio ambiente. Essa técnica pode ser implementada em qualquer estrutura, incluindo PyTorch e TensorFlow. Obtivemos uma clara aceleração de 2x e, ao longo do caminho, estendemos o estado da arte em algoritmos de empacotamento.

Outras aplicações que nos interessam são a genômica e o dobramento de proteínas, onde distribuições de dados semelhantes podem ser observadas. Os transformadores de visão também podem ser uma área interessante para aplicar imagens compactadas de tamanhos diferentes. Quais aplicativos você acha que funcionariam bem? Gostaríamos muito de ouvir de você!

Leia o papel

Acesse o código no GitHub

Obrigado

 
 
Obrigado aos nossos colegas da equipe de Engenharia de Aplicações da Graphcore, Sheng Fu e Mrinal Iyer, por suas contribuições para este trabalho e obrigado a Douglas Orr da equipe de Pesquisa da Graphcore por seu valioso feedback.

Referências

 
 
[1] M. Kosec, S. Fu, MM Krell, Embalagem: Rumo a 2x Aceleração NLP BERT (2021), arXiv See More

 
Dr. Mário Michael Krell é um líder de aprendizado de máquina principal na Graphcore. Mario pesquisa e desenvolve algoritmos de aprendizado de máquina há mais de 12 anos, criando software para setores tão diversos como robótica, automotivo, telecomunicações e saúde. Na Graphcore, ele contribuiu para o nosso impressionante Submissões MLPerf e tem paixão por acelerar novos modelos não padronizados, como computação Bayesiana aproximada para análise estatística de dados COVID-19.

Matej Kosec é especialista em aplicações de IA na Graphcore em Palo Alto. Anteriormente, ele trabalhou como Cientista de IA em direção autônoma na NIO em San Jose e possui mestrado em aeronáutica e astronáutica pela Universidade de Stanford.

Óptimo estado. Original. Republicado com permissão.

Relacionado:

Fonte: https://www.kdnuggets.com/2021/08/packed-bert-training-speed-up-natural-language-processing.html

Carimbo de hora:

Mais de KDnuggetsGenericName