>
>>
>
>
>
>
>
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 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.
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.