Este repositório contém uma implementação do modelo LLaMA 2 (Large Language Model Meta AI), uma variante Generative Pretrained Transformer (GPT). A implementação concentra-se na arquitetura do modelo e no processo de inferência. O código é reestruturado e fortemente comentado para facilitar a compreensão das partes principais da arquitetura.
Normalização RMS: RMSNorm é uma simplificação da normalização da camada original (LayerNorm). LayerNorm é uma técnica de regularização que pode lidar com o problema de mudança interna de covariáveis, de modo a estabilizar as ativações da camada e melhorar a convergência do modelo. Foi provado bastante sucesso no LLaMA 2.
Função de ativação: LLaMA 2 usa a função de ativação SwiGLU em vez de ReLU, levando a um melhor desempenho de treinamento.
Embeddings posicionais rotativos (RoPE): Inspirado no projeto GPT-Neo-X, o LLaMA 2 incorpora embeddings posicionais rotativos em cada camada, melhorando a compreensão posicional do modelo.
Maior comprimento de contexto e atenção de consulta agrupada (GQA): o modelo LLaMA 2 tem uma janela de contexto duplicada (de 2.048 a 4.096 tokens) e emprega atenção de consulta agrupada. Isso permite um melhor processamento de documentos longos, históricos de bate-papo e tarefas de resumo.
O cache KV é uma técnica de otimização crucial empregada nesta implementação para acelerar o processo de inferência para decodificação do Modelo de Linguagem (LM). Durante a decodificação autorregressiva, onde cada token é previsto com base em tokens anteriores, a autoatenção dentro do modelo é causal. Isto implica que a representação de um token é calculada com base apenas nele mesmo e nos tokens anteriores, não nos futuros.
Na autoatenção, a sequência de entrada é projetada usando projeções de chave, valor e consulta. O cache KV armazena com eficiência os resultados das projeções de chave e valor, eliminando a necessidade de cálculos redundantes em futuras iterações de decodificação. Como resultado, as representações de tokens que permanecem fixas durante a decodificação autorregressiva podem ser recuperadas do cache, aumentando significativamente a velocidade de inferência.
Esta técnica de cache KV é um recurso arquitetônico chave que aumenta a eficiência e a velocidade do modelo LLaMA durante a decodificação.
O modelo LLaMA 2 incorpora uma variação do conceito de Multi-Query Attention (MQA) proposto por Shazeer (2019), um refinamento do algoritmo Multi-Head Attention (MHA). O MQA aumenta a eficiência dos mecanismos de atenção, mantendo ao mesmo tempo uma degradação mínima da precisão.
Na atenção tradicional com múltiplas cabeças, todo o cálculo da atenção é replicado h vezes, onde h é o número de cabeças de atenção. No entanto, o GQA reduz a redundância computacional removendo ou reduzindo significativamente a dimensão das cabeças (h) dos valores K e V. No MQA, cada “cabeça” do valor de consulta (Q) sofre a mesma transformação K e V, otimizando o cálculo da atenção.
Esse refinamento resulta em desempenho computacional semelhante ao MHA, mas reduz significativamente a quantidade de dados lidos/gravados na memória. Como consequência, o GQA melhora o desempenho (através de um aumento na intensidade aritmética) e a eficiência do espaço de memória (através de uma diminuição na quantidade de dados armazenados no cache KV), tornando-o uma adição valiosa à arquitetura LLaMA.
No modelo LLaMA 2, Rotary Positional Embeddings (RoPE) desempenham um papel crucial no aprimoramento dos mecanismos de atenção, incorporando informações posicionais nas representações simbólicas. O conceito de “atenção” é poderoso, mas para garantir que a atenção calculada seja significativa, os tokens precisam ter uma noção de posição.
Os embeddings de posição vêm em dois tipos principais: absolutos e relativos. Os embeddings de posição absoluta codificam a posição absoluta de uma palavra na frase de entrada, enquanto os embeddings de posição relativa codificam a posição relativa entre duas palavras. Essas incorporações fornecem informações posicionais vitais que ajudam os tokens a compreender seu contexto em uma sequência.
Os Rotary Positional Embeddings adotam uma abordagem única, aproveitando matrizes de rotação para incorporar informações posicionais. O objetivo é garantir que o produto interno dos vetores q e k, nas posições m e n, dependa apenas de q, k e de sua distância relativa (m - n). A matriz de rotação, onde o ângulo é a posição do vetor, é incorporada ao vetor original por meio da multiplicação da matriz, alinhando-se a este critério.
Esta abordagem inovadora para incorporar informações posicionais aumenta a capacidade do modelo de compreender as relações e o contexto dos tokens, contribuindo para melhorar os mecanismos de atenção.
model.py
: Contém a implementação do modelo do transformador LLaMA com comentários detalhados explicando cada componente e funcionalidade.
inference.py
: demonstra como usar o modelo LLaMA treinado para inferência, fornecendo insights sobre o processamento de entrada e saída.
Sinta-se à vontade para explorar o código, corrigir se houver algum erro e experimentar o modelo LLaMA 2!