Porque é que um runtime de IA local reserva memória depois de um pedido?

Eva Wong é a Redatora Técnica e e entusiasta residente na ZimaSpace. Uma geek de longa data com paixão por homelabs e software de código aberto, ela é especialista em traduzir conceitos técnicos complexos em guias acessíveis e práticos . Eva acredita que o auto-hospedagem deve ser divertida, não intimidante. Através dos seus tutoriais, ela capacita a comunidade adesmistificar configurações de hardware , desde a construção do seu primeiro NAS até dominar os contêineres Docker., from building their first NAS to mastering Docker containers.

Um runtime de IA local reserva memória após um pedido para que os tensores futuros possam reutilizar blocos do dispositivo sem suportar repetidamente os custos de alocação e sincronização.

O resultado visível pode parecer uma fuga de memória: o uso de GPU cai para zero, a resposta está concluída, mas o processo continua a ocupar a maior parte da memória do acelerador. Parte dessa utilização pode corresponder a pesos do modelo ou ao estado KV ainda ativos, enquanto outra parte pertence a um alocador de memória em cache, ao contexto de execução, à captura de grafos, ao espaço de trabalho de uma biblioteca ou a uma política de manutenção do modelo em memória. As secções abaixo distinguem as alocações ativas das reservas reutilizáveis e mostram quando a memória persistente é normal, desperdiçada ou indício de uma fuga real.

A Alocação no Dispositivo é Suficientemente Dispendiosa para Ser Colocada em Cache

Os tensores criados durante os pedidos são repetidamente criados e libertados. Devolver todos os blocos ao controlador pode introduzir sincronização e obrigar o pedido seguinte a reconstruir a mesma disposição de memória.

O alocador CUDA do PyTorch separa os blocos do alocador em cache dos tensores que continuam ativamente alocados.

Manter blocos livres dentro do processo melhora a latência de pedidos repetidos, mas outro serviço de IA não pode utilizar esses bytes enquanto o alocador não os devolver ao controlador.

Memória Alocada, Reservada e Livre no Dispositivo São Métricas Diferentes

A memória alocada pertence a tensores ativos. A memória reservada é gerida pelo alocador do runtime e pode incluir tanto alocações ativas como blocos reutilizáveis atualmente não utilizados.

Um runtime pode, por isso, apresentar uma diferença de memória reservada mesmo depois de os tensores temporários serem destruídos.

Ferramentas do dispositivo, como o nvidia-smi, apresentam a utilização do processo visível ao controlador, não os blocos que estão logicamente livres dentro da framework.

O Estado do Modelo e do Runtime Pode Permanecer Intencionalmente Ativo

O processo pode manter os pesos do modelo, o estado do tokenizador, os kernels, os grafos de execução e os contextos do acelerador prontos, porque descarregá-los transformaria o pedido seguinte num arranque a frio.

A explicação da ZimaSpace sobre a permanência do modelo em memória mostra por que motivo um serviço ativo consome memória mesmo quando nenhum utilizador está atualmente a gerar tokens.

Trata-se de um compromisso deliberado entre capacidade e latência. Do ponto de vista computacional, a memória está inativa, mas continua a ser valiosa como estado pronto a utilizar.

-15% OFF

A Fragmentação Pode Deixar os Blocos Reservados Difíceis de Reutilizar

Um conjunto pode conter bytes não utilizados suficientes no total, mas os tamanhos dos blocos podem não corresponder ao pedido seguinte. Prompts variáveis, dimensões de imagem, lotes e mudanças de modelo podem criar um padrão de reserva fragmentado.

O GMLake estuda a fragmentação do alocador causada por tamanhos de alocação irregulares.

Nesse caso, a memória retida não é ativamente útil nem está disponível para outros processos, e reiniciar o processo pode restaurar temporariamente uma disposição mais organizada.

Meça se a Utilização de Memória Estabiliza ou Continua a Crescer

Execute repetidamente o mesmo pedido fixo e registe a memória alocada, reservada, da cache KV, dos pesos do modelo e livre no dispositivo após cada conclusão.

Um limite máximo estável e elevado sugere um comportamento normal de colocação em cache ou de manutenção ativa. Uma utilização que cresce a cada pedido idêntico e nunca reutiliza os blocos antigos sugere uma fuga de memória, uma cache sem limite, uma sessão retida ou variações na carga de trabalho.

Teste os controlos de libertação da cache apenas depois de confirmar que estado removem. Esvaziar os blocos não utilizados do alocador não descarrega os pesos ativos do modelo, e descarregar o modelo pode prejudicar o tempo de resposta.

Num servidor doméstico com vários serviços, defina um orçamento de memória e uma política de inatividade para cada runtime, para que a reserva de um serviço não impeça silenciosamente outro de arrancar.

Centro de Tecnologia e IA

Mais para Ler

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.