每周乱搞日记5
10.10
在研究 pruning 时 bert 是一个主要的 benchmark
使用了 pytorch-pretrained-bert 的代码
在 i1 和 nico 上进行了测试,选用的 benchmark 为 SQuAD
- 其中一个奇怪的事情是在 i1 双卡上的用时略小于 nico 8卡上的用时
两个 epoch
i1 双卡: epoch1 48.37, epoch2 41.36
准确率: EM 81.164, f1 88.464
nico 8卡:epoch1 54.20, epoch2 54.02
准确率: EM 81.362, f1 88.475
在nico上测试了一个 epoch:
准确率:EM 80.142, f1 87.566
对 bert base uncased 进行了调研:
超参数:
{
"attention_probs_dropout_prob": 0.1,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"initializer_range": 0.02,
"intermediate_size": 3072,
"max_position_embeddings": 512,
"num_attention_heads": 12,
"num_hidden_layers": 12,
"type_vocab_size": 2,
"vocab_size": 30522
}
总参数:109M (109483778)
其中 bert 部分参数数量: 109M (109482240)
bert部分:
embeddings : 23M(23837184)
encoder : 85M (85054464)
encoder 层为 12 个 Bertlayer 层的叠加:
每个 layer 参数数量为 7087872
每个layer中:
attention : 2363904
intermediate : 2362368
output : 2361600
三层有大致等量的参数
其中 attention 又分为 self 和 output 两部分
self 包含 q,k,v 主要 attention 部分,参数量: 1771776
output : 592128
所有layer中这三层的参数占模型参数总量 77.7%
embedding中参数占模型参数总量 21.8%
目前还不知道 embedding 中参数是否可prune
参数大致来源如下:
attention.self : hidden * hidden * 3
attention.output : hidden * hidden
intermediate : hidden * intermediate
output : intermediate * hidden
11.19
(这都隔了一个多月了呀喂)
在看一篇在 TASO 上做 sparse 的文章
"A sparse iteration space transformation framework for sparse tensor algebra"
是自动生成 sparse 的 CPU 和 GPU 操作的文章
另一种可能的 sparse op : MTTKRP
$$ A = B_{(1)} (D \dot C) $$
$$ A_{ij} = B_{ikl} \dot D_{lj} \dot C_{kj} $$
其中 A,D,C 为二维矩阵,B为三维 tensor
在存储 sparse tensor 时可以引入新格式 CSF
cold cache : 冷缓存?
在小矩阵情况下 CPU 性能优于 GPU
TACO : 计算 tensor expression 的 C++ library
可以生成 atomic 操作 (相比 TVM 优点)