实际上,整个过程实在容器中进行的

检查环境

首先,Ubuntu下查看Nvidia显卡的详细信息:

nvidia-smi

可见:

$ nvidia-smi
Fri Aug 16 08:46:25 2019     
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26       Driver Version: 430.26       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 940MX       Off  | 00000000:3C:00.0 Off |                  N/A |
| N/A   46C    P0    N/A /  N/A |    183MiB /  2004MiB |      3%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      3038      G   /usr/lib/xorg/Xorg                            94MiB |
|    0      4709      G   /usr/bin/gnome-shell                          86MiB |
+-----------------------------------------------------------------------------+

查看cuda 版本:

cat  /usr/local/cuda/version.txt 
    or
    nvcc -V

可见:

$ cat /usr/local/cuda/version.txt 
CUDA Version 10.1.243

查看cudnn版本:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

如果上述命令你都没有输出,那么请往下看(容器里面不用装显卡驱动,容器本身有cuda,实际只操作了安装cudnn和opencv):

Ubuntu下双显卡笔记本如何安装NVIDIA卡驱动

安装显卡驱动

检查自己电脑的gpu是否CUDA-capable

lspci | grep -i nvidia
    #没有lspci就安装
    apt install pciutils

可见:

虚拟机 cpu转gpu_深度学习

禁用nouveau并重启

(安装Nvidia显卡的官方驱动和系统自带的nouveau驱动冲突)

lsmod | grep nouveau
    #没有lsmod就安装
    apt install module-init-tools

如果有输出说明nouveau正在加载

打开禁用列表

sudo gedit /etc/modprobe.d/blacklist.conf

在打开文本的最后一行添加:

blacklist nouveau
    options nouveau modeset=0

更新,重启:

sudo update-initramfs -u
    reboot

再次查看是否禁用nouveau

lsmod | grep nouveau

重点:

1、 先安装 gcc :

sudo yum -y install gcc-c++

或者

sudo apt install build-essential

2、删除旧的NVIDIA驱动:

$sudo apt-get remove nvidia-*
$sudo apt-get autoremove

或者

sudo apt-get --purge remove nvidia-*
# sudo ./NVIDIA-Linux-x86_64-410.57.run -uninstall

sudo update-initramfs -u
sudo reboot now

3、更新系统软件仓库列表

~$ sudo apt-get update

4、使用下面的命令查看系统推荐安装哪个版本的N卡驱动

ubuntu-drivers devices

qyh@qyh-mas$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:1d.0/0000:3c:00.0 ==
modalias : pci:v000010DEd0000134Dsv000017AAsd000039C8bc03sc02i00
vendor   : NVIDIA Corporation
model    : GM108M [GeForce 940MX]
driver   : nvidia-driver-410 - third-party free
driver   : nvidia-driver-415 - third-party free
driver   : nvidia-driver-390 - third-party free
driver   : nvidia-driver-430 - third-party free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin

在上面这些输出中可以看到recommended关键词,说明系统推荐安装的N卡驱动是"nvidia-driver-430"

5、选择你看到推荐版本安装,本例使用nvidia-driver-430,然后安装几个必要组件,命令如下

$ sudo apt-get install nvidia-settings nvidia-driver-430 nvidia-prime

我的建议安装的是nvidia-440版本驱动,然后继续在命令行输入:

$ sudo ubuntu-drivers autoinstall

将会自动安装所推荐的nvidia-440版本驱动
6、安装双显卡切换指示器

~$ sudo add-apt-repository ppa:nilarimogard/webupd8
	~$ sudo apt-get update
    ~$ sudo apt-get install prime-indicator

7、重新启动

~$ sudo reboot

新启动后会在右上角看到一个显卡指示器,默认情况下是Nvidia图标,说明现在使用的是N卡,点击这个图标选择"Quick switch graphics…",按下确认后会自动重启桌面,此时就会切换到Intel显卡了,图标也变成了Intel。

大家可以尝试着在两个显卡之间切换,并使用下面的命令查看是否切换成功,然后测试其性能

切换到Intel卡后,查看N卡是否关闭,如果N卡末尾是(rev ff),则表示成功关闭了N卡,现在使用的是I卡,如果末尾不是ff,则说明现在使用的是N卡

~$ lspci | grep VGA

00:02.0 VGA compatible controller: Intel Corporation .... (rev 09)

01:00.0 VGA compatible controller: NVIDIA Corporation .... (rev ff)

如果上面的命令没有看到NVIDIA卡,可以直接使用下面的命令来查看N卡状态

~$ lspci | grep NVI

