在训练模型时,使用pip安装的decord库读取视频和音频,但在运行过程中遇到cpu内存泄漏的问题,加载了大约60w个视频样本后就会占用接近300G的cpu内存
step1:参考常规的内存泄漏的检查思路,排查代码中可能存在的问题
网上通常出现内存泄漏的解决方法有以下几种:
#loss_all += loss
loss_all += loss.item()
#a = torch.tensor(b)
a = torch.tensor(b, dtype=torch.float32)
# data = self.data_list[index]
data = copy.deepcopy(self.data_list[index])
del data
gc.collect()
step2:以上方法都尝试过,但都没有改变我代码中内存泄漏的问题。因此想着使用memory_profiler工具定位代码中哪个地方导致内存增加(参考)
【图】
step3:于是一步步将部分函数或代码注释,从而缩小定位范围
将代码tranform转换的所有步骤的注释,只保留decord读取音视频部分
【代码】
结果发现还是存在内存增长,但是这次的增长规律有所不同。由于没有了transform步骤,内存增长趋势没有大的波动,没有明显内存释放的过程,而是缓慢地一步步的增长。到这里基本确定是decord库可能存在内存泄漏问题。
step4:去github上搜decord代码中存在的memory leak问题的Issue。参考1、参考2
从一个回答中找到了问题所在: The problem appears with ctx=cpu(0) but not ctx=gpu(0)
因此我试了以下使用ctx=gpu(0)来读取,结果发现我的decord不支持decord.gpu(0)。然后发现别人的decord都是从源代码编译安装的,而我的是从pip安装来的。于是,尝试去https://github.com/dmlc/decord用源码安装decord
。
# 下载编译
git clone --recursive https://github.com/dmlc/decord
cd decord
mkdir build && cd build
cmake .. -DUSE_CUDA=ON -DCMAKE_CUDA_COMPILER=/path/to/cuda/bin/nvcc -DCMAKE_BUILD_TYPE=Release
make
# 安装python
cd ../python
# option 1: add python path to $PYTHONPATH, you will need to install numpy separately
pwd=$PWD
echo "PYTHONPATH=$PYTHONPATH:$pwd" >> ~/.zshrc
source ~/.zshrc
# option 2: install with setuptools
python setup.py install --user
结果发现内存不动了!!至此问题解决~~!!
使用pip安装的decord库读取音视频时,存在内存泄漏的问题,并且这个版本的decord缺少部分功能。解决方法是使用decord源码重新编译安装到python。