计算机器学习所耗内存
显存占用和GPU利用率是两个不一样的东西,显卡是由GPU计算单元和显存等组成的,显存和GPU的关系有点类似于内存和CPU的关系。
1.首先安装scalenepip install scalene
Scalene 是一个 Python 的高性能 CPU内存分析器
用于Python脚本的CPU和内存分析器,能够正确处理多线程代码,还能区分Python代码和本机代码的运行时间
在linux或Mac OS X上运行
要安装的这些自动化工具都用不了
使用代码计算参数量
# 模型显存占用监测函数
# model:输入的模型
# input:实际中需要输入的Tensor变量
# type_size 默认为 4 默认类型为 float32
# def modelsize(model, input, type_size=4):
def modelsize(model, input1, input2, type_size=4): # 若有两个输出参数
para = sum([np.prod(list(p.size())) for p in model.parameters()])
print('Model {} : params: {:4f}M'.format(model._get_name(), para * type_size / 1000 / 1000))
input1_ = input1.clone()
input2_ = input2.clone()
input1_.requires_grad_(requires_grad=False)
input2_.requires_grad_(requires_grad=False)
mods = list(model.modules())
print(mods)
out_sizes = []
for i in range(1, len(mods)):
m = mods[i]
if isinstance(m, nn.ReLU):
if m.inplace:
continue
# out = m(input_)
out = m(input1_, input2_) # 若有两个参数
out_sizes.append(np.array(out.size()))
# input_ = out
input2_ = out # 若有两个参数
total_nums = 0
for i in range(len(out_sizes)):
s = out_sizes[i]
nums = np.prod(np.array(s))
total_nums += nums
print('Model {} : intermedite variables: {:3f} M (without backward)'
.format(model._get_name(), total_nums * type_size / 1000 / 1000))
print('Model {} : intermedite variables: {:3f} M (with backward)'
.format(model._get_name(), total_nums * type_size*2 / 1000 / 1000))
modelsize(model, tensor_adjacency, tensor_x)
参考资料:
Scalene: Python 高性能 CPU 内存分析器
python工具——Scalene
Python - scalene CPU和GPU及内存分析工具
机器学习代码占多少内存?
Python使用pynvml查看GPU信息
Python 性能分析工具py-spy与Scalene
神经网络内存占用计算
【DL基础】模型训练测试过程消耗内存的计算
浅谈深度学习:如何计算模型以及中间变量的显存占用大小
如何在Pytorch中精细化利用显存
再次浅谈Pytorch中的显存利用问题(附完善显存跟踪代码)
科普帖:深度学习中GPU和显存分析
深度学习PyTorch,TensorFlow中GPU利用率较低,CPU利用率很低,且模型训练速度很慢的问题总结与分析
火焰图与JOL