Ubuntu1604从0安装CUDA

2022/9/3 5:25:36

本文主要是介绍Ubuntu1604从0安装CUDA,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

港澳 2020年12月31日

目录
  • 通过安装CUDA来安装驱动
  • 先安装驱动
    • 禁用第三方驱动、卸载初始驱动、关闭图形界面
  • 再安装CUDA
  • 卸载CUDA
  • 安装Tensorflow
  • 安装VSCode和Requirements包
  • InternalError: Dst tensor is not initialized
  • 实时监测GPU状态
  • demo运行结果
  • 重要参考


通过安装CUDA来安装驱动

首先检查系统

是 否有支持 CUDA 编程的 GPU。可使用

lspci | grep -i nvidia
image-20201230104206682

传统上,安装 NVIDIA Driver 和 CUDA Toolkit 的步骤是分开的,但实际上我们可以直接安装 CUDA Toolkit,系统将自动安装与其版本匹配的 NVIDIA Driver。下面我们讲述安装 CUDA Toolkit 的方法。

在安装 CUDA Toolkit 前,要确保系统安装了 gcc 和 make。如果希望使用 C++ 进行 CUDA 编程,需要安装 g++。如果想要运行 CUDA 例程序,需要安装相应的依赖库。

sudo apt update # 更新 apt
sudo apt install gcc g++ make # 安装 gcc g++ make
sudo apt install libglu1-mesa libxi-dev libxmu-dev libglu1-mesa-dev freeglut3-dev # 安装依赖库
image-20201230105123884

解决问题的方法在这里: apt指令

image-20201230105808104 image-20201230105854243 image-20201230110333365

在 CUDA Toolkit 的下载页面选择系统版本和安装方式,下载并运行 runfile。

下载 CUDA Toolkit (文件较大):

wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda_11.1.0_455.23.05_linux.run

安装 CUDA Toolkit (时间较长):

sudo sh cuda_11.1.0_455.23.05_linux.run
image-20201230110842522 image-20201230110924970 image-20201230111022922

出现错误。所以还是老老实实先安装驱动,再装CUDA吧。


先安装驱动

禁用第三方驱动、卸载初始驱动、关闭图形界面

Ubuntu 16.04系统使用第三方驱动程序nouveau支持NVIDIA显卡,为了安装NVIDIA公司的原版驱动程序,需要将其禁用,具体方法为:使用快捷键Ctrl+Alt+T打开一个终端,使用vi编辑器在/etc/modprobe.d目录中创建文件:blacklist-nvidia.conf(文件名随便起,只要后缀为.conf并且自己觉得有意义就行):

sudo vi /etc/modprobe.d/blacklist-nvidia.conf

文件内容如下:

blacklist nouveau
options nouveau modeset=0
image-20201230112551017

然后使用如下命令更新内核信息:

sudo update-initramfs -u

注意:更改信息后一定要记得重启电脑!

image-20201230121017093

验证nouveau是否已禁用,没有出现任何东西则禁用成功了

lsmod | grep nouveau

接下来停止图形界面

sudo service lightdm stop

然后移除所有显卡驱动

sudo apt-get remove nvidia-*
image-20201230121531698

查看是否有驱动安装

ls /usr/src | grep nvidia
image-20201230121853768

查看显卡信息

lshw -numeric -C display
image-20201230142320749

使用以下指令安装驱动程序

sudo chmod +x NVIDIA-Linux-x86_64-450.80.02.run
image-20201230122149169

失败,查看高级选项

image-20201230142407166

仔细查看help,发现是输错了命令格式。看其他教程说是不安装OpenGL这个参数通重要的,所以必须有。

image-20201230142018858 image-20201230142208131

重新运行安装

 sudo ./NVIDIA-Linux-x86_64-450.80.02.run --no-x-check --no-nouveau-check --no-opengl-files
image-20201230143604184

遇到错误

image-20201230142855077

如果上面那些工作你都做了的话,但是发现还是出现这个检查脚本出错的问题,怎么都是失败。
恭喜你,nvidia的工程师和你开了个玩笑。它仅仅是为了让你确认你真是是要安装这个,如果你确实排除了我上边说的其他原因,卡在脚本检查这一步,其实你继续安装也是没有问题的。

我们可以查看这个验证脚本

 vi   /usr/lib/nvidia/pre-install
