CPU VS GPU
- CPU: 中央处理单元。由数百万个晶体管组成,可以有多个处理内核,执行计算机和操作系统所需的命令和流程。
- GPU: 图形处理单元。由许多更小、更专业的内核组成的处理器。 在多个内核之间划分并执行一项处理任务时,通过协同工作,这些内核可以提供强大的性能。
由于其设计目标的不同,它们分别针对了两种不同的应用场景。
CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂。
CPU 基于低延时的设计,具有强大的ALU(算术运算单元),它可以在很少的时钟周期内完成算术计算。
CPU 适用于一系列广泛的工作负载,特别是那些对于延迟和单位内核性能要求较高的工作负载。作为强大的执行引擎,CPU 将它数量相对较少的内核集中用于处理单个任务,并快速将其完成。这使它尤其适合用于处理从串行计算到数据库运行等类型的工作。
GPU是基于大的吞吐量设计,有很多的ALU和很少的cache,访问的数据保存在dram中而不是cache里面,自然不能保证低延时。
GPU的虽然有dram延时,却有非常多的ALU和非常多的thread. 为了平衡内存延时的问题,我们可以中充分利用多的ALU的特性达到一个非常大的吞吐量的效果,尽可能多的分配多的Threads。
综上,与CPU擅长逻辑控制,串行的运算和通用类型数据运算不同,GPU擅长的是大规模并发计算,这也正是密码破解等所需要的。所以GPU除了图像处理,也越来越多的参与到计算当中来。
更具体信息请参考文后链接。
确认GPU信息
首先你的机器上要配置有GPU显卡,目前主流厂商是NVIDIA和AMD。
命令:
% lspci | grep -i vga
0000:05:00.0 VGA compatible controller: ASPEED Technology, Inc. ASPEED Graphics Family (rev 41)
0000:38:00.0 VGA compatible controller: NVIDIA Corporation GV102 (rev a1)
0000:41:00.0 VGA compatible controller: NVIDIA Corporation GV102 (rev a1)
0000:48:00.0 VGA compatible controller: NVIDIA Corporation GV102 (rev a1)
0000:50:00.0 VGA compatible controller: NVIDIA Corporation GV102 (rev a1)
可以看到,我的机器上有4块显卡(第一行是集成显卡,忽略),都是NVIDIA的。
以第一列作为参数查看更详细信息:
% lspci -vvs 0000:38:00.0
0000:38:00.0 VGA compatible controller: NVIDIA Corporation GV102 (rev a1) (prog-if 00 [VGA controller])
Subsystem: NVIDIA Corporation Device 12fa
Physical Slot: 9
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Interrupt: pin A routed to IRQ 305
NUMA node: 0
Region 0: Memory at b7000000 (32-bit, non-prefetchable) [size=16M]
Region 1: Memory at 6ffe0000000 (64-bit, prefetchable) [size=256M]
Region 3: Memory at 6fff0000000 (64-bit, prefetchable) [size=32M]
Region 5: I/O ports at 8000 [size=128]
[virtual] Expansion ROM at b8000000 [disabled] [size=512K]
Capabilities: <access denied>
Kernel driver in use: nvidia
Kernel modules: nvidiafb, nvidia_drm, nvidia
对于NVIDIA显卡,可以通过特定命令查看显卡信息:
% nvidia-smi
Fri Feb 25 13:54:08 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.44 Driver Version: 440.44 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce RTX 208... Off | 00000000:38:00.0 Off | N/A |
| 31% 37C P8 6W / 250W | 10537MiB / 11019MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 GeForce RTX 208... Off | 00000000:41:00.0 Off | N/A |
| 31% 50C P2 95W / 250W | 1322MiB / 11019MiB | 35% Default |
+-------------------------------+----------------------+----------------------+
| 2 GeForce RTX 208... Off | 00000000:48:00.0 Off | N/A |
| 59% 67C P2 209W / 250W | 3390MiB / 11019MiB | 71% Default |
+-------------------------------+----------------------+----------------------+
| 3 GeForce RTX 208... Off | 00000000:50:00.0 Off | N/A |
| 61% 67C P2 210W / 250W | 3366MiB / 11019MiB | 67% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 51318 C /opt/anaconda/envs/test1/bin/python 4487MiB |
| 0 53200 C /opt/anaconda/envs/test1/bin/python 6039MiB |
| 1 52472 C /opt/anaconda/envs/test1/bin/python 1311MiB |
| 2 46529 C /opt/anaconda/envs/test1/bin/python 3379MiB |
| 3 46529 C /opt/anaconda/envs/test1/bin/python 3355MiB |
+-----------------------------------------------------------------------------+
其中,主要关注:
- Temp:温度,过高可能是哪里出了问题
- Memory-Usage:显存使用情况
- GPU-Util:GPU使用率
- CUDA Version: 后面要对应到TensorFlow版本
关于显卡更详细的信息可参考相关资料。
确定TensorFlow版本
TensorFlow版本不是随便安装的,对GPU的支持需要对应的驱动库,版本不对应会导致问题。
所以真正开始动手安装之前一定要确认好版本。
确认版本的顺序:
机器上显卡类型 -> 显卡的CUDA版本 -> TensorFlow版本
具体版本间对应关系官网上有:https://tensorflow.google.cn/install/source 。
截图示例:
对于我的CUDA Version: 10.2来说,可以选择TensorFlow 2.4以下所有版本。
安装TensorFlow 2.3.0
首先确保你的Anaconda环境无误,我对应的python版本为3.6,创建conda虚拟环境命令如下:
conda create -n tf2 python=3.6
需要安装的包:
- cudatoolkit,版本10.1
- cudnn:版本7.6
- tensorflow:2.3.0
注意,如果你已经安装了tensorflow,但没有安装前两个库,使用GPU时会提示找不到CUDA驱动库,无法使用GPU。把前两个库的对应版本安装上即可。
具体的安装步骤(仅四行指令):
conda activate tf2
conda install cudatoolkit=10.1
conda install cudnn=7.6 # 对应的是7.4,但是没有这个版本,装更高版本即可
pip install tensorflow==2.3.0
pip install --upgrade keras # 安装最新版本keras
ok,tensorflow:2.3.0安装完毕,使用下面的测试程序跑一下:
# --coding: utf8--
import tensorflow as tf
if __name__ == '__main__':
print('tf version: {}'.format(tf.__version__))
print('keras version: {}'.format(tf.keras.__version__))
# print('GPU: {}'.format(tf.test.is_gpu_available())) # 1.x版本的TF使用此行
print('GPU: {}'.format(tf.config.list_physical_devices('GPU'))) # 2.x版本的TF使用
输出如下:
% python show_tf_version.py
tf version: 2.3.0
keras version: 2.4.0
GPU: [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:2', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:3', device_type='GPU')]
ok了。
安装TensorFlow 1.13.1
1.x版本的TensorFlow,cpu和gpu版本是分开的,如果只安装了cpu版本的,无法使用GPU,直接上安装命令:
conda activate tf1
conda install cudatoolkit=10.1
conda install cudnn=7.6
pip install tensorflow-gpu==1.13.1
pip install keras==2.2.4 # 安装指定版本的keras
输出如下:
tf version: 1.13.1
keras version: 2.2.4-tf
GPU: True
小节
- 使用conda管理虚拟环境,简单省力,搞错了可以删除再搞一遍
- 开始安装前确认好版本
- 如果之前没有安装CUDA驱动库,再安装一下即可
参考
https://tensorflow.google.cn/install/source
https://tensorflow.google.cn/install/pip