55
CS433 Parallel and Distributed Computing 大作业布置 2019/12/12 1

CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

  • Upload
    others

  • View
    18

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

CS433 Parallel and Distributed

Computing

大作业布置

2019/12/12

1

Page 2: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

大作业可选项1

2

CUDA优化:优化Inception-BN,ResNet-101网络的训练过程

• 学习如何修改caffe框架的源码,定位上述两个网络调用的cublas库

• 将上述两个网络调用的cublas库改为cuda代码

• 可适当优化非cublas库的cuda代码,例如池化及激活函数

• 撰写报告一份,报告需包含:大作业介绍、优化方案、与原始caffe版

本的对比结果、结果分析、遇到的问题以及解决的方法

组队标准:

• 2人一组

• 不超过20组

Page 3: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

大作业可选项1

3

评分标准:

• 及格:学会修改caffe框架;仅修改部分cublas、cudnn库

• 良好:将上述网络涉及的大部分cublas、cudnn库进行逐一优化;最终

的性能测试位列所有组的前80%;且提交一份较为完整、详细的实验

报告

• 优秀:将上述网络涉及的所有cublas 、cudnn库进行case by case优化,

具体而言,需要对神经网络的各层的矩阵相乘进行优化;最终的性能

测试位列所有组的前20%;提交一份完整、详细的实验报告

Page 4: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

大作业可选项2

4

昇腾算子优化

• 理解昇腾c910芯片架构

• 给定算子功能(包括向量加法等),使用TVM进行开发

• 优化上述算子的执行效率(需要理解TVM的调度策略)

• 撰写报告一份,报告需包含:大作业介绍、优化方案、结果分析、遇

到的问题以及解决的方法

组队标准:

• 2人一组

• 不超过20组

Page 5: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

大作业可选项2

5

注意事项:

• 实验平台为华为云端;可与华为工程师进行沟通,讨论开发时遇到的

问题

评分标准:

• 及格:理解昇腾c910芯片架构,实现至少3个算子的功能,提交较完

整的实验报告一份

• 良好:实现至少6个算子的功能,并提交较完整的实验报告一份

• 优秀:实现至少9个算子的功能,且能针对昇腾芯片架构,对算子进

行性能优化,提交一份完整、详细的实验报告

Page 6: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

大作业可选项3

6

SIMTensor

• 了解典型卷积神经网络的计算特性,以及常见的加速方法(如im2col

、直接卷积、winograd等)

• 理解SIMTensor编程模型,以及参考架构

• 在给定卷积神经网络模型下,按照SIMTensor编程模型理念,建立相

应的功能、性能仿真模型

组队标准:

• 3人一组

• 不超过3组

Page 7: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

大作业可选项3

7

注意事项:

• 每周需要与TA江子山单独meeting一次

评分标准:

• 及格:理解SIMTensor编程模型及架构,建立编程模型的部分功能的

仿真模型,提交较完整的实验报告一份

• 良好:建立完整的编程模型的功能仿真模型,并提交较完整的实验报

告一份

• 优秀:建立完整的编程模型的功能仿真、性能仿真模型,提交一份完

整、详细的实验报告

Page 8: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

CS433 Parallel and Distributed

Computing

CUDA 优化

2019/12/12

8

Page 9: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

循环展开

9

Why?

举例说明:分块矩阵乘法加速中的循环乘加

每一次循环所需要的计算:

1.计数器k更新指令 1次2.由k计算得Mds与Nds矩阵寻址 2次3.循环尾跳转指令 1次4.乘加计算指令 2次

乘加计算指令仅占了1/3的指令。由于指令处理带宽有限,因此这种指令混合将能取得

的性能限制在带宽峰值的1/3以内。

Page 10: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

循环展开

10

Solution:

将循环展开,设tile为4,得以下代码:

代码分析:1.消除分支指令以及计数器更新2.索引为常量-编译器可以使用加载指令的寻址模式对应的偏移量,这样可以消除地址运算指令3.执行速度几乎可以接近性能的峰值

Page 11: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

掩盖访存时间

11

H2D A1 H2D B1 K1 D2H C1 H2D A2 H2D B2 K2 D2H C2