qyh@qyh-mas:$ lspci | grep NVI
3c:00.0 3D controller: <font color="#EF2929"><b>NVI</b></font>DIA Corporation GM108M [GeForce 940MX] (rev a2)
qyh@qyh-mas: $ lspci | grep VGA
00:02.0 <font color="#EF2929"><b>VGA</b></font> compatible controller: Intel Corporation Skylake GT2 [HD Graphics 520] (rev 07)

使用下面的命令来测试显卡的性能,数字越大代表显卡性能越好,这条命令可以明显看到N卡的性能强于I卡

~$ glxspheres64

安装CUDA 10.1

1.在http://developer.nvidia.com/cuda-downloads上下载安装包

虚拟机 cpu转gpu_深度学习_02


你自己可以建个文件夹,然后在文件夹中输入上述两条命令:

$:sudo wget http://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run

$:sudo sh cuda_10.1.243_418.87.00_linux.run

2.再出现的提示中选择continue和accept,直到出现如下画面:

虚拟机 cpu转gpu_bash_03


由于之前已经安装了Nvidia的显卡驱动,这里不安装driver,那么只需要移动到Driver,按enter键,将"[]"中的X去掉即是不选择.然后在Install.因为我们只是调用CUDA,不去写CUDA程序,所以Samples也可以选择不安装.3.安装成功

虚拟机 cpu转gpu_虚拟机 cpu转gpu_04


4.添加环境变量

vi ~/.bashrc

在文件末尾添加

export PATH="/usr/local/cuda-10.1/bin:$PATH"
export LD_LIBRARY_PATH="/usr/lcoal/cuda-10.1/lib64:$LD_LIBRARY_PATH"

最后使其生效

source ~/.bashrc

5.终端输入

cd /usr/local/cuda-10.1/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery

结果如图:

虚拟机 cpu转gpu_docker_05


出现Result = PASS则表示安装成功通过!!

6.在终端输入命令,实时查看GPU的使用情况:

watch -n 1 nvidia-smi

安装CUDNN

(实际容器中没有sudo,指令不加这个也行)

1.下载cuDNN v7.6.1 (June 24, 2019), for CUDA 10.1

https://developer.nvidia.com/rdp/cudnn-archive

虚拟机 cpu转gpu_虚拟机 cpu转gpu_06


进入解压后的cudnn目录 应该能看到cuda文件夹

sudo cp cuda/include/cudnn.h /usr/local/cuda/include/ 
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/ 
sudo chmod a+r /usr/local/cuda/include/cudnn.h

若是在无界面环境下,下载cuDNN Library for Linux
查看cudnn版本

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

可见

虚拟机 cpu转gpu_docker_07


从上到下输出7 6 4 即表示cudnn7.6.4

(下面这部分问题实际没遇到)

注意:

假如你不禁用nouveau驱动遇到的问题和解决方案

安装Nvidia显卡的官方驱动和系统自带的nouveau驱动冲突。 安装网上方法尝试了modprob.d/blacklist.conf里的各种修改,重启以后还是没有成功禁用nouveau驱动

最后看见一个方法:

直接移除这个驱动(备份出来)

#    mv /lib/modules/3.0.0-12-generic/kernel/drivers/gpu/drm/nouveau/nouveau.ko /lib/modules/3.0.0-12-generic/kernel/drivers/gpu/drm/nouveau/nouveau.ko.org

重新加载一下

#     update-initramfs -u

重启发现字体已经变大了,卸载成功。

安装配置OpenCV 4.4.0

OpenCV下载

下载地址:https://opencv.org/releases/

选择最新的4.4.0版本(如果下载速度太慢,复制链接地址,使用迅雷)

虚拟机 cpu转gpu_bash_08


将下载好的压缩文件拷贝到虚拟机中

编译与安装

  1. 安装cmake
    OpenCV需要使用cmake进行编译
sudo apt-get install cmake
  1. 安装依赖
sudo apt-get install build-essential pkg-config libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
  1. 解压
unzip opencv-4.4.0
  1. 进入文件目录,创建build目录并进入
cd opencv-4.4.0/
mkdir build
cd build
  1. 使用cmake生成makefile文件
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_GTK=ON -D OPENCV_GENERATE_PKGCONFIG=YES ..

CMAKE_BUILD_TYPE=RELEASE:表示编译发布版本
CMAKE_INSTALL_PREFIX:表示生成动态库的安装路径,可以自定义
WITH_GTK=ON:这个配置是为了防止GTK配置失败:即安装了libgtk2.0-dev依赖,还是报错未安装
OPENCV_GENERATE_PKGCONFIG=YES:表示自动生成OpenCV的pkgconfig文件,否则需要自己手动生成。

  1. 编译
make -j8

-j8表示使用多个系统内核进行编译,从而提高编译速度,不清楚自己系统内核数的,可以使用make -j$(nproc)
如果编译时报错,可以尝试不使用多个内核编译,虽然需要更长的编译时间,但是可以避免一些奇怪的报错

  1. 安装
