硬件配置:技嘉Turbo2 RTX3090+Ubuntu20.04LTS
安装显卡驱动
安装显卡驱动时**不要!!!!**选择长期支持版(455.23.04)
必须使用短期支持版(455.45.01)
wget https://us.download.nvidia.com/XFree86/Linux-x86_64/455.45.01/NVIDIA-Linux-x86_64-455.45.01.run
sudo sh NVIDIA-Linux-x86_64-455.45.01.run
可能会出现gcc、g++版本不一致问题导致驱动安装失败,可通过安装多个版本的gcc切换使用来解决这一问题
#首先通过正常安装命令安装自己需要的gcc、g++版本
sudo apt install gcc-10.2 g++-10.2
#将刚才安装的gcc、g++加入到alternatives中
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 100
#通过以下命令实现版本切换
sudo update-alternatives --config gcc
sudo update-alternatives --config g++
解决gcc、g++问题后安提示安装显卡驱动。下面禁用nouveau驱动。nouveau 是系统自带的一个显示驱动程序,需要先将其禁用,然后再进行下一步操作,否则在安装显卡驱动时,会提示:You appear to be running an X server …,然后安装失败。分别打开如下两个文件(如果没有就创建一个),并在其中输入如下两句,然后保存。
sudo vim /etc/modprobe.d/nvidia-installer-disable-nouveau.conf
sudo vim /lib/modprobe.d/nvidia-installer-disable-nouveau.conf
#将下面两句添加至文件中
blacklist nouveau
options nouveau modeset=0
安装cuda+cudnn
驱动成功安装后需要安装cuda(支持计算的框架)与cudnn(支持计算的库),与RTX3090适配的cuda为11及以上,因为截止目前最新的tensorflow-2.4.0对应cuda-11.0,所以我们安装cuda-11.0 。访问英伟达官网选择适合自己系统的版本,按照提示的命令进行下载
wget https://developer.download.nvidia.com/compute/cuda/11.2.0/local_installers/cuda_11.2.0_460.27.04_linux.run
sudo sh cuda_11.2.0_460.27.04_linux.run
执行安装命令时会出现选择安装组件的的多个选项,第一项为显卡驱动(上一步已安装),将[X]去掉,后几项可以全部选择,最后选择install。等待几十秒出现成功的界面。
环境变量!!环境变量!!环境变量!!
一定要注意有两个环境变量文件PATH
跟LD_LIBRARY_PATH
#打开环境变量配置文件
sudo vim /etc/profile
#添加下面两句
export PATH=/usr/local/cuda-版本号/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-版本号/lib64:$LD_LIBRARY_PATH
#退出后使用下面命令刷新环境变量
source /etc/profile
#输入下列命令如果可以看到cuda版本号则说明环境变量配置成功
nvcc -V
检测cuda与显卡驱动是否可以联动完成计算任务
#进入下面文件夹
cd /usr/local/cuda-版本号/samples/1_Utilities/deviceQuery
#使用make命令编译
sudo make
#执行
./deviceQuery
查看输出最后一行为PASS
说明运行通过。
下面安装cudnn8.0.2,需要使用英伟达账号在官网下载。
tar -zxvf cudnn-11.1-linux-x64-v8.0.2.39.tgz # 首先解压文件
sudo cp cuda/lib64/* /usr/local/cuda-11.0/lib64/ # 拷贝lib64下的配置文件
sudo cp cuda/include/* /usr/local/cuda-11.0/include/ # 拷贝include下的.h文件
sudo chmod a+r /usr/local/cuda-11.0/include/cudnn.h /usr/local/cuda-11.0/lib64/libcudnn*
检测cudnn是否安装成功,执行下列命令,有返回值说明成功。
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
安装docker
#使用 apt-get 进行安装
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
安装完成后测试docker是否可用,执行下面命令无报错,显示hello-world的字样表示docker成功安装。
sudo docker run hello-world
下面是一些常见的docker命令。
image,镜像,是一个个配置好的环境。 container,容器,是image的具体实例。 image和container的关系,相当于面向对象中类与对象的关系。
如何查询命令参数: docker
可以看docker客户端有那些基本命令; 对应每一条命令,想看看具体是做什么的,可以在后面加一个--help
查看具体用法,例如对于run命令: docker run --help
#创建某个镜像的容器。注意,同一个镜像可以通过这种方式创建任意多个container. 加上-it之后,可以创建之后,马上进入交互模式。
docker run [-it] some-image
#列出当前运行中的容器
docker ps
#列出所有容器
docker ps -a
#删除某个容器
docker rm [-f] container-id
#启动某个容器,必须是已经创建的。 加上-i 参数之后,可以直接进入交互模式
docker start [-i] container-id
#容器的停止、重启
docker stop container-id
docker restart container-id
进入交互模式后如何退出,分两种情况。
#想退出但是保持容器运行
CTRL+P+Q
#关闭容器并退出
CTRL+D 或 exit
安装nvidia-docker
# add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) #查询当前系统版本
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
检测安装是否成功
docker run --gpus all nvidia/cuda:11.0-base nvidia-smi
Pull镜像
Deepo 是一系列 Docker 镜像,它的主要特征有:
- 允许我们快速配置深度学习环境
- 支持几乎所有常见的深度学习框架
- 支持 GPU 加速(包括 CUDA 和 cuDNN), 同样在 CPU 中运行良好
- 支持 Linux(CPU 版和 GPU 版)、OS X(CPU 版)、Windows(CPU 版)
docker pull ufoym/deepo
现有deepo镜像没有适配cuda11.0的,所以需要自己制作镜像。
下载已有cuda11.0的镜像或者nvidia/cuda:11.0官方的镜像,下载后在里面安装对应版本的tensorflow跟常用的第三方包,然后把容器打包成镜像。
docker commit container-ID Image-name
上传镜像到自己的仓库
docker tag friendlyhello username/repository:tag
friendlyhello #为app的名称
username:你注册的docker的名字
repository:你建立的docker镜像的仓库
tag:应用打一个标记号,版本的变迁
#上传
docker push username/repository:tag
启动jupyter分配容器
#创建容器
sudo nvidia-docker run -it -p 7777:8888 --ipc=host -v /home/shcd/Documents/zjg:/zjg --name zjg-notebook 90be7604e476
OR
sudo docker run -it -p 7777:8888 --ipc=host -v /home/shcd/Documents/zjg:/zjg --name zjg-notebook 90be7604e476
其中: - -it
为直接进入交互式 - -p 7777:8888
是把主机的7777端口映射到容器的8888端口 - -ipc=host
可以让容器与主机共享内存 - 还可以加一个--name xxxxx
给容器定义一个个性化名字 - -v /home/shcd/Documents/zjg:/zjg
可以讲主机上的/home/shcd/Documents/zjg地址挂载到容器里,并命名为/data文件夹,这样这个文件夹的内容可以在容器和主机之间共享了。因为容器一旦关闭,容器中的所有改动都会清除,所以这样挂载一个地址可以吧容器内的数据保存到本地。 - 90be7604e476
则是你安装的jupyter镜像的id,可以在刚刚docker images命令后面查看,当然你也可以直接写全名ufoym/deepo:all-py36-jupyter
jupyter notebook --no-browser --ip=0.0.0.0 --port 8888 --allow-root --NotebookApp.token= --notebook-dir='/zjg'
其中: --no-browser
即不通过浏览器启动,--ip
指定容器的ip,--allow-root
允许root模型运行 --NotebookApp.token
可以指定jupyter
登录密码,可以为空 --notebook-dir='/gby'
指定jupyter
的根目录
未解决问题
因为目前只有一块显卡,显卡性能可以自动按需分配,但是显存只有24G无法按需分配,在使用时,需要在程序一开始添加下面三行代码!!!!
import tensorflow as tf
config = tf.compat.v1.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.25
session = tf.compat.v1.Session(config=config)
可以看到每人分配了25%,这意味着每个人只能开一个jupyter的代码标签页并设置为25%,或者开N个jupyter标签页自行分配25%,每个标签页设置为(25/N)%。
如果占用了过大的显存,程序运行时不仅不会快,还会把时间浪费在分配显存上,导致程序运行变慢。