shell插件
fzf
zsh : 在.zshrc 中加入 plugins=(fzf)
zsh : 在.zshrc 中加入 plugins=(fzf)
proxy server :
https://github.com/tinyproxy/tinyproxy
默认端口 8888,后台运行
local port forwarding :
本地命令:ssh -L 8181:192.168.0.135:3389 pi@192.168.0.135
此时连接本地 localhost:8181
相当于连接 192.168.0.135:3389
且只有 localhost:22
的连接通过防火墙
dynamic port forwarding :
本地命令:ssh -D 8181 pi@192.168.0.135
设置本地代理为 localhost:8181
,把本地所有流量传到远端
remote port forwarding :
本地命令:ssh -R 8181:localhost:3389 pi@192.168.0.135
将本地 3389 端口传输至远端8181端口,远端通过连接 localhost:8181
可以连接本地 3389 端口
cmd 使用 ss 代理:
set HTTP_PROXY=socks5://127.0.0.1:10808
set HTTPS_PROXY=socks5://127.0.0.1:10808
网关:连接不同类型的网络
route -n #查看路由表
修改网卡设置:/etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
arp : ip 和 mac 映射表
arp -a #查看 arp 表缓存
arp -d #删除 arp 表缓存
arp 欺骗:
sudo arpspoof -i [网卡] -t [目标ip] [网关ip]
nmap :
nmap -sP 192.168.40.0/24 #扫描网段中的 IP
VMware :
桥接模式:与主机处在同一网段,虚拟机拥有独立 IP,所有虚拟机可以和主机相互访问
在研究 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
(这都隔了一个多月了呀喂)
在看一篇在 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 优点)
for循环:
for((i = 0; i < 10; i++))
do
echo ${i}
done
for file in $(ls .)
do
echo ${file}
done
for i in ${a[@]} # 遍历数组元素
do
echo $i
done
if [ $# -lt 3 ] #等价于 if (( $# < 3 ))
then
# ...
elif (( $# > 3 ))
then
# ...
else
# ...
fi
# [[]] 字符串模式匹配
if [[ "$FN" == *.@(jpg|jpeg) ]]
变量: var="name"
字符串:单引号内所有字符按原样,双引号内转义
数组: array_name = (v0, v1, v2)
下标:${array_name[index]}
全部:${array_name[@]}
参数:$0
文件名 $1
之后参数
$?
: 上条命令返回值
$$
: bash进程id
$-
: 当前bash选项
$*
: 所有参数
"$@"
: 所有参数,每个参数用引号包含
$#
: 参数数量
{ pwd;ls; } > tt.out
: 花括号组合多个命令,两端必须有空格
(pwd;ls) > tt.out
: 普通括号在当前 shell 子shell 中运行,有相同环境变量
set -o noclobber
: 重定向输出不覆盖已有文件
set +o noclobber
: 重定向输出可以覆盖已有文件
set -e
: 脚本中任何命令出现错误,bash退出
set -x
:输出脚本中所有命令,前面加 "+"
set -u
:遇到未定义变量时报错
echo "string" > file
string输出到file,覆盖原有内容
echo "string" >> file
追加string到file
cd mytmp && rm *
: &&分隔命令,当第一个返回值为 0 时再执行第二个命令
echo ${HOME:=/tmp}
:当$HOME为空时赋值为/tmp
:-
:只返回值,不赋值
:+
:存在时返回值,否则返回空,测试变量是否存在
:?
:存在时返回值,否则打印并中断脚本
read TAG FN
读取一行内容,前面为单个单词,最后为剩余部分
||
和 &&
为短路运算符
echo "line1
line2" # 输出多行文本
echo -n hello world #输出不带换行
echo -e "Hello\nWorld" #解析引号中转义符
type 'command' #指令详细信息 (bash buildin 等)
shopt #查看当前 bash 选项
ctrl + l
: 将当前行移到首行
ctrl + a
: 移到行首
ctrl + e
: 移到行尾
alt + f
: 移到单词词尾
alt + b
: 移到单词词首
ctrl + k
: 剪切光标位置到行尾
ctrl + u
: 剪切光标位置到行首
~
扩展为当前用户 home
?
匹配文件路径中任意单个字符
*
匹配路径中任意数量字符
.*
匹配隐藏文件
[...]
匹配 [] 内单个字符
[^...]
, [!...]
匹配除 ... 外单个字符
[a-zA-Z0-9]
匹配范围扩展
{1,2,3}
分别扩展成 {} 中所有值,其中不能有空格
{start..end}
扩展成 start 到 end 每个值
{start..end..stride}
${!string*}
和 ${!string@}
扩展成以 string 开头的环境变量
$(...)
和 反引号 扩展成命令结果
$((...))
扩展成整数运算结果
量词:
?(pattern-list)
:匹配零个或一个模式。
*(pattern-list)
:匹配零个或多个模式。
+(pattern-list)
:匹配一个或多个模式。
@(pattern-list)
:只匹配一个模式。
!(pattern-list)
:匹配给定模式以外的任何内容。
单引号中所有字符变为普通字符
双引号中保留 $, `, \
here 文档:
<< token
text
token
输入多行字符串,支持变量替换,反斜杠转义,引号为普通字符
env
: 显示所有环境变量
set
: 显示所有环境变量和自定义变量
echo ${!myvar}
: myvar 的最终值
unset NAME
: 删除变量
export
: 将用户变量变为环境变量,对所有子 shell 生效
declare -i
: 声明整形变量,可以直接运算
declare -x
: 等同于 export
declare -r
: 声明只读变量
declare -u
: 为大写字母,-l
: 小写字母
declare -r
: 只读变量
-p
: 输出已定义变量值
-f
: 输出环境中所有函数及定义
-F
: 输出环境中所有函数名
let
:声明变量时直接计算表达式
负责应用: gromacs && IO500
tutorial 中提到 ccmake ,可以查看 cmake 全部选项
compile time :
GMX_SMI
必须符合target architecture
GMX_CLANG_CUDA
可能带来 performance degeneration
发现了 cpu 拓扑查看工具 hwloc
H series : CPU VM
HB : memory bandwidth
HC : dense compute
H型号 : IB 仅支持 intel MPI 5.1
HBv2, HB, HC : 全 IB 支持 (IP over IB)
GPU:
NV(visualization 意义不大), NC(GP-GPU), ND(deep learning)
A100 (unlikely)
NCV3 : 1-4 V100 16GB (older IB)
NDrv2 : 8 V100 32GB (edr IB) (NVLink interconnected)
azure cycle cloud
access restricted to single Resource group
可以在运行时修改配置