Com o crescimento crescente da inteligência artificial – a introdução de modelos linguísticos de grande escala (LLMs) e IA generativa – tem havido uma procura crescente por unidades de processamento gráfico (GPUs) de alto desempenho. GPUs são hardware de computação especializado usado principalmente para tarefas de computação de alto desempenho e são capazes de computação paralela. Escrever os caracteres de GPU corretos é importante para usar todo o potencial das GPUs. Esta tarefa é demorada e complexa, exigindo profundo conhecimento em design de GPU e outras linguagens de programação, como C++, CUDA, etc.
ML Learning Compiladores de ML como TVM, Triton e Mojo fornecem alguma automação, mas ainda exigem manipulação manual dos kernels da GPU para obter o resultado correto. Para alcançar resultados ideais e evitar tarefas manuais, os pesquisadores da A Universidade Carnegie Mellon desenvolveu o Mirageuma ferramenta flexível projetada para automatizar a geração de kernels de GPU eficientes, pesquisando-os e gerando-os. Os kernels gerados pelo Mirage podem ser usados diretamente em tensores PyTorch e chamados a partir de programas PyTorch. Os usuários precisam escrever menos linhas de código no Mirage em comparação com um script tradicional, que usa várias linhas.
O Mirage pode ser visto como uma mudança futura, alcançando maior produtividade, melhor desempenho e maior justiça nos sistemas de IA. A codificação manual requer muita experiência do desenvolvedor devido à natureza complexa da arquitetura da GPU, mas o Mirage simplifica o processo gerando caracteres automaticamente, agilizando e simplificando as tarefas do desenvolvedor.
Os scripts de GPU escritos à mão podem conter alguns erros, dificultando a obtenção dos resultados desejados, mas a pesquisa do Mirage mostrou que os scripts gerados pelo Mirage são 1,2x-2,5x mais rápidos do que o melhor código escrito por humanos. Além disso, a integração do Mirage ao PyTorch reduz a latência geral em 15-20%.
# Use Mirage to generate GPU kernels for attention
import mirage as mi
graph = mi.new_kernel_graph()
Q = graph.new_input(dims=(64, 1, 128), dtype=mi.float16)
K = graph.new_input(dims=(64, 128, 4096), dtype=mi.float16)
V = graph.new_input(dims=(64, 4096, 128), dtype=mi.float16)
A = graph.matmul(Q, K)
S = graph.softmax(A)
O = graph.matmul(S, V)
optimized_graph = graph.superoptimize()
O código no Mirage ocupa menos linhas em comparação com a abordagem multilinha tradicional
Todos os cálculos em GPUs estão concentrados em kernels, que são tarefas executadas em paralelo em vários multiprocessadores distribuídos (SM) na forma de dados múltiplos de programa único (SPMD). Os personagens organizam a contagem em uma grade de blocos de threads, cada bloco de threads rodando em um SM. Cada bloco possui vários threads para realizar cálculos em elementos de dados individuais.
A GPU segue uma determinada fase de memória com:
- Registre um arquivo para obter dados imediatamente
- Memória Compartilhada: Compartilhada por todos os threads em um bloco para troca eficiente de dados.
- Memória do dispositivo: acessível por todos os threads do kernel
As arquiteturas são representadas com a ajuda da representação uGraph, que contém gráficos em vários níveis: nível de kernel, nível de bloco de thread e nível de thread com computação encapsulada em nível de kernel sobre toda a GPU, nível de bloco de thread que lida com a computação em um multiprocessador de streaming cada (SM), e um gráfico de série que aborda a computação no nível CUDA ou núcleo tensor. uGraph fornece uma maneira estruturada de representar cálculos de GPU.
Quatro fases de otimização de GPU:
1. Normalização + Linear
LLMs normalmente usam as técnicas LayernNorm, RMSNorm, GroupNorm e BatchNorm, que geralmente são tratadas separadamente por compiladores de ML. Essa separação se deve ao fato de que as técnicas de normalização exigem operações de redução de escala e de transmissão. Essas camadas de normalização podem ser combinadas com as diretas por multiplicação de matrizes.
2. LoRA + Linear
Inclui adaptação de baixo nível (LoRA), um método de adaptação de modelos pré-treinados a novas tarefas ou conjuntos de dados, ao mesmo tempo que reduz os requisitos computacionais para camadas lineares. 1,6x mais rápido que os sistemas existentes.
3. Um MLP fechado
Inclui dois MatMuls, ativação SiLU e iteração por objeto. O Gated MLP reduz a sobrecarga de inicialização do kernel e o acesso à memória do dispositivo 1,3x mais rápido do que a melhor linha de base.
4. Atenção diferente
um. Criação de chaves de consulta
Chameleon, ViT-22B e um artigo recente do Google introduziram a normalização da chave de consulta e integraram o LayerNorm ao kernel de atenção. Este kernel personalizado também otimiza as otimizações de GPU existentes para chamar a atenção com uma melhoria de desempenho de 1,7x-2,5x.
b. Atenção latente de múltiplas cabeças
Ele melhora o uso da memória compactando o cache de valor-chave comum em um vetor oculto mais compacto. Esta mudança introduz duas camadas de linha antes da atenção. Mirage gera um kernel personalizado que combina as camadas linear e de atenção em um único kernel. Isso evita o armazenamento de vetores de valores-chave intermediários na memória do dispositivo GPU.
Concluindo, o Mirage aborda o importante desafio de lidar com GPUs de ponta em problemas avançados de inteligência artificial. Ele elimina os problemas de investimento significativo de tempo, codificação de alta tecnologia e geração de erros, fornecendo os melhores kernels de GPU que funcionam em um ambiente baseado em PyTorch. Também aborda lacunas que podem ser ignoradas pela computação manual, acelerando o uso de LLMs e outras tecnologias de IA em aplicações do mundo real.
Confira Página GitHub de novo Detalhes. Todo o crédito deste estudo vai para os pesquisadores deste projeto. Além disso, não se esqueça de nos seguir Twitter e junte-se ao nosso Estação telefônica de novo LinkedIn Gracima. Se você gosta do nosso trabalho, você vai gostar do nosso jornal..
Não se esqueça de participar do nosso Mais de 50k ML SubReddit
Interessado em promover sua empresa, produto, serviço ou evento para mais de 1 milhão de desenvolvedores e pesquisadores de IA? Vamos trabalhar juntos!
Nazmi Syed é estagiária de consultoria na MarktechPost e possui bacharelado em ciências pelo Instituto Indiano de Tecnologia (IIT) Kharagpur. Ele tem uma profunda paixão pela Ciência de Dados e está explorando ativamente a ampla aplicação da inteligência artificial em vários setores. Fascinada pelos avanços tecnológicos, a Nazmi está comprometida em compreender e aplicar inovações de ponta em situações do mundo real.