[嵌入式AI从0开始到入土]8_在线Gpu环境训练(基于启智ai协作平台)

[嵌入式AI从0开始到入土]嵌入式AI系列教程

注:等我摸完鱼再把链接补上
可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。

第1期 昇腾Altas 200 DK上手
第2期 下载昇腾案例并运行
第3期 官方模型适配工具使用
第4期 炼丹炉的搭建(基于Ubuntu23.04 Desktop)
第5期 炼丹炉的搭建(基于wsl2_Ubuntu22.04)
第6期 Ubuntu远程桌面配置
第7期 下载yolo源码及样例运行验证
第8期 在线Gpu环境训练(基于启智ai协作平台)
第9期 转化为昇腾支持的om离线模型
第10期 jupyter lab的使用
第11期 yolov5在昇腾上推理
第12期 yolov5在昇腾上应用
第13期_orangepi aipro开箱测评
第14期 orangepi_aipro小修补含yolov7多线程案例
未完待续…


文章目录

  • [嵌入式AI从0开始到入土]嵌入式AI系列教程
  • 前言
  • 一、注册
  • 二、导入项目
  • 三、修改代码适配在线环境
    • 1、下载预训练模型
    • 2、上传模型
    • 3、下载数据集
    • 4、修改数据集
    • 5、上传数据集
  • 四、编写启动文件
    • 1、修改train.py
    • 2、单独启动文件
  • 五、创建调试任务
    • 1、路径说明
    • 2、创建任务
    • 3、开始调试
    • 4、导出镜像
  • 六、创建训练任务
    • 1、路径说明
    • 2、创建任务
    • 3、开始训练
    • 4、下载训练结果
  • 问题
    • 1、无法解压代码
  • 总结


前言

当前启智平台每天能够稳定白嫖5个小时Nvidia T4、5小时ascend 910或者其他算力。

一、注册

点击这里进入注册链接。
在这里插入图片描述
填写相关信息,完成注册。

二、导入项目

在首页右上角选择迁移外部项目。
在这里插入图片描述
如下图所示,填写相关信息

  • url:https://github.com/ultralytics/yolov5.git
  • 迁移类型:因为我们要做修改,因此不勾选
    在这里插入图片描述
    点击迁移,耐心等待迁移结束。

三、修改代码适配在线环境

1、下载预训练模型

平台访问github有一定几率失败,因此我们需要提前上传。
我个人使用的是yolov5s的预训练模型,这里贴出下载地址:https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5s.pt
其他几个模型只需要将yolov5s的s修改为n,s,m,l,x,n6,s,6,m6,l6,x6即可。老规矩,下不动丢迅雷。
区别如下:
在这里插入图片描述

2、上传模型

因为我目前只用yolov5s,且模型不大,因此我将其上传到仓库的models文件夹内了。
其他模型请按如下步骤上传
在这里插入图片描述
如果是你自己的模型,可以设置为私有
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、下载数据集

这里使用coco128数据集做演示。
下载地址:https://ultralytics.com/assets/coco128.zip

4、修改数据集

为方便接下来的操作,请将数据集调整到这样
在这里插入图片描述
coco128.yaml内设置好相关信息,以下仅供参考

# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# COCO128 dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics
# Example usage: python train.py --data coco128.yaml
# parent
# ├── yolov5
# └── datasets
#     └── coco128  ← downloads here (7 MB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco128 # dataset root dir
train: images/train2017 # train images (relative to 'path') 128 images
val: images/train2017 # val images (relative to 'path') 128 images
test: # test images (optional)# Classes
names:0: person1: bicycle2: car3: motorcycle4: airplane5: bus6: train7: truck8: boat9: traffic light10: fire hydrant11: stop sign12: parking meter13: bench14: bird15: cat16: dog17: horse18: sheep19: cow20: elephant21: bear22: zebra23: giraffe24: backpack25: umbrella26: handbag27: tie28: suitcase29: frisbee30: skis31: snowboard32: sports ball33: kite34: baseball bat35: baseball glove36: skateboard37: surfboard38: tennis racket39: bottle40: wine glass41: cup42: fork43: knife44: spoon45: bowl46: banana47: apple48: sandwich49: orange50: broccoli51: carrot52: hot dog53: pizza54: donut55: cake56: chair57: couch58: potted plant59: bed60: dining table61: toilet62: tv63: laptop64: mouse65: remote66: keyboard67: cell phone68: microwave69: oven70: toaster71: sink72: refrigerator73: book74: clock75: vase76: scissors77: teddy bear78: hair drier79: toothbrush

