vDNN

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的特点:

  1. GPU memory + CPU memory
  2. transparent to ML practitioners.

vDNN的观察:

  1. DNN有很多个layers租场
  2. 这些layer有很多,排列顺序等是提前固定的
  3. GPU一次只能执行一个。但是现在的ML框架直接把所有layers的内存全塞进显存中。DNN越深,浪费越严重。

vDNN的目标:只给当前需要用的layer保守分配显存,降低显存的最大/平均占用量。

vDNN的手段:研究了allocated data structures的数据依赖,特别是占了大部分的intermediate feature maps;将这些数据在GPU与CPU之间倒腾。具体如下:

  1. 不用的直接释放
  2. 短期内不用的暂存到CPU memory中
  3. overlap传输与计算。

贡献:

  1. 第一篇对GPU-based DNN训练做详细、量化分析的。
  2. 第一篇从架构角度对DNN的内存访问特性与其对显存系统的影响进行深入的研究。
  3. 指出了现有ML框架的内存管理问题。
  4. 实现了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的观察:

  1. 内存占用: intermediate feature maps>>weights
  2. 中间数据大多与feature extraction maps相关,与后面的classifier layers无关。
  3. weights与classifier layer非常相关。
  4. 每层的内存使用量远小于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

  1. 使用$\mathtt {cudaMallocHost}$在host端申请固定内存块。
  2. 调用$\mathtt {cudaMemcpyAsync}$对$X$做GPU-CPU之间的拷贝,以使当前layer前向计算与传输overlap(对于CONV/POOL层,$X$是只读的,所以可以做overlap)。
  3. vDNN在每个layer前向结束后会对$stream_{compute}$和$stream_{memory}$做一次同步:保证了offloaded data拷贝到了host端,最大化memory saving.

Memory Prefetch

略过(搜索的伪代码很无语,就是找最近需要预取的layer)

vDNN Memory Transfer Policy

决定哪些layers中的feature maps需要offload,需要考虑:

  1. 显存大小
  2. 卷积算法(有临时占用)与整体的layer-wise内存占用
  3. network-wide性能

Static vDNN

  1. ${vDNN}_{all}$: offload所有layer的$X$s: 有最低的显存占用。
  2. $vDNN_{conv}$: offload所有conv层的$X$s: CONV层比ACTV/POOL层有更长的计算延迟,可以更好的hide offload/prefetch的延迟,有更好的性能表现。

Dynamic vDNN

平衡trainability和performance.
首先,明确一点,卷积算法有很多种,朴素方法算的慢,不需要额外内存;FFT-卷积算法算的快,但是需要额外空间辅助计算。
利用cuDNN提供的一套运行时API来做性能分析,决定每个CONV层用哪种卷积算法。然后vDNN做如下操作:

  1. 所有CONV层都用朴素卷积方法。测试一遍$vDNN_{all}$。以确认trainability
  2. 如果步骤1中能运行,则将所有CONV层换成FFT-卷积算法,并且不offload任意layer。若过了,则用此策略;否则先后采用$vDNN_{conv}$与$vDNN_{all}$来测试能否正常运行,若能运行,则采用对应策略。若失败,则进入步骤3.
  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


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。