目录
前言
由于台式机电脑刚刚增加了一块500G的固态硬盘,所以直接把Ubuntu18.04装在整块硬盘里面了,然后原来的存储全部分给WIN10,这样的话便于管理。重新刷过Ubuntu,第一件事肯定就是安装各种各样的开发平台。
因此,本文对所配置的文件以及开发平台做记录,以便遗忘时有所参考。(毕竟Ubuntu这破玩意,每台电脑的BUG,同一台电脑不同时候的BUG都可能不一样…It works, but why? It doesn’t work, but why?)
Tips: 个人感觉,大多数时候还是官网的教程最靠谱,出现奇奇怪怪BUG的概率低一些。但是鉴于官网经常“引导”大家操作一些“看似熟悉,但是却又没有接触过”的操作,把本来就不熟悉平台的我们搞得更加困惑。所以,更多时候作为初学者的我,比起官网,更喜欢博客或者知乎…(只是因为我很菜>_<)
0. 台式机配置
- CPU:16核 11th Gen Intel® Core™ i7-11700 @ 2.50GHz
- GPU:NVIDIA RTX 2060
- GPU的驱动版本号:470.57.02
- 内存:16G
- 存储:两张500G固态硬盘
1. Anaconda3 安装
Anaconda3的安装直接参考官网的教程就好,进入官网:https://www.anaconda.com/,点击Get Started, Download Anacona installers,之后选择对应版本即可。安装方法参考https://docs.anaconda.com/anaconda/install/linux/,参考installation即可,一般不会出啥问题,然后链接里面有说哪些操作“recommend”,最好听他的话;除了Verify data integrity with SHA-256,这个没必要。
安装之后,系统会默认将Python切换成anaconda自带的,这是很好的。打开终端,会有如下提示。(base代表anaconda3的基本环境,3.8是python版本。很多教程喜欢在anaconda里面创建各种自环境,个人习惯是直接在base里面安装。)
在base环境下,就可以直接使用pip安装python的包,跟正常的python没有差别。
2. CUDA安装
CUDA的安装个人趟了一些坑,但是最后成功之后,也没有太明确究竟是哪些坑导致我失败的。
开始安装之前最好卸载NVIDIA的显卡驱动,并且禁用Ubuntu自带的驱动,然后手动安装NVIDIA显卡驱动,原因不是因为这么做是最好的,而是我这么做成功了,可能是巧合,但是同理…好使了,以后就照搬吧,O(∩_∩)O哈哈哈~。。。。
2.1. 卸载NVIDIA显卡驱动
sudo ./usr/bin/nvidia-uninstall
或者
sudo apt-get install autoremove --purge nvidia*
哪个都行,卸了就行。如果之前有CUDA,最好也卸载掉
sudo ./usr/local/cuda-11.4/bin/cuda-uninstaller
2.2. 禁用自带nouveau驱动
sudo gedit /etc/modprobe.d/blacklist_nouveau.conf
在文中添加:
blacklist nouveau
options nouveau modeset=0
重启电脑,运行lsmod | grep nouveau
,如果啥都没有,那说明OK了。
2.3. 重新安装NVIDIA驱动
终端输入ubuntu-drivers devices
查看系统推荐的版本,我的是470。(有一个recommended)
然后直接终端执行sudo apt-get install nvidia-driver-470-server
即可,不同的设备安装的驱动版本不一样,千万看好,我自己的台式机是470。
最后测试,终端输入nvidia-smi
,可以看到我的显卡驱动为470.57.02,推荐的CUDA版本为11.4。
Sun Oct 17 16:48:47 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... Off | 00000000:01:00.0 On | N/A |
| 0% 53C P8 24W / 183W | 526MiB / 5931MiB | 11% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1299 G /usr/lib/xorg/Xorg 26MiB |
| 0 N/A N/A 1435 G /usr/bin/gnome-shell 89MiB |
| 0 N/A N/A 1727 G /usr/lib/xorg/Xorg 214MiB |
| 0 N/A N/A 1852 G /usr/bin/gnome-shell 40MiB |
| 0 N/A N/A 2321 G ...AAAAAAAAA= --shared-files 152MiB |
+-----------------------------------------------------------------------------+
2.4. CUDA安装
直接去官网,CUDA下载界面,找到自己的对应版本就OK。然后下载一个run文件,之后直接终端执行sudo sh xxxxx.run
即可,如果之前装过驱动,可能新版本的CUDA会提示类似于“你的电脑已经安装了某个版本的显卡驱动,您选择先卸载还是继续”之类的话,就选择继续。然后下边会弹出一个option,问我们哪些module是我们需要的,其中第一个就是driver,不要选择这个就好了。
个人猜测:CUDA安装程序是要把显卡驱动核CUDA一起帮我们装上,但是我们已经有NVIDIA显卡驱动了,
而且我们确认过,我们所选择安装的版本是完全兼容的,因此就不需要CUDA帮我们安装了。
之后终端会提示一共有三个东西,第一个是驱动:没安装,剩下两个:安装了,就OK了。
若安装后显示toolkit安装成功,但是sample安装失败,也许是因为缺少一些库,可以使用如下代码解决
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
此外, 不要忘记将环境变量更新,打开~/.bashrc文件,在最下边添加如下两行
export PATH="/usr/local/cuda-11.4/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH"
2.5. CUDA测试
测试1:终端输入nvcc -V
,输出内容与下方类似则OK。
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Sun_Aug_15_21:14:11_PDT_2021
Cuda compilation tools, release 11.4, V11.4.120
Build cuda_11.4.r11.4/compiler.30300941_0
测试2:编译运行sample,进入安装目录:/usr/local/cuda-11.4/samples/0_Simple/vectorAdd
,这只是其中一个例子,我们可以选择任意一个,然后执行sudo make
,之后运行./vectorAdd
。
终端中会输出一大堆东西,最后一行如果是类似Pass、Test Pass之类的字样,就是成功了。
注意:不要直接在0_Simple的上一级文件夹直接`sudo make`,因为那样会编译所有的samples
我写博客的时候已经编译了好几分钟了T_T......,还没结束......
我只是做测试而已,不需要这么复杂/(ㄒoㄒ)/~~
cudnn安装
安装
同样,官网可以找到与CUDA版本相对应的cudnn,CUDNN下载。下载之后解压,解压后的文件夹名为cuda,文件夹中包含两个文件夹:一个为include,另一个为lib64,将解压后的文件中的lib64文件夹关联到环境变量中。
cd ~
sudo gedit .bashrc
在文件里面加入
export LD_LIBRARY_PATH=/your/path/to/cudnn/lib64:$LD_LIBRARY_PATH
保存,关闭,终端执行source ~/bashrc
。
配置cuDNN的最后一步就是将解压后的cuda文件夹中的include文件夹中的cudnn.h文件拷贝到/usr/local/cuda/include中
cd 解压路径/cuda/include
sudo cp cudnn.h /usr/local/cuda/include
sudo chmod a+r /usr/local/cuda/include
cudnn测试
官网下载测试程序https://developer.nvidia.com/rdp/cudnn-archive。里面有很多文件,找到这三个:
libcudnn8_8.2.4.15-1+cuda11.4_amd64.deb
libcudnn8-dev_8.2.4.15-1+cuda11.4_amd64.deb
libcudnn8-samples_8.2.4.15-1+cuda11.4_amd64.deb
(不同的版本不一样,但是名字类似)
然后直接安装
sudo dpkg -i libcudnn8_8.2.4.15-1+cuda11.4_amd64.deb
sudo dpkg -i libcudnn8-dev_8.2.4.15-1+cuda11.4_amd64.deb
sudo dpkg -i libcudnn8-samples_8.2.4.15-1+cuda11.4_amd64.deb
进入安装目录cd /usr/src/cudnn_samples_v8
,然后挑一个编译,比如conv_sample
cd conv_sample
sudo make
./conv_sample
输出如下字样
Executing: conv_sample
Using format CUDNN_TENSOR_NCHW (for INT8x4 and INT8x32 tests use CUDNN_TENSOR_NCHW_VECT_C)
Testing single precision
====USER DIMENSIONS====
input dims are 1, 32, 4, 4
filter dims are 32, 32, 1, 1
output dims are 1, 32, 4, 4
====PADDING DIMENSIONS====
padded input dims are 1, 32, 4, 4
padded filter dims are 32, 32, 1, 1
padded output dims are 1, 32, 4, 4
Testing conv
^^^^ CUDA : elapsed = 0.426204 sec,
Test PASSED
Testing half precision (math in single precision)
====USER DIMENSIONS====
input dims are 1, 32, 4, 4
filter dims are 32, 32, 1, 1
output dims are 1, 32, 4, 4
====PADDING DIMENSIONS====
padded input dims are 1, 32, 4, 4
padded filter dims are 32, 32, 1, 1
padded output dims are 1, 32, 4, 4
Testing conv
^^^^ CUDA : elapsed = 2.7895e-05 sec,
Test PASSED
OK,安装成功,O(∩_∩)O~~O(∩_∩)O
PyTorch(GPU)安装
安装
同样,官网找安装说明https://pytorch.org/get-started/locally/,我选的是:
Stable(1.9.1)、LInux、Pip、Python、CUDA11.1(其实我是CUDA11.4,但是没有更新的了),然后直接终端执行下边的指令就行,很简单~~
测试
新建main.py,内容如下:
import torch
import time
a = torch.rand((10000, 10000))
b = torch.rand((10000, 10000))
print('Size a:', a.size())
print('Size b:', b.size())
t0 = time.time()
for _ in range(10):
c = torch.matmul(a, b)
t1 = time.time()
print('Device:', a.device, ' Time:', t1 - t0)
print('Start moving matrix to GPU...')
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
t0 = time.time()
a = a.to(device)
b = b.to(device)
t1 = time.time()
print('time:', t1 - t0)
print('Finish moving matrix to GPU...')
t0 = time.time()
for _ in range(10):
c = torch.matmul(a, b)
t1 = time.time()
print('Device:', a.device, ' Time:', t1 - t0)
代码中可以看到for _ in range(10):
这个是控制计算矩阵乘法的次数。
如果只计算一次,结果如下:
Size a: torch.Size([10000, 10000])
Size b: torch.Size([10000, 10000])
Device: cpu Time: 2.066044807434082
Start moving matrix to GPU...
time: 2.224944591522217
Finish moving matrix to GPU...
Device: cuda:0 Time: 0.010721683502197266
计算时间大幅度缩短,但是由于数据从CPU搬运到GPU还需要消耗很多时间,所以总的来算GPU并没有占便宜。但是如果计算10次,结果如下:
Size a: torch.Size([10000, 10000])
Size b: torch.Size([10000, 10000])
Device: cpu Time: 20.653153657913208
Start moving matrix to GPU...
time: 2.176244020462036
Finish moving matrix to GPU...
Device: cuda:0 Time: 0.011154413223266602
好可怕,CPU的计算时间是原来的10倍,但是GPU运算的时间没有明显变化,加上搬运时间,GPU的好处就大大体现出来了。如果运算100次
Size a: torch.Size([10000, 10000])
Size b: torch.Size([10000, 10000])
Device: cpu Time: 218.0396192073822
Start moving matrix to GPU...
time: 2.2560465335845947
Finish moving matrix to GPU...
Device: cuda:0 Time: 0.0151214599609375
同样很可怕,当然这个只是计算的时间,还有很多的额外操作是电脑自动去处理,比如数据搬运,缓存等等高级操作,所以实际程序运行时间肯定会远远大于0.0019秒,但是也比用单纯的CPU快很多很多…
OK,环境已经安装完成,我要回windows里面看看还能正常用不了,毕竟装完Ubuntu之后还没回去看过呢,O(∩_∩)O~~