Pular para o conteúdo principal

Otimização de Memória no JetPack 7.2

O Jetson usa memória unificada, portanto o sistema operacional, cargas de trabalho de GPU, firmware de câmera e display, pesos de modelo, engines TensorRT, cache KV e serviços de aplicação competem pela mesma DRAM física. A otimização de memória, portanto, precisa cobrir tanto a plataforma quanto a carga de trabalho de inferência.

Este guia combina o material do JetPack 7.2 já disponível nesta coleção:

atenção

As alterações de recuperação de memória em nível de BSP modificam o firmware de boot, device trees e configurações da linha de comando do kernel. Aplique apenas receitas validadas de headless, no-camera ou SWIOTLB em um dispositivo de teste recuperável. Mantenha o BSP original e confirme que o dispositivo pode ser regravado antes de fazer essas alterações.

Camadas de Otimização

Use a camada menos invasiva que resolva o problema.

CamadaAção típicaRiscoReboot ou reflash
MediçãoRegistrar memória disponível e uso por processoBaixoNão
Configuração de inferênciaQuantização, contexto mais curto, tamanho de lote 1, menor concorrênciaBaixoNão
Configuração de serviçosAlvo sem monitor, parar servidores de modelo duplicados, desabilitar serviços de usuário não utilizadosMédioNormalmente reboot
Recuperação de memória no BSPDesabilitar firmware e memória reservada de display ou câmera não utilizadosAltoRecompilar e regravar
Ajuste de SWIOTLBReduzir o pool de bounce de DMA após medir o uso realAltoRecompilar e regravar

1. Registrar uma Linha de Base Reproduzível

Confirme a versão de software e capture a memória antes de iniciar a aplicação:

cat /etc/nv_tegra_release
free -h
grep -E 'MemTotal|MemAvailable|SwapTotal|SwapFree|CmaTotal|CmaFree' /proc/meminfo

Monitore memória unificada, uso de GPU, temperaturas e potência enquanto carrega e executa o modelo:

sudo tegrastats --interval 1000

Em outro terminal, identifique os maiores processos e grupos de controle:

ps -eo pid,comm,rss,vsz,%mem --sort=-rss | head -20
systemd-cgtop

Registre pelo menos quatro estados:

  1. após o boot e antes de a aplicação iniciar;
  2. após o carregamento do modelo ou da engine TensorRT;
  3. durante o prefill do prompt ou o pico de pré-processamento de visão;
  4. durante a geração de tokens em estado estacionário ou a operação da aplicação.

Não compare apenas o valor used de free. Use MemAvailable, a lista de RSS por processo e o pico reportado por tegrastats em conjunto.

2. Usar Skills para Auditar Antes de Editar o BSP

O workflow orientado por skills deve começar com observação em vez de mudanças imediatas de configuração.

Diagnosticar o Dispositivo

Use jetson-diagnostic para coletar o módulo, versão JetPack/L4T, estado de memória, armazenamento, térmicas, serviços e endpoints de hardware visíveis.

Prompt de exemplo:

/jetson-diagnostic Confirm that this device is running JetPack 7.2 / L4T 39.2,
capture its idle memory baseline, and identify services or hardware subsystems
that consume memory before the inference application starts.

Auditar Pressão de Memória

Use jetson-memory-audit quando o modelo falhar ao carregar, o OOM killer encerrar um processo ou o uso de memória crescer de forma inesperada.

/jetson-memory-audit Compare idle, engine-load, prefill, and decode memory use.
Separate model weights, KV cache, application processes, filesystem cache,
desktop services, and reserved platform memory where possible.

A auditoria deve produzir evidências antes de recomendar uma mudança. Não desabilite um serviço apenas porque ele aparece perto do topo de uma lista de processos.

Converter Implantações de Appliance para Modo Sem Monitor

Se o Jetson roda sem um display local, use jetson-headless-mode para remover a sobrecarga de desktop no nível de serviços.

O target padrão do systemd é:

sudo systemctl set-default multi-user.target
sudo reboot

Confirme o acesso por SSH antes de reiniciar. Essa mudança em nível de serviço é separada da recuperação de carveouts de firmware de display no BSP.

Usar jetson-optimize-memory Apenas para Cenários de BSP Validados

A skill em nível de BSP oferece suporte a três workflows delimitados:

CenárioImplantação pretendidaÁrea de plataforma recuperada
headlessSem saída de display localFirmware de DCE/display, framebuffer inicial e nós de kernel correspondentes
no-cameraSem CSI, GMSL ou outro pipeline de câmeraRCE, VI, ISP, NVCSI e carveouts de firmware correspondentes
swiotlbUso medido do pool de bounce de DMA muito abaixo do pool reservadoUma alocação SWIOTLB menor e diferente de zero

Solicitações de exemplo:

/jetson-optimize-memory headless
/jetson-optimize-memory no-camera
/jetson-optimize-memory swiotlb

Para mudanças em carveouts, o MB1 BCT, os controles de carregamento do MB2, as referências AST do MB2 e os nós de device-tree do kernel devem permanecer consistentes. Zerar apenas uma entrada de carveout não é uma otimização válida. Para SWIOTLB, nunca configure um pool de tamanho zero e reverta imediatamente se io_tlb_used se aproximar de io_tlb_nslabs.

3. Reduzir o Uso de Memória de LLM e VLM

Escolher a Menor Precisão Suportada

O TensorRT Edge-LLM no JetPack 7.2 oferece suporte a FP16, INT8 e INT4 no Jetson Orin. Comece com FP16 para validar a correção e, em seguida, avalie checkpoints INT8 ou INT4 suportados pelo modelo selecionado.

