深度学习第一步,搭配环境第一步,准备数据第二步,训练第三步,推理第四步~~
好吧这只是偏执的观念,但是真正想做深度学习还是得先从跑通 demo 开始的,比如当时毕设就是寒假的时候用 Yolov5 开始的,然后又是搭配 Yolov4、Yolov3。多模型的比较,当然,yolo(you look only once)是目标检测中的一种一阶算法,而后续要做的 extraction 是语义分割的一种,但是我导说可以用现成的算法做。问了做过的学长,用的是 Mask-RCNN,读论文用过的多是 U-Net。
所谓语义分割,就是基于像素尺度的图像分割,像遥感的分类,实际上就是基于语义的,之前听的讲座道路提取其实就是语义分割。而像飞机目标检测、遥感的风电场、火灾检测是目标检测(实例)的一种。
BB 的前言基础有点多了,但是还有一件最重要的事情没讲,那就是 GPU 和 CPU 运行时,GPU 运行时的推理训练时间能是 CPU 的几倍甚至是几十倍(虽然我自己没试过),但是入坑就是 GPU。 CPU 环境好配,直接无脑 pip
即可,但是效率低。而 GPU 的运行环境配置很麻烦,除了基础的 Python 还有 CUDA、CUDNN 各种搭配,且配起来很复杂,第一次搭很容易失败而且,搭一次很可能要一周甚至半个月,直接气吐血, CSDN 上的各种说不清楚,还是自己看官方的 doc 更好点。
CUDA 是英伟达提供的显卡并行计算的类似驱动的东西,在做深度学习的时候需要严格对应版本,CUDNN 是专门用于神经网络加速的,现在的 DL 其实就是所谓的神经网络再叠 attention、tranfomer…要么在数据前面增强增强,做点强化,要么在 backbone 魔改,改到面目全非,要么就是在后期的 Loss 修改,真正的大牛都是在从数学层面下功夫,菜鸡只配搬砖调库(曹)。
由于之前毕设做了个 Yolov5 也是自己慢慢搭的,这次回顾了一下,半天就搭完了(科学上网万岁)。一般的这些框架会给你写好 requirements.txt
,直接 pip install -r requirements.txt
即可。
我想搭 Yolov5(轻量)和 Mask-RCNN ,Yolov5 要求的 pytorch>1.7.0
,而 Mask-RCNN 要求的 tensorflow>=1.3.0
,所以找到了 pytorch=1.7.1
,tensorflow=2.4.0
,对应的 CUDA 为 11.0,CUDNN 为 8.0.这两个是比较成熟的机器学习的基础框架,但是要严格对应 CUDA 和 CUDNN 的版本。
在 https://developer.nvidia.com/cuda-toolkit-archive 这里面找到需要对应的版本,然后选择选择自己的系统,我用 Ubuntu,就傻点对应的系统即可。
在科学上网的情况下,按照下面的指示无脑安装就可以了
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda-repo-ubuntu1804-11-1-local_11.1.0-455.23.05-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-11-1-local_11.1.0-455.23.05-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu1804-11-1-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda
当然需要自己去对应自己需要的版本,按照指令完成安装之后需要重启一次系统,否则会告诉你 NVIDIA failure .重启后 nvidia-smi
检查一下是否安装上。可以看到CUDA Version=11.0
。
当然如果用 nvcc -V
还是检查不到,需要用 vim 去导出一下 path。这一步相当于 windows 中常用的添加环境变量…
(在有 vim 的情况下)打开终端,输入 vim .bashrc
,先按 i
进入 insert 模式,然后在最后两行加入:
export PATH="/usr/local/cuda-11.0/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-11.0/lib64:$LD_LIBRARY_PATH"
输入完成后先按 esc
然后打个 (冒号),然后 wq
write and quit 保存并且退出,然后需要刷新一下 bashrc,即:source .bashrc
. 然后打开终端输入 nvcc -V
检查 CUDA 的版本
CUDA 安装完成,奔赴 CUDNN 的安装。
CUDNN 有特别简单的安装方式,直接从英伟达官网下拉下 Library 即可https://developer.nvidia.com/rdp/cudnn-archive,下完后用 tar zxvf cudnn-11.0-linux-x64-v8.0.5.39.tgz
解压文件夹,然后会解压出一个 cuda 文件夹,然后在 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
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
最后用 cat cuda/include/cudnn_version.h |grep ^#
命令检查 CUDNN 是否安装成功,这种方法无法用自带的 sample 程序检测。
所谓的 cuda 前的根目录是指,比如 cuda 文件夹,你输入 ls
之后有 cuda
这个文件夹(会点Linux就能明白的那种)。
先在 CUDNN 官网是把 runtime、dev、code_samples
拉下来,然后一个一个 dpkg
,
sudo dpkg -i libcudnn8_8.0.5.39-1+cuda11.0_amd64.deb
sudo dpkg -i libcudnn8-dev_8.0.5.39-1+cuda11.0_amd64.deb
sudo dpkg -i libcudnn8-samples_8.0.5.39-1+cuda11.0_amd64.deb
用 vim 导出路径
export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-11.0/bin:$PATH
然后再刷新一次环境变量.
source ~/.bashrc
cd 进入 usr/src
中的 samples 代码,首先 clean 然后运行程序。
cd /usr/src/cudnn_samples_v8/mnistCUDNN/
make clean && make
./mnistCUDNN
最好,用 cp
的命令复制下,然后再编译,然后CUDNN 就装完了。
由于这台电脑刚刚装上 Ubuntu,所以就先装下 github,方便我后续拉下项目以及存储自己的代码,终端先
sudo apt-get install git
git config --global user.name"balalala"
git config --global user.email"balalala"
然后用 conda create -n yolov5 python=x.x.x
创建一个虚拟环境专门 Yolov5 的环境。
创建完成后用 conda activate yolov5
激活这个虚拟环境,就当做虚拟的容器一样,里面装着各种各样的 Python 的 packages。
之后,重要的一步就是要装 pytorch
了
conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=11.0 -c pytorch
前面我已经阐述过为什么要装 pytorch=1.7.1
的版本了,如果不能科学上网的话,则需要慢慢来,挺慢的,要么去镜像源下载,具体的自己度娘吧,不多 BB 了。
装完之后随便找个地方 clone
下 yolov5 的源代码,比如我放在我的桌面下:
cd ~
cd Desktop
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
耐心等待,检查所有的 packages 是否安装完成,完成后,作者加了 detect
后若没检测到 yolov5s.pt 的话会自动下载,就让他自己下载即可。然后检测图片.
python detect.py --weight yolov5s.pt
出现下面的东西说明完结撒花了(写的我累死了,后面还要搭 Mask-RCNN)。
说明 CUDA、CUDNN 环境完全正确,Yolov5 的环境也没问题,真正的完结撒花了。