IGNORANT

记录Paddlepaddle使用GPU训练的经历

折腾起因

最近学长在AIStudio上发布了人脸识别的项目,跑一次要十余分钟。
因此我申请了百度免费提供的算力,得到如下算力:

GPU: V100 16GB VMem, CPU: 2 Cores 8GB Memory

真良心,跑一次项目只花了17s左右。
然而遇到一个问题,AIStudio上重跑一次项目极大概率地会在某一个cell上出错,猜测是第二次点击全部运行并未清除第一次跑完的变量。目前我采取中断一次kernel后再跑,然而操作繁琐,而且不太喜欢类似web IDE的环境(抵触没有vim的环境)。
因之,我干脆把项目搬到vscode上(毕竟本人习惯于vscode上的轻便开发),用自己的配置跑。

安装相关环境

本机环境

有必要先报一下我使用的环境:

特别说明:如果只使用CPU跑,可以只安装pip install paddlepaddle(不会支持GPU)。如果要使用GPU跑,pip install paddlepaddle-gpu(也支持CPU)。

测试本机使用CPU跑,结果如下(本文不注重Acc的值,忽略):

花了8分钟。有点长,开始折腾GPU了。

CUDA以及CUDNN的安装

直接使用如下代码跑:

# 使用GPU进行训练
place = fluid.CUDAPlace(0)
# 创建一个executor
exe = fluid.Executor(place)

会报错缺少cublas64_92.dll,查阅资料发现需要安装CUDA和CUDNN。

CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。
NVIDIA cuDNN是用于深度神经网络的GPU加速库。它强调性能、易用性和低内存开销。NVIDIA cuDNN可以集成到更高级别的机器学习框架中,如谷歌的Tensorflow、加州大学伯克利分校的流行caffe软件。简单的插入式设计可以让开发人员专注于设计和实现神经网络模型,而不是简单调整性能,同时还可以在GPU上实现高性能现代并行计算。

先补充一下:你需要在CUDA GPUs查看CUDA支不支持你的GPU
很显然GTX1050Ti不在其列,但https://devtalk.nvidia.com/default/topic/982791/gtx-1050-ti-do-not-support-cuda-中疑似客服又说支持。所以我才继续折腾,发现还真支持。

查阅paddlepaddle官方文档https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/beginners_guide/install/Tables.html,确定CUDA和CUDNN的安装版本:

paddlepaddle-gpu==1.5.0 使用CUDA 9.0和cuDNN 7编译的1.5.0版本

然而报错信息显示的是缺乏cublas64_92.dll,因此安装CUDA 9.2,至于CUDNN版本,维护人员称安装7.3版本以上,因此选择了cuDNN v7.3.1 (Sept 28, 2018), for CUDA 9.2。安装CUDA后,解压cudnn-9.2-windows10-x64-v7.3.1.20得到cuda文件夹,将目录下include、bin、lib直接拷贝到CUDA的安装路径下。完事儿。

错误修复

使用cmdnvidia-smi.exe查看显卡信息,可见1050ti的GPU Name为0,对应上文的CUDAPlace(0)

第一次跑的时候,显示无法分配足够的显存,报错信息如下:

按照维护人员提供的解决方案:

export FLAGS_eager_delete_tensor_gb=0.0 #  一旦不再使用立即释放内存垃圾
export FLAGS_fast_eager_deletion_mode=1 # 启用快速垃圾回收策略
export FLAGS_fraction_of_gpu_memory_to_use=1    # 训练时占用100%的显存

各参数说明见官方文档:
FLAGS_fast_eager_deletion_mode
FLAGS_eager_delete_tensor_gb

这显然是linux下的命令,在Windows下可直接使用Python设置:

import os
os.environ["FLAGS_eager_delete_tensor_gb"]="0.0"
os.environ["FLAGS_fast_eager_deletion_mode"]="1"
os.environ["FLAGS_fraction_of_gpu_memory_to_use"]="1"

然而又报显存错误:

期望的显存小于可用的显存,已接受到的显存又大于可用的显存,什么鬼?推测是设定的显存占用率太高,因此改为如下:

os.environ["FLAGS_fraction_of_gpu_memory_to_use"]="0.8"

可根据实际情况调节大小。
最后跑出来结果如下,花了34秒,比用CPU跑节省不止10倍的时间:

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »