深度学习GPU环境配置及建模(Python)

对于深度学习开发者,操作系统的选择、到深度学习相关依赖包安装、环境配置上,这些步骤看似简单基础,但其实也经常是有不少麻烦的。本文简要梳理了,从环境配置到深度学习建模的完整的流程,有所帮助的话,可以文末点个赞。

一、操作系统的选择

1.1 Linux

如果是深度学习的重度用户,首选的操作系统是Linux,虽然操作门槛搞一些(如命令行操作),但linux的开发环境很友好,可以减少很多依赖包不兼容的问题,可以大大提高效率。linux的发行版很多,比较常用的的可以安装个包含图形界面及命令行的Ubuntu。


1.2、 Windows

如果要兼顾生活及开发,就笔记本上面看看视频、写写博客、跑跑代码(像我平时就是ctrl c ,再跑跑代码的),windows就够了,操作简单而且上面的各种依赖包也很齐全。(下文主要以Windows系统为例展开介绍,其他系统也是大同小异,有不清楚地方可以找相应教程)。

1.3、 双系统的方案

如果即想要linux做开发、windows兼顾生活,可以借助安装双系统或者虚拟机,那么有几种选择:

1、 安装双系统

硬件资源够的话,安装双个系统是比较直接的,能够比较纯粹地使用windows或者Linux,但是最麻烦的点在于切换间比较麻烦,需要开关机地切换。

2、 虚拟机

通过在虚拟机(如vmware)上面再安装另一个操作系统,这样打开虚拟机就可以很方便使用另一个系统了,但是缺点是虚拟机的硬件资源消耗也很高,而且有性能问题及各种bug。按我之前的尝试,这里更推荐linux作为主系统+虚拟机的windows,能更好发挥出Linux开发的效能。

3、 WSL

适用于 Linux 的 Windows 子系统 (WSL)是微软官方发布的应用,通俗来说它也就是Windows上面启用的Linux子系统。wsl安装非常简单,运行WSL的开销比运行一个虚拟机低很多,在wsl上面还可以配置cuda调用其GPU资源(但貌似配置复杂),用于日常学习是完全够用了。缺点是不如原linux来的纯粹,用于高强度开发的话,性能会弱些,还容易卡各种bug。

wsl安装简单,在windows功能上打勾启用wsl功能后,


WIN+R运行cmd,一句命令行wsl --install就可以安装好ubuntu系统了,安装好后 wsl就可以使用Linux系统了(命令行cli版),

两个系统之间数据可以自由访问,如访问D盘数据只要 cd /mnt/d,双系统使用上是非常方便的。

可以参考WSL官方文档:https://learn.microsoft.com/zh-cn/windows/wsl/install

二、Python环境配置

搞定操作系统(比如Windows),接下来配置个Python环境。实现PYthon环境配置及依赖包管理最方便的就是安装个 anaconda,官网下载https://www.anaconda.com/download

如果网速慢,也可以到清华镜像上面快速下载一个https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

安装也很简单,一路确认就安装好了。这里可以勾选Add path 就可以配置好环境变量,也可以再勾选anaconda作为默认Python版本,后面比较省心。

通过点击jupyter notebook就可以进入python开发环境了,



如果平时以小项目、数据分析、调调模型为主,jupyter notebook作为开发工具是够的。如果平时任务以大型项目居多,还可以再安装个IDE编辑器如vscode、pycharm。

三、安装相关的库

这里有两种方案,如果只有CPU资源直接选择【3.1 CPU环境配置】就可以很快开始深度学习建模。如有GPU资源,可以选择【3.2 GPU环境配置】开始繁琐的安装配置及建模。

3.1 CPU环境配置

安装相关的python依赖包,主要的如数据处理库pandas、机器学习库scikit-learn、深度学习库tensorflow、pytorch等等。简单安装几个必要的包,后面运行项目代码,有发现缺什么包再补什么。

可以点击prompt打开命令行安装,


python安装依赖也很简单,比如pip install tensorflow 就可以安装好tensorflow神经网络库。

安装好相关的依赖包后,基本上就可以开始在CPU运算环境的深度学习、机器学习的代码开发了。

3.2 GPU环境配置

在大数据量、大模型炼丹的场景下,深度学习会耗费大量的算力及时间,这时可以用GPU来加速神经网络模型训练(唠叨一句,购置gpu首选大显存的!)。