Time

如何组织多kernel的主机端代码?

以唤醒两个kernel,每个kernel需要2个源操作数,1个输出结果为例:

串行组织方式:

在调用kernel的过程中,内存数据复制进入显存,与计算单元进行计算可以并行,因此上述串行组织方式没有用计算时间掩盖访存时间。

Page 12: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

掩盖访存时间

12

Time

从上图可以发现,kernel的执行时间可以与访存时间相互掩盖;但需要注意,此处我们假设kernel的执行时间与访存时间长短一致,然而在实际情况中往往并非如此,因而在优化时需要关注各个部分的执行时间

H2D A1 H2D B1 K1 D2H C1

H2D A2 H2D B2 K2 D2H C2

Page 13: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

流并行

13

流 Stream:你可以认为流是一个队列,封装cuda的异步操作。并保持操作顺序,同

时允许操作在流中排队。

以常见的写入-计算-写回为例:

启动多个kernel是在同一个stream中进行

H2D-1

Exe

D2H-1

H2D-2

Exe

D2H-2

TIM

E

Page 14: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

流并行

14

流并行:一个流中的不同操作有着严格的顺序。但是不同流之间没有限制

。但需要注意,不同的流之间不可以有数据依赖。CUDA流中排队的操作和主机都是异步的,所以排队的过程中并不耽误主机运行其他指令,所以这就隐藏了执行这些操作的开销。

我们以4个流并行表示上页的例子,有以下两个版本:

相比于异步版本1,版本2在某个流进行内存搬运的同时其他流进行运算。

Page 15: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

流并行

15

总结来说,上页表示了Host数据复制与Device计算并行。流并行还有其他的并行方式:

重叠Host和Device计算

重叠Host计算和Host设备数据传输

并发Device计算(多个Device)

Page 16: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

动态并行

16

动态并行指的是允许GPU kernel创建线程调用另外的GPU kernel。

如下图所示:

H

o

s

t

Kernel 1

Kernel 2

Kernel 3

非动态并行

H

O

s

tKernel 1

Kernel 2 Kernel 3

动态并行

H

O

s

t

Page 17: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

动态并行

17

动态并行能优化什么?

例子如下:

主要区别

其主要区别为调用entry函数的方式,假设调用diverge_cta函数的方式为diverge_cta<<<K,M*32>>>(foo) 。则显然,非动态并行diverge_cta函数跳转进入entry函数次数为K*M,而动态并行的次数为K。动态并行显著减少了线程的分支。

非动态并行 动态并行

Page 18: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

优化显存访问

回顾:CUDA存储器模型

18

GridBlock(0, 0) Block(1, 0)

Shared Memory / L1 Cache Shared Memory / L1 Cache

Reg Reg

Thread(0, 0) Thread(1, 0)

Reg Reg

Thread(0, 0) Thread(1, 0)

Global Memory

Constant Memory

Host

Page 19: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

优化显存访问

1. Global Memory是一块存储容量较大的DRAM,它是on board memory。从

DRAM中访问一个变量需要数百甚至数千个时钟周期,此外,从DRAM访问变量

的速度通常要比处理器完成算术操作的速度慢很多。

2. 使用shared memory是一个不错的选择,在后面会对shared memory展开详细介

绍。

3. 常数存储器constant memory是一块访问延迟很小的存储器,可以将kernel调用

不变的变量存储在constant memory,提高访问速度。需要注意,constant memory

是一块只读的memory,其次,constant memory容量很小。

__constant__ float M[MAX_MASK_WIDTH]

cudaMemcpyToSymbol(dest, src, size)

19

Page 20: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

利用共享内存

Global Memory vs. Shared Memory

20

ARCHITECTURE Pascal Volta

Capacity of Global Memory 16 GB 32 GB

Capacity of Shared Memory 64 KB / SM 128 KB / SM(with L1 cache)

Bandwidth of Global Memory 732 GB/s 900 GB/s

Bandwidth of Shared Memory32 bits of each bank

per cycle

64 bits of each bank

per cycle

PRODUCTS Tesla P100 Tesla V100

在不发生板块冲突的情况下,shared memory的访问延迟远低于global