image-20201230143020219 image-20201230143043271

选择continue继续安装。

image-20201230143209482

这是说不会装32位,因为我们的系统就是64位的,随意没有影响。继续。

image-20201230143427448

选NO

image-20201230143523025

安装完成,验证安装

nvidia-smi 
nvidia-settings -v
image-20201230143650071 image-20201230143856836

重启图形界面

sudo service lightdm start 

驱动安装完成!可喜可贺!


再安装CUDA

继续第一部分中的步骤,运行下载好的cuda的run程序。要取消驱动的安装。

image-20201230165849065

显示以下结果,真真不少内容:

image-20201230170220520
驱动程序:未选择
工具箱:安装在/usr/local/cuda-11.1/中
样本:安装在/ home / allan /

请确保
 -   PATH包括/usr/local/cuda-11.1/bin
 -   LD_LIBRARY_PATH包含/usr/local/cuda-11.1/lib64,或者将/usr/local/cuda-11.1/lib64添加到/etc/ld.so.conf并以root用户身份运行ldconfig

要卸载CUDA Toolkit,请在/usr/local/cuda-11.1/bin中运行cuda-uninstaller
***警告:未完全安装! 此安装未安装CUDA驱动程序。 要使CUDA 11.1功能正常运行,至少需要使用.00以上版本的驱动程序。
要使用此安装程序安装驱动程序,请运行以下命令,并用本运行文件的名称替换<CudaInstaller>
    sudo <CudaInstaller>.run --silent --driver

完善后续的环境变量配置,在 ~/.bashrc 中添加以下内容:

# add nvcc compiler to path
export PATH=$PATH:/usr/local/cuda-11.1/bin
# add cuBLAS, cuSPARSE, cuRAND, cuSOLVER, cuFFT to path
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.1/lib64:/usr/lib/x86_64-linux-gnu

运行测试,看是否安装完成。可以在路径

/usr/local/cuda-10.1/extras/demo_suite

路径下找到一些样例程序。deviceQuery 将输出 CUDA 的相关信息

image-20201230173220849

CUDA 的各种特性:纹理内存 (texture memory)、常量内存 (constant memory)、共享内存 (shared memory)、块 (block)、线程 (thread)、统一寻址 (unified addressing) 都包含在以上信息中。了解这些特性是进行 CUDA C/C++ 编程的基础。

至此,安装完成。


卸载CUDA

img

安装的是CUDA 11,但是要求是用CUDA 8。哭了。并在下面保存一张与anaconda对应的版本表,以备后用。

在这里插入图片描述

按照安装完成时的提示进行卸载。要卸载CUDA Toolkit,请在/usr/local/cuda-11.1/bin中运行cuda-uninstaller。

image-20201230175944186

可能卸载之后,还有一些残留的文件夹,可以一并删除。这次自动删除了。

sudo rm -rf /usr/local/cuda/
image-20201230180318124

下载CUDA 8

image-20201230191749852

运行run文件

image-20201230191825481

开始安装之后,需要阅读说明,可以使用Ctrl + C直接阅读完成,或者使用空格键慢慢阅读。然后进行配置,我这里说明一下:

image-20201230192647152
(是否同意条款,必须同意才能继续安装)
accept/decline/quit: accept

(这里不要安装驱动,因为已经安装最新的驱动了,否则可能会安装旧版本的显卡驱动,导致重复登录的情况)
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?
(y)es/(n)o/(q)uit: n

Install the CUDA 10.0 Toolkit?(是否安装CUDA 10 ,这里必须要安装)
(y)es/(n)o/(q)uit: y

Enter Toolkit Location(安装路径,使用默认,直接回车就行)
 [ default is /usr/local/cuda-10.0 ]:  

Do you want to install a symbolic link at /usr/local/cuda?(同意创建软链接)
(y)es/(n)o/(q)uit: y

Install the CUDA 10.0 Samples?(不用安装测试,本身就有了)
(y)es/(n)o/(q)uit: n

Installing the CUDA Toolkit in /usr/local/cuda-10.0 ...(开始安装)
image-20201230192054812

安装完成之后,可以配置他们的环境变量,在vim ~/.bashrc的最后加上以下配置信息:

export CUDA_HOME=/usr/local/cuda-10.0
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64
export PATH=${CUDA_HOME}/bin:${PATH}

