如果需要用gpu运行代码,必须先在代码中指定gpu,即将相应的值存储在显存上,这是第一步
1.默认情况下,数据都是存放在内存上,如
x = nd.array([1, 2, 3])
print(x)
会输出
说明此时是在cpu上运行,如果为了查看某矩阵所在的设备,可以使用其context属性
print(x.context)
会输出cpu(0),表示在第0块cpu上
2.将值存储在GPU上
方法一:直接将变量创建在gpu(0)上
a = nd.array([1, 2, 3], ctx = mx.gpu(0)) # 放在第0块gpu上,如果括号内不填数字,也是默认0
方法二:通过copyto函数或as_in_context函数在设备之间传输数据,如将前文中内存上的x变量复制到gpu(0)上
使用copyto函数复制到显存中的变量y
y = x.copyto(mx.gpu())
使用as_in_context函数复制到显存中的变量z
z = x.as_in_context(mx.gpu())
之后的计算会在context指定的设备上进行
3.Gluon模型的GPU计算
初始化神经网络时,也需要将模型参数初始化在显存上
net = nn.Sequential()
net.add(nn.Dense(1))
net.initialize(ctx = mx.gpu(0))
首先进入NCIVA控制面板,点击左下方系统信息,再点击组件,发现在3D设置里面有CUDA11.1,但是这个CUDA貌似在Pycharm中无法同时,同时按:Win+R,输入cmd后,在命令行中输入:
nvcc --version #用于查看cuda版本
提示:不是内部命令或外部命令,也不是可运行程序,于是推测并没有真正安装CUDA,所以下一步就是去安装CUDA
进入网站:https://developer.nvidia.com/cuda-toolkit-archive
找到对应的CUDA版本下载。我用的是mxnet,所以下载10版本即可,11版本目前没有对应的gpu版本的mxnet,这点需要注意,下载后默认安装即可。
然后再次查看CUDA 版本(方法同上),发现已经安装成功
备注:如果需要pip install xxx的话,不要在电脑命令行中进行(即cmd那种),直接在pycharm的terminal中输入命令操作,否则会出各种问题!!!!
注意:下面操作均在pycharm的terminal中进行!!!!
大家可能最开始时,都是在pycharm中通过:
pip install mxnet
但这是安装了cpu版本的mxnet,可以正常运行在cpu下运行代码,但是不可以在gpu下运行代码,为此我们需要安装gpu版本的mxnet。
首先,卸载cpu版本的mxnet
pip uninstall mxnet
然后安装gpu版本的mxnet,必须注意的是,这里安装的mxnet版本和我们第一步安装的CUDA版本必须兼容,否则会出问题。这里以我安装的CUDA 10.1版本为例,安装对应mxnet
pip install --pre mxnet-cu101
①代码中的101指的就是版本,如果你安装的CUDA是9.2,那么这里就是cu92
②mxnet前面必须加–pre,否则安装完成照样运行不了(原因未知)
成功完成上述操作后,运行代码时发现提示AttributeError: module ‘numpy’ has no attribute ‘int32’’,这时我们需要先卸载原来的numpy
pip uninstall numpy
(推测)然后安装这个版本下的numpy
pip install -U numpy
至此大功告成,应该已经可以使用gpu运行代码了
先卸载已安装的GPU模式的mxnet-cu101
(如果不影响安装cpu的mxnet的话,貌似也可以不卸载)
pip uninstall mxnet-cu101
再安装cpu版本的mxnet
pip install mxnet
会发现连cpu版本对应的numpy也安装好了,这是就可以重新用CPU进行运行啦~
按照上述操作使用GPU跑代码时,直观上确实发现速度比最开始的CPU快很多,但为了确定一下确实是用GPU,故运行时打开任务管理器:
发现GPU利用率始终是0。但是在代码运行过程中和停止运行后,用cmd命令:nvidia-smi 查看GPU情况,发现并不一样
左为停止状态下,右为运行状态下
从左到右红框的五项指标依次表示:
①显卡温度
②性能状态,从P0到P12,P0表示最大性能,P12表示最小性能
③当前功率
④系统占用显存数量和显存总大小
⑤显存核心利用率
可以得知,确实是在用GPU运行,那么就是任务管理器出问题了
查阅了一些资料发现,解决方法有两个:
1.GPU检测的驱动出了一些问题,到网上下载个驱动修复之类的就行
2.专门下载一个GPU监测的小程序也可