memory(显存)(Excerpt from Nvidia Developer Blog)

Page 21: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

利用共享内存

• The amount of the unified data cache reserved for shared memory is

configurable on a per kernel basis.

• For the Volta architecture (compute capability 7.0), the unified data cache

has a size of 128 KB, and the shared memory capacity can be set to 0, 8,

16, 32, 64 or 96 KB.

• For the Turing architecture (compute capability 7.5), the unified data cache

has a size of 96 KB, and the shared memory capacity can be set to either 32

KB or 64 KB. (Excerpt from CUDA Toolkit Document)

21

Set the shared memory size__host__cudaError_t cudaDeviceSetSharedMemConfig ( cudaSharedMemConfig config )

Brief Introduce:

Sets the shared memory configuration for the current device, including the shared memory

bank size which is used for all subsequent kernel launches.

Parameters:

config - Requested cache configuration

Returns:

cudaSuccess, cudaErrorInvalidValue ( Excerpt from CUDA Toolkit Document)

Page 22: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

利用共享内存

22

1. 什么是bank(板块)?BWshared-memory = n * BWbank

2. 发生板块冲突的原因?

3. 因此我们需要避免板块冲突

无板块冲突两个线程访问同一个板块,造成板块冲突

无板块冲突例外情况:如果所有线程访问同一个板块,那么会采用广播机制

Page 23: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

避免板块冲突(以数组求和问题为例)

利用共享内存

23

在这里我们假设warp size是8

,板块数量为8个

0 1 2 3 4 5 6 7

8 9 10 11 12 13 14 15

16 17 18 19 20 21 22 …

线程4访问shared_memory[8]

和 shared_memory[9],分别映射到bank[0] 和 bank[1]

线程0访问shared_memory[0]

和 shared_memory[1],分别映射到bank[0] 和 bank[1]

Bank Conflicts

B

a

n

k

Page 24: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

利用共享内存

避免板块冲突(以数组求和问题为例)

24

在这里我们假设warp size是8

,板块数量为8个

0 1 2 3 4 5 6 7

8 9 10 11 12 13 14 15

16 17 18 19 20 21 22 …

先后两次访存,每次访问中所

有线程的访问地址都映射在了8

个bank内,且没有冲突,提高

了带宽。

同时,减少了控制流分支,提高了wrap内线程的执行效率。

Page 25: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

合并访存请求

M0,0 M0,1 M0,2 M0,3

M1,0 M1,1 M1,2 M1,3

M2,0 M2,1 M2,2 M2,3

M3,0 M3,1 M3,2 M3,3

25

M0,0 M0,1 M0,2 M0,3 M1,0 M1,1 M1,2 M1,3 M2,0 M2,1 M2,2 M2,3 M3,0 M3,1 M3,2 M3,3

按地址递增排列的线性化顺序

Page 26: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

合并访存请求

M0,0 M0,1 M0,2 M0,3

M1,0 M1,1 M1,2 M1,3

M2,0 M2,1 M2,2 M2,3

M3,0 M3,1 M3,2 M3,3

26

M0,0 M0,1 M0,2 M0,3 M1,0 M1,1 M1,2 M1,3 M2,0 M2,1 M2,2 M2,3 M3,0 M3,1 M3,2 M3,3

Thread 0

Thread 1

Thread 2

Thread 3

Kernel代码的访问方向

加载迭代0T0 T1 T2 T3

非合并模式

加载迭代1T0 T1 T2 T3

Page 27: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

合并访存请求

M0,0 M0,1 M0,2 M0,3

M1,0 M1,1 M1,2 M1,3

M2,0 M2,1 M2,2 M2,3

M3,0 M3,1 M3,2 M3,3

27

M0,0 M0,1 M0,2 M0,3 M1,0 M1,1 M1,2 M1,3 M2,0 M2,1 M2,2 M2,3 M3,0 M3,1 M3,2 M3,3

Thread 0Thread 1

Thread 2 Thread 3

Kern

el代

码的

访问

方向

加载迭代0

T0 T1 T2 T3

合并模式

加载迭代1

T0 T1 T2 T3

Page 28: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

合并访存请求

1. 当同一个warp中所有线程都执行同一条指令访问全局存储器中的连续

的单元时,就获得最有利的访问模式。所有这些访问请求将被合并和结

合成对所有连续单元的单个请求。这种合并访问使DRAM在传输数据时

的速度接近全局存储器带宽的峰值。

2.如果算法本身要求一个kernel函数中的代码以行的方式遍历数据,那么

就可以使用共享存储器来实现存储空间的合并。一旦数据放入共享存储

器中,则不管是以行还是以列的方式访问都不会引起性能的差异,因为

shared memory本身能实现高速的on chip memory,不需要通过合并提高

数据的访问速度。

28

Page 29: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

数据分块

以分块矩阵乘法为例mat_M * mat_N = mat_P

先利用线程协同将矩阵M

和N中的元素加载到共享

存储器中,由于线程数量和共享存储容量的限制,我们需要对M和N进行分块

29

M0,0 M0,1 M0,2 M0,3

M1,0 M1,1 M1,2 M1,3

N0,0 N0,1

N1,0 N1,1

N2,0 N2,1

N3,0 N3,1

P0,0 P0,1 P0,2 P0,3

P1,0 P1,1 P1,2 P1,3

P2,0 P2,1 P2,2 P2,3

P3,0 P3,1 P3,2 P3,3

Page 30: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

优化手段3 - 数据分块Stage 1 Stage 2

Thread0,0

M0,0

Mds0,0

N0,0

Nds0,0

Pvalue0,0+=Mds0,0*N

ds0,0+Mds0,1*Nds1,0

M0,2

Mds0,0

N2,0

Nds0,0

Pvalue0,0+=Mds0,0*Nd

s0,0+Mds0,1*Nds1,0

Thread0,1

M0,1

Mds0,1

N0,1

Nds0,1

Pvalue0,1+=Mds0,0*N

ds0,1+Mds0,1*Nds1,1

M0,3

Mds0,1

N2,1

Nds0,1

Pvalue0,1+=Mds0,0*Nd

s0,1+Mds0,1*Nds1,1

Thread1,0

M1,0

Mds1,0

N1,0

Nds1,0

Pvalue1,0+=Mds1,0*N

ds0,0+Mds1,1*Nds1,0

M1,2

Mds1,0

N3,0

Nds1,0

Pvalue1,0+=Mds1,0*Nd

s0,0+Mds1,1*Nds1,0

Thread1,1

M1,1

Mds1,1

N1,1

Nds1,1

Pvalue1,1+=Mds1,0*N

ds0,1+Mds1,1*Nds1,1

M1,3

Mds1,1

N3,1

Nds1,1

Pvalue1,1+=Mds1,0*Nd

s0,1+Mds1,1*Nds1,1

30

time

Page 31: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

其他优化方法

31

1. Kernel fusion

由于启动kernel的时间很长,因此对于任务量很小的连续kernel可以进行

合并。例如神经网络中的激活函数和池化函数

2.Case by case优化

神经网络不同的层的配置不同(channel、kernel size、batch size等),导

致矩阵乘法的size不同。在优化时,需要根据配置的区别来优化代码

3.ptx汇编级别优化

分析ptx汇编代码中调用kernel和寄存器的方式,给性能优化带来启示

Page 32: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

CS433 Parallel and Distributed

Computing

昇腾算子开发

2019/12/12

32

Page 33: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

TBE ——架构概述

Compute api Schedule api

Halida IR

PASS(内存复用、同步优化、指令映射等)

CODEGEN

用户层

Build api

Compute api:用于描述Tensor等

Schedule api:用于描述算子实现的

调度优化

Build api:用于描述算子编译动作

PASS:对原始HalidaIR或变形后的

IR进行变形处理的编译器pass

CODEGEN:将变形后的HalidaIR转

换成目标代码

Page 34: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

TBE ——算子开发流程

Atlas 200DK提供了TBE(Tensor Boost Engine)算子开发框架,可以开发自定义算子。TBE是基于Python API接口,来描述和实

现算子开发工具,其主要在TVM( Tensor Virtual Machine )框架的基础上,开放了一套描述算子计算的DSL接口。

TVM是一个用于CPU、GPU和专用加速器的端到端深度学习编译器栈,它提供了一套用易用的Python API接口,让用户快速构建特

性平台上的描述程序。

创建自定义算子开发工程。

自定义未实现的算子,包括算子代码开发、单算子的编译、运行、

验证。

自定义算子插件开发,将算子注册到Framework中,算子插件编

译后生成.so插件文件

再次进行模型转换时,通过加载*.so插件文件,才能识别自定义的

算子,进而完成模型转换。

Page 35: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

自定义算子与插件开发

算子开发

插件开发

Page 36: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

TBE —— DSL方式开发TBE自定义算子

• TBE Compute API

TBE算子都是调用框架提供的computeAPI来描述计算过程, 接口都是以te.lang.cce.name的形式;

compute API 现根据功能类型可分为以下几类:

·elewise_compute 对Tensor中每个原子值分别做相同操作; te.lang.cce.vabs 即对每个数值x求绝对值

·reduction_compute 对Tensor按轴进行操作;te.lang.cce.sum(data,axis)表示对data按axis进行累加

·segment_compute 对Tensor进行分段操作

·cast_compute 对Tensor中数据的数据类型进行转换;例如float16转换为float32

·broadcast_compute 对Tensor按照目标shape进行广播;shape为(3,1,2)的Tensor广播成(3,3,2)Tensor

·mmad_compute 矩阵乘法

·卷积相关compute 除以上几种compute,还有一些专门针对卷积的compute

Atlas 200DK TensorEngine

API参考

Page 37: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

TBE —— DSL方式开发TBE自定义算子

elewise_compute分为singleElewise 和 binaryElewise以及multipleElewise

singleElewise对Tensor中每个原子值分别做相同操作,如te.lang.cce.vabs 即对每个数值x求绝对值:

binaryElewise是输入两个shape相同的tensor,对应位置上的数值做操作,如te.lang.cce.vadd:

Page 38: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

TBE ——算子开发

• TBE-DSL开发( Caffe_Reduction为例)• 1. 算子定义:• Reduction算子是Caffe中的Redcution算子,对指定轴及其之后的轴做reduce操作,这个算子包含四种类型

Page 39: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

TBE ——算子插件开发

自定义算子插件开发参考实例代码及GE API文档进行开发,主要修改部分有以下几步:

1 解析算子参数(Caffe)

2 获取算子输出描述

3 编译算子,获取算子的二进制文件及算子描述文件

4 注册算子

Page 40: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

TBE ——算子插件开发

算子参数解析函数ParseParamFunc

用户自定义并实现ParseParamFunc类函数,完成caffe模型参数和权值的转换,将结果填到Operator类中。

Status ParseParamFunc(const Message* op_origin, ge::Operator& op_dest);

获取算子输出描述函数InferShapeFunc

用户自定义并实现InferShapeFunc类函数,用于获取算子的输出描

述,包括输出shape信息、数据类型等张量描述信息。

Status InferShapeFunc(const ge::Operator& op, vector<ge::TensorDesc>&

v_output_desc);

算子编译、构建算子二进制文件和描述文件的函BuildTeBinFunc

用户自定义并实现BuildTeBinFunc类函数,用于构建算子二进制文件。virtual Status BuildTeBinFunc(const ge::Operator& op,TEBinInfo& teBinInfo);

Page 41: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

TBE ——整网调试

OM

OMG(Offline Model Generate)加载模型文件、自定义算子插件,对模型文件中的算子进行解析,并将自定义算子转换为IR(Intermediate representation)

表示。

OMG根据运行环境对自定义算子进行数据转换、运行内存计算,同时编译生成自定义算子的二进制文件(*.o)文件,并生成Davinci离线模型(*.om)文件

应用程序运行时,OME会获取输入数据,加载离线模型文件进行算子的循环调用执行,输出结果数据。

Page 42: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

CS433 Parallel and Distributed

Computing

SIMTensor

2019/12/12

42

Page 43: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

• 完成一个矩阵相乘计算任务的方式,在这几十年里发生了巨大改变!– 以串行的方式编写三层循环,交给CPU执行,在标量之间进行乘

加。

• 所有的计算任务都是交给CPU完成的,计算硬件是完全泛化的。

– 以SIMT的方式编写并行程序,交给GPU完成,仍然是每个线程操

作标量进行乘加,不过现在是由大量的线程同时进行以完成计算。

• 大规模并行的计算任务交给适合并行的硬件进行,计算硬件开始出现专用化的苗头。

从矩阵相乘说起

Page 44: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

从矩阵相乘说起

• Tensor Core的出现,使得完成矩阵相乘计算有了完全不同的形式。– 在整体框架采用SIMT的基础上,添加特殊的指令编写并行程序。

– 每个线程的操作单位不再是标量级别!

• 在计算硬件上最大的变化是:– 硬件接受的操作数不再是标量级别!

– 计算硬件真正的专用化——即面向特定的计算任务调用特定的计算硬件。

• 在编程层面,也出现了变化– 以SIMT的方式编写操控Tensor Core,不如先前直观灵活,编程困

难。

Warp 内 的线程 被打 包 ,以操 纵Tensor Core。这意味着,对于实际的运算硬件Tensor Core而言,真正的“线程”是原先的“Warp”!

Page 45: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

计算硬件专用化设计越来越多!

现在大家更喜欢,“把专业的事情交给专业的人办”!

Page 46: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

SIMTensor编程模型

• 总结一下我们可以得到这样的信息:

– 1.面向专用计算的硬件越来越多。

– 2.现有的编程模型并不适应这样的专用硬件。

• 为此,我们希望在SIMT的基础上,创造出一个新的编程模型!

– 它继承了SIMT的优点,能以简单的方式完成并行程序的编写并操控专用加速硬件单元!

– 它能适应市面上各种各样的专用加速单元!

– 它能简化设计各异的专用硬件上的编程难度!

– 它能由特定的计算任务与算法指导硬件设计!

Page 47: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

SIMTensor编程模型的关键理念

• 张量元(Tensor Unit)

• 大小核(Outter Kernel & Inner Kernel)

• 数据搬移单元(Memory Transfer Element)

• 存储层次(Memory Hierarchy)

Page 48: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

张量元

• 张量:– 本质是一种数据容器,它的形式可以是n维的,具体形状是与研究

问题具体相关的。

– 可以说一组含有N个样本,C个通道的特征图(实质是维度为[N,C,H,W]的数据)整体是一个张量。

– 也可以说该数据里的每张特征图是一个张量,那这样,该组数据就是由N*C个张量组成的张量数组([N,C](H,W))。

• 张量元:

– 张量元的形状则是对问题固定的,相反,它随硬件改变而改变,硬件具体的。

– 针对特定的硬件设计特定的形状以达到最高效率的计算。

– 张量元是衔接大核函数与小核函数的桥梁。

Page 49: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

大小核函数

• 大内核函数延续SIMT的编写方式供程序员完成算法编写。– 本质仍然是SIMT。

– 可以自由编写,自由优化。

– 区别在于,操作单元不再是标量,而是张量元!

• 小内核函数则更趋向于面向差异化的硬件

– 面向硬件,由厂商最优地完成该硬件支持的运算指令的编写,固化在小核函数中。

• 因此编写计算任务的程序员不能编写小内核!

– 面向程序员,即大核函数,提供该专用计算单元所能完成运算操作的定义

– 因此,小核函数本质是定义一种运算操作,完成该运算操作在具体硬件上的具体实现。

• 硬件支持多少专用的运算,就提供多少小核函数。

Page 50: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

数据搬移单元

• 数据搬移单元是为了解决张量元概念引入的内存重排布开销。

– 通常而言,数据都是以行优先形式存储在内存中,而张量元的引入,并且要求数据以张量元为单位提交给硬件计算单元,就势必引入“行优先排布->张量元优先排布的步骤”。

– 将该步骤交由编程人员完成 -> SIMTensor编程模型臃肿,不易用。

– 引入数据搬移模块,通过API调用的方式,让编程人员易用地完成行优先数据与张量元优先数据的相互转化。

• 当然,数据搬移单元不局限于存储方式转换!– 提供自定义的索引方式,例如:

