ubuntu RTX2080Ti pytorch使用fp16

被安利了很久说2080ti下使用fp16可以提速而且几乎不影响效果,所以今天试着弄了一下,整体感觉是显存占用少很多,速度比较快,但是还是会影响准确度,而且一些非官方提供的模块使用起来不方便(因为不支持fp16)。这里记录一下安装过程和详细的使用体验,毕竟我金鱼记忆。

1. 配置apex

使用fp16,官方推荐用apex包。在安装apex时需要注意driver和cuda版本对应,不然可能会报错(顺便唠叨一句,以前感觉driver和cuda版本不对应影响不大,程序照样可以跑,但最近发现配置很多环境出错是它们版本不对应造成的)。然后按照apex官方提供的安装过程安装https://github.com/NVIDIA/apex。为了不影响速度,我选用了“installing Apex with CUDA and C++ extensions”,在conda环境下配置了pytorch1.0,我截的安装过程:

$ git clone apex
$ cd apex
$ pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" .

注意:pip install命令最后的“.”不要漏掉,这个表明在当前环境下操作。

 

遇到的错误:

(1)好象是cuda版本和driver版本不对应造成的,改了cuda后就可以了。(记得还要装对应cuda版本的pytorch)

RuntimeError: cublas runtime error : the GPU program failed to execute at /opt/conda/conda-bld/pytorch_1549616138213/work/aten/src/THC/THCBlas.cu:258

 

2. 使用fp16

可以参考http://on-demand.gputechconf.com/gtc-cn/2018/pdf/CH8302.pdf

有两种方法使用fp16,第一种是使用FP16 Optimizer, 第二种是用AMP

(1)FP16 Optimizer,使用的时候因为有些数值不在fp16范围内报错,改完之后因为loss function不支持fp16,所以放弃了……

(2)使用AMP,ppt给的代码是旧版的代码,使用的时候会提醒使用新版AMP,它会提供参考链接,我使用的方式是

from apex import amp
...
amp.initialize(net, optimizer, opt_level='O1')
...
# loss.backward()
with amp.scale_loss(total_loss, optimizer) as scaled_loss:
    scaled_loss.backward()

其中,opt_level是选用哪种精度(官方推荐是'O1'),更多信息参考https://nvidia.github.io/apex/index.html。

 

3. 使用体验

优点:

(1)显存占用明显减少。举个栗子,单卡(下面默认单卡)fp32下batch size为7~8,fp16下为12。

(2)速度。fp32下batch size 7~8的速度和fp16下 batch size 12的速度差不多。

缺点:

(1)准确度。官方说不会影响,但是我实验后发现准确度还是降低了,不过降低的比较少,值得一试。降低的原因?猜测是因为反向传播的时候gradient本来就比较小,所以16位的精确度还是不如32位吧。

(2)用非pytorch官方提供的模块,可能会不支持fp16,所以使用受限。(我上述说的不准确,因为外包是c++编写的才存在不支持fp16的情况,如果是pytorch的,依然是支持fp16的,其它不支持情况还不清楚)

(3)并行不方便使用。apex提供的并行是分布式的并行(apex.parallel.DistributedDataParallel),对于单机多卡,我目前还没有跑通,可能后续更新这部分吧……有跑通的或者使用过的可以留个言呀

 

emmmmm

如果博客中有任何侵权、内容错误等情况都欢迎指出。

 

你可能感兴趣的:(ubuntu RTX2080Ti pytorch使用fp16)