We gebruiken Python redelijk veel bij Zendesk voor het bouwen van machine learning (ML) producten. Een van de meest voorkomende prestatieproblemen die we tegenkomen bij machine learning-toepassingen zijn geheugenlekken en pieken. De Python-code wordt meestal uitgevoerd in containers via gedistribueerde verwerkingsframeworks zoals Hadoop, Spark en AWS Batch. Elke container krijgt een vaste hoeveelheid geheugen toegewezen. Zodra de uitvoering van de code de gespecificeerde geheugenlimiet overschrijdt, wordt de container beëindigd als gevolg van out of memory errors.
Een snelle oplossing is om de geheugentoewijzing te verhogen. Dit kan echter leiden tot verspilling van middelen en invloed hebben op de stabiliteit van de producten als gevolg van onvoorspelbare geheugen pieken. De oorzaken van geheugenlekken kunnen onder meer zijn:
- het plaatsen van grote objecten die niet worden vrijgegeven
- referentiecycli binnen de code
- onderliggende bibliotheken/C-extensies die geheugen lekken
Een nuttige oefening is om het geheugengebruik van de toepassingen te profileren om een beter inzicht te krijgen in de ruimte-efficiëntie van de code en de onderliggende pakketten die worden gebruikt. Deze post behandelt:
- profilering geheugengebruik van de toepassing in de tijd
- hoe het geheugengebruik te inspecteren op een specifiek deel van het programma
- tips voor het debuggen van geheugenproblemen
U kunt kijken naar het geheugengebruik variërend in de tijd tijdens de uitvoering van de Python-code met behulp van het memory-profile pakket.
# 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
Met de optie include-children wordt ook het geheugengebruik berekend van eventuele kindprocessen die via het ouderproces tot stand zijn gekomen. Grafiek A toont een iteratief modeltrainingsproces waarbij het geheugen in cycli toeneemt naarmate er batches met trainingsgegevens worden verwerkt. De objecten worden vrijgegeven zodra de vuilnisophaal wordt gestart.
Als het geheugengebruik constant toeneemt, is er een potentieel probleem van geheugenlekken. Hier volgt een voorbeeldscript om dit te illustreren.