Darknet和YOLO的区别和关系
首先说明下:在人工智能领域的两个大的概念,深度学习训练框架、神经网络模型。
训练框架我的理解是用于构建神经网络模型的工具,提供基础的模型组件(如卷积层、池化层)和优化算法(如梯度下降等)来帮助工程师构建算法模型。框架本身没有实现具体的深度学习算法。
在人工智能领域,我们常说的算法模型,我的理解就是神经网络模型。他们表达的含义是一样的。
另外我们常说的模型比如OCR文字识别模型、人脸识别模型、包括现在很火的大语言模型。这些在人们口中经常被提及的模型,我的理解是基于神经网络模型(通俗的说就是算法模型)+训练框架(如darknet、tensorflow,pytorch,caffe,mxnet等)+数据集。通过大量的计算训练(通俗的来说就是模型训练)得到的最终能够满足人们需求产物。所以这里的模型和算法模型完全不是一个概念。
基于以上概念:Darknet其实就是一个深度学习的训练框架、yolo是目标检测领域比较优秀的神经网络模型(算法模型)。
所以本文的目的就是介绍如何基于darknet+yolo训练自己的模型。
在详细介绍之前再说明下:为什么会是darknet+yolo。首先yolo是目标检测比较优秀的网络模型,另外yolo的最初版本是作者本人使用自己研发的darknet深度学习框架编写的,也就是说yolo和darknet的作者本来就是同一个人。所以它们两组合使用是非常方便简单的,作为一个模型训练的入门教程可以说是非常合适。
1. nvidia显卡驱动以及CUDA安装
个人认为显卡驱动的安装是最复杂的事情。
显卡型号检查
首先通过命令行查看机器显卡环境
lspci | grep -i nvidia
[root@node10 ~]# lspci | grep -i nvidia
3b:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
86:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
af:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
如果运行提示lspci命令不存在。请自行百度lspci的安装。注意操作系统不同,安装命令有区别。
如上所示,服务器显卡代号:1eb8
在http://pci-ids.ucw.cz/mods/PC/10de?action=help?help=pci
可以查看显卡型号
输入1eb8查看得到显卡对应的Tesla T4
接下来就可以去nvidia官网下载驱动安装脚本文件。
Linux的kernel内核检查
驱动安装涉及到Linux的kernel内核。并且驱动的安装和kernel内核版本有很强的关系
具体可以查看nvidia官网的资料,因为都是英文,看起来比较费劲
nvidia驱动安装手册
下图是官网提供的各操作系统版本和Linux内核的匹配关系。
注意如果操作系统是centos7.X版本的话,kernel不能过高,不过我本人验证过,centos7的kernel版本4.X.X也能安装成功。5.X.X就不行,为此还废了不少时间。建议还是按照官网的手册来吧。
查看当前内核
[root@node10 ~]# uname -r
4.4.230-1.el7.elrepo.x86_64
如果内核过低可能需要升级内核。具体内核如何升级,最简单的方式其实就去官网下载对应的包
linux内核下载
注意版本以及不要选错了
内核具体安装自行百度吧,内核确认升级完成后,就可以安装显卡驱动了。
驱动安装
驱动安装还是要看官网的安装手册。虽然是英文,但是还是要认真仔细的阅读
nvidia驱动安装手册
从教程来看,驱动安装分多种方式,第一种最简单基于官网提供的run脚本安装。run脚本下载的地址
方法1:CUDA Runfile
cuda安装下载地址
注意:下载地址其实是cuda的下载地址,因为脚本中包含驱动程序的安装,安装过程中会让你选择是否安装驱动程序,或者只安装cuda。所以基于脚本安装是最简单快速的,而且还顺带帮你把cuda和驱动程序都安装好了。
下载完成执行脚本
sh cuda_<release>_<version>_linux.run
注意安装的时候会有交互,需要人工选择安装的内容,如官网所说run脚本安装会包含cuda和driver,并且用户可以选择安装。
centos7安装
因为run脚本centos只有8以上版本,所以没有尝试采用run脚本安装。按照官网的说明执行脚本:
sudo yum install kmod-nvidia-open-dkms
sudo yum install nvidia-driver-latest-dkms
sudo yum install cuda-drivers
其他操作系统安装
没有验证过,不过可以查阅官网的文档,在文档中
建议还是通过RUN脚本安装。以上安装仅安装了驱动和CUDA,在训练模型的时候很多框架都会用到CDNN加速器,比如本文中提到的Darknet框架就需要使用CUDNN加速器。
2. CUDA安装
在上一章节中其实安装显卡驱动的时候基本上都会安装CUDA,本章节不在详细说明
3. CUDNN加速器安装
[CUDNN下载地址](https://developer.nvidia.com/cudnn-archive)
CUDNN安装只需要下载并把文件复制到对应的目录即可。
CUDNN加速器官网
文档以及下载地址都在途中,下载地址进去后注意如果想下载历史版本,也有链接。
安装教程其实有两种方式:
-
按照官网执行安装命令
-
下载包解压复制到cuda的安装目录
因为一开始没有认真查阅官方资料,所以我采用的是网上的教程,下载包然后解压复制到对应的目录
[root@node10 ~]# cd /usr/local/
[root@node10 local]# ls
bin cuda cuda-12 cuda-12.4 etc games include lib lib64 libexec nginx-1.18.0 sbin share src
以上是我CUDA的安装目录,在前面的安装驱动时都会自动安装CUDA
一般我们只需要将CUDNN软件包复制到当前系统安装的CUDA版本文件夹下即可,如cuda-12.4。cuda目录是通过cuda-12.4创建的软链
tar cudnn-10.1-linux-x64-v8.0.4.30.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda-10.2/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-10.2/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
通过以下命令可以查看CUDA以及CUDNN版本
#查看kuda版本
[root@node10 local]# nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Thu_Mar_28_02:18:24_PDT_2024
Cuda compilation tools, release 12.4, V12.4.131
Build cuda_12.4.r12.4/compiler.34097967_0
#查看CUDNN版本
[root@node10 local]# cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
#define CUDNN_MAJOR 9
#define CUDNN_MINOR 1
#define CUDNN_PATCHLEVEL 1
--
#define CUDNN_VERSION (CUDNN_MAJOR * 10000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)
/* cannot use constexpr here since this is a C-only file */
至此物理环境上的GPU环境都已经全部安装完成,如果是在GPU物理机上做训练等工作,那么就不需要安装其他的资源了。
云原生环境GPU插件安装
但是一般在真实的环境中,我们训练模型一般都会使用docker或者k8s来训练。所以除了以上基础的环境外。还需要额外安装以下环境
-
nvidia-container-toolkits或者nvidia docker2
nvidia-container-toolkits或者nvidia docker2是为了在dockers容器中能使用GPU资源。 -
nvidia-device-plugin
nvidia-device-plugin是用于k8s能对集群节点的GPU资源进行调度
如果是K8S以上两者都需要安装,如果是dockers只需要安装第一点即可。另外
建议安装nvidia-container-toolkits而不是nvidia docker2。
说明:看到这的话,我们在思考下,如果我们的模型训练等任务是在Docker中跑的话,也就是说CUDA以及CUDNN其实也要在Docker镜像中准备好,意味着宿主机上其实是不需要CUDA以及CUDNN环境的,只需要显卡驱动程序即可。
至于具备CUDA以及CUDNN的Docker镜像可以去hub.docker上找。
CUDA的docker镜像
nvidia-container-toolkits安装
安装教程具体还是看官网手册,具体分安装和配置,安装有分了apt安装和yum安装,针对不同的操作系统查看对应的安装手册即可
nvidia-container-toolkits安装手册
下图是官网的yum安装命令
下图是官网的配置命令
安装配置完成后可以查看下docker的配置文件
{
"exec-opts": [
"native.cgroupdriver=systemd"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
}
}
应该或多出default-runtime和runtimes两项配置,如果没有该两项配置,可以手动补充该配置。
完成后,重启下Docker
systemctl restart docker
完成以上操作后,在Docker中中就可以使用GPU资源了。根据官网教程,还需要在配置下K8S的配置
配置完成后,配置文件应该也会多出一些配置项,如果没有的话,需要手动配置下
cat /etc/containerd/config.toml
disabled_plugins = ["cri"]
version = 1
[plugins]
[plugins.cri]
[plugins.cri.containerd]
default_runtime_name = "nvidia"
[plugins.cri.containerd.runtimes]
[plugins.cri.containerd.runtimes.nvidia]
privileged_without_host_devices = false
runtime_engine = ""
runtime_root = ""
runtime_type = "io.containerd.runc.v2"
[plugins.cri.containerd.runtimes.nvidia.options]
BinaryName = "/usr/bin/nvidia-container-runtime"
Runtime = "/usr/bin/nvidia-container-runtime"
nvidia-device-plugin安装
官网的手册都是采用helm安装的,个人对helm不是特别清楚,感觉又饶了一下。所以没有按照官网手册安装。其实按照很简单,就是在k8s集群上部署一个资源
kubectl apply -f nvidia-device-plugin.yml
nvidia-device-plugin.yml文件可以直接去github上下载
安装完成后查看下资源状态,而且需要查看下对应的POD日志,确保日志中提示能检测到GPU信息
[root@master ~]# kubectl get pod -n kube-system | grep nvidia
nvidia-device-plugin-daemonset-b7m9b 1/1 Running 0 2d22h
nvidia-device-plugin-daemonset-h877d 1/1 Running 0 2d22h
nvidia-device-plugin-daemonset-qj4fr 1/1 Running 0 2d22h
nvidia-device-plugin-daemonset-s849p 1/1 Running 1 2d22h
最后在创建一个POD来验证下容器中是否能运行nvidia-smi,创建的POD对应的cuda-vectoradd.yaml文件如下
apiVersion: v1
kind: Pod
metadata:
name: cuda-vectoradd
spec:
restartPolicy: OnFailure
containers:
- name: cuda-vectoradd
image: "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.7.1-ubuntu20.04"
resources:
limits:
nvidia.com/gpu: 1
执行 kubectl apply -f cuda-vectoradd.yaml
kubectl apply -f cuda-vectoradd.yaml
至此物理机环境、docker环境、k8s环境都支持使用GPU资源了。接下啦就要准备基于Darknet来训练一个模型了。
Darknet容器镜像制作
Darknet的镜像制作还是很简单的,因为源码库中直接提供了Dockerfile文件。
下载Darknet源码库
https://github.com/AlexeyAB/darknet.git
通过git clone下来后,目录结构如下
FROM nvidia/cuda:11.6.0-cudnn8-devel-ubuntu20.04 AS builder
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -y
RUN apt-get install -y g++ make pkg-config libopencv-dev
COPY . /darknet
WORKDIR /darknet
RUN rm Dockerfile.cpu
RUN rm Dockerfile.gpu
RUN rm docker-compose.yml
RUN make
FROM nvidia/cuda:11.6.1-cudnn8-devel-ubuntu20.04
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -y
RUN apt-get install -y sudo libgomp1
RUN useradd -U -m yolo
RUN usermod -aG sudo yolo
RUN usermod --shell /bin/bash yolo
RUN echo "yolo:yolo" | chpasswd
COPY --from=builder /darknet /home/yolo/darknet
RUN cp /home/yolo/darknet/libdarknet.so /usr/local/lib/libdarknet.so || echo "libso not used"
RUN cp /home/yolo/darknet/include/darknet.h /usr/local/include/darknet.h
RUN ldconfig
WORKDIR /home/yolo/darknet
USER yolo
看下Dockerfile内容,其实就明白了镜像的整个制作过程,我们会发现其实源镜像就是nvidia的cuda镜像,我们需要确认cuda的镜像版本,可能需要修改下。
我记得之前的有一个darknet的源码不支持CUDNN8以及以上版本,如果你使用的CUDA版本过高,darknet编译会失败,所以需要根据实际情况选择源镜像版本。
此外在制作镜像版本时,我们也可以把需要训练的数据集、与训练模型权重文件等资料准备好一起打包到镜像中。
如下图所示,我直接将数据以及权重文件都复制到了源码根目录,这样构建镜像时就会把数据集以及权重文件都复制到镜像中。
运行镜像后,在容器中执行命令,就可以训练模型了,注意通过docker run 创建容器时,需要带上参数指定GPU资源。
#执行训练脚本
./darknet detector train ./coco/cocos/coco.data ./coco/cocos/my_yolov4.cfg yolov4.conv.137 -dont_show -gpu 0
训练过程中仔细看日志的开头部分,会有提示,如果提示is not use gpu。那么需要检查下整个过程,确保以下几点
- darknet在编译的时候确保Makefile配置文件中开启了GPU以及CUDNN
- 确保docker容器创建的时候分配的GPU资源
- 确保训练命令指定了gpu参数
下图是我训练的最终日志截图
训练开始的部分日志
训练过程中的日志
好了,证过过程到此结束
本人纯属AI小白,仅以此文章作为对模型训练感兴趣的同学作为入门教程。
另外补充一句最近体会特别深刻的总结
知识是需要反复的看,才能真正理解。可能积累到一定程度就懂了。不要觉得你看了一些资料就认为自己是专家了,真正的知识是需要反复的阅读,不断的重复。也许当年写的笔记,后面要反反复复的修改,整个过程中你会有新的体会,也会发现也许原来的认知根本就是错的。