搭建GPU环境、基于darknet+yolo深度学习框架训练自己的目标检测模型,模型训练入门详细教程

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
可以查看显卡型号
image.png
输入1eb8查看得到显卡对应的Tesla T4
image.png
接下来就可以去nvidia官网下载驱动安装脚本文件。

Linux的kernel内核检查

驱动安装涉及到Linux的kernel内核。并且驱动的安装和kernel内核版本有很强的关系

具体可以查看nvidia官网的资料,因为都是英文,看起来比较费劲
nvidia驱动安装手册

下图是官网提供的各操作系统版本和Linux内核的匹配关系。
image.png

注意如果操作系统是centos7.X版本的话,kernel不能过高,不过我本人验证过,centos7的kernel版本4.X.X也能安装成功。5.X.X就不行,为此还废了不少时间。建议还是按照官网的手册来吧。

查看当前内核

[root@node10 ~]# uname -r
4.4.230-1.el7.elrepo.x86_64

如果内核过低可能需要升级内核。具体内核如何升级,最简单的方式其实就去官网下载对应的包
linux内核下载
注意版本以及不要选错了
image.png

内核具体安装自行百度吧,内核确认升级完成后,就可以安装显卡驱动了。

驱动安装

驱动安装还是要看官网的安装手册。虽然是英文,但是还是要认真仔细的阅读
nvidia驱动安装手册

从教程来看,驱动安装分多种方式,第一种最简单基于官网提供的run脚本安装。run脚本下载的地址

方法1:CUDA Runfile

cuda安装下载地址
注意:下载地址其实是cuda的下载地址,因为脚本中包含驱动程序的安装,安装过程中会让你选择是否安装驱动程序,或者只安装cuda。所以基于脚本安装是最简单快速的,而且还顺带帮你把cuda和驱动程序都安装好了。
image.png

下载完成执行脚本

sh cuda_<release>_<version>_linux.run

注意安装的时候会有交互,需要人工选择安装的内容,如官网所说run脚本安装会包含cuda和driver,并且用户可以选择安装。
image.png

centos7安装

因为run脚本centos只有8以上版本,所以没有尝试采用run脚本安装。按照官网的说明执行脚本:

sudo yum install kmod-nvidia-open-dkms
sudo yum install nvidia-driver-latest-dkms
sudo yum install cuda-drivers

其他操作系统安装

没有验证过,不过可以查阅官网的文档,在文档中
image.png

建议还是通过RUN脚本安装。以上安装仅安装了驱动和CUDA,在训练模型的时候很多框架都会用到CDNN加速器,比如本文中提到的Darknet框架就需要使用CUDNN加速器。

2. CUDA安装

CUDA下载地址

在上一章节中其实安装显卡驱动的时候基本上都会安装CUDA,本章节不在详细说明

3. CUDNN加速器安装

[CUDNN下载地址](https://developer.nvidia.com/cudnn-archive)
CUDNN安装只需要下载并把文件复制到对应的目录即可。

CUDNN加速器官网
文档以及下载地址都在途中,下载地址进去后注意如果想下载历史版本,也有链接。
image.png

安装教程其实有两种方式:

  1. 按照官网执行安装命令
    image.png

  2. 下载包解压复制到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来训练。所以除了以上基础的环境外。还需要额外安装以下环境

  1. nvidia-container-toolkits或者nvidia docker2
    nvidia-container-toolkits或者nvidia docker2是为了在dockers容器中能使用GPU资源。

  2. 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安装命令
image.png

下图是官网的配置命令
image.png

安装配置完成后可以查看下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的配置

1716519399313.png

配置完成后,配置文件应该也会多出一些配置项,如果没有的话,需要手动配置下

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上下载

nvidia-device-plugin下载地址

image.png
安装完成后查看下资源状态,而且需要查看下对应的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源码库

源码库github地址

https://github.com/AlexeyAB/darknet.git

通过git clone下来后,目录结构如下
image.png

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编译会失败,所以需要根据实际情况选择源镜像版本。

此外在制作镜像版本时,我们也可以把需要训练的数据集、与训练模型权重文件等资料准备好一起打包到镜像中。
如下图所示,我直接将数据以及权重文件都复制到了源码根目录,这样构建镜像时就会把数据集以及权重文件都复制到镜像中。

image.png

运行镜像后,在容器中执行命令,就可以训练模型了,注意通过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。那么需要检查下整个过程,确保以下几点

  1. darknet在编译的时候确保Makefile配置文件中开启了GPU以及CUDNN
  2. 确保docker容器创建的时候分配的GPU资源
  3. 确保训练命令指定了gpu参数

下图是我训练的最终日志截图

训练开始的部分日志
image.png

训练过程中的日志
image.png

好了,证过过程到此结束

本人纯属AI小白,仅以此文章作为对模型训练感兴趣的同学作为入门教程。

另外补充一句最近体会特别深刻的总结

知识是需要反复的看,才能真正理解。可能积累到一定程度就懂了。不要觉得你看了一些资料就认为自己是专家了,真正的知识是需要反复的阅读,不断的重复。也许当年写的笔记,后面要反反复复的修改,整个过程中你会有新的体会,也会发现也许原来的认知根本就是错的。

评论

公众号:mumuser

企鹅群:932154986

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×