最后使用命令source ~/.bashrc使它生效。

image-20201230192440638

可以使用命令nvcc -V查看安装的版本信息:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61
image-20201230193032690

安装补丁。先传到服务器:

image-20201230193951732

安装Tensorflow

image-20201230195622022image-20201230195654858

image-20201230195654858


安装VSCode和Requirements包

使用wget下载VSCode在Ubuntu 64位下的安装包,并运行。

根据要求安装以下包:

python 2.7.6
tensorflow 1.2.0
numpy 1.13.3
scipy 0.19.0
matplotlib 2.0.2
skimage 0.13.0

需要注意的是,skimage 在pip安装时名称为scikit-image。另外,根据提示还需要补充的是:sudo apt_get python-tk。然后再补充一个scikit-learn包,该包在tools.py中被调用。


InternalError: Dst tensor is not initialized

运行后,出现以下错误:

2.7.12 (default, Oct  5 2020, 13:56:01)
[GCC 5.4.0 20160609]
Traceback (most recent call last):
  File "demo_3D-RecGAN++.py", line 65, in <module>
    ttest_demo()
  File "demo_3D-RecGAN++.py", line 27, in ttest_demo
    saver.restore(sess, model_path+ 'model.cptk')
  File "/home/allan/.local/lib/python2.7/site-packages/tensorflow/python/training/saver.py", line 1548, in restore
    {self.saver_def.filename_tensor_name: save_path})
  File "/home/allan/.local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 789, in run
    run_metadata_ptr)
  File "/home/allan/.local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 997, in _run
    feed_dict_string, options, run_metadata)
  File "/home/allan/.local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1132, in _do_run
    target_list, options, run_metadata)
  File "/home/allan/.local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1152, in _do_call
    raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InternalError: Dst tensor is not initialized.
         [[Node: save/RestoreV2_10/_91 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/gpu:0", send_device="/job:localhost/replica:0/task:0/cpu:0", send_device_incarnation=1, tensor_name="edge_318_save/RestoreV2_10", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"]()]]

以下引用网上的解决方案:

错误:InternalError: Dst tensor is not initialized.

分析:出现这个错误一般是GPU内存耗尽,挂在后台进程中的IPython内核会这样做

解决办法:运行程序之前,先运行 export CUDA_VISIBLE_DEVICES=1,仅显卡设备1GPU可见,tensorflow 算是一个比较贪心的工具了就算用device_id指定gpu 也会占用别的GPU的显存资源 必须在执行程序前执行
export CUDA_VISIBLE_DEVICES=n(n为可见的服务器编号)再去执行Python 代码.py 才不会占用别的GPU资源

看看我电脑上有几颗GPU:

nvidia-smi -L
image-20201231134924298
allan@allan-virtual-machine:~/Projects/CV/3D-RecGAN-extended$ nvidia-smi -B
No blacklisted devices found.
allan@allan-virtual-machine:~/Projects/CV/3D-RecGAN-extended$ nvidia-smi -L
GPU 0: Quadro P2200 (UUID: GPU-dba12531-5578-48d1-1c7b-bbee02b75be4)

另外,尝试以下解决方案:

解决办法:

  1. 修改系统环境变量 CUDA_VISIBLE_DEVICES=n (让cuda只能看到某个显卡,n为gpu编号。 gpu0 即n=0)参考
  2. 通过设定config为使用的显存按需自动增长,避免显存被耗尽,可进行有效的预防。
    定义TensorFlow配置
    config = tf.ConfigProto()
    配置GPU内存分配方式,按需增长,很关键
    config.gpu_options.allow_growth = True
    配置可使用的显存比例
    config.gpu_options.per_process_gpu_memory_fraction = 0.1
    在创建session的时候把config作为参数传进去
    sess = tf.InteractiveSession(config = config)
    参考
  3. 可以尝试修改batch_size,减少同时进入显存的数据数量。减少显存占用。

查看当前的进程,发现一只有一个进程占据着4KM+的资源。

image-20201231140845864

通过reboot结束进程释放内存看看效果:

image-20201231140647284

程序运行成功!终于能跑通了。以防以后再出现这样的情况,通过设定config为使用的显存按需自动增长,避免显存被耗尽。程序参考自这篇文章。

