Deep Learning Systems Lecture 10 Convolutional operators in deep networks
这里回顾dlsys第十讲,本讲内容是卷积网络。
课程主页:
https://dlsyscourse.org/
https://forum.dlsyscourse.org/
https://mugrade-online.dlsyscourse.org/
大纲
深度网络中的卷积运算符;
实用卷积的要素;
微分卷积;
深度网络中的卷积运算符全连接神经网络的问题
到目前为止,我们已经考虑了将输入图像视为向量。
当我们尝试处理更大的图像时,这会产生一个实际问题:256x256 RGB 图像⟹~200K维输入⟹映射到1000维隐藏向量需要200M参数(对于每一层)。
没有捕捉到我们期望在图像中具有的任何“直观”不变性(例如,将图像移动一个像素会导致非常不同的下一层)。
卷积如何“简化”深度网络
卷积结合了两种非常适合处理图像的想法;
要求层与层之间的激活仅以“局部”方式发生,并将隐藏层本身视为空间图像;
在所有空间位置共享权重;
卷积的优势
大幅减少参数数量;
256x256 灰度图像 ⟹ 256x256 单通道隐藏层:从全连接网络中的40亿个参数到3x3卷积中的9个参数;
...
Deep Learning Systems Lecture 9 Normalization and Regularization
这里回顾dlsys第九讲,本讲内容是归一化和正则化。
课程主页:
https://dlsyscourse.org/
https://forum.dlsyscourse.org/
https://mugrade-online.dlsyscourse.org/
大纲
归一化;
正则化;
优化、初始化、归一化、正则化的交互;
归一化初始化vs优化假设我们为ReLU网络选择初始化方式为$W_i\sim \mathcal N(0, \frac c n )$,不同的$c$会带来不同的训练结果:
然而,问题更为根本:即使训练成功,初始化时出现的效果/尺度在整个训练过程中都会持续存在:
归一化
既然初始化对于训练非常重要,并且在训练过程中可能会发生变化,不再跨层/网络“一致”。
但请记住,深度网络中的“层”可以是任何计算。
让我们添加层来“修复”激活的规范化,使其成为我们想要的任何值!
Layer normalization第一个想法:让我们标准化(均值零和方差一)每一层的激活函数值,这称为Layer normalization:
\begin{aligned}
\hat{z}_{i+ ...
ECE408 Lecture 26 Course Retrospective
这次回顾ECE408 Lecture 26,这次是最后一讲,课程回顾。
课程主页:
https://wiki.illinois.edu/wiki/display/ECE408
搬运视频:
https://www.youtube.com/playlist?list=PL6RdenZrxrw-UKfRL5smPfFFpeqwN3Dsz
ECE408回顾:
这个学期我们做了什么?
基本计算模式;
矩阵乘法、卷积、归约、扫描、直方图、稀疏表示;
并行优化;
线程、内存管理、合并、线程发散、任务管理、分析;
编程系统;
CUDA, OpenACC,(OpenCL, DPC++, Hip, OpenMP)
批量同步模型促成成功
在批量同步中,barrier分隔代码的时间区域。 交织/数据共享仅发生在区域内(称为phases);
GPU计算生态系统2021自2007年推出以来,开发人员抽象级别一直在稳步上升,更多繁重的GPU工作由开发GPU的公司完成。
英伟达视角
AMD视角
ECE408 Lecture 23 Alternatives to CUDA
这次回顾ECE408 Lecture 23,这次介绍了CUDA的替代品。
课程主页:
https://wiki.illinois.edu/wiki/display/ECE408
搬运视频:
https://www.youtube.com/playlist?list=PL6RdenZrxrw-UKfRL5smPfFFpeqwN3Dsz
加速计算不再是问题GPU 供应商包括:
Nvidia;
AMD;
Intel;
Samsung;
Apple;
Qualcomm;
ARM;
CUDA只是计算加速的一种模型计算加速的历史:
OpenGL (1992), DirectX (1995);
GPGPU(2002);
CUDA (2007);
OpenCL (2008);
OpenACC (2012), C++AMP (2013), RenderScript (2013);
Metal (2014), SYCL (2014), Vulkan (2016),ROCm HIP (2016);
MPI、TBB、OpenCV等现有框架适配以提供支持。Caffe、TensorFlow、 ...
ECE408 Lecture 22 Task Concurrency
这次回顾ECE408 Lecture 22,这次介绍了任务并发。
课程主页:
https://wiki.illinois.edu/wiki/display/ECE408
搬运视频:
https://www.youtube.com/playlist?list=PL6RdenZrxrw-UKfRL5smPfFFpeqwN3Dsz
序列化数据传输至此,我们使用cudaMemcpy的方式序列化数据传输和GPU计算:
支持并发
大多数CUDA设备支持设备overlap;
在设备和主机内存之间执行复制的同时执行内核;
int dev_count;
cudaDeviceProp prop;
cudaGetDeviceCount(&dev_count);
for (int i = 0; i < dev_count; i++) {
cudaGetDeviceProperties(&prop, i);
if (prop.deviceOverlap) …
重叠(流水线)时序
将大向量分成段;
相邻段的传输和计算overlap;
...
ECE408 Lecture 21 GPU as part of the PC Architecture
这次回顾ECE408 Lecture 21,这次介绍GPU作为PC架构的一部分。
课程主页:
https://wiki.illinois.edu/wiki/display/ECE408
搬运视频:
https://www.youtube.com/playlist?list=PL6RdenZrxrw-UKfRL5smPfFFpeqwN3Dsz
目标
了解将GPU用作协处理器时数据传输对性能的影响;
传统CPU的speeds和feeds;
使用GPU的speeds和feeds;
开发用于现代GPU性能调整的知识库;
回顾:规范的CUDA程序结构
全局变量声明
内核函数;
__global__ void kernelOne(…)
Main () // 主机代码
在设备上分配内存空间;
cudaMalloc(&d_GlblVarPtr, bytes)
将数据从主机传输到设备;
cudaMemcpy(d_GlblVarPtr, h_Gl ...)
执行配置设置;
内核调用;
– kernelOne<<<execution configurat ...
ECE408 Lecture 20 Parallel Sparse Methods II
这次回顾ECE408 Lecture 20,这次继续介绍并行稀疏方法。
课程主页:
https://wiki.illinois.edu/wiki/display/ECE408
搬运视频:
https://www.youtube.com/playlist?list=PL6RdenZrxrw-UKfRL5smPfFFpeqwN3Dsz
CSR运行时
块性能由最长的行决定。
基于CSR的SpMV
JDS(Jagged Diagonal Sparse)负载均衡内核设计
根据非零个数对行进行降序排序。跟踪原始行号,以便可以正确生成输出向量。
根据长度对行进行排序(正则化)
CSR到JDS转换
并行SpMV/JDS Kernel__global__ void SpMV_JDS(int num_rows, float *data, int *col_index, int *jds_row_ptr, int *jds_row_perm, float *x, float *y) {
int row = blockIdx.x * blockDim.x + thread ...
ECE408 Lecture 19 Parallel Sparse Methods
这次回顾ECE408 Lecture 19,这次介绍了并行稀疏方法。
课程主页:
https://wiki.illinois.edu/wiki/display/ECE408
搬运视频:
https://www.youtube.com/playlist?list=PL6RdenZrxrw-UKfRL5smPfFFpeqwN3Dsz
目标
学习在并行稀疏方法中压缩输入数据以减少内存带宽消耗的关键技术;
更好地利用片上存储器;
更少的字节传输到片上存储器;
更好地利用全局内存;
挑战:保持规律性;
稀疏矩阵
许多现实世界的系统本质上都是稀疏的;
描述为稀疏矩阵的线性系统;
求解稀疏线性系统
基于稀疏矩阵向量乘法的迭代共轭梯度求解器是一种常用方法;
PDE系统的解可以表述为表示为稀疏矩阵向量乘法的线性运算;
分析和人工智能中的稀疏矩阵
稀疏矩阵-向量乘法(SpMV)
挑战
与密集矩阵向量乘法相比,SpMV;
不规则/非结构化;
从优化技巧、先前讨论的想法中获益甚微;
实现最佳性能的关键;
减少稀疏性(通过去除零);
最大化规律性(通过减少分歧和负载不平衡);
最大 ...
ECE408 Lecture 18 Atomic Operations and Histogramming
这次回顾ECE408 Lecture 18,这次介绍了原子操作和直方图。
课程主页:
https://wiki.illinois.edu/wiki/display/ECE408
搬运视频:
https://www.youtube.com/playlist?list=PL6RdenZrxrw-UKfRL5smPfFFpeqwN3Dsz
目标
理解原子操作
并行计算中的读取-修改-写入;
并行程序中“临界区”的原始形式;
在CUDA中使用原子操作;
为什么原子操作会降低内存系统的吞吐量;
如何避免某些并行算法中的原子操作;
直方图作为原子操作的示例应用
基本的直方图算法;
私有化;
一种常见模式
多个客户预订机票;
每个客户:
调出飞行座位图;
决定座位;
更新座位图,将座位标记为已占用;
糟糕的结果:多名乘客最终预订了同一个座位;
Read-Modify-Write操作
如果Mem[x]最初为0,那么在线程1和2完成后Mem[x]的值是多少?
每个线程在它们的Old变量中得到什么?
答案可能因数据竞争而有所不同。为了避免数据竞争,我们需要使用原子操作。
分析 ...
Deep Learning Systems Lecture 7 Neural Network Library Abstractions
这里回顾dlsys第七讲,本讲内容是神经网络库抽象。
课程主页:
https://dlsyscourse.org/
https://forum.dlsyscourse.org/
https://mugrade-online.dlsyscourse.org/
大纲
编程抽象;
高级模块化库组件;
编程抽象
框架的编程抽象定义了实现、扩展和执行模型计算的常用方法;
虽然设计的选择在看到实际实现之后可能看起来很明显,但了解思考过程很有用,因为:
我们可以了解为什么要这样设计抽象;
以及学习如何设计新的抽象;
案例分析主要从对3个框架进行分析,分别是Caffe 1.0, TensorFlow 1.0以及PyTorch:
Forward和backward层接口(Caffe 1.0)Caffe 1.0:
定义前向计算和后向(梯度)操作,用于cuda-convenet(AlexNet框架):
class Layer:
def forward(bottom, top):
pass
def backward(top,
propagat ...
ECE408 Lecture 17 Parallel Scan Part 2
这次回顾ECE408 Lecture 17,这次介绍了Parallel Scan第二部分。
课程主页:
https://wiki.illinois.edu/wiki/display/ECE408
搬运视频:
https://www.youtube.com/playlist?list=PL6RdenZrxrw-UKfRL5smPfFFpeqwN3Dsz
目标
掌握并行扫描(前缀和)算法
工作效率与延迟;
Brent-Kung树算法;
分层算法;
Kogge-Stone并行Scan算法回顾回顾Kogge-Stone并行Scan算法:
提高效率
一种常见的并行算法模式:
平衡树;
在输入数据上构建一个平衡二叉树,并将其从root开始遍历;
树不是一种实际的数据结构,而是一种概念模式;
对于scan:
从叶子节点向上遍历到根,在树的内部节点处构建部分和;
root是所有叶子节点的总和;
Brent-Kung并行scan算法Brent-Kung并行scan步骤第一步先计算一些特殊的部分和,称为Scan Step:
第二步,根据第一步的结果再次求和,称为Post- ...
ECE408 Lecture 16 Parallel Scan
这次回顾ECE408 Lecture 16,这次介绍了Parallel Scan。
课程主页:
https://wiki.illinois.edu/wiki/display/ECE408
搬运视频:
https://www.youtube.com/playlist?list=PL6RdenZrxrw-UKfRL5smPfFFpeqwN3Dsz
Inclusive Scan定义定义:
扫描操作采用二元结合运算符$\oplus$和$n$个元素的数组:
\left[x_0, x_1, \ldots, x_{n-1}\right],并返回前缀和数组:
\left[x_0,\left(x_0 \oplus x_1\right), \ldots,\left(x_0 \oplus x_1 \oplus \ldots \oplus x_{ {n}-1}\right)\right].例子:
如果$\oplus$是加法,那么在数组$[3,1,7,0,4,1,6,3]$上执行scan操作的结果会返回$[3,4,11,11,15,16,22,25]$。
Scan应用例子
假设我们有一块$100 ...