Reference & Notations
Item | Instructions |
---|---|
Title | vDNN: Virtualized Deep Neural Networks for Scalable Memory-Efficient Neural Network Design |
Authors | Minsoo Rhu, Natalia Gimelshein, Jason Clemons, Arslan Zulfiqar, Stephen W. Keckler |
Conference | MICRO’16 |
vDNN | virtualized Deep Neural Network |
Abstract
a runtime memory manager: 虚拟化DNN的内存,可以同时使用CPU和GPU内存来训练更大的DNNs。
vDNN的成果:
- 降低了AlexNet 89%的显存占用量
- 降低了OverFeat 91%的显存占用量
- 降低了GoogLeNet 95%的显存占用量。
- 在显存为12GB的Titan X GPU卡上,用batchsize=256训练了vgg16(需要总计28G内存),性能损失只有18%。
Introduction
模型占用的内存越来越大。
vDNN的特点:
- GPU memory + CPU memory
- transparent to ML practitioners.
vDNN的观察:
- DNN有很多个layers租场
- 这些layer有很多,排列顺序等是提前固定的
- GPU一次只能执行一个。但是现在的ML框架直接把所有layers的内存全塞进显存中。DNN越深,浪费越严重。
vDNN的目标:只给当前需要用的layer保守分配显存,降低显存的最大/平均占用量。
vDNN的手段:研究了allocated data structures的数据依赖,特别是占了大部分的intermediate feature maps;将这些数据在GPU与CPU之间倒腾。具体如下:
- 不用的直接释放
- 短期内不用的暂存到CPU memory中
- overlap传输与计算。
贡献:
- 第一篇对GPU-based DNN训练做详细、量化分析的。
- 第一篇从架构角度对DNN的内存访问特性与其对显存系统的影响进行深入的研究。
- 指出了现有ML框架的内存管理问题。
- 实现了vDNN,将6个模型的显存占用降低了73%~98%,使得可以在单张titan X卡上训练。性能损失在1%~18%。
Background & Motivation
DNN Architecture
主要关注feedforward style convolutional neural networks(例如AlexNet, OverFeat, GoogLeNet, VGG)。
CV领域的DNN的layers组成:
- CONV
- ACTV
- POOL
- FC
其中,CONV, ACTV, POOL组成 _feature extraction layers_,FC组成 _classification layers_。趋势是feature extraction layers越来越大。
DNN Training vs. Inference
Forward Propagation
略过
Backward Propagation
也是layer-wise的。
Motivation: Scalable and Memory-Efficient DNN Design
现有page-migration based virtualization solutions的限制:通过PCIe来传输pages的延迟太高了(CPU interrupts for system calls, page-table updates, TLB updates/shootdowns, actual page transfer)。
之前的研究表明:将一个4KB的page通过PCIe传输到GPU中需要20~50us $\leftrightarrow$ page-migration的PCIe带宽利用率为80~200MB/sec, 而 _cudaMemcpy_ 的传输速度为12.8GB/sec。
基于图5的观察:
- 内存占用: intermediate feature maps>>weights
- 中间数据大多与feature extraction maps相关,与后面的classifier layers无关。
- weights与classifier layer非常相关。
- 每层的内存使用量远小于28G(VGG-16的总显存占用量)。
Virtualized DNN
feature extraction layers占用最大:
- AlexNet中81%
- VGG-16(256)中96%
vDNN关注feature extraction layers中的feature map.
Design Principle
Forward Propagation
前向计算中的$X$s用完后要一直等到反向计算到当前layer才会重新启用。AlexNet第一层的前向反向间隔时间60ms+,VGG16(64)第一层的前向反向间隔时间1200ms+。
Backward Propagation
没啥好说的,就是用prefetch来做overlap
Core Operations And Its Design
有两个cuda stream,分别是$stream_{compute}$, $stream_{memory}$.
Memory Allocation/Release
旨在解决$\mathtt {cudaMalloc}$和$\mathtt {cudaFree}$带来的同步问题。
采用了NVIDIA发布的一个异步库,内存申请释放操作时不需要调用$\mathtt {cudaMalloc}$和$\mathtt {cudaFree}$.
Memory Offload
- 使用$\mathtt {cudaMallocHost}$在host端申请固定内存块。
- 调用$\mathtt {cudaMemcpyAsync}$对$X$做GPU-CPU之间的拷贝,以使当前layer前向计算与传输overlap(对于CONV/POOL层,$X$是只读的,所以可以做overlap)。
- vDNN在每个layer前向结束后会对$stream_{compute}$和$stream_{memory}$做一次同步:保证了offloaded data拷贝到了host端,最大化memory saving.
Memory Prefetch
略过(搜索的伪代码很无语,就是找最近需要预取的layer)
vDNN Memory Transfer Policy
决定哪些layers中的feature maps需要offload,需要考虑:
- 显存大小
- 卷积算法(有临时占用)与整体的layer-wise内存占用
- network-wide性能
Static vDNN
- ${vDNN}_{all}$: offload所有layer的$X$s: 有最低的显存占用。
- $vDNN_{conv}$: offload所有conv层的$X$s: CONV层比ACTV/POOL层有更长的计算延迟,可以更好的hide offload/prefetch的延迟,有更好的性能表现。
Dynamic vDNN
平衡trainability和performance.
首先,明确一点,卷积算法有很多种,朴素方法算的慢,不需要额外内存;FFT-卷积算法算的快,但是需要额外空间辅助计算。
利用cuDNN提供的一套运行时API来做性能分析,决定每个CONV层用哪种卷积算法。然后vDNN做如下操作:
- 所有CONV层都用朴素卷积方法。测试一遍$vDNN_{all}$。以确认trainability
- 如果步骤1中能运行,则将所有CONV层换成FFT-卷积算法,并且不offload任意layer。若过了,则用此策略;否则先后采用$vDNN_{conv}$与$vDNN_{all}$来测试能否正常运行,若能运行,则采用对应策略。若失败,则进入步骤3.
- 一点一点降低卷积算法的内存占用,一点一点减少需要offload的layers。能fit进显存后就选用对应策略。(greedy-based, 无法保证最优性)
Methodology
vDNN Memory Manager
GPU Node Topology
DNN Benchmarks
Results
GPU Memory Usage
Impact on Memory System
Performance
Power
Case Study: Training Very Deep Networks
Related Work
Conclusion
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。