MHuiG

「看庭前花开花落,望天上云卷云舒」

# 尝试使用 GPU 加速计算

MHuiG

字数：1.9k 字

时长：10 分钟

大规模训练，gpu 和 cpu 速度差别很大。

## 概述

### GPU

- CPU (Central Processing Unit) 即中央处理器。
- GPU (Graphics Processing Unit) 即图形处理器。

当程序员为 CPU 编写程序时，他们倾向于利用复杂的逻辑结构优化算法从而减少计算任务的运行时间，即 Latency。
当程序员为 GPU 编写程序时，则利用其处理海量数据的优势，通过提高总的数据吞吐量（Throughput）来掩盖 Lantency。

其中绿色的是计算单元，橙红色的是存储单元，橙黄色的是控制单元。

首先你需要硬件支持，一块能够支持 GPU 加速计算的显卡，这里以 NVIDIA 的 GPU 为例。

### CUDA

CUDA（Compute Unified Device Architecture），是显卡厂商 NVIDIA 推出的运算平台。 CUDA™是一种由 NVIDIA 推出的通用并行计算架构，该架构使 GPU 能够解决复杂的计算问题。

CUDA 提供了一种可扩展的编程模型，使得已经写好的 CUDA 代码可以在任意数量核心的 GPU 上运行。只有运行时，系统才知道物理处理器的数量。

### CUDNN

NVIDIA cuDNN 是用于深度神经网络的 GPU 加速库。它强调性能、易用性和低内存开销。NVIDIA cuDNN 可以集成到更高级别的机器学习框架中，如加州大学伯克利分校的流行 CAFFE 软件。简单的，插入式设计可以让开发人员专注于设计和实现神经网络模型，而不是调整性能，同时还可以在 GPU 上实现高性能现代并行计算。

## 支持 GPU 的计算框架

### Tensorflow-GPU

安装教程参考 https://tensorflow.google.cn/install

需要注意的是 严格对应 tensorflow_gpu、Python、 编译器、 cuDNN、CUDA 的版本关系。

相关对应关系 windows 平台可参考:

Tensorflow 文档

显卡驱动与 Cuda 版本之间的对应关系

cuda 与 cudnn 版本之间的对应关系

打开 NVIDIA 控制面板进入系统信息，可查看当前支持的 CUDA 驱动版本。

这里的 CUDA 驱动版本是指你只可以安装该版本及以下版本的 CUDA。

根据实际情况，笔者计划使用的环境是：

- tensorflow_gpu-1.14.0
- python 3.7
- MSVC 2017
- cuDNN 7.4.2.24
- CUDA 10.0.130

#### 安装 CUDA

进入 cuda-toolkit-archive 选择需要的 CUDA Toolkit 版本下载安装即可。

笔者选择 network 安装方式。注意第一个路径是选择临时解压路径。选择自定义安装，取消安装不需要的应用，如 NVIDIA GeForce Experience。

在 cmd 中执行：

    nvcc -V

需要注意配置相关环境变量。

#### 安装 CUDNN

进入 cudnn-archive 选择需要的 CUDA Toolkit 版本下载解压即可。

笔者将 CUDA 默认安装在 `C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0`

将 CUDNN 解压到 `C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0` 中即可。

或者配置单独的环境变量。

#### 安装 Tensorflow-GPU

如果之前安装过 cpu 版本的 Tensorflow 需要进行卸载.

若在虚拟环境中使用 conda 安装，conda 会自动安装相关的 cuda 和 cudnn 依赖。

    conda install tensorflow-gpu

下面给出一段 GPU 测试程序：

    import time
    import tensorflow as tf
    begin = time.time()
    with tf.device('/gpu:0'):
        rand_t = tf.random_uniform([50,50],0,10,dtype=tf.float32,seed=0)
        a = tf.Variable(rand_t)
        b = tf.Variable(rand_t)
        c = tf.matmul(a,b)
        init = tf.global_variables_initializer()
    sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) #强制使用GPU
    sess.run(init)
    print(sess.run(c))
    end = time.time()
    print(end-begin,'s')

