Avançando HPC com Modelos de Linguagem Específicos de Domínio
Novo tokenizador melhora o desempenho de modelos de linguagem para programação em computação de alto desempenho.
― 5 min ler
Índice
Com o crescimento de computadores poderosos, tá rolando uma onda de criar Modelos de linguagem maiores (LLMs) pra desenvolvimento de software. Esses modelos ajudam em várias tarefas de programação, incluindo as que têm a ver com computação de alto desempenho (HPC). Mas, alguns desses LLMs são bem grandões, precisando de muita grana e recursos pra serem treinados. Isso levanta uma pergunta importante: Por que precisamos desses modelos enormes treinados em linguagens que não têm nada a ver com HPC pra tarefas nessa área específica?
O Problema com os Modelos Atuais
Muitos LLMs que já existem são pré-treinados em linguagens naturais e ajustados em linguagens de programação. Embora isso possa ajudar em tarefas que exigem entender a língua natural, também pode resultar em modelos grandes que consomem muito poder computacional e grana. Por exemplo, alguns LLMs, como o HPC-Coder, são construídos ajustando modelos maiores que foram treinados em uma grande variedade de linguagens de programação. Essa abordagem parece desnecessária. Se um modelo é pra tarefas de HPC, não poderia ser treinado especificamente em linguagens relevantes pra HPC?
LLMs Específicos do Domínio
Acreditamos que LLMs menores, específicos do domínio, feitos pra HPC seriam mais eficientes e eficazes. Nosso objetivo é analisar as escolhas de design feitas para os LLMs existentes e propor melhorias. Nesse contexto, apresentamos um novo tokenizador especificamente pra tarefas de HPC. Esse tokenizador entende melhor a estrutura do código sem depender de semântica humana, tornando-se adequado pra tarefas de programação em HPC.
Tokenização para Código
Tokenização é uma etapa crucial pra fazer modelos de linguagem funcionarem com código. Os métodos atuais costumam usar técnicas como codificação de pares de bytes (BPE) ou outras abordagens que podem não ser bem adequadas pra linguagens de programação. Esses métodos falham em considerar a sintaxe e estrutura específicas encontradas nas linguagens de programação. Nosso tokenizador proposto foca nas necessidades únicas de tarefas de HPC e compilação.
O Processo de Tokenização
Nosso tokenizador passa por várias etapas pra preparar o código pro modelo. Primeiro, ele troca nomes de variáveis, números e strings por versões anônimas pra tirar significados enganosos. Em seguida, usa um parser pra criar uma Árvore de Sintaxe Abstrata (AST) que captura a estrutura do código. O tokenizador atualiza a AST pra refletir as mudanças de anonimização e mantém um dicionário dessas mudanças.
Depois de atualizar a AST, transforma de volta em código enquanto tira detalhes desnecessários. Pra facilitar a compreensão, tokens de múltiplas partes são divididos em componentes mais simples. Por fim, números aleatórios são anexados a tokens recorrentes pra reduzir a dependência de nomes ou padrões específicos.
Comparando Tokenizadores
Fizemos testes comparando nosso tokenizador com métodos tradicionais como o BPE. Os resultados mostram uma diminuição significativa no total de tokens produzidos, o que, por sua vez, reduz a complexidade do modelo. Nosso tokenizador não só cria menos tokens, mas também preserva informações importantes que ajudam o modelo a entender melhor o código.
Treinando o Modelo
Integramos nosso tokenizador com um modelo de código de última geração chamado PolyCoder. Esse modelo se mostrou eficaz com grandes quantidades de código de programação. Treinamos ambos os modelos em conjuntos de dados específicos contendo código escrito em Fortran, C e C++. Os conjuntos de dados foram cuidadosamente preparados pra garantir que não contivessem língua natural, focando apenas em blocos de código estruturados.
Durante o Treinamento, ajustamos os tamanhos dos modelos pra garantir uma comparação justa entre nossa nova abordagem e métodos tradicionais. O treinamento utilizou GPUs poderosas pra acelerar o processo, permitindo testar a eficiência do nosso tokenizador em cenários em tempo real.
Resultados de Performance
A avaliação do nosso modelo comparado ao PolyCoder revela que nosso tokenizador aumenta significativamente a performance. Ao testar tarefas específicas relacionadas a HPC, nossa abordagem superou os modelos existentes. Com nosso tokenizador, conseguimos melhor precisão e entendimento em menos tempo.
Nosso modelo demonstrou métricas de performance melhoradas, mostrando que pode captar os padrões de design e comportamentos no código. Ao remover semântica humana, provamos que é possível pro modelo de linguagem aprender e se adaptar à estrutura do código de forma independente.
Trabalho Futuro
Olhando pra frente, pretendemos desenvolver ainda mais nosso tokenizador e modelo. Nosso foco será em incorporar representações adicionais de código, como gráficos de fluxo de dados e representações intermediárias. Esses novos recursos visam melhorar o entendimento do modelo sobre tarefas complexas de programação.
Também esperamos ajustar nossos modelos pré-treinados pra tarefas específicas de HPC, como gerar pragmas OpenMP e distribuir domínios MPI. Nossa pesquisa continuará a examinar diferentes elementos dos LLMs existentes e ajustá-los conforme necessário para as necessidades únicas da programação em HPC.
Resumo
A utilização de modelos de linguagem no desenvolvimento de software, principalmente em computação de alto desempenho, traz oportunidades empolgantes. Questionando a abordagem atual e propondo modelos específicos do domínio, podemos melhorar a eficiência e eficácia. Nosso novo tokenizador lança as bases pra uma aplicação mais focada e prática de modelos de linguagem em HPC, abrindo caminho pra futuros avanços nessa área. O objetivo é criar ferramentas que sejam poderosas e acessíveis pra desenvolvedores que trabalham em computação de alto desempenho, tornando tarefas complexas mais fáceis e eficientes.
Título: Scope is all you need: Transforming LLMs for HPC Code
Resumo: With easier access to powerful compute resources, there is a growing trend in the field of AI for software development to develop larger and larger language models (LLMs) to address a variety of programming tasks. Even LLMs applied to tasks from the high-performance computing (HPC) domain are huge in size (e.g., billions of parameters) and demand expensive compute resources for training. We found this design choice confusing - why do we need large LLMs trained on natural languages and programming languages unrelated to HPC for HPC-specific tasks? In this line of work, we aim to question design choices made by existing LLMs by developing smaller LLMs for specific domains - we call them domain-specific LLMs. Specifically, we start off with HPC as a domain and propose a novel tokenizer named Tokompiler, designed specifically for preprocessing code in HPC and compilation-centric tasks. Tokompiler leverages knowledge of language primitives to generate language-oriented tokens, providing a context-aware understanding of code structure while avoiding human semantics attributed to code structures completely. We applied Tokompiler to pre-train two state-of-the-art models, SPT-Code and Polycoder, for a Fortran code corpus mined from GitHub. We evaluate the performance of these models against the conventional LLMs. Results demonstrate that Tokompiler significantly enhances code completion accuracy and semantic understanding compared to traditional tokenizers in normalized-perplexity tests, down to ~1 perplexity score. This research opens avenues for further advancements in domain-specific LLMs, catering to the unique demands of HPC and compilation tasks.
Autores: Tal Kadosh, Niranjan Hasabnis, Vy A. Vo, Nadav Schneider, Neva Krien, Abdul Wasay, Nesreen Ahmed, Ted Willke, Guy Tamir, Yuval Pinter, Timothy Mattson, Gal Oren
Última atualização: 2023-09-29 00:00:00
Idioma: English
Fonte URL: https://arxiv.org/abs/2308.09440
Fonte PDF: https://arxiv.org/pdf/2308.09440
Licença: https://creativecommons.org/licenses/by/4.0/
Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.
Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.