sudo make install

注:如果需要重新cmake,请先将build目录下的文件清空,再重新cmake,以免发生错误

环境配置

  1. 将OpenCV的库添加到系统路径(实际用的方法一)

方法一:配置ld.so.conf文件

sudo vim /etc/ld.so.conf

在文件中加上一行 include /usr/loacal/lib,这个路径是cmake编译时填的动态库安装路径加上/lib

虚拟机 cpu转gpu_docker_09


方法二:手动生成opencv.conf文件

sudo vim /etc/ld.so.conf.d/opencv.conf

是一个新建的空文件,直接添加路径,同理这个路径是cmake编译时填的动态库安装路径加上/lib

/usr/local/lib

以上两种方法配置好后,执行如下命令使得配置的路径生效

sudo ldconfig
  1. 配置系统bash
    因为在cmake时,选择了自动生成OpenCV的pkgconfig文件,在/usr/local/lib/pkgconfig路径可以看到文件

    确保文件存在,执行如下命令
sudo vim /etc/bash.bashrc

在文末添加

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

如下:

虚拟机 cpu转gpu_虚拟机 cpu转gpu_10


保存退出,然后执行如下命令使配置生效

source /etc/bash.bashrc

至此,Linux\Ubuntu18.04环境下OpenCV的安装以及配置已经全部完成,可以使用以下命令查看是否安装和配置成功

pkg-config --modversion opencv4
pkg-config --cflags opencv4
pkg-config --libs opencv4

虚拟机 cpu转gpu_docker_11

测试

(实际测试未成功,不知道为什么)
新建一个demo.cpp文件,代码如下

#include <iostream>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;

int main()
{
    Mat srcImage = imread("opencv.jpg");
    imshow("Display Image window",srcImage);
    waitKey(0);
    return 0;
}

同级目录放一张图片,名为opencv.jpg,编译

g++ `pkg-config opencv4 --cflags` demo.cpp  -o demo `pkg-config opencv4 --libs`

运行

./demo

结果如下:

虚拟机 cpu转gpu_虚拟机 cpu转gpu_12

安装Darknet

Clone项目文件

git clone https://github.com/AlexeyAB/darknet.git
cd darknet

根据环境,修改Makefile 文件

首先

GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=0
LIBSO=0
ZED_CAMERA=0
ZED_CAMERA_v2_8=0

# set GPU=1 and CUDNN=1 to speedup on GPU
# set CUDNN_HALF=1 to further speedup 3 x times (Mixed-precision on Tensor Cores) GPU: Volta, Xavier, Turing and higher
# set AVX=1 and OPENMP=1 to speedup on CPU (if error occurs then set AVX=0)
# set ZED_CAMERA=1 to enable ZED SDK 3.0 and above
# set ZED_CAMERA_v2_8=1 to enable ZED SDK 2.X

USE_CPP=0
DEBUG=0

ARCH= -gencode arch=compute_30,code=sm_30 \
      -gencode arch=compute_35,code=sm_35 \
      -gencode arch=compute_50,code=[sm_50,compute_50] \
      -gencode arch=compute_52,code=[sm_52,compute_52] \
            -gencode arch=compute_61,code=[sm_61,compute_61]

(实际这块并没有修改:更改ARCH配置的时候,根据自己的GPU型号来定。我的GPU是GTX1050Ti的计算能力是6.1。

compute_30表示显卡的计算能力是3.0。
注意:每次修改完makefile都要重新Make一下才能生效。)

然后:
修改NVCC的路径:

NVCC=/usr/local/cuda-10.1/bin/nvcc

最后(实际未更改)
确认48~51行,在”ifeq ((GPU),1)”语句块中修改为自己的CUDA安装路径,更改前默认路径如下:ifeq((GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand
将三处的cuda路径改为自己本机上的路径即可。

给系统加入opencv库的环境变量

(编译时报过错:error while loading shared libraries: libopencv_highgui.so.2.4 linux)

用vim打开/etc/ld.so.conf,注意要用sudo打开获得权限,不然无法修改,如:

sudo vim /etc/ld.so.conf

(本来用不了sudo,这里又可以用了,不知道为什么)

在文件中加上一行 /usr/loacal/lib,
/user/loacal是opencv安装路径(我的是/opencv),就是makefile中指定的安装路径,再运行sudo ldconfig,

修改bash.bashrc文件,sudo gedit /etc/bash.bashrc
在文件末尾加入:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

然后source /etc/bash.bashrc

编译

在darknet下

make

检验

./darknet

若出现下图,则说明编译成功:

虚拟机 cpu转gpu_虚拟机 cpu转gpu_13