-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathMem_monitor.py
38 lines (30 loc) · 1.22 KB
/
Mem_monitor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import numpy as np
import torch
import torch.nn as nn
# type_size 默认为4 默认类型为float32
def modelsize(model, input, 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))
input_ = input.clone()
input_.requires_grad_(requires_grad=False)
mods = list(model.modules())
# 存储输出的size的数组
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_sizes.append(np.array(out.size()))
input_ = 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))
# backward 过程所有中间变量需要保存下来再进行计算
print('Model {} : intermedite variables: {:3f} M (with backward)'
.format(model._get_name(), total_nums * type_size *2/ 1000/ 1000))