Normalmente uma de cinco coisas: o snapshot de dados, as sementes aleatórias, versões de biblioteca e do CUDA, kernels de GPU não determinísticos, ou diferenças de hardware no comportamento de ponto flutuante. Fixe os dados por snapshot datado em vez de uma consulta ao vivo, semeie toda fonte de aleatoriedade incluindo os workers do data loader, containerize o ambiente, e aceite que determinismo bit a bit exato em GPU custa performance e nem sempre vale a pena comprar.
Por que os entrevistadores perguntam isso
O entrevistador está checando se você entende reprodutibilidade como um conjunto de controles concretos e não como uma virtude. O sinal mais forte é saber que reduções em GPU são não determinísticas por padrão e que forçar determinismo tem um custo real de velocidade, mais saber que os dados são o culpado mais comum porque eles mudam debaixo de você sem nenhuma mudança de código.
Como estruturar sua resposta
- Liste as causas candidatas em ordem de probabilidade.
- Ponha o snapshot de dados primeiro porque ele muda em silêncio.
- Cubra semear toda fonte, incluindo os workers do data loader.
- Explique o não determinismo de GPU e o custo de forçá lo.
- Diga que nível de reprodutibilidade de fato vale pagar.
Exemplo de resposta
Eu desço uma lista, do mais provável ao menos. Dados, quase sempre. Se a consulta de treino lê uma tabela ao vivo, ela mudou entre a minha rodada e a dela, e nenhuma quantidade de sementes conserta isso, então o treino lê um snapshot datado com contagem de linhas registrada. Depois, sementes, e não só a semente do framework: o random do Python, o NumPy, o framework, e criticamente os workers do data loader, cada um precisando da própria semente para que embaralhamento e augmentação também sejam reprodutíveis. Depois ambiente, e é por isso que o treino roda num container com versões de biblioteca e de CUDA fixadas em vez de com o que a pessoa por acaso tem instalado. Depois disso você entra no não determinismo de GPU. Alguns kernels usam acumulação atômica, então a ordem da redução varia de rodada para rodada e você tem diferenças minúsculas de ponto flutuante que se acumulam ao longo de milhares de passos. Dá para forçar algoritmos determinísticos, mas isso desabilita os kernels rápidos e eu já vi custar vinte por cento ou mais. Então eu pergunto do que a gente de fato precisa. Para uma investigação de depuração ou um modelo regulado eu pago por determinismo bit a bit. Normalmente eu só preciso de resultados que batam dentro do ruído, e eu demonstro isso rodando a mesma configuração duas vezes e mostrando a dispersão.
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
- Como você mostraria que uma diferença está dentro do ruído entre rodadas?
- Quais flags do framework forçam kernels determinísticos, e o que elas custam?
- Como você torna uma rodada distribuída reprodutível com um número diferente de nós?
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