最后打包压缩,名称要和coco128.yaml中的path一致,否则解压数据的时候会比较麻烦。
为了简单,假设数据集名称为xxx,请将xxx.yaml(path路径为…/datasets/xxx)和相关数据打包到xxx.zip

5、上传数据集

注意:此处应分为CPU/GPU或NPU两种,且互相不能调用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里我已经在另一个项目中上传了,因此上传失败,你自己的数据集是不会这样的。

四、编写启动文件

启智在训练时会自动加载数据集和模型到指定文件夹,结果也需要保存到指定文件夹。当然,你可以通过调试去训练,但是麻烦程度+999.
这里,如果你在导入的时候没有勾选镜像的话,按照法一直接修改train.py即可。否则建议单独建立分支或者单独编写一个启动文件(法二)。

1、修改train.py

在模块导入最下方添加代码,创建输出目录

import zipfile
import shutil
import subprocessif not os.path.exists("/tmp/output"): # 判断是否存在文件夹如果不存在则创建为文件夹os.makedirs("/tmp/output") print("create '/tmp/output' successed!")

在train函数return结果之前添加代码,保存结果到输出目录

    def zip_runs_folder():folder_path = "runs"zip_path = "runs.zip"with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:for root, dirs, files in os.walk(folder_path):for file in files:file_path = os.path.join(root, file)zipf.write(file_path, os.path.relpath(file_path, folder_path))print("Successfully compressed the 'runs' folder and its contents!")zip_runs_folder()shutil.copy('runs.zip','/tmp/output')shutil.copy('runs/train/exp/weights/best.pt','/tmp/output')print("Save training output successfully!")print("Start export onnx model!")subprocess.call(f"python export.py --weights runs/train/exp/weights/best.pt --data {opt.data} --include onnx --opset=12 --simplify --device 0", shell=True)shutil.copy('runs/train/exp/weights/best.onnx','/tmp/output')print("Export onnx model successfully!")

在main函数开头添加代码,解压数据集

    #Copy dataset and unzipdata_param = os.path.basename(opt.data)  # 获取--data参数的文件名data_name = data_param.split('.')[0]  # 获取数据集名称,去除文件后缀dataset_dir = "../datasets"  # 数据集目录dataset_path = f"/tmp/dataset/{data_name}.zip"  # 数据集压缩文件路径if not os.path.exists(os.path.join(dataset_dir, data_name)):print("start unzip dataset,please wait some times!")f = zipfile.ZipFile(os.path.join(dataset_path),'r')for file in f.namelist():f.extract(file,"../datasets")               # 解压到的位置f.close()print("Dataset decompression completed!")

2、单独启动文件

在代码根目录新建start.py文件