运行结果:

    2020-10-11 09:36:56.713905: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
    2020-10-11 09:36:56.742138: I tensorflow/stream_executor/platform/default/dso_loader.cc:42] Successfully opened dynamic library nvcuda.dll
    2020-10-11 09:36:57.193243: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1640] Found device 0 with properties:
    name: GeForce GTX 960M major: 5 minor: 0 memoryClockRate(GHz): 1.176
    pciBusID: 0000:01:00.0
    2020-10-11 09:36:57.199952: I tensorflow/stream_executor/platform/default/dlopen_checker_stub.cc:25] GPU libraries are statically linked, skip dlopen check.
    2020-10-11 09:36:57.204946: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1763] Adding visible gpu devices: 0
    2020-10-11 09:36:58.622428: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1181] Device interconnect StreamExecutor with strength 1 edge matrix:
    2020-10-11 09:36:58.626880: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1187]      0
    2020-10-11 09:36:58.630073: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1200] 0:   N
    2020-10-11 09:36:58.633910: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1326] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1382 MB memory) -> physical GPU (device: 0, name: GeForce GTX 960M, pci bus id: 0000:01:00.0, compute capability: 5.0)
    Device mapping:
    /job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 960M, pci bus id: 0000:01:00.0, compute capability: 5.0
    2020-10-11 09:36:58.657797: I tensorflow/core/common_runtime/direct_session.cc:296] Device mapping:
    /job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 960M, pci bus id: 0000:01:00.0, compute capability: 5.0

    random_uniform/RandomUniform: (RandomUniform): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.683509: I tensorflow/core/common_runtime/placer.cc:54] random_uniform/RandomUniform: (RandomUniform)/job:localhost/replica:0/task:0/device:GPU:0
    random_uniform/sub: (Sub): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.690684: I tensorflow/core/common_runtime/placer.cc:54] random_uniform/sub: (Sub)/job:localhost/replica:0/task:0/device:GPU:0
    random_uniform/mul: (Mul): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.705871: I tensorflow/core/common_runtime/placer.cc:54] random_uniform/mul: (Mul)/job:localhost/replica:0/task:0/device:GPU:0
    random_uniform: (Add): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.719880: I tensorflow/core/common_runtime/placer.cc:54] random_uniform: (Add)/job:localhost/replica:0/task:0/device:GPU:0
    Variable: (VariableV2): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.738611: I tensorflow/core/common_runtime/placer.cc:54] Variable: (VariableV2)/job:localhost/replica:0/task:0/device:GPU:0
    Variable/Assign: (Assign): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.749906: I tensorflow/core/common_runtime/placer.cc:54] Variable/Assign: (Assign)/job:localhost/replica:0/task:0/device:GPU:0
    Variable/read: (Identity): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.759648: I tensorflow/core/common_runtime/placer.cc:54] Variable/read: (Identity)/job:localhost/replica:0/task:0/device:GPU:0
    Variable_1: (VariableV2): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.769854: I tensorflow/core/common_runtime/placer.cc:54] Variable_1: (VariableV2)/job:localhost/replica:0/task:0/device:GPU:0
    Variable_1/Assign: (Assign): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.776819: I tensorflow/core/common_runtime/placer.cc:54] Variable_1/Assign: (Assign)/job:localhost/replica:0/task:0/device:GPU:0
    Variable_1/read: (Identity): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.792460: I tensorflow/core/common_runtime/placer.cc:54] Variable_1/read: (Identity)/job:localhost/replica:0/task:0/device:GPU:0
    MatMul: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.808352: I tensorflow/core/common_runtime/placer.cc:54] MatMul: (MatMul)/job:localhost/replica:0/task:0/device:GPU:0
    init: (NoOp): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.823256: I tensorflow/core/common_runtime/placer.cc:54] init: (NoOp)/job:localhost/replica:0/task:0/device:GPU:0
    random_uniform/shape: (Const): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.838355: I tensorflow/core/common_runtime/placer.cc:54] random_uniform/shape: (Const)/job:localhost/replica:0/task:0/device:GPU:0
    random_uniform/min: (Const): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.853758: I tensorflow/core/common_runtime/placer.cc:54] random_uniform/min: (Const)/job:localhost/replica:0/task:0/device:GPU:0
    random_uniform/max: (Const): /job:localhost/replica:0/task:0/device:GPU:0
    2020-10-11 09:36:58.868493: I tensorflow/core/common_runtime/placer.cc:54] random_uniform/max: (Const)/job:localhost/replica:0/task:0/device:GPU:0
    [[1405.2429  1441.7413  1364.38    ... 1480.2251  1279.0061  1620.0938 ]
     [1232.6589  1344.4458  1169.7095  ... 1205.1284  1040.5566  1421.967  ]
     [1209.3164  1180.3206  1158.1396  ... 1200.0344  1014.03217 1222.5107 ]
     ...
     [1298.9648  1262.9236  1205.6918  ... 1396.479   1090.7253  1437.241  ]
     [1118.2473  1209.0151  1077.7229  ... 1180.7025  1076.4694  1139.742  ]
     [1200.8866  1297.2266  1260.01    ... 1289.4297  1165.2448  1433.4183 ]]
    2.6225805282592773 s

可以看到 GPU 已经在工作了。

同时可以在 cmd 中运行 nvidia-smi【C:\Program Files\NVIDIA Corporation\NVSMInvidia-smi.exe】监控 GPU 使用情况和更改 GPU 状态。

### Keras-GPU

conda 直接安装即可，注意需要先安装 tensorflow-gpu。

    conda install keras-gpu

### Pytorch-GPU

再也找不到比官网更详尽的文档了，请直接参考 https://pytorch.org/。

    conda install pytorch torchvision cudatoolkit=10.0

GPU 测试程序：

    import torch
    flag = torch.cuda.is_available()
    print(flag)

    ngpu= 1
    # Decide which device we want to run on
    device = torch.device("cuda:0" if (torch.cuda.is_available() and ngpu > 0) else "cpu")
    print(device)
    print(torch.cuda.get_device_name(0))
    print(torch.rand(3,3).cuda())

输出结果：

    True
    cuda:0
    GeForce GTX 960M
    tensor([[0.0208, 0.2799, 0.4918],
            [0.0020, 0.1067, 0.8207],
            [0.5531, 0.0994, 0.2108]], device='cuda:0')

Data mining Data mining

Data mining

Machine Learning

Data mining Machine Learning

发布于：2020年10月11日

更新于：2020年10月11日

BERT 预训练模型及其应用案例

预训练模型最开始是在图像领域提出的，获得了良好的效果，近几年才被广泛应用到自然语言处理各项任务中。 (1) 2003 年 Bengio 提出神经网络语言模型 NNLM，从此统一了 NLP 的特...

R 语言初步

尝试使用 R 语言进行数据处理 安装 R进入 https://www.r-project.org 下载安装包即可. 安装包，载入包的命令安装包install.packages("mlbenc...

留言区

本文目录
<pjax>
</pjax>
<pjax></pjax>
<pjax> Are you Robot?</pjax>