模型并行训练

算是自己经常使用的两种方法吧,其他的非分布式的方法就不介绍了。

一. PyTorch

torch.distributed,分配n个进程,分别运行在n个GPU上

  • 单机多卡:CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch –nproc_per_node=4  master_port=29501 main.py (最好指定端口,否则出现端口被占用)
  • 多机多卡:
    • 机器1: CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch –nproc_per_node=4 –nnodes=2 –node_rank=0 –master_addr=”156.132.1.2″  –master_port=1234 main.py
    • 机器2: CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch –nproc_per_node=4 –nnodes=2 –node_rank=1 –master_addr=”156.132.1.2″  –master_port=1234 main.py

参考:pytorch DistributedDataParallel多卡并行训练 torch.distributed(该页末尾) 当代研究生应当掌握的并行训练方法(单机多卡)

二. Tensorflow

使用horovod

  • 单机多卡:horovodrun -np 8 -H localhost:8 python run_classifier.py
  • 多机多卡:
    • 机器1:  horovodrun -np 16 -H localhost:8,172.31.60.175:8  python run_classifier.py
    • 机器2: horovodrun -np 16 -H 机器1的ip:8,172.31.60.175:8  python run_classifier.py

参考:private_bert

Difference between hvd.rank() and hvd.local_rank()

 

shell 字符串处理

一. 字符串截取

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

三. 参考

FFM (Field-aware Factorization Machines)

一.简介

通过引入field的概念,FFM把相同性质的特征归于同一个field。FFM相对于FM加入了field的概念,每个特征的隐向量不再是只有一个,而是针对每个field学习一个独立的隐向量,防止互相影响

二.原理

连续特征,一个特征就对应一个Field (也可连续特征离散化,一个分箱成为一个特征);  离散特征,采用one-hot编码,同一种属性的归到一个Field。

以上文的表格数据为例,计算用户1的FFM组合特征:

算一下𝑦̂ 𝑣1,𝑓2的偏导

注意𝑥2,𝑥3,𝑥4是同一个属性的one-hot表示,即𝑥2,𝑥3,𝑥4中只有一个为1,其他都为0 (对于每个样本来说,同一个field下只有一个feature的值不是0,其他feature的值都是0)。在本例中𝑥3=𝑥4=0, 𝑥2=1,所以:

推广到一般情况:

𝑥𝑗属于Field 𝑓𝑗,且同一个Field里面的其他𝑥𝑚都等于0。实际项目中𝑥是非常高维的稀疏向量,求导时只关注那些非0项即可。

三.参考