import os
import zipfile
import shutil
import subprocess
import argparse
from pathlib import Path
import sysFILE = Path(__file__).resolve()
ROOT = FILE.parents[0]  # YOLOv5 root directory
if str(ROOT) not in sys.path:sys.path.append(str(ROOT))  # add ROOT to PATH
ROOT = Path(os.path.relpath(ROOT, Path.cwd()))  # relative# Parse command line arguments
parser = argparse.ArgumentParser()
parser.add_argument("--weights", type=str)
parser.add_argument("--cfg", type=str)
parser.add_argument("--data", type=str)
parser.add_argument("--hyp", type=str)
parser.add_argument("--epochs", type=int)
parser.add_argument("--batch-size", type=int)
parser.add_argument("--imgsz", "--img", "--img-size", type=int)
parser.add_argument("--rect", action="store_true")
parser.add_argument("--resume", nargs="?", const=True)
parser.add_argument("--nosave", action="store_true")
parser.add_argument("--noval", action="store_true")
parser.add_argument("--noautoanchor", action="store_true")
parser.add_argument("--noplots", action="store_true")
parser.add_argument("--evolve", type=int, nargs="?", const=300)
parser.add_argument("--evolve_population", type=str)
parser.add_argument("--resume_evolve", type=str)
parser.add_argument("--bucket", type=str)
parser.add_argument("--cache", type=str, nargs="?", const="ram")
parser.add_argument("--image-weights", action="store_true")
parser.add_argument("--device")
parser.add_argument("--multi-scale", action="store_true")
parser.add_argument("--single-cls", action="store_true")
parser.add_argument("--optimizer", type=str, choices=["SGD", "Adam", "AdamW"])
parser.add_argument("--sync-bn", action="store_true")
parser.add_argument("--workers", type=int)
parser.add_argument("--project")
parser.add_argument("--name")
parser.add_argument("--exist-ok", action="store_true")
parser.add_argument("--quad", action="store_true")
parser.add_argument("--cos-lr", action="store_true")
parser.add_argument("--label-smoothing", type=float)
parser.add_argument("--patience", type=int)
parser.add_argument("--freeze", nargs="+", type=int)
parser.add_argument("--save-period", type=int)
parser.add_argument("--seed", type=int)
parser.add_argument("--local_rank", type=int)
parser.add_argument("--entity")
parser.add_argument("--upload_dataset", nargs="?", const=True)
parser.add_argument("--bbox_interval", type=int)
parser.add_argument("--artifact_alias", type=str)
parser.add_argument("--ndjson-console", action="store_true")
parser.add_argument("--ndjson-file", action="store_true")
opt = parser.parse_args()if not os.path.exists("/tmp/output"): # 判断是否存在文件夹如果不存在则创建为文件夹os.makedirs("/tmp/output") print("create '/tmp/output' successed!")#Copy dataset and unzip
data_param = os.path.basename(opt.data)  # 获取--data参数的文件名
data_name = data_param.split('.')[0]  # 获取数据集名称,去除文件后缀
dataset_dir = "../datasets"  # 数据集目录
dataset_path = f"/tmp/dataset/{data_name}.zip"  # 数据集压缩文件路径
if not os.path.exists(os.path.join(dataset_dir, data_name)):print("start unzip dataset,please wait some times!")f = zipfile.ZipFile(os.path.join(dataset_path),'r')for file in f.namelist():f.extract(file,"../datasets")               # 解压到的位置f.close()print("Dataset decompression completed!")# zip runs folder
def zip_runs_folder():folder_path = "runs"zip_path = "runs.zip"with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:for root, dirs, files in os.walk(folder_path):for file in files:file_path = os.path.join(root, file)zipf.write(file_path, os.path.relpath(file_path, folder_path))print("Successfully compressed the 'runs' folder and its contents!")#start train
print("Start train model!")
subprocess.call(f"python train.py --weights {opt.weights} --cfg {opt.cfg} --data {opt.data} --hyp {opt.hyp} --epochs {opt.epochs} --batch-size {opt.batch_size} --imgsz {opt.imgsz} --device {opt.device} --name {opt.name} --exist-ok --rect {'--resume' if opt.resume else ''} {'--nosave' if opt.nosave else ''} {'--noval' if opt.noval else ''} {'--noautoanchor' if opt.noautoanchor else ''} {'--noplots' if opt.noplots else ''} {'--evolve' if opt.evolve else ''} {'--resume_evolve' if opt.resume_evolve else ''} {'--cache' if opt.cache else ''} {'--image-weights' if opt.image_weights else ''} {'--multi-scale' if opt.multi_scale else ''} {'--single-cls' if opt.single_cls else ''} --optimizer {opt.optimizer} {'--sync-bn' if opt.sync_bn else ''} --workers {opt.workers} --project {opt.project} --patience {opt.patience} --freeze {' '.join(map(str, opt.freeze))} --save-period {opt.save_period} --seed {opt.seed} --local_rank {opt.local_rank}", shell=True)
print("Training is complete, start saving results!")# Save training output
zip_runs_folder()
shutil.copy('runs.zip','/tmp/output')
shutil.copy('runs/train/exp/weights/best.pt','/tmp/output')
print("Save training output successfully!")# Export onnx model    
print("Start export onnx model!")
subprocess.call(f"python export.py --weights runs/train/exp/weights/best.pt --data {opt.data} --include onnx --opset=12 --simplify --device 0", shell=True)
shutil.copy('runs/train/exp/weights/best.onnx','/tmp/output')
print("Export and save onnx model successfully!")

五、创建调试任务

以英伟达GPU环境为例

1、路径说明

第四步中的路径是英伟达gpu训练环境的路径,调试时需要删除/tmp

  • /code:本目录对应控制台左侧的文件菜单栏,已经存放代码仓为 master.zip,需要用户手动解压
  • /dataset: 本目录下可以找到创建调试任务时选取的数据集,平台已解压
  • /pretrainmodel: 本目录下将加载创建调试任务时选取的预训练模型

2、创建任务

如下图所示
在这里插入图片描述
建议使用T4卡做前期调试,这样比较节省积分
在这里插入图片描述
镜像可以使用这个,这样需要配置的东西就少一些
数据集可以提前下载coco2017val,上传到数据集,节省调试时下载时间。

3、开始调试

不幸的是,笔者在写本文时,英伟达集群似乎都无法创建任务,这里没法放进图了。
首先,打开终端执行以下命令

su
apt update	#这一步很重要
apt install unzip
cd /code
unzip master.zip

