Caça a fugas de memória em aplicações Python

Wai Chee Yau

Follow

>

>>

Feb 13, 2019 – 4 min leia-se

>
>

>

>

>

>

>

>

Usamos um pouco de Python na Zendesk para construir produtos de aprendizagem de máquinas (ML). Um dos problemas comuns de desempenho que encontramos com aplicações de aprendizagem de máquinas é o vazamento de memória e picos. O código Python é normalmente executado dentro de containers através de frameworks de processamento distribuído, como Hadoop, Spark e AWS Batch. A cada contêiner é atribuída uma quantidade fixa de memória. Uma vez que a execução do código exceda o limite de memória especificado, o container terminará devido a erros de falta de memória.

Uma correção rápida é aumentar a alocação de memória. Entretanto, isto pode resultar em desperdício de recursos e afetar a estabilidade dos produtos devido a picos de memória imprevisíveis. As causas de vazamentos de memória podem incluir:

  • lingering grandes objetos que não são liberados
  • ciclos de referência dentro do código
  • bibliotecas subjacentes / extensões de memória vazando

Um exercício útil é traçar o perfil de utilização da memória das aplicações para obter uma melhor compreensão da eficiência espacial do código e dos pacotes subjacentes utilizados. Este post cobre:

>

  • profiling memory usage of the application across time
  • how to inspect memory usage at specific part of the program
  • tips for debugging memory issues

You can look at the memory usage varying across time during the execution of the Python code using the memory-profile package.

# install the required packages
pip install memory_profiler
pip install matplotlib# run the profiler to record the memory usage
# sample 0.1s by defaut
mprof run --include-children python fantastic_model_building_code.py# plot the recorded memory usage
mprof plot --output memory-profile.png

A. Perfil de memória em função do tempo

A opção incluir crianças incluirá o uso de memória de qualquer processo infantil gerado através do processo dos pais. O gráfico A mostra um modelo iterativo do processo de treinamento que faz com que a memória aumente em ciclos como lotes de dados de treinamento sendo processados. Os objetos são liberados uma vez que a coleta de lixo é lançada em.

Se o uso de memória está em constante crescimento, há um problema potencial de vazamentos de memória. Aqui está uma amostra de script para ilustrar isto.

>

>

>

>

B. Pegadas de memória que aumentam com o tempo

Um ponto de interrupção do depurador pode ser definido uma vez que o uso da memória exceda determinado limite usando a opção pdb-mmem que é útil para a resolução de problemas.

Memory Dump at a Point in Time

É importante entender o número esperado de objetos grandes no programa e se eles devem ser duplicados e/ou transformados em formatos diferentes.

Para analisar melhor os objetos na memória, um heap dump pode ser criado durante certas linhas do código no programa com muppy.

>

>

Exemplo de resumo de heap dump de memória

Outra biblioteca de perfis de memória útil é o objgraph que pode gerar gráficos de objetos para inspecionar a linhagem dos objetos.

Projeto para loop de feedback rápido

Uma abordagem útil é criar um pequeno “test case” que executa apenas o código de vazamento de memória em questão. Considere o uso de um subconjunto dos dados amostrados aleatoriamente se os dados de entrada completos forem longos para rodar.

Executar tarefas intensivas de memória em processo separado

Python não necessariamente libera a memória imediatamente de volta para o sistema operacional. Para garantir que a memória seja liberada após um pedaço de código ter sido executado, ela precisa ser executada em um processo separado. Esta página fornece mais detalhes sobre a coleta de lixo Python.

Debugger pode adicionar referências a objetos

Se um depurador de ponto de parada como o pdb for usado, quaisquer objetos criados e referenciados manualmente a partir do depurador permanecerão no perfil da memória. Isto pode criar uma falsa sensação de vazamentos de memória onde os objetos não são liberados em tempo hábil.

Visualizar pacotes que podem ter vazamentos

algumas bibliotecas Python podem potencialmente ter vazamentos de memória. Por exemplo, pandas têm alguns problemas de vazamento de memória conhecidos.

Caça Feliz!

Deixe uma resposta

O seu endereço de email não será publicado.