如果硬件配置有nvdia的GPU的话(使用 AMD 的 GPU 也可行但很麻烦,相关信息可参阅:https://rocmdocs.amd.com/en/latest/),接下来就可以开始GPU开发环境cuda的配置,这个流程稍微繁琐容易出错,请耐心配置。

  • 安装cuda

通过桌面鼠标右键进入nvdia的控制面板,看到显卡类型,可以看到我的游戏本有配了个独立显卡950M(算力仅仅为5,虽然这是GPU中的渣渣..但也比纯cpu香啊!),



依据显卡算力我们可以知道对应支持的cuda版本号范围,像算力为5对应的cuda版本号就可以选择cuda-10.1



(好像也可以在nvdia控制面板的系统信息看到相关cuda的版本号)


相应的,我们到官网下载相应版本的cuda,https://developer.nvidia.com/cuda-toolkit-archive


然后,运行cuda安装包,我直接精简安装,一路确认就安装好了。

win+R 输入cmd,进入命令行界面:

输入以下指令:nvcc -V 能够正常显示版本号,cuda就安装好了

# $ nvcc -V
# nvcc: NVIDIA (R) Cuda compiler driver
# Copyright (c) 2005-2019 NVIDIA Corporation
# Built on Fri_Feb__8_19:08:26_Pacific_Standard_Time_2019
# Cuda compilation tools, release 10.1, V10.1.105

  • 安装cudnn
    cuda安装完了还需要下载个cudnn(即 CUDA Deep Neural Network 软件库),这是一个 GPU 加速的深度神经网络基元库。不同版本的cuda 对应着不同的cudnn版本(我这边cuda10.1对应cudnn7.5的),详情可以从英伟达官网找到具体信息https://developer.nvidia.com/rdp/cudnn-archive ,下载cudnn还需要去英伟达官网注册。

    cudnn解压以后将各个子文件夹

拷贝到cuda安装目录下,到此,cuda整个环境就配置好了。


  • Pytorch

最后,安装Python相关的(支持GPU)的深度学习库,本文建模用的是pytorch(tensorflow、keras等其他库也是可以的)

可以到官网下载相应的pytorch版本,https://pytorch.org/get-started/locally/

官网会很友好地给出相应的所选的cuda版本对应的安装命令,



比如我这边cuda10.1对应的命令如下,在anaconda命令行输入就可以安装相关依赖包。

conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=10.1 -c pytorch

安装以后,可以检查GPU的可用性 ,通过调用torch.cuda.is_available()。如果结果为 True,则表明系统已正确安装Nvidia驱动。进入jupyter notebook运行:
import torch torch.cuda.is_available()

四、 深度学习模型训练

本节的示例是调用GPU或CPU版的pytorch搭建深度学习图像分类模型(CNN),并对比下性能差异。详细的深度学习建模过程可以参考之前文章 《一文搞定深度学习建模》

%%time
import torch,torchvision
import torch.nn as nn
import torchvision.transforms as transforms
 ## 项目源码可以到https://github.com/aialgorithm/Blog
#定义CNN神经网络模型
class CNNCifar(nn.Module):
    def __init__(self):
        super(CNNCifar,self).__init__()
        self.feature = nn.Sequential(
            nn.Conv2d(3,64,3,padding=2),   nn.BatchNorm2d(64),  nn.ReLU(), nn.MaxPool2d(2,2),
            nn.Conv2d(64,128,3,padding=2), nn.BatchNorm2d(128), nn.ReLU(), nn.MaxPool2d(2,2),
            nn.Conv2d(128,256,3,padding=1),nn.BatchNorm2d(256), nn.ReLU(), nn.MaxPool2d(2,2),
            nn.Conv2d(256,512,3,padding=1),nn.BatchNorm2d(512), nn.ReLU(), nn.MaxPool2d(2,2)
        )
        self.classifier=nn.Sequential(
            nn.Flatten(),
            nn.Linear(2048, 4096),nn.ReLU(),nn.Dropout(0.5),
            nn.Linear(4096,4096), nn.ReLU(),nn.Dropout(0.5),
            nn.Linear(4096,100)
        )
        
    def forward(self, x):
 
        x = self.feature(x)
        output = self.classifier(x)
        return output
        
net = CNNCifar()
print(net)
 
#加载数据集
apply_transform = transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
    ])
 
train_dataset = torchvision.datasets.CIFAR10(root='../data/cifar100', train=True, download=True,transform=apply_transform)
test_dataset = torchvision.datasets.CIFAR10(root='../data/cifar100', train=False, download=True,transform=apply_transform)
 
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, num_workers=2,
                          pin_memory=True,shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, num_workers=2,
                          pin_memory=True,shuffle=False)
 
#定义损失函数和优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.001,weight_decay=5e-4)
 
#获取设备:如果有gpu就使用gpu,否则使用cpu
device = torch.device('cuda'if torch.cuda.is_available() else 'cpu')
net = net.to(device) # 简单通过.to(device), 数据或模型就可以转移至GPU
 
#训练模型
print('training on: ',device)
def test(): 
    net.eval()
    acc = 0.0
    sum = 0.0
    loss_sum = 0
    for batch, (data, target) in enumerate(test_loader):
        data, target = data.to(device), target.to(device)
        output = net(data)
        loss = criterion(output, target)
        acc+=torch.sum(torch.argmax(output,dim=1)==target).item()
        sum+=len(target)
        loss_sum+=loss.item()
    print('test  acc: %.2f%%, loss: %.4f'%(100*acc/sum, loss_sum/(batch+1)))

def train(): 
    net.train()
    acc = 0.0
    sum = 0.0
    loss_sum = 0
    for batch, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = net(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

        acc +=torch.sum(torch.argmax(output,dim=1)==target).item()
        sum+=len(target)
        loss_sum+=loss.item()

        if batch%200==0:
            print('\tbatch: %d, loss: %.4f'%(batch, loss.item()))
    print('train acc: %.2f%%, loss: %.4f'%(100*acc/sum, loss_sum/(batch+1)))

    
## 开始训练模型
for epoch in range(5):
    print('epoch: %d'%epoch)
    train()
    test()

可以通过device = torch.device('cuda'if torch.cuda.is_available() else 'cpu')分别修改相应的运算设备gpu或者cpu, 对比使用cpu、gpu资源占用的变化:



同一超参数下模型预测效果上面来看两者差不多,但运行时间CPU是GPU的5倍左右,GPU对深度学习训练的效率提升还是很明显的!

###################
training on:  cpu
epoch: 0
    batch: 0, loss: 4.5887
    batch: 200, loss: 1.5186
    batch: 400, loss: 1.3614
    batch: 600, loss: 1.2306
train acc: 42.96%, loss: 1.5834
test  acc: 54.61%, loss: 1.2249
Wall time: 18min 27s
###################
training on:  cuda
epoch: 0
    batch: 0, loss: 4.6759
    batch: 200, loss: 1.5816
    batch: 400, loss: 1.6414
    batch: 600, loss: 1.2504
train acc: 43.72%, loss: 1.5647
test  acc: 53.02%, loss: 1.2784
Wall time: 3min 22s


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容