← /projects
$cat ~/projects/llama-bend/README.md

llama.bend

Modelos da arquitetura Llama rodando em Bend, sobre o bend-ml. Pesos tipados, cache verificado e geração comparada com PyTorch.

modelos
135M · 360M · 1.7B
execução
CPU · greedy
pacote
bend-ml-llama
llama.benda04268a

construído sobre bend-ml.

o que construí

Construí o llama.bend sobre o bend-ml para rodar modelos de linguagem da arquitetura Llama em Bend. Um pacote executa SmolLM2-135M, SmolLM2-360M e SmolLM2-1.7B na CPU; só a configuração muda.

O pacote está publicado no BendHub como bend-ml-llama. Cada matriz de pesos recebe seu shape da configuração do modelo, e o cache de chaves e valores carrega tanto a capacidade quanto a quantidade de posições já escritas.

um exemplo concreto

No SmolLM2-135M, a projeção de queries é 576 × 576 e a de keys é 192 × 576. Trocar uma pela outra é um erro que os tipos rejeitam antes de executar o modelo.

um erro detectado pelos tipos

q576 × 576
k192 × 576

SOME PROOFS FAIL

expected  Bands<576n, 576n>
observed  Bands<192n, 576n>

Os shapes de queries e keys do SmolLM2-135M. Trocar os pesos é rejeitado; a saída original do checador está nos links abaixo.

fonte pública ↗abrir imagem completa ↗

as decisões

  • Derivar os shapes dos pesos de uma configuração, para que as mesmas camadas tipadas atendam aos três tamanhos de modelo.
  • Checar leis estruturais para o mapeamento entre cabeças de atenção, as leituras causais do cache, sua capacidade, a divisão das cabeças no RoPE e o layout dos pesos.
  • Escrever o tokenizer também em Bend e compará-lo de forma independente com a referência. As provas são apagadas durante a compilação.

os resultados

  • Para cada um dos três modelos, os 32 tokens gerados em decodificação greedy e o texto decodificado correspondem ao transformers nos 12 prompts testados, usando transformers 5.19 em F32 com atenção eager.
  • Verificações separadas comparam logits em 11 prompts e o token de maior pontuação em 88 posições. Tokens gerados iguais não significam que todos os valores de ponto flutuante sejam idênticos.
  • O tokenizer corresponde aos ids da referência em 68 textos fixos e 600 aleatórios; a decodificação é comparada em 1.500 sequências aleatórias de tokens.

as limitações

  • Somente CPU, modelos base e decodificação greedy, sem template de chat. Os vetores entre camadas são listas cujos comprimentos não estão nos tipos.
  • Na comparação publicada em 2026-10-13, o SmolLM2-1.7B fica 3,7–4,9 vezes mais lento que o llama.cpp. O carregamento é a parte mais demorada. O BENCHMARK.md registra hardware, versões e medições; esses resultados não são previsões para outras máquinas.
  • As leis estabelecem garantias estruturais. A precisão numérica e o texto gerado são testados contra referências, não provados formalmente.

README de referência ↗ · comparações publicadas ↗