Percorra os consumidores de memória em ordem: batch size e comprimento de sequência, ativações retidas para a passagem backward, estado do otimizador, e fragmentação por causa de formatos variáveis. Correções rápidas são um batch menor com gradient accumulation para preservar o batch efetivo, gradient checkpointing, bf16 e um otimizador eficiente em memória. Cheque também se você não está acumulando tensores que ainda carregam um grafo de computação.
Por que os entrevistadores perguntam isso
Essa é a realidade diária de quem treina modelos, então o entrevistador está checando se existe um método sistemático em vez de virar flags no chute. O detalhe que identifica experiência é saber que as ativações costumam dominar em vez dos pesos, mais o bug clássico de anexar um tensor de loss a uma lista a cada passo, o que retém o grafo inteiro e vaza memória entre iterações.
Como estruturar sua resposta
- Liste os consumidores de memória em ordem aproximada de tamanho.
- Distinga um problema de capacidade de um vazamento que cresce com os passos.
- Dê as correções baratas: accumulation, checkpointing, bf16.
- Cite o bug do grafo retido e como você o identifica.
Exemplo de resposta
A primeira coisa que eu checo é se ele morre na hora ou depois de algumas centenas de passos, porque são bugs diferentes. Imediato é problema de capacidade, crescente é vazamento. Para capacidade eu decomponho o que está de fato residente: pesos, gradientes, estado do otimizador (com o Adam são duas cópias extras) e ativações salvas para a passagem backward. Num transformer as ativações normalmente dominam, e elas escalam com batch size vezes comprimento de sequência, então esses são os primeiros botões. Eu reduzo o batch e uso gradient accumulation para manter o batch efetivo idêntico, o que custa tempo de relógio e nada mais. Depois gradient checkpointing, que recomputa ativações durante o backward e troca cerca de trinta por cento de computação extra por uma economia grande de memória. O bf16 corta o tamanho das ativações pela metade em cima disso. Se cresce com os passos, algo está segurando um grafo. O clássico é anexar o tensor cru de loss a uma lista para logging, o que mantém vivo o grafo de computação de cada passo, e a correção é chamar item nele. Eu confirmo imprimindo memória allocated e reserved a cada cem passos, porque uma escada limpa subindo é a pista.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Qual é a diferença entre memória allocated e reserved no alocador?
- Como acontece fragmentação de memória com entradas de tamanho variável?
- Quando você usaria offloading para CPU em vez de reduzir o batch?
Mais perguntas para Engenheiro de Machine Learning
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas