Python程序如何用GPU加速:Tesla、CUDA、Numba
-
概念解析
首先要明白,普通的
Python
代码是无法使用GPU
加速的,只能在GPU
上跑针对GPU
设计的程序。硬件加速必须要用硬件语言实现。
查询
Python+GPU
关键字,除了TensorFlow
,另外出镜率比较高的几个概念是:Numba
、CUDA
、PyCUDA
、minpy
。要理解这些,需要对
Python
的理解更底层一些。关于计算机的一些底层实现,参见:
-
GPU概念相关
GPU
(Graphics Processing Unit
),视觉处理器、图形显示卡。GPU
负责渲染出2D
、3D
、VR
效果,主要专注于计算机图形图像领域。后来人们发现,GPU
非常适合并行计算,可以加速现代科学计算,GPU
也因此不再局限于游戏
和视频
领域。无论是CPU还是GPU,在进行计算时,都需要用核心(Core,也就是ALU+寄存器)来做算术逻辑运算。
一个核心只能顺序执行某项任务,为了同时并行处理更多任务,芯片公司开发出了多核架构,只要相互之间没有依赖,每个核心做自己的事情,多核之间互不干扰,就可以达到并行计算的效果。
-
CPU的局限
个人桌面电脑
CPU
只有2~8个核心Core
,数据中信的服务器上也只有20到40个核心,GPU
却有上千个核心。然而,
CPU
和GPU
的核心并不相同,GPU
的核心只能专注于某些特性的任务,而CPU
核心具有更广泛的计算能力。CPU
更通用,起到协调管理的作用,GPU
功能局限在计算特定任务。 -
CPU与GPU交互
CPU
从主存(Main Memory
)中读写数据,并通过总线(Bus
)与GPU
交互。GPU
在许多计算核心之外,也有自己独立的存储,称为显存。GPU核心
在做计算时,只能直接从显存中读写数据,程序员需要在代码中指明哪些数据需要从内存和显存之间相互拷贝,这些数据传输都是在总线上,因此总线
(NVLink
技术、PCI-E
技术…)的传输速度和带宽也会是部分计算任务的瓶颈。因为
CPU
和GPU
是分开的,在英伟达的设计理念中,CPU和主存
被称为Host,GPU
被称为Device。Host
和·概念会贯穿整个英伟达GPU
编程。使用
CPU
和GPU
组合来加速计算,也被称为异构计算。世界第一的超级计算机
Summit
使用了9216个IBMPOWER9 CPU
和27648个英伟达Tesla GPU
。 -
GPU架构
-
Turing
图灵- 2018年发布
- 消费显卡:
GeForce 2080 Ti
-
Volta
伏特- 2017年发布
- 专业显卡:
Tesla V100
(16或32GB显存,5120个核心)
-
Pascal
帕斯卡- 2016年发布
- 专业显卡:
Tesla P100
(12或16GB显存,3584个核心)
英伟达设计理念中,多个小核心组成一个
Streaming Multiprocessor
(SM
),一张GPU
卡又多个SM
。英伟达主要以
SM
为运算和调度的基本单元。单个SM的结构包括:
-
针对不同计算的小核心(绿色小格子),包括优化深度学习的
TENSOR CORE
,32个64位浮点核心(FP64
),64个整型核心(INT
),64个32位浮点核心(FP32
); -
计算核心直接从寄存器(
Register
)中读写数据; -
调度和分发器(
Scheduler
和Dispatch Unit
); -
L0
和L1
级缓存;
前面以物理学家命名的架构区分主要针对设计,对消费者而言,英伟达主要又两条产品线:
-
-
GPU的软件生态
前面描述的都是
GPU
的物理层面的结构,英伟达之所以能在人工智能时代成功,除了上述硬件卓越之外,更主要的是率先提供了可编程的软件架构。早期
GPU编程
不友好,2007
年英伟达
发布CUDA编程模型
之后改变了这一情形。CUDA
对于GPU
就像个人电脑上的Windows
、手机上的安卓
系统。一旦建立好系统,吸引了开发者,用户非常依赖这套软件生态体系。英伟达软件栈:
GPU
编程方法:CUDA
及其软件栈的缺点:入门可以考虑云厂商的
Tesla P4
虚拟机,大约十几元/小时。 -
References