1.Coding
2.Paper
- 20190828⛽️:7:30左右起床
- 20200515⛽️:skill++, paper++, but laziness++
- 20200615⛽️:text-generation
一个形状为 的矩阵,与另一个形状为
的矩阵相乘,其运算复杂度来源于乘法操作的次数,时间复杂度为
故最后self-attention的时间复杂度为
对于受限的self-attention,每个元素仅能和周围 个元素进行交互,即和
个
维向量做内积运算,复杂度为
,则
个元素的总时间复杂度为
对于multi-head attention,假设有 个head,这里
是一个常数,对于每个head,首先需要把三个矩阵分别映射到
维度。这里考虑一种简化情况:
。(对于dot-attention计算方式,
与
可以不同)。
故最后的复杂度为:
注意:多头的计算并不是通过循环完成的,而是通过 transposes and reshapes,用矩阵乘法来完成的。假设有 个head,则新的representation dimension:
。因为,我们将
的矩阵拆为
的张量,再利用转置操作转为
的张量。故
的计算为:
与
做计算,得到
的张量,复杂度为
,即
。注意,此处
实际是一个常数,故
复杂度为
。
故一次操作的时间复杂度为 ,
次序列操作后的总时间复杂度为
注: 这里保证输入输出都是一样的,即均是
算是自己经常使用的两种方法吧,其他的非分布式的方法就不介绍了。
torch.distributed,分配n个进程,分别运行在n个GPU上
参考:pytorch DistributedDataParallel多卡并行训练 torch.distributed(该页末尾) 当代研究生应当掌握的并行训练方法(单机多卡)
使用horovod
参考:private_bert
Difference between hvd.rank() and hvd.local_rank()
1. 关键字(词)截取
var=http://www.aaa.com/123.htm echo ${var#*//} # 从左边开始删除第一个 // 号及其左边的所有字符 # 输出为 www.aaa.com/123.htm
var=http://www.aaa.com/123.htm echo ${var##*/} # 从左边开始删除最后(最右边)一个 / 号及其左边的所有字符 # 输出123.htm
var=http://www.aaa.com/123.htm echo ${var%/*} # 从右边开始,删除第一个 / 号及其右边的字符 # 输出 http://www.aaa.com
var=http://www.aaa.com/123.htm echo ${var%%/*} # 从右边开始,删除最后一个(最左边) / 号及其右边的字符 # 输出 http:
2. 定位截取
var=http://www.aaa.com/123.htm echo ${var:0:5} # 0 表示左边第一个字符开始,5 表示字符的总个数 # 输出 http:
var=http://www.aaa.com/123.htm echo ${var:5} # 5 表示左边第6个字符开始,一直到结束。 # 输出 //www.aaa.com/123.htm
var=http://www.aaa.com/123.htm echo ${var:0-7:3} # 0-7 表示右边算起第七个字符开始,3 表示字符的个数 # 输出 123
var=http://www.aaa.com/123.htm echo ${var:0-7} # 从右边第七个字符开始,一直到结束 # 输出 123.htm
echo "111""222" # 输出 111222
var="aaa" echo "111"${var} # 输出 111aaa echo "111${var}" # 输出 111aaa
a="123" b="456" echo $a$b # 输出 123456