港澳 2020年12月31日
目录- 通过安装CUDA来安装驱动
- 先安装驱动
- 再安装CUDA
- 卸载CUDA
- 安装Tensorflow
- 安装VSCode和Requirements包
- InternalError: Dst tensor is not initialized
- 实时监测GPU状态
- demo运行结果
- 重要参考
通过安装CUDA来安装驱动
首先检查系统
是 否有支持 CUDA 编程的 GPU。可使用
lspci | grep -i nvidia
传统上,安装 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 # 安装依赖库
在 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
出现错误。所以还是老老实实先安装驱动,再装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
然后使用如下命令更新内核信息:
sudo update-initramfs -u
注意:更改信息后一定要记得重启电脑!
验证nouveau是否已禁用,没有出现任何东西则禁用成功了
lsmod | grep nouveau
接下来停止图形界面
sudo service lightdm stop
然后移除所有显卡驱动
sudo apt-get remove nvidia-*
查看是否有驱动安装
ls /usr/src | grep nvidia
查看显卡信息
lshw -numeric -C display
使用以下指令安装驱动程序
sudo chmod +x NVIDIA-Linux-x86_64-450.80.02.run
失败,查看高级选项
仔细查看help,发现是输错了命令格式。看其他教程说是不安装OpenGL这个参数通重要的,所以必须有。
重新运行安装
sudo ./NVIDIA-Linux-x86_64-450.80.02.run --no-x-check --no-nouveau-check --no-opengl-files
遇到错误
如果上面那些工作你都做了的话,但是发现还是出现这个检查脚本出错的问题,怎么都是失败。
恭喜你,nvidia的工程师和你开了个玩笑。它仅仅是为了让你确认你真是是要安装这个,如果你确实排除了我上边说的其他原因,卡在脚本检查这一步,其实你继续安装也是没有问题的。
我们可以查看这个验证脚本
vi /usr/lib/nvidia/pre-install
选择continue继续安装。
这是说不会装32位,因为我们的系统就是64位的,随意没有影响。继续。
选NO
安装完成,验证安装
nvidia-smi
nvidia-settings -v
重启图形界面
sudo service lightdm start
驱动安装完成!可喜可贺!
再安装CUDA
继续第一部分中的步骤,运行下载好的cuda的run程序。要取消驱动的安装。
显示以下结果,真真不少内容:
驱动程序:未选择
工具箱:安装在/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 的相关信息
CUDA 的各种特性:纹理内存 (texture memory)、常量内存 (constant memory)、共享内存 (shared memory)、块 (block)、线程 (thread)、统一寻址 (unified addressing) 都包含在以上信息中。了解这些特性是进行 CUDA C/C++ 编程的基础。
至此,安装完成。
卸载CUDA
安装的是CUDA 11,但是要求是用CUDA 8。哭了。并在下面保存一张与anaconda对应的版本表,以备后用。
按照安装完成时的提示进行卸载。要卸载CUDA Toolkit,请在/usr/local/cuda-11.1/bin中运行cuda-uninstaller。
可能卸载之后,还有一些残留的文件夹,可以一并删除。这次自动删除了。
sudo rm -rf /usr/local/cuda/
下载CUDA 8
运行run文件
开始安装之后,需要阅读说明,可以使用Ctrl + C
直接阅读完成,或者使用空格键
慢慢阅读。然后进行配置,我这里说明一下:
(是否同意条款,必须同意才能继续安装)
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 ...(开始安装)
安装完成之后,可以配置他们的环境变量,在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
使它生效。
可以使用命令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
安装补丁。先传到服务器:
安装Tensorflow
安装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
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)
另外,尝试以下解决方案:
解决办法:
- 修改系统环境变量 CUDA_VISIBLE_DEVICES=n (让cuda只能看到某个显卡,n为gpu编号。 gpu0 即n=0)参考
- 通过设定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)
参考- 可以尝试修改batch_size,减少同时进入显存的数据数量。减少显存占用。
查看当前的进程,发现一只有一个进程占据着4KM+的资源。
通过reboot结束进程释放内存看看效果:
程序运行成功!终于能跑通了。以防以后再出现这样的情况,通过设定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运行结果
重要参考
第一和第三部分主要参考了下面这篇文章。作者【已注销】:
Linux 下的 CUDA 安装和使用指南
其实首先参考的是下文,但遇到了比较难解决的问题。作者【Seehidre】:
Ubuntu 16.04系统中利用CUDA安装更新NVIDIA显卡驱动程序的方法
作者【pprp】:
NVIDIA 驱动安装(超详细)
参考了下文的环境变量配置。作者【苍术厚朴】:
Ubuntu 设置环境变量
挺好的一篇文章。作者【Lzpong】
在linux系统中安装VSCode(Visual Studio Code)
tensorflow入门(二)---tensorflow显存管理
还有其他未列出,或已在文中列出。