gpu_no = '0' # or '1'
os.environ["CUDA_VISIBLE_DEVICES"] = gpu_no
# 定义TensorFlow配置
config = tf.ConfigProto()
# 配置GPU内存分配方式,按需增长,很关键
config.gpu_options.allow_growth = True
# 配置可使用的显存比例
config.gpu_options.per_process_gpu_memory_fraction = 0.1
# 在创建session的时候把config作为参数传进去
sess = tf.InteractiveSession(config = config)

在运行上面的Tensorflow小程序的时候程序我们会遇到一个问题,当然这个问题不影响我们实际的结果计算,但是会给同样使用这台计算机的人带来麻烦,程序会自动调用所有能调用到的资源,并且全占满,在自己的PC上没问题,但是在服务器上,问题就很大,因为一旦你运行程序,占满显存别人就不能再用了,解决方法是我们通常是给程序运行指定一块GPU,然后限制其使用比例:

import tensorflow as tf
import os
os.environ["CUDA_VISIBLE_DEVICES"] = '0'   #指定第一块GPU可用
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.5  # 程序最多只能占用指定gpu50%的显存
sess = tf.Session(config = config)

但是我们通常在程序开始之前并不知道需要多大的显存,程序回去申请GPU的显存的50%,比如一个8G的内存,被占用了2G,那么程序会申请4G的显存(因为有足够的剩余显存),如果此时显存被占用7G,那么程序会申请剩下的所有的1G的显存。也许你的程序根本用不着这么多显存,200M也许就够了,这时候如果程序能按照需求去申请就好了,幸运的是,这样的方法是存在的。只需要加上一条语句就好,完整语句为:

import tensorflow as tf
import os
os.environ["CUDA_VISIBLE_DEVICES"] = '0'   #指定第一块GPU可用
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.5  # 程序最多只能占用指定gpu50%的显存
config.gpu_options.allow_growth = True      #程序按需申请内存
sess = tf.Session(config = config)

实时监测GPU状态

watch 命令简介

1 $ whatis watch
2 watch(1)        - execute a program periodically, showing output fullscreen

功能很明白,周期性执行某一命令,并将输出全屏显示。watch的基本用法是

1 watch [options]  command

最常用的参数是 -n, 后面指定是每多少秒来执行一次命令。监视显存:我们设置为每 1s 显示一次显存的情况

watch -n 1 nvidia-smi

对于smi表格中的数据:

第一栏的Fan:N/A是风扇转速,从0到100%之间变动。有的设备不会返回转速,因为它不依赖风扇冷却而是通过其他外设保持低温。 
第二栏的Temp:是温度,单位摄氏度。 
第三栏的Perf:是性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能。 
第四栏下方的Pwr:是能耗,上方的Persistence-M:是持续模式的状态,持续模式虽然耗能大,但是在新的GPU应用启动时,花费的时间更少,这里显示的是off的状态。 
第五栏的Bus-Id是涉及GPU总线的东西,domain:bus:device.function 
第六栏的Disp.A是Display Active,表示GPU的显示是否初始化。 
第五第六栏下方的Memory Usage是显存使用率。 
第七栏是浮动的GPU利用率。 
第八栏上方是关于ECC的东西。 
第八栏下方Compute M是计算模式。 
下面一张表示每个进程占用的显存使用率。

显存占用和GPU占用是两个不一样的东西,显卡是由GPU和显存等组成的,显存和GPU的关系有点类似于内存和CPU的关系。


demo运行结果

image-20201231155600511 image-20201231155636845 image-20201231155705439

重要参考

第一和第三部分主要参考了下面这篇文章。作者【已注销】:
Linux 下的 CUDA 安装和使用指南

其实首先参考的是下文,但遇到了比较难解决的问题。作者【Seehidre】:
Ubuntu 16.04系统中利用CUDA安装更新NVIDIA显卡驱动程序的方法

作者【pprp】:
NVIDIA 驱动安装(超详细)

参考了下文的环境变量配置。作者【苍术厚朴】:
Ubuntu 设置环境变量

挺好的一篇文章。作者【Lzpong】
在linux系统中安装VSCode(Visual Studio Code)

ubuntu使用watch命令实时监测显卡

tensorflow入门(二)---tensorflow显存管理
还有其他未列出,或已在文中列出。



这篇关于Ubuntu1604从0安装CUDA的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程