PrecisãoTendência de memóriaUso recomendado
FP16Maior entre os caminhos suportados no OrinLinha de base funcional e cargas de trabalho sensíveis à acurácia
INT8Menor memória de pesos com compensações moderadas de acuráciaAvaliação de produção equilibrada
INT4Menor memória de pesos entre os caminhos suportadosModelos grandes ou implantações com múltiplos serviços e DRAM limitada

Não presuma que alterar um flag da engine quantiza corretamente um checkpoint FP16. Use um checkpoint e um caminho de exportação suportados pelo modelo e então reconstrua a engine TensorRT no JetPack 7.2.

Controlar Contexto, Cache KV e Concorrência

A memória de LLM não é determinada apenas pelos pesos do modelo. O cache KV cresce com o comprimento do contexto, tamanho de lote, tokens gerados e requisições concorrentes.

Comece com uma requisição conservadora:

{
"batch_size": 1,
"max_generate_length": 128,
"requests": [
{
"messages": [
{
"role": "user",
"content": "Summarize the current device status."
}
]
}
]
}

Em seguida, aumente uma dimensão por vez:

  1. comprimento do contexto de entrada;
  2. comprimento da geração;
  3. tamanho de lote;
  4. requisições concorrentes;
  5. serviços adicionais de visão ou robótica.

Se a memória subir abruptamente durante o prefill, encurte o prompt ou a janela de contexto. Se ela subir à medida que as sessões permanecem ativas, inspecione a retenção de cache KV e o tratamento de requisições concorrentes.

Evitar Carregamentos Duplicados de Modelo

Use um único servidor de modelo de longa duração quando várias aplicações precisarem do mesmo modelo. Scripts Python separados, notebooks, servidores de teste e serviços de produção podem cada um carregar outra cópia dos pesos ou da engine.

Antes de iniciar a inferência, verifique se já existem processos de modelo:

ps -ef | grep -E 'llm|triton|python|ollama' | grep -v grep

Pare apenas processos que sejam confirmadamente duplicados. Não encerre serviços de sistema apenas com base em uma correspondência de nome.

Manter Exportação e Build da Engine Fora do Alvo Sempre que Possível

O TensorRT Edge-LLM usa um host x86 com GPU para exportar o checkpoint e o Jetson para construir a engine de destino. A exportação pode exigir várias vezes o tamanho do checkpoint em RAM e VRAM, portanto manter a exportação no host preserva a memória do Jetson para validação e inferência.

Durante o build da engine, feche servidores de modelo não relacionados e registre o pico de memória separadamente da memória em tempo de execução. A pressão de memória durante o build não representa necessariamente o requisito de implantação em estado estacionário.

TensorRT Edge-LLM engine build

Tratar Swap como Ferramenta de Recuperação, Não como DRAM Livre

Swap pode ajudar a concluir uma conversão de modelo ou build de engine pontual, mas trocas sustentadas aumentam a latência e podem elevar o desgaste do armazenamento. Para inferência em tempo real, prefira um modelo menor ou quantizado, contexto mais curto, menor concorrência e menos serviços duplicados antes de depender de swap.

4. Validar o Resultado

Use o mesmo prompt, entrada, modo de potência e topologia de aplicação antes e depois de cada mudança.

MétricaPor que é importante
MemAvailable em idleMede a sobrecarga do sistema e dos serviços
Memória após o carregamento da engineMostra o footprint do modelo e do runtime
Pico de memória no prefillExpõe a pressão de contexto e de workspace temporário
Memória de decodificação em estado estacionárioMostra cache KV e retenção de sessão
Tempo até o primeiro tokenDetecta regressões causadas por swap ou workspaces restritos
Throughput de decodificaçãoConfirma que a menor memória não tornou a inferência inutilizavelmente lenta
Temperatura e potência da placaConfirma que o resultado é estável, não apenas um pico curto

O JetPack 7.2 Deep Dive registrou a memória após o carregamento de um modelo de 27B caindo de aproximadamente 24,6 GB no JetPack 6.2 para 14,7 GB no JetPack 7.2 na comparação da Seeed. Trate esse resultado como uma referência específica de carga de trabalho, não como uma redução garantida para todo modelo.

Ordem recomendada

  1. Meça a memória em idle, com carga de engine, prefill e decode.
  2. Remova processos de modelo duplicados e serviços de aplicativo desnecessários.
  3. Reduza o contexto, o comprimento de geração, o tamanho de batch e a simultaneidade.
  4. Avalie checkpoints INT8 ou INT4 compatíveis com TensorRT Edge-LLM.
  5. Use jetson-headless-mode para implantações de appliances sem display.
  6. Use jetson-optimize-memory headless ou no-camera somente quando o cenário de hardware corresponder exatamente.
  7. Considere a redução de SWIOTLB somente após medir o uso real do bounce-pool de DMA.
  8. Execute novamente testes de correção, latência, throughput, térmica e estabilidade após cada alteração.

Rollback

  • Restaure o target de serviço original se um desktop gráfico for necessário novamente.
  • Restaure o BSP original e reflashe se uma alteração de carveout ou device-tree causar falhas de boot ou de periféricos.
  • Reverta as alterações de SWIOTLB se erros de DMA aparecerem ou se o uso se aproximar do pool configurado.
  • Mantenha o último engine TensorRT e configuração de modelo conhecidos como bons até que a configuração otimizada seja aprovada nos testes de aceitação.

Suporte técnico e discussão de produtos

Obrigado por escolher produtos Seeed Studio! Para suporte técnico e discussão de produtos, utilize os seguintes canais:

Loading Comments...