Capítulo 1: Otimização de Inferência
KV Cache
Armazene pares chave-valor computados para evitar recomputação:
# Sem KV cache: recomputa todos os KV para cada novo token
# Com KV cache: computa apenas o KV para o novo token
class KVCache:
def __init__(self, max_batch, max_seq, num_heads, head_dim):
self.k_cache = torch.zeros(max_batch, num_heads, max_seq, head_dim)
self.v_cache = torch.zeros(max_batch, num_heads, max_seq, head_dim)
def update(self, k, v, position):
self.k_cache[:, :, position] = k
self.v_cache[:, :, position] = v
Decodificação Especulativa
Use um modelo pequeno para rascunhar e um modelo grande para verificar:
# 1. Rascunho: Modelo pequeno gera N tokens rapidamente
# 2. Verificação: Modelo grande verifica todos os N tokens em paralelo
# 3. Aceita tokens correspondentes, regenera a partir da primeira divergência
Batching Contínuo
Processe múltiplas requisições simultaneamente:
| Estratégia | Vazão | Latência |
|---|---|---|
| Estática | Baixa | Consistente |
| Contínua | Alta | Variável |