PyTorch在笔记本上实现CUDA加速

时间:2024-02-23 08:38:25

  最近刚开始学习深度学习,参考了一篇深度学习的入门文章,原文链接:https://medium.freecodecamp.org/everything-you-need-to-know-to-master-convolutional-neural-networks-ef98ca3c7655。

  文章内容就是kaggle上的一个competition,识别图像中是否存在航拍仙人掌,使用了Pytorch框架,原文代码有些许错误,经改正后代码如下:

 1 import numpy as np
 2 import pandas as pd 
 3 from pathlib import Path 
 4 from fastai import * 
 5 from fastai.vision import * 
 6 import torch 
 7 get_ipython().run_line_magic(\'matplotlib\', \'inline\')
 8 
 9 train_df=pd.read_csv("train.csv") #读取csv文件到train_df
10 data_folder=Path(".") #path为默认位置
11 train_images=ImageList.from_df(train_df,path=data_folder,folder=\'train\')#记住读取方法
12 print(torch.cuda.is_available())
13 a=torch.ones(1,1)
14 print(a.cuda())
15 
16 trfm=get_transforms(do_flip=True,flip_vert=True,max_rotate=10.0,max_zoom=1.1,max_lighting=0.2,max_warp=.2,p_affine=0.75,p_lighting=0.75)
17 #train_img = train_img.transform(transformations, size=128)#错误句子,直接删除
18 
19 test_df=pd.read_csv("sample_submission.csv")
20 test_img=ImageList.from_df(test_df,path=data_folder,folder=\'test\')
21 train_img = (train_images
22         .split_by_rand_pct(0.01)#把训练数据分出一小部分做验证集
23         .label_from_df()
24         .add_test(test_img)
25         .transform(trfm, size=128)
26         .databunch(path=\'.\', bs=14, device= torch.device(\'cuda:0\'))#进行批处理,bs由显存决定,太大跑不了。太小跑得慢
27         .normalize(imagenet_stats)#图像归一化
28              )
29 
30 learn = cnn_learner(train_img, models.densenet161, metrics=[error_rate, accuracy])#用 cnn_leaner 创建一个训练器
31 #用移动网络开热点下载快,用联通的网就下载的很慢
32 
33 #单周期策略,暴力搜索(大了:训练过程快,容易错过误差边界,甚至会跳出可控范围,无法收敛;小了:训练慢)
34 learn.lr_find() 
35 learn.recorder.plot()
36 
37 lr = 3e-02 
38 learn.fit_one_cycle(5, slice(lr))
39 
40 preds,_ = learn.get_preds(ds_type=DatasetType.Test)
41 test_df.has_cactus = preds.numpy()[:, 0]
42 
43 test_df.to_csv(\'submission.csv\', index=False)

 

  以上就是全部的代码,运行环境为win10 64位操作系统,Python3.7,Pytorch1.1.0,CUDA10.1.120,NVDIA驱动程序431.36。

  开始时使用CUDA运行遇到困难,测试print(torch.cuda.is_available()) 总是显示false,经过一番折腾,找到了解决办法,如下:

  1、Pytorch在国内通过pip安装会有问题,最好通过在PyTorch官网(https://pytorch.org/)下载后,然后本地安装whl文件(再次提醒,一定要本地安装,这样才能保证安装的Pytorch是完整包含CUDA的):

    ①官网图片,直接浏览器中打开如下https网站,可能会慢一些;或者将网站拷贝到迅雷中下载,这样可能会快一点。

另外一定要注意安装Python3.7的64位,并且win10/win7也要是64位,因为Pytorch仅支持64位!

       

    ②本地文件系统图片和通过命令行(管理员模式)安装图片,cmd中两个whl文件都要安装,我这里只演示一个,如果之前装过Pytorch但是没法调用CUDA,就先卸载(一定要用管理员模式的命令行)再安装,卸载指令为 pip uninstall torch 和 pip uninstall torchvision:

 

   2、NVDIA官网(https://developer.nvidia.com/cuda-downloads)下载CUDA,首先应确认自己的电脑是否有NVDIA显卡,并确定是否支持CUDA,直接一路下一步安装即可,这里就不放图片了。

  3、jupyter notebook中运行上述代码,若  print(torch.cuda.is_available())  为True则证明CUDA调用成功,另外注意  bs 数值要根据自己的显存大小来设置。

note:笔记本一般都是双显卡(一个位集成显卡,一个为NVDIA独立显卡),做桌面模式win10可以自动切换使用独立显卡调用CUDA,并不用特意设置NVDIA控制面板,之前走过很多弯路,以为笔记本上没法用CUDA加速,后来发现就是版本或者安装的问题。



  通过这样一番设置,应该就可以调用CUDA了,关键点有几个:64位,离线安装whl,NVDIA显卡。

  下面就尽情享受CUDA的快感吧,cpu运行上述代码需要几个小时,用CUDA加速后几十分钟就完成了。