Um motor de inferência de LLMs construído do zero para GPUs AMD no Windows.
Sem llama.cpp. Sem PyTorch. Sem ONNX. Só HIP, GGUF e muita medição.
O VTE não embrulha nenhum runtime existente. Ele lê o arquivo GGUF sozinho,
gera os kernels HIP C++ sozinho, os compila com hipcc em runtime, e
conversa com o amdhip64.dll por uma ponte ctypes escrita à mão.
Dequantização Q4_K / Q6_K / Q8_0 byte-a-byte, batendo com o layout de referência do llama.cpp — validada camada por camada contra NumPy.
Templates .hip renderizados e compilados sob demanda, com cache por hash e rejeição de kernels que arriscam register spilling.
Todo o passo de decode capturado num único grafo e reproduzido, eliminando quase todo o overhead de dispatch do lado da CPU.
Mesmos arquivos GGUF em disco, mesmo prompt, temperature=0. O código que faz o dispatch aqui é
Python puro dirigindo cada launch HIP por ctypes — e no Granite isso já entrega
mais tok/s que o próprio llama.cpp; no Qwen2.5 é um empate técnico.
→ Três arquiteturas sem quase nada em comum entre si (RoPE, quantização, e no Qwen3.5 uma recorrência linear com estado persistente que nenhuma das outras duas tem) chegando a resultados competitivos — e num caso ultrapassando o llama.cpp — é evidência de que dispatch em Python é um problema de engenharia, não um imposto fixo da linguagem.
.gguf ao token, em quatro camadas.Validação dupla do GGUF não confiável: magic, versão, bounds de cada tensor.
Plano de memória em VRAM + kernels HIP gerados e compilados com hipcc.
Decode inteiro capturado num HIP Graph estático, incluindo a LM Head.
Replay do grafo por token; sampler restrito ao top-k roda na CPU depois.
Wrapper ctypes do amdhip64.dll: cada alocação rastreada, cada ponteiro checado, um KernelWatchdog anti-travamento e um limitador de duty-cycle que mantém o desktop responsivo durante gerações longas.
Parser, dequantizador, mapeadores de memória por arquitetura e o codegen que renderiza e compila os templates HIP.
Grafo IR, fusão de kernels, dois executores (eager + HIP Graph), o loop autoregressivo e o sampler vetorizado.
Chat + dashboard de telemetria da GPU ao vivo (tok/s, ms/token, VRAM, ciclo de vida do modelo), troca de modelo em runtime e toggle de idioma pt/en — falando com o motor por um pipe local.
A maioria do software de inferência é ajustada para hardware de datacenter — um MI300X, uma RTX 4090. O VTE nasceu com o objetivo oposto: extrair desempenho real de uma placa de consumidor, uma RX 7600 com 32 CUs e 8 GB, dividida com o resto do desktop do usuário. Cada decisão de otimização veio de uma medição nesse hardware específico, não de suposição.
E, no fundo, foi um desafio pessoal: descobrir se dava para construir um motor de LLM inteiro do zero — parser, kernels, gerenciador de memória, UI — sobre o HIP no Windows, medir tudo com honestidade, e chegar perto de uma engine madura com anos de vantagem. No Granite, chegou a superá-la.