block pruning
block-sparse RNN
prune掉整个块
所有层使用相同超参数
balanced sparsity
每行切块,每块中 prune 掉指定数量元素
shrinkbench :
compression : 总参数数量 / 剩余参数数量
prune掉整个块
所有层使用相同超参数
每行切块,每块中 prune 掉指定数量元素
shrinkbench :
compression : 总参数数量 / 剩余参数数量
AndroidManifest.xml : 根内容记录
属性:
"@style" : 位于 res/values/styles.xml
"@color" : 位于 res/values/colors.xml,保存颜色 (格式argb)
"@string" : 位于 res/values/strings.xml,保存字符串
"@mipmap" :位于 res/mipmap,存储图片,每个图片一个文件夹
"@+id" : 设定 id,可以通过 findViewById(R.id.[id name]) 查找
R.layout : 位于 res/layout,所有layout
R.menu : 位于 res/menu,菜单资源
创建 Activity 后,需要在 AndroidManifest.xml 中配置
setContentView(R.layout.activity_main) :设定layout
startActivity(Intent intent) :启动新的Activity
传递信息:
//发送方
Intent intent = new Intent(this, TestActivity.class);
intent.putExtra("username", "Peter");
intent.putExtra("age", 20);
startActivity(intent);
//接收方
Intent intent = getIntent();
String username = intent.getExtra("username");
int age = intent.getExtra("age", 0);
finish() : 结束自身Activity,并回调启动者的 onActivityResult
onKeyDown :重写输入键实现
后台运行
Started状态回调:onStartCommand
Bound状态回调:onBind
管理应用级数据
onCreate() : 应用开始
onTerminate() : 应用结束
程序名:
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// do sth.
}
})
textview.setText("String");
短暂显示提示
Toast toast = new Toast(this);
toast.setDuration(Toast.LEGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.setView(ll);
Loading a value into a 32-bit register name sets the upper 32 bits of the register to zero. Thus, after movl $-1, %eax, the %rax register has value 0x00000000FFFFFFFF.
Loading a value into a 16- or 8-bit register name leaves all other bits unchanged.
既movl等操作32bit指令会将后32bit置零
开始看适之学长给的论文
introduction 中提到bert模型的pre_train过程代价极高
1024 V100 1day
bert large 很难在12GB ~ 16GB 的显卡上reproduce 结果
bert有multiple layers 的双向 transformers
每个 transformer 有一个 multi-head self-attention层,position-wise feed-forward层
防止假期摸鱼,记一下每天都干了什么
这个假期主要需要搞TVM那边的工作
$SHELL
环境变量是当前的shell路径
tmux调整当前窗口全屏 : ctrl+b z
tmux新建窗口: ctrl+b c
,下一个窗口:ctrl+b n
ctrl+b [
: 页面滚动
任务提交dgx-dev : qsub -I -q dgx-dev
cmake添加前缀路径:CMAKE_PREFIX_PATH = /opt/fftw:/opt/cuda cmake ..
ssh -L [localport]:[host]:[hostport] [host]
将本地端口localport ssh forward到host的hostport上
ssh -D [localport] [host]
将host转发到localport
/sys
: 在内存中
/var
: variable,可能grow in size的内容
CPU flops计算:
对于nico的Intel® Xeon® Gold 5218 Processor:
每个核有1个AVX-512 FMA unit (单个时钟周期内两次512bit 的乘法和加法)
睿频3.9GHz,32位GFLOPS = 64 * 512 / 32 * 2 * 3.9 = 7987 => 8TFLOPS
单V100 single precision 14TFLOPS
带宽900GB/sec
nico1上v100的capability 7.0
参考一些 《CUDA C权威编程指南》里面的内容
atomicCAS(int *address, int compare, int val)
(*address == compare ? val : *address)
可以通过它对 capability < 6.0 设备实现 atomicAdd
一个有趣的东西 warp vote function:__all_sync/__any_sync...(unsigned mask, int predicate)
对wrap中 mask中每个线程传入一个predicate与0比较,返回结果到每个wrap
nvidia-smi -L
: 查看所有GPU的设备ID
nvidia-smi -q -i 0
: 查看GPU0详细信息
一个block只能在一个SM上被调度
major revision number对应架构: Volta 7, Pascal 6, Maxwell 5, Kepler 3, Fermi 2, Tesla 1
Turing 7.5 (基于Volta的incremental)
-arch=compute_30
: 编译选项中使用3.0 capability
Fermi架构中shared memory 和 L1 cache 共享
Kepler : 每个SM中包含192个单精单元,64双精单元,32特殊单元,32加载存储单元
每个SM中有4个 wrap 调度器,8个指令调度器。可同时调度64个wrap,2048个线程
双精1TFLOPS
动态并行,GPU可以启动嵌套kernel
V100 release时间是2017.5
我觉得目前可以做的是研究V100的tensor core
PTX = parallel thread execution
active threads : 在所在wrap当前执行路径上的threads
ASpT的代码中大量用到了__shfl
原语
在一个wrap的threads之间交换一个variable
int __shfl(int var, int srcLane, int width=warpSize);
返回srcLane中var的值
width必须是power of 2
width<warpSize时每width个thread被视为一个子wrap
matrix multiply and accumulate (D = A*B + C)
register bank conflict : volta架构中寄存器被分为两个64bit bank
一个volta指令每个cycle只能访问每个bank的64 bit
x86_64中,依次使用rdi, rsi, rdx传递函数参数
A100 GPU : 54 billion 晶体管 826 mm^2
ampere架构
intel cascade lake : 基于 sky lake 优化