计算机器学习所耗内存

显存占用和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

posted @ 2022-08-15 20:33  YTT77  阅读(274)  评论(0编辑  收藏  举报