• 窗口滑动式索引(以省去重排内存的开销)。

– 提供常用的数据格式转换API

• IM2COL、转置等。

Page 51: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

存储层次

• 对于CUDA支持的共享内存,SIMTensor当然也支持,不再赘述!

• 对于专用硬件的各种缓存设计,我们提供支持!– 不管是Tensor Core还是华为的Davinci Core,它们在进行计算时使

用的指令都不再是从全局内存或共享内存中读操作数了!

• Tensor Core的指令是会先由一条显式的指令将操作数Load至寄存器,再执行计算指令;

• 而Davinci Core因为其本身就是专用加速硬件,其操作数是存放至Buffer中,因此会先有显式的指令,将操作数Load至计算单元前的Buffer,再执行真正的计算。

– 因此在存储层次上,除了Global Mem到Shared Mem这一层,SIMTensor还有专用的Buffer层。这个当然也会是硬件相关的!

• 对此,我们希望能统一Buffer相关的指令集,对Buffer的读写操作等进行规范,使得这样的指令集能适用于各种加速硬件的Buffer;同时,我们也希望设计的指令集能指导Buffer的设计。

Page 52: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

如果用SIMTensor编写矩阵相乘

• 假设我们的硬件单元是CUDA Core

• 典型步骤:– 1.在主机内存中开辟原始矩阵A,B以及结果矩阵C的主存空间;

– 2.在设备端内存中相应开辟矩阵A,B,C的空间,并利用MTE转换单

元,在将主机端数据搬移到设备端时实现行优先到张量元优先的转换;

– 3.程序执行用户编写的大核函数,其以张量元(16*16矩阵,当然也

可能是更大的矩阵效率更高!)为基本操作数,抽象到一个更高的层次,在该层面进行矩阵相乘;

– 4.大核函数中执行到张量元的计算操作语句时,进入小核函数。小

核函数实现张量元之间的各种运算操作,无编程自由性,在大核函数内是固定格式的语句或运算符。

– 5. 完成计算任务,大核函数退出,用户通过MTE单元将算好的数据搬回主机端。

Page 53: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

如果用SIMTensor编写矩阵相乘

• 能获得哪些收益?

– 由于小核函数是固化的,因此相同算法下,SIMTensor与CUDA相比,SIMTensor的计算效率会提高!

– 程序员不用再考虑原先CUDA中每个Block该怎么划分了的事情了,因为现在每个小Kernel就相当于原先CUDA中的Block,已经将你最优化固化参数了!

– 可以专心地将优化的功夫放在数据复用,数据调度层面了!

– 由于有MTE单元的存在,数据重排布的消耗是有限的,对性能的影响微小!

– 若A,B两个加速硬件设计类似,那移植你刚刚用SIMTensor写好的程序会变得非常简单!

– 指令数量显著减少!

• 会有哪些不同

– SIMTensor由于本质上仍是硬件具体的,因此相比起CUDA,程序员更需要知道底层设计的细节才更方便写出最高效的程序!

– 可能会有Buffer层的存储供使用!甚至某些以Register Files之名行Buffer之实的RFs

也可以被使用了!

– 现在大核函数内需要以张量元为操作单位进行计算、调度等工作了!

Page 54: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

SIMTensor任务总结

• 总体任务:在给定的的架构与基于SIMTensor的编程模型下,进行给

定的神经网络如“Inception”、“ResNet”网络等进行性能分析。

• 分阶段任务:

– 第一周:详细分析典型卷积神经网络的计算特性和存储特性,具体分析

卷积层计算的不同实现方式。

– 第二周:调查卷积神经网络的不同功能层在不同硬件平台上的实现方式

,结合SIMTensor编程模型的思想分析。

– 第三周:在给定的SIMTensor编程模型参考架构上实现卷积神经网络的调

度,搭建功能模型。

– 第四周:在理想情况下,根据自己的调度方法建立在给定参考架构上的

性能模型。

Page 55: CS433 Parallel and Distributed Computingacalab.sjtu.edu.cn/kindeditor/Upload/file/20191213/20191213134032… · CUDA优化:优化Inception-BN,ResNet-101网络的训练过程 •

55

THANKS