首页 > 其他分享 >搭建yolov8模型训练的环境_制作docker镜像_模型训练

搭建yolov8模型训练的环境_制作docker镜像_模型训练

时间:2024-06-23 22:20:21浏览次数:3  
标签:容器 训练 模型 yolov8 https nvidia 镜像 docker

搭建一个能进行yolov8模型训练的环境,包括CUDA 11.x、cuDNN 8.x、Ubuntu 18.04、Python 3.8、Cython、NumPy、PyTorch、YOLOv8、Ultralytics等依赖(其实ultralytics 包会包含 YOLOv8 及其相关工具)。在 Docker 容器中,不需要创建虚拟环境,每个容器本身就像是一个隔离的环境,所以可以直接在 Dockerfile 中安装所需的依赖项。

一、主要步骤:

1.前提:宿主机安装了docker、nvidia-docker、显卡驱动

2.在docker的配置文件中配置镜像加速器

3.构建docker镜像

4.运行docker容器

5.验证容器内的环境

6.开始模型训练

7.模型推理验证

8.部署到Android端

二、详细内容:

1.验证宿主机安装了docker、nvidia-docker、显卡驱动

1.1宿主机为什么需要安装nvidia-docker

nvidia-docker 和 docker 都是用于容器化应用的工具,但它们的主要区别在于 nvidia-docker 支持 NVIDIA GPU 加速,可以让容器中的应用程序访问宿主机上的 GPU资源,从而提高应用程序的性能。而 docker 则是一个通用的容器化工具,不提供 GPU 加速功能。因此,如果需要在容器中运行需要 GPU 加速的应用程序,就需要使用nvidia-docker 来创建和管理容器。

nvidia-docker2.0对nvidia-docker1.0进行了很大的优化,不用再映射宿主机GPU驱动了,直接把宿主机的GPU运行时映射到容器即可,容器内无需安装gpu驱动和cuda了。

1.2查看服务器上是否安装了docker

docker -v

1.3查看服务器上是否安装了nvidia-docker

dpkg -l | grep nvidia-docker

 服务器上显示的这条内容代表宿主机已经安装了 nvidia-docker2dpkg -l 命令列出了所有已安装的.deb软件包,grep nvidia-docker 则是过滤出了含有 “nvidia-docker” 字段的条目。从输出中可以看到 nvidia-docker2 的版本为 2.14.0-1,这说明 nvidia-docker2 包已经安装且目前是最新版本。(nvidia-docker2 是 nvidia-docker 的新版本,提供了与NVIDIA容器工具集的集成。)

宿主机上安装了 nvidia-docker2 包之后,就可以在运行 Docker 容器时使用 NVIDIA GPU 了。nvidia-docker2 包包括 nvidia-container-toolkit,这是一个允许 Docker 容器访问宿主机上的 NVIDIA GPU 的工具。

1.4查看服务器安装了显卡驱动

在终端中输入nvidia-smi命令来查看GPU驱动版本

nvidia-smi

 

2.在docker的配置文件中配置镜像加速器

使用Docker镜像加速器可以更加稳定地下载镜像。通常拉取镜像失败,提示“构建 Docker 镜像时由于网络超时问题无法从 Docker 注册表中拉取基础镜像”。这通常是由于网络连接问题,特别是在中国大陆访问国外 Docker 镜像仓库时容易出现这种情况。