之后我们只需要打开对应的jupyter文件进行调试即可。

4、导出镜像

在调试完成后,我们需要导出镜像以便我们在训练时使用
在这里插入图片描述
注意,必须在任务处于运行状态时提交镜像
提交成功后,在下次创建任务的时候,在我的镜像内就可以看到。

六、创建训练任务

以英伟达GPU环境为例

1、路径说明

  • /tmp/code:存放训练脚本
  • /tmp/dataset:存放训练数据集
  • /tmp/pretrainmodel:存放预训练模型
  • /tmp/output:存放训练结果

2、创建任务

如下图所示
在这里插入图片描述
注意事项:

  1. 代码分支:选择存放你训练代码的分支,我这没有去修改master分支,选择从master分支派生出来的适配启智GPU平台的train_gpu分支
  2. 镜像:请选择你在上一步中提交的镜像,否则可能需要在开始运行前安装缺少的依赖(没有命令交互界面,需要写入main函数)
    可以使用我的环境(仅保证GPU环境下可以正常训练和导出onnx模型):192.168.204.22:5000/default-workspace/99280a9940ae44ca8f5892134386fddb/image:yolov5_gpu_240124
  3. 启动文件:一般为train.py,如果你需要在训练开始前做一些配置的话,可能需要使用start.sh等
  4. 数据集:训练使用的数据集
  5. 运行参数:详见train.py内opt函数,和本地训练一致,只需要写与默认参数不同的参数即可

3、开始训练

新建任务后,等待其状态变为running,可以点击任务,日志查看其输出(可能需要手动刷新才会显示新的日志)
下图为任务开始时的日志
在这里插入图片描述
下图为训练结束后的日志
在这里插入图片描述

4、下载训练结果

点击结果下载,如果使用我的代码,将生成以下三个文件。
在这里插入图片描述
文件说明:

  • best.onnx:导出的onnx模型
  • best.pt:训练获得的原始pt模型
  • runs.zip:包含所有训练结果的压缩包

问题

1、无法解压代码

一定要先打开终端执行

su	#这里是切换到root用户
apt update	#不然没法安装软件

总结

具体细节直接点击平台首页右上角的问号,查看帮助。好像过段时间会统一各个集群的环境内代码等存放位置,请关注公告。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

原子变量和原子操作

一、什么是原子操作 通常某一个变量的操作对应的CPU指令是大于一个的,在多线程环境下,为了确保对共享变量的操作在执行时不会被干扰,从而避免竞态条件和死锁等问题,使用原子变量。 原子变量可以看作是一种特殊的类型&#xff0c…

php基础学习之函数

基本概念 是一种语法结构,将实现某一个功能的代码块封装到一个结构中,从而实现代码的重复利用 php函数的定义语法 (与C/Java很类似,区别在于没有数据类型,因为php是弱类型语言) function 函数名(参数){ //…

会计财税答案怎么查找?推荐你使用这五个公众号和工具 #知识分享#微信

当今社会,随着信息技术的迅猛发展,大学生们在学习过程中面临着各种各样的困难和挑战。而在这些挑战中,面对繁重的作业和复杂的题目,大学生搜题软件应运而生 1.题小聪 这个是公众号 电大国开试题库为主,搜题效率挺高…

Linux 查看 系统基本信息 uname

基本用法: 在终端中输入"uname"即可显示系统的内核名称。 可以结合不同的参数使用,获取更详细的系统信息。 常见参数: “-s”:显示操作系统名称。 “-n”:显示网络节点主机名。 “-r”:显示内核版…

Linux之动静态库

今天我们来讲动静态库! 首先我们来粗粒度的划分一下动态库和静态库。 动态库就是只有一份库文件,所有想用该库的文件与改库文件建立链接,然后使用。这样可以提高代码复用率,避免重复拷贝产生没必要的内存消耗。 静态库&#xf…

UART通信中的奇偶校验

UART通信中的奇偶校验:提升数据传输可靠性的简单方法 在微控制器(MCU)和各种电子设备之间的数据通信领域,UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)协议是一种广泛…

openGauss学习笔记-220 openGauss性能调优-确定性能调优范围-查询最耗性能的SQL

文章目录 openGauss学习笔记-220 openGauss性能调优-确定性能调优范围-查询最耗性能的SQL220.1 操作步骤 openGauss学习笔记-220 openGauss性能调优-确定性能调优范围-查询最耗性能的SQL 系统中有些SQL语句运行了很长时间还没有结束,这些语句会消耗很多的系统性能&…

Django CORS 跨域问题解决

