1. Fragmentação da memória
Fragmentação interna
Os sistemas pré-alocam um grande pedaço de memória para cada solicitação, assumindo o máximo de comprimento de saída possível (por exemplo, 2048 tokens). No entanto, se uma solicitação gerar apenas uma saída curta, grande parte dessa memória reservada não é utilizada, levando a um desperdício significativo.
Fragmentação externa
Como diferentes solicitações reservam pedaços de tamanhos variados, a memória da GPU fica espalhada com pequenas lacunas inutilizáveis, dificultando a ajuste novas solicitações, mesmo que a memória total total esteja disponível. Nossas fontes mostram que, nos sistemas existentes, apenas 20,4% – 38,2% da memória de cache de kv é realmente usada para armazenar estados de token, com o restante sendo desperdiçado.
2. Sem compartilhamento de memória
Técnicas avançadas de decodificação, como amostragem paralela ou pesquisa de feixe, geralmente geram várias saídas de um único prompt, o que significa que eles poderiam compartilhar partes do cache KV. No entanto, os sistemas existentes não podem compartilhar facilmente essa memória porque o cache KV de cada sequência está em seu próprio bloco separado e contíguo.