配置镜像加速器:编辑daemon.json

 在 Docker 守护进程配置文件中(通常是 /etc/docker/daemon.json

cd /etc/docker
sudo vim daemon.json

 

添加或修改以下内容:

{
       "registry-mirrors": [
              "https://registry.docker-cn.com",
                  "https://docker.mirrors.ustc.edu.cn",
                   "https://hub-mirror.c.163.com",
                   "https://mirror.baidubce.com",
                   "https://docker.m.daocloud.io",
                   "https://noohub.ru",
                   "https://huecker.io",
                   "https://dockerhub.timeweb.cloud"
       ],
       "runtimes": {
        "nvidia": {
            "args": [],
            "path": "/usr/bin/nvidia-container-runtime"
        }
    }
}

 

然后重启 Docker 服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

 

3.构建docker镜像 

(1)手动拉取镜像

有时候直接拉取镜像比通过 Dockerfile 构建更稳定。(我最开始没有手动拉取,而是直接通过dockerfile构建,但是失败了。所以还是选择先手动拉取基础镜像,然后再构建)

sudo docker pull nvidia/cuda:11.6.2-cudnn8-devel-ubuntu18.04

 

手动拉取镜像成功后,可以直接在 Dockerfile 中指定本地镜像,而无需再次从远程仓库拉取。(Dockerfile 中的命令保持不变。当构建 Docker 镜像时,如果本地已经存在指定的基础镜像,Docker 将自动使用本地镜像,而不会再次从远程仓库拉取。)

(2)创建一个app-yolov8文件夹

mkdia app-yolov8

(3)进入文件夹

cd app-yolov8

(4)创建Dockerfile文件

touch Dockerfile

(5)编辑Dockerfile

# 基础镜像,包含 CUDA 11.x 和 cuDNN 8.x
FROM nvidia/cuda:11.6.2-cudnn8-devel-ubuntu18.04

# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive

# 安装基本工具
RUN apt-get update && apt-get install -y \
    software-properties-common \
    curl \
    wget \
    git \
    vim \
    unzip \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

# 安装 Python 3.8
RUN add-apt-repository ppa:deadsnakes/ppa \
    && apt-get update \
    && apt-get install -y python3.8 python3.8-dev python3.8-distutils \
    && rm -rf /var/lib/apt/lists/*

# 设置 Python 3.8 为默认
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1 \
    && update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1

# 安装 pip 并更新到最新版本,同时配置使用清华源
RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.8 \
    && pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple


# 安装 Cython 和 NumPy
RUN pip install cython numpy

# 安装 PyTorch 2.0,并指定使用 CUDA 11.8,使用清华源
RUN pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 torchaudio==2.0.2 -f https://download.pytorch.org/whl/torch_stable.html # 安装 Ultralytics 和 YOLOv8,使用清华源 RUN pip install ultralytics # 设置工作目录 WORKDIR /home/jiafu/app-yolov8 # 复制代码 COPY . . # 建立日志 RUN mkdir log # 暴露端口 EXPOSE 19090 # 复制训练脚本到容器中 # 运行训练脚本 # 进入交互模式 CMD ["bash"]

上面dockerfile里的pytorch其实一开始不是这个版本,也是后面运行脚本和模型训练时,遇到了很多次报错后,找到的一个适配的2.0版本。

(解决:升级pytorch版本,1.9以后的大概就可以,官方推荐torch>=2.0.0版本,pytorch升级命令可查看Previous PyTorch Versions PyTorch 

 

(6)构建 Docker 镜像:

docker build -t yolov8-env .

 

 

4.运行docker容器

先启动容器,确保容器在运行,再进入容器

# docker run --gpus all --privileged -dti --name yolov8-rq -p 29090:19090 yolov8-env:latest  # 这句后来会报错,需要根据实际需求,增加共享内存大小
docker run --gpus all --privileged -dti --name yolov8-rq --shm-size=24g -p 29090:19090 yolov8-env:latest /bin/bash  # 指定了共享内存大小为24g
docker exec -it yolov8-rq bash 

#########注释
--gpus all:允许容器使用所有可用的 GPU。
--privileged:赋予容器扩展的权限。
-d:在后台运行容器(分离模式)。
-t:分配一个伪终端。
-i:保持标准输入打开。
--name yolov8-rq:为容器指定名称。
-p 29090:19090:端口映射。将主机的 29090 端口映射到容器的 19090 端口。
yolov8-env:latest:Docker 镜像及其标签。
bash:容器启动时调用可执行文件

 

启动容器:

进入容器:

 

接上面运行语句,当时模型训练中断,报错提示是:

Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/popen_fork.py", line 27, in poll
    pid, sts = os.waitpid(self.pid, flag)
  File "/usr/local/lib/python3.8/dist-packages/torch/utils/data/_utils/signal_handling.py", line 66, in handler
    _error_if_any_worker_fails()
RuntimeError: DataLoader worker (pid 4949) is killed by signal: Bus error. It is possible that dataloader's workers are out of shared memory. Please try to raise your shared memory limit.

使用free -h  系统将会以人类可读的格式显示当前的内存使用情况,包括总内存、已用内存、空闲内存等信息。

free -h

解决办法是把之前的容器停了,提交了新的镜像yolov8-env2,运行新的容器时增加共享内存大小。

 

5.验证容器内的环境

查看容器内的各种依赖和环境设置。按照下面的命令,一步一步的执行。

# 检查 Python 版本
python3 --version

# 检查 pip 版本
pip --version

# 列出所有已安装的 Python 包
pip list

# 检查特定包是否已安装
pip list | grep numpy
pip list | grep torch
pip list | grep ultralytics

# 检查 CUDA 版本
nvcc --version

# 检查 GPU 可用性
nvidia-smi

# 验证 ultralytics 库
python3 -c "import ultralytics; print(ultralytics.__version__)"

 

或者写个脚本,通过运行Python 代码来验证 CUDA 和 GPU 可用性:

import torch

print(torch.__version__)
print(torch.version.cuda)

# 检查CUDA是否可用
print("CUDA available:", torch.cuda.is_available())

# 打印可用的GPU设备数
print("Number of GPUs available:", torch.cuda.device_count())

# 打印每个GPU设备的信息
for i in range(torch.cuda.device_count()):
    print(f"GPU {i}: {torch.cuda.get_device_name(i)}")

执行情况:

 

6.开始模型训练

 运行命令:

yolo task=detect mode=train model=yolov8n.pt data=config.yaml  batch=16 epochs=400  imgsz=640 workers=16

一开始执行的batch为32,但是后来训练到中间时出现出错,所以将batch改为了16。

最后训练结束情况:

 这里面有段话是这样的:EarlyStopping: Training stopped early as no improvement observed in last 100 epochs. Best results observed at epoch 94, best model saved as best.pt. To update EarlyStopping(patience=100) pass a new patience value, i.e. `patience=300` or use `patience=0` to disable EarlyStopping. 194 epochs completed in 2.883 hours. Optimizer stripped from runs/detect/train10/weights/last.pt, 6.2MB Optimizer stripped from runs/detect/train10/weights/best.pt, 6.2MB

这段信息是关于使用了早停法(EarlyStopping)的深度学习训练过程中的一些关键事件的描述。早停法是一种常用的技术,用于防止模型过拟合,通过在验证集上的性能不再提升时停止训练。表明训练提前结束了,在第 94 轮训练时观察到了最佳性能,并且该轮的最佳模型已被保存为 best.pt 文件。

 

查看模型文件:因为在过去的 100 轮中没有观察到性能的提升,最佳模型在第 94 轮被保存。

 

7.模型推理验证

yolo task=detect mode=val model=runs/detect/train9/weights/best.pt data=config.yaml  batch=4

 

 

8.部署到Android端

yolov8模型训练之后,默认得到的文件格式为pt后缀,先将pt文件转换为onnx格式,再onnx文件再转换为ncnn文件。可查看下面博客的操作流程:

https://blog.csdn.net/qq_45955154/article/details/135344226?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-135344226-blog-133586307.235^v43^control&spm=1001.2101.3001.4242.1&utm_relevant_index=3

 

 

 

参考:

1.docker中使用gpu    https://blog.csdn.net/qq_42152032/article/details/131342043

2.GPU驱动、CUDA和cuDNN之间的版本匹配与下载  https://blog.csdn.net/eastking0530/article/details/126571601

3.确定与GPU驱动匹配的CUDA版本 https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html

4.docker凉了,国内镜像站全军覆没!https://mp.weixin.qq.com/s/YBoxpp6XPZhw-adaZBBUGA  

5.模型导出Ultralytics YOLO https://docs.ultralytics.com/zh/modes/export/

 

标签:容器,训练,模型,yolov8,https,nvidia,镜像,docker
From: https://www.cnblogs.com/tully/p/18260424

相关文章

  • YoloV8改进策略:注意力篇|自研基于xLSTM的注意力(全网首发)
    文章目录摘要论文:《Vision-LSTM:xLSTM作为通用视觉主干》1、引言2、方法3、实验3.1分类设计4、结论致谢A.扩展结果A.1ViL与Vim的运行时间比较A.2更长训练时间的影响B.实现细节B.1硬件B.2FLOPS计算B.3ViL超参数B.4、DeiT-III重新实现的超参数测试结果......
  • Vienna 整流器的基本原理及数学模型
    2.1Vienna整流器基本工作原理2.1.1主电路拓扑结构分析Vienna整流器系统的主电路包含用于升压的三相电感、三相桥臂和两个直流侧均压电容。通过有规律的对双向开关进行控制不仅能实现功率双向流动,还能使网侧电流时刻跟踪电网电压,使系统运行在高功率因数状态下。拓扑如图2......
  • AI 大模型企业应用实战(07)-LangChain的Hello World项目
    pipinstall--upgradelangchain==0.0.279-ihttps://pypi.org/simple1创建一个LLM自有算力平台+开源大模型(需要有庞大的GPU资源)企业自己训练数据第三方大模型API(openai/百度文心/阿里通义千问...)数据无所谓让LLM给孩子起具有中国特色的名字。在LangChain中最基本的功......
  • AI 大模型企业应用实战(06)-初识LangChain
    LLM大模型与AI应用的粘合剂。1langchain是什么以及发展过程LangChain是一个开源框架,旨在简化使用大型语言模型构建端到端应用程序的过程,也是ReAct(reason+act)论文的落地实现。2022年10月25日开源54K+star种子轮一周1000万美金,A轮2500万美金11个月里累计发布200多次,提交4......
  • 项目训练营第四天
    项目训练营第四天前端部分修改前端用的是WebStorm和AntDesignPro框架AntDesignPro是比较流行的一个前端登陆、注册、管理框架,能帮我们快速实现前端界面的开发效果大致如图使用起来也极为方便,首先在WebStorm控制台中输入如下命令#使用npmnpmi@ant-design/......
  • 项目训练营第三天
    项目训练营第三天注册登录测试前面我们编写了用户注册、登录的逻辑代码,每编写完一个功能模块之后,我们都要对该模块进行单元测试,来确保该功能模块的正确性。一般情况下使用快捷键Ctrl+Shift+Insert,鼠标左击类名可以自动生成测试类,我们可以在测试类中编写一些逻辑进行测......
  • 算法训练营第六十七天 | 卡码网110 字符串接龙、卡码网105 有向图的完全可达性、卡码
    卡码网110字符串接龙这题一开始用的邻接表+dfs,不幸超时#include<iostream>#include<list>#include<string>#include<vector>usingnamespacestd;intminLen=501;boolcount(stringa,stringb){intnum=0;for(inti=0;i<a.lengt......
  • javascript浏览器对象模型
    BOM对象:BOM是浏览器对象模型的简称。JavaScript将整个浏览器窗口按照实现的功能不同拆分成若干个对象;包含:window对象、history对象、location对象和document对象等window对象:常用方法:1.prompt();显示可提示用户输入的对话框window.prompt("请输入您的名字");返......
  • 【Matlab】CNN-LSTM分类 卷积神经网络-长短期记忆神经网络组合模型(附代码)
     资源下载: https://download.csdn.net/download/vvoennvv/89466499分类算法资源合集:https://download.csdn.net/download/vvoennvv/89466519目录MatlabSVM支持向量机分类算法MatlabRF随机森林分类算法MatlabRBF径向基神经网络分类算法MatlabPSO-BP基于粒子群算法......
  • 【06】数据模型和工作量证明-工作量证明
    1.工作量证明的背景比特币是通过工作量证明来竞争记账权,并获得比特币奖励。简单来讲就是谁能够根据区块数据更快的计算得到满足条件的哈希值,谁就可以胜出,这个块才会被添加到区块链中。我们把这个过程称为挖矿。比特币每10分钟产生1个区块。2.工作量证明算法1.获取区块头......