座右铭:怎么简单怎么来,以实现功能为主。 欢迎大家关注公众号与我交流 环境安装 pip install django-cors-headers settings.py 修改配置 INSTALLED_APPS ["","corsheaders", # 加上这个"", ]MIDDLEWARE ["cors…

软件项目版本与文档管理的最佳实践

在软件项目开发过程中,版本管理和项目文档管理是至关重要的一环。它们直接影响到项目的顺利进行和最终成果的质量。然而如何有效地管理和维护这些信息,同时保持独立和客观的态度,是每个开发者都需要掌握的技能。本文将探讨如何在软件开发过程…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核基础-消息队列queue

目录 一、消息队列基本概念二、消息队列运行机制三、消息队列开发流程四、消息队列使用说明五、消息队列接口六、代码分析(待续...)坚持就有收获 一、消息队列基本概念 队列又称消息队列,是一种常用于任务间通信的数据结构。队列接收来自任务…

BossPlayerCTF

靶场环境问题 靶场下载之后,可能会出现扫描不到IP的情况,需要进行调整,参考: Vulnhub靶机检测不到IP地址_vulnhub靶机nmap扫不到-CSDN博客 该靶机没有vim,需要使用vi命令去修改;改成当前网卡即可&#x…

第21讲关于我们页面实现

关于我们页面实现 关于锋哥页面author.vue 我们这里用一个vip宣传页面&#xff0c;套一个web-view <template><web-view src"http://www.java1234.com/vip.html"></web-view> </template><script> </script><style> <…

【Java多线程案例】定时器

1. 定时器简介 定时器&#xff1a;想必大家一定对定时器这个概念不陌生&#xff01;因为它经常出现在我们的日常生活和编程学习中&#xff0c;定时器就好比是一个"闹钟"&#xff0c;会在指定时间处理某件事&#xff08;例如响铃&#xff09;&#xff0c;而在编程世界…

删除 Windows 设备和驱动器中的 WPS网盘、百度网盘等快捷图标

在安装诸如WPS软件、百度云盘、爱奇艺等客户端后&#xff0c;Windows 的“我的电脑”&#xff08;或“此电脑”&#xff09;中的“设备和驱动器”部分会出现对应的软件图标。这种情况被许多技术人员视为不必要的干扰&#xff0c;因此许多用户想要知道如何隐藏或删除这些图标。 …

【初中生讲机器学习】9. 我是怎么用朴素贝叶斯实现垃圾邮件分类的?真的超全!

创建时间&#xff1a;2024-02-14 最后编辑时间&#xff1a;2024-02-15 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

leetcode刷题之或操作使用场景

文章目录 概要题目问题分析小结 概要 今天晚上上床前刷了一个leetcode的题目&#xff0c;是leetcode的2103题&#xff0c;因为是个简单题&#xff0c;我只是想复习一下hash表的用法。结果反而让我看到了或操作的使用场景。 题目 总计有 n 个环&#xff0c;环的颜色可以是红、…

Zabbix图形中文乱码问题(显示口口)解决办法

一 切换到zabbix安装目录assets/fonts下&#xff0c;下载字体 这里使用是nginxphp作为zabbix-web展示&#xff0c;使用find 命令查找 进入目录下&#xff0c;将原有字体备份&#xff0c;下载msyh字体 wget https://www.xxshell.com/download/sh/zabbix/ttf/msyh.ttf 二 修改配…

[GYCTF2020]Blacklist

感觉是[强网杯 2019]随便注 的加强版&#xff0c;之前做的是最后可以通过prepare和execute实现对select的绕过&#xff0c;但是这题把这两个关键字也过滤了。 前面堆叠注入没啥问题&#xff0c;卡在了最后读取flag 查看其他师傅的wp&#xff0c;发现这个handler的可以当作丐版s…

CPU-GPU异构并行化APSP算法

一、Floyd-Warshall算法 介绍 Floyd-Warshall算法&#xff08;英语&#xff1a;Floyd-Warshall algorithm&#xff09;&#xff0c;中文亦称弗洛伊德算法或佛洛依德算法&#xff0c;是解决任意两点间的最短路径的一种算法&#xff0c;可以正确处理有向图或负权&#xff08;但…

奔跑吧小恐龙(Java)

前言 Google浏览器内含了一个小彩蛋当没有网络连接时&#xff0c;浏览器会弹出一个小恐龙&#xff0c;当我们点击它时游戏就会开始进行&#xff0c;大家也可以玩一下试试&#xff0c;网址&#xff1a;恐龙快跑 - 霸王龙游戏. (ur1.fun) 今天我们也可以用Java来简单的实现一下这…