使用GPU为Tensorflow训练模型加速

记录了一些踩过的坑,以及给初学者提供了一些使用keras库训练MNIST数据集的相关代码

请注意,本文编写于 2038 天前,最后修改于 1710 天前,其中某些信息可能已经过时。

1. 我的机器配置(穷学生的攒机之旅)

1.1 机器的来源

在上个月,我在闲鱼上疯狂捡漏,最终淘了一个800块的主机(后配了一块惠普500G的SSD,价格370)以及760的显示器,自己氪金(这能叫氪金???)在创新区整了一套我觉得蛮不错的生产力工具,总共花费大概是2000左右,比我5000的笔记本使用体验好多了(笔记本的屏幕还坏掉了哭唧唧)。由于现在大三了,这些机器我是绝对不舍得丢掉的,读到研究生估计也会拎着一起走,为了啥呢,还不是因为穷。

1.2 机器的配置

先上两个设备的配置:

主机的配置信息我思来想去还是用了智商检测大师...配置确实是物超所值了,只是主板没有m.2的接口,我只有重买了一块hp的sata接口的ssd,装了学校KMS上的系统,整的还是蛮舒服的。跑分大家都懂的,看看就好,之前是能到15w左右的hhh(有一个问题是我这个显卡玩lol的FPS居然会在60左右不太清楚是什么问题嘤嘤嘤,之前下CUDA的时候又给我优化了设置,最近准备再试试

显示器的配置我也要吹一吹,2k分辨率 + 32大尺寸,简直幸福感Max,敲代码(你骗鬼呢)和看番啥的都很舒服呢。

电脑配置
电脑配置

智商大师评分
智商大师评分

显示器配置
显示器配置

2. 开始配置环境

2.1 卸载之前的tensorflow版本

首先我是先装的cpu版本的tensorflow,我使用以下命令对其进行了卸载,后面如果不是tensorflow-gpu,安装和卸载的时候都是默认cpu版本。d

pip uninstall tensorflow
2.2 开始安装环境

安装gpu版本的tensorflow是需要CUDA以及CUDNN的支持的,所以我先去下载了这两个东西,给大家列一下我的各配置的版本叭,应该不会有问题,我再次贪心安装了CUDA最新版本10.1的,结果十分的凄凉还是卸载了重新装了CUDA10.0版本的,所以建议大家还是去下载LTS(长期支持)版本的一些库,毕竟相关的生态可能没有那么快更新

首先怎么看自己的显卡支持的CUDA版本呢,这里补充一点的是CUDA和CUDNN都是只支持Nvidia显卡的,A卡我没有装过,请A卡的同学自己右上角叭(劝退)。

1.桌面右键点击NVIDIA控制面板 -> 点击控制面板的左下角系统信息 -> 组件中可以看到支持的CUDA版本

我理解的是,这是GPU能够支持的最新版本的CUDA库的版本,应该是向下兼容的,所以我下载CUDA10.0才能正确运行

步骤1
步骤1

步骤2
步骤2

步骤3
步骤3

2.开始下载相关的库

这里我就只放链接了,安装过程中我没有出现什么问题,CUDA我选择的是NetWork版本的(就是运行exe再下载相关组件),并且我也是直接精简模式一把梭没有出现什么问题.注意cuDNN的话要注册才能下载

工具及库版本下载链接
Python3.6.8https://www.python.org/downloads/
CUDAcuda_10.0.130_win10_networkhttps://developer.nvidia.com/cuda-toolkit-archive
cuDNNcuDNN v7.5.1 (April 22, 2019), for CUDA 10.0https://developer.nvidia.com/rdp/cudnn-download
tensorflow-gpu1.13.1pip install tensorflow-gpu(此条命令是从tuna上抓的最新版本的包)
Pytorch-GPU1.2.0conda install pytorch torchvision cudatoolkit=10.0 -c pytorch
2.3 完成环境的配置

提醒一点,cuDNN因为是个库,所以你需要将其下的对应文件夹里面的内容挪到CUDA的库中

CUDA的文件路径一般是在“C:Program FilesNVIDIA GPU Computing Toolkit”

(强烈建议大家使用listary,用过一次就会爱上他,使用listary的同学也可以直接搜索GPU,如下图所示)

并保证CUDA在环境变量中(安装时一般是自动添加的),你在cmd里面输入nvcc -V即可查看

将cuDNN中的bin中的文件挪到CUDA的bin中

将cuDNN中的include中的文件挪到CUDA的include中

将cuDNN中的lib中的文件挪到CUDA的lib中

Listary搜索
Listary搜索

2.4. 尽情愉悦的享受GPU加速的快感吧

我大概花了2个小时来完成这次的GPU版本tensorflow的环境搭建,在看到结果出来的那一刻还是挺愉悦的,赶紧跑了个keras的MNIST数据集试试水,发现大概google的colab的速度的1/3左右,时间方面比CPU版本的快了7-8倍,已经很心满意足了,希望大家也能享受到机器学习的快感,下面贴上跑MNIST的CNN的代码以及速度展示

如果没有较好GPU的同学可以去薅Google的羊毛,因为里面是使用jupyter的,所以你可能需要学习一些相关的知识,你可以在里面使用clone命令克隆你Github上面的项目并在这上面跑跑,希望大家的AI之旅玩的愉快,

Colab的传送门: https://colab.research.google.com

Compute capability
Compute capability

5轮CNN大概30s
5轮CNN大概30s

# 第一次使用的话首先会下载一个MNIST数据集
from keras.datasets import mnist

(train_data, train_labels), (test_data, test_labels) = mnist.load_data()
print('train_shape {} {}'.format(train_data.shape, train_labels.shape))
print('test_shape {} {}'.format(test_data.shape, test_labels.shape))

from keras import models
from keras import layers
import numpy as np
from keras.utils.np_utils import to_categorical


def model_conv():
    model = models.Sequential()
    model.add(
        layers.Conv2D(32, (3, 3), activation='relu',
                      input_shape=(28, 28, 1)))  # 32个3*3的卷积核
    model.add(layers.MaxPooling2D(2, 2))  # 2*2 的池化

    model.add(layers.Conv2D(64, (3, 3), activation='relu'))  # 64个3*3的卷积核
    model.add(layers.MaxPooling2D(2, 2))  # 2*2 的池化

    model.add(layers.Conv2D(64, (3, 3), activation='relu'))  # 64个3*3的卷积核
    model.add(layers.Flatten())  # 拉伸

    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(10, activation='softmax'))
    model.compile(
        optimizer='rmsprop', loss='categorical_crossentropy', metrics=['acc'])
    return model


if __name__ == '__main__':
    x_train = train_data.reshape((60000, 28, 28, 1))
    x_train = x_train.astype('float32') / 255
    x_test = test_data.reshape((10000, 28, 28, 1))
    x_test = x_test.astype('float32') / 255

    y_train = to_categorical(train_labels)
    y_test = to_categorical(test_labels)

    print(x_train.shape, y_train.shape)

    model = model_conv()
    model.summary()
    his = model.fit(
        x_train, y_train, epochs=5, batch_size=64, validation_split=0.1)

    loss, acc = model.evaluate(x_test, y_test)
    print("loss: {}, acc: {}".format(loss, acc))
    model.save("my_mnist_model.h5")

    print("Model have saved! ")

评论列表