(附代碼)干貨 | 你必須知道的代碼內(nèi)存占用
點(diǎn)擊左上方藍(lán)字關(guān)注我們

作者 | Tirthajyoti Sarkar
鏈接 | https://towardsdatascience.com/how-much-memory-is-your-ml-code-consuming-98df64074c8f
pip install scalene
scalene <yourapp.py>
load_ext scalene

行和函數(shù):報(bào)告有關(guān)整個(gè)函數(shù)和每個(gè)獨(dú)立代碼行的信息;
線程:支持 Python 線程;
多進(jìn)程處理:支持使用 multiprocessing 庫(kù);
Python 與 C 的時(shí)間:Scalene 用在 Python 與本機(jī)代碼(例如庫(kù))上的時(shí)間;
系統(tǒng)時(shí)間:區(qū)分系統(tǒng)時(shí)間(例如,休眠或執(zhí)行 I / O 操作);
GPU:報(bào)告在英偉達(dá) GPU 上使用的時(shí)間(如果有);
復(fù)制量:報(bào)告每秒要復(fù)制的數(shù)據(jù)量;
泄漏檢測(cè):自動(dòng)查明可能造成內(nèi)存泄漏的線路。
多元線性回歸模型;
具有相同數(shù)據(jù)集的深度神經(jīng)網(wǎng)絡(luò)模型。




$ scalene linearmodel.py --html linearmodel-scalene.html



最好在代碼中編寫(xiě)專(zhuān)注于單個(gè)任務(wù)的小型函數(shù);
保留一些自由變量,例如特征數(shù)和數(shù)據(jù)點(diǎn),借助最少的更改來(lái)運(yùn)行相同的代碼,在數(shù)據(jù) / 模型縮放時(shí)檢查內(nèi)存配置文件;
如果要將一種 ML 算法與另一種 ML 算法進(jìn)行比較,請(qǐng)讓整體代碼的結(jié)構(gòu)和流程盡可能相同以減少混亂。最好只更改 estimator 類(lèi)并對(duì)比內(nèi)存配置文件;
數(shù)據(jù)和模型 I / O(導(dǎo)入語(yǔ)句,磁盤(pán)上的模型持久性)在內(nèi)存占用方面可能會(huì)出乎意料地占主導(dǎo)地位,具體取決于建模方案,優(yōu)化時(shí)切勿忽略這些;
出于相同原因,請(qǐng)考慮比較來(lái)自多個(gè)實(shí)現(xiàn) / 程序包的同一算法的內(nèi)存配置文件(例如 Keras、PyTorch、Scikitlearn)。如果內(nèi)存優(yōu)化是主要目標(biāo),那么即使在功能或性能上不是最佳,也必須尋找一種占用最小內(nèi)存且可以滿(mǎn)意完成工作的實(shí)現(xiàn)方式;
如果數(shù)據(jù) I / O 成為瓶頸,請(qǐng)?zhí)剿鞲斓倪x項(xiàng)或其他存儲(chǔ)類(lèi)型,例如,用 parquet 文件和 Apache Arrow 存儲(chǔ)替換 Pandas CSV??梢钥纯催@篇文章:
僅分析 CPU 時(shí)間,不分析內(nèi)存;
僅使用非零內(nèi)存減少資源占用;
指定 CPU 和內(nèi)存分配的最小閾值;
設(shè)置 CPU 采樣率;
多線程并行,隨后檢查差異。

END
整理不易,點(diǎn)贊三連↓
