0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解TAO的配置文件与执行流程

NVIDIA英伟达企业解决方案 来源:NVIDIA英伟达企业解决方案 作者:NVIDIA英伟达企业解 2022-04-25 11:47 次阅读

图像分类 (image classification) 是视觉人工智能的最基础应用,目前 TAO 模型训练工具支持 resnet、vgg、mobilenet_v1、mobilenet_v2、googlenet、cspdarknet、darknet、efficientnet_b0、efficientnet_b1、cspdarknet_tiny 等 10 种神经网络,其中 resnet、vgg、darknet、cspdarknet 还有不同结构层数的区分。

在 TAO 启动器中只用 “classification” 这个任务指令,去面对上面所列出的十多种网络结构,其关键处就是结合“配置文件”的协助,因此这个配置文件的设置组是 TAO 工具的核心所在,也是本文一开始要花时间说明的部分。

在 cv_samples 下面的 classification 项目,是 TAO 工具的图像分类模型训练的标准范例,里面提供 classification.ipynb 执行脚本与 specs 目录下两个 .cfg 配置文件,基本上在执行脚本里只需要修改一些路径的设定就行,其余细节都在配置文件里面进行调整,包括所选择的神经网络种类与结构。

这个项目以 PascalVOC 2012 数据集作为训练源,与 TAO 所支持的格式并不相同,因此在训练之前还需要进行格式的转换。还好这里的转换比较简单,只要将图像分别存放在以“类别”所命名的目录下就可以,同时分割成训练与校验两个不同用途的数据集,在脚本里透过一段简单的 Python 代码就能完成,并没有什么难度。

最后在训练之前,可以选择是否启动 “迁移学习” 的功能?在这个实验中也会示范这中间所得到的精度差异,让大家直接体验到迁移学习所带来的的好处。

以下就将几个执行重点提出来说明,协助大家可以轻松地执行。

配置文件内容

TAO 的 CLI 指令集只使用一个 classification 去面对所有的图形分类应用,其余的工作就全部交给配置文件去处理。在图像分类的配置文件里,主要有以下三个配置组:

1、model_config:存放神经网络种类、结构(层数)与特性的内容,以下列出比较重要的部分:

(1) arch:网络名称,可使用所有已支持的网络,包括 resnet、vgg、mobilenet_v1、mobilenet_v2、googlenet、cspdarknet、darknet、efficientnet_b0、efficientnet_b1、cspdarknet_tiny 等;

(2) n_layer:有些网络有多种结构层,例如 resnet有10/18/34/50/101、vgg 有16/19、darknet 有 19/53、cspdarknet 有 19/53 等;

其余参数都按照配置文件里面所设定的值,因为 NGC 提供的预训练模型是按照这些参数所训练的,能在迁移学习过程中得到比较好的效果。

2、train_config:执行训练时所需要参考的

(1) train_dataset_path: 训练用数据集的位置,需要输入在容器内的完整路径

(2) val_dataset_path: 校验用数据集的位置,需要输入在容器内的完整路径

(3) pretrained_model_path: 预训练模型位置,需要输入在容器内的完整路径

(4) batch_size_per_gpu:请根据GPU显存大小进行调整

(5) n_epochs:训练的回合数

(6) n_workersCPU的并行线程数,请根据实际CPU核数量进行调整

其余参数清先安装范例所提供的设置。

3、eval_config:评估模型时所需要用到的参数,需要输入在容器内的完整路径

(1) eval_dataset_path: 测试用数据集路径,与前面相同

(2) model_path: 在前面训练模型过程中所生成的 .tlt 模型文件中,挑选效果最好的一个模型来进行评估,通常最后一个的效果会最好。这里的 “resnet_080.tlt” 是因为训练回合数为 80。

其余参数请先按照范例所提供的设置。

以上关于路径部分的设置,只要遵循脚本一开始 “0. Set up env variables and map drives” 的配置规则,文件里基本上不需要做修改。其他参数的定义与设定值,请访问 https://docs.nvidia.com/tao/tao-toolkit/text/image_classification.html#model-config 有完整的说明。

数据集格式转换与分配

TAO 支持的图像分类数据格式,是以“分类名”作为路径名,将所有该类的图像都放置到分类名目录之下,例如有 20 个分类的数据集,就会有 20 个分类目录。

本实验使用 PascalVOC 的 VOCtrainval_11-May-2012.tar (1.9GB) 数据集,可以用脚本提供的链接,也可以在https://pan.baidu.com/s/1JhnBCRi32xblhSSWFmF5aA (密码: gg95) 下载压缩文件。

请按照脚本的数据集处理过程,包括放置路径与解压缩的指令。由于这个数据集的格式并不符合 TAO 的要求,因此脚本中使用一段 Python 代码来进行转换,详细内容请自行阅读代码,其主要功能就是将下图左边 VOC 路径结构转换成右边符合 TAO 要求的结构,存放在 “formated” 目录下。

接着再将 “formated” 的数据,随机分割成 train、val与test 三大类存放到 “split” 目录下,作为后面执行训练、校验与测试时所需要的数据路径。

动迁移学习功能

TAO 的模型训练继承 TLT 的迁移学习功能,只要在配置文件中的“train_config” 配置组里,指定好 “pretrained_model_path:” 的路径就可以,如果不想启用这个功能,只要在这个参数前面用 “#” 去关闭就行。

在 NGC 提供 300 多个预训练模型,我们需要挑选合适的模型来协助执行迁移学习,这部分的下载需要使用 NGC 的指令来操作,在脚本中已经提供完整的安装步骤,只要执行命令块就行,然后用以下指令去下载所选的模型:

ngc registry model download-version 模型全名 --dest 本地存放路径

这里配合所使用的网络种类,挑选 nvidia/tao/pretrained_classification:resnet18 作为本次的预训练模型,文件大小在 80MB 左右。

下图左方是这个实验中,关闭迁移学习功能所训练出来的模型,经过下面评估步骤所测算出来的结果,下图右方则是在基于 NGC 下载的预训练模型基础上,利用迁移学习功能所训练出来的模型效果,总体来说得到的精准度提升还是很明显的。

但如果是缺乏合适预训练模型的状况下,也不能硬是挑选不合适的模型来做迁移学习,可能得到的效果会更差。

执行模型训练

当前面的准备工作都做到位之后,这个步骤就是水到渠成。执行训练所耗费的时间就只跟 GPU 卡的总体计算资源有关系,如果您的设备有一张以上 GPU 计算卡的话,可以透过 TAO 指令以下参数,去调整可用的计算资源:

--gpus [N]:指定要调用的 GPU 卡数量;

--gpu_index 编号1 [编号2...]

例如设备上有 2 片 GPU 卡时,想要全部用上的话就直接用 “--gpus 2” 参数进行调用;如果设备上有 4 片 GPU 计算卡,想要指定调用 0 号与 3 号这两张卡的时,就用 “--gpus 2--gpu_index 0 3” 参数,就能精准调用指定的GPU来进行训练。

在这个图像分类实验中,我们以 NVIDIA RTX2070 与 RTX3070 进行测试,这两张计算卡都具有 8GB 显存。在固定回合数为 80、batch_size_per_gpu 为 64 的条件下,所耗费的训练时间如下:

单GPU/3070-8G : 52分19秒

单GPU/2070-8G : 62分44秒

双GPU/3070+2070 : 38分03秒

修剪模型

这个步骤的目的,是要在维持足够精准度的前提下缩小模型的尺寸,越小的模型会消耗更少的计算资源,特别是内存与显存。

这对于计算资源充沛的计算设备来说,所体现的差异并不明显,但是对于计算资源相对吃紧的边缘设备来说,就有非常大的影响,甚至影响推理识别的性能,因此请自行决定是否需要执行这个步骤。

这里的要剪裁的对象是已训练好的模型,而不是从网络结构层进行融合处理,最简单的方法就是调整 “-pth(阈值)” ,在精确度与模型大小之间取得平衡,调整的值越高就会得到越小的模型,但精准度会受到比较大的损失,这就需要经过不断尝试去调节出满足要求的模型。

以这个 classification 项目为例,在 80 回合中训练的模型大小为 87.7MB,通常最后一回合训练的模型精确度会最好,因此用 resnet_080.tlt 模型进行修剪测试:

-pth=0.6:修剪后生成大小为38.5MB的resnet18_nopool_bn_pruned.tlt

-pth=0.3:修剪后生成大小为44.2MB的resnet18_nopool_bn_pruned.tlt

至于修剪后模型对精确度产生怎样的影响?就需继续往下执行“再训练”之后,看看评估的效果如何!

模型再训练

经过修剪的模型并不能立即使用,而是作为“再训练”的预训练模型,再次利用迁移学习的技巧,以前面的数据集进行模型再训练的工作,唯一不一样的地方是这次使用的配置文件为 classification_retrain_spec.cfg,这个配置内容与前面的 classification_spec.cfg 只有三个差异的地方:

1. 在 model_config 设置组少了两个 “freeze_blocks” 设置;

2. 在 train_config 设置组的 “pretrained_model_path” 换成前面修剪过的模型;

3. 在 eval_config 设置组的 “model_path” 换成修剪后重新训练的模型

继续往下执行 “7. Retrain pruned models” 与 “8. Testing the model” 两个步骤,就能得到修剪过模型的精确度评估结果。

从上面的比较表中可以看出,这个剪裁的方式对模型文件大小的影响是很明显的,但精确度的损失并不是太大,所以这个剪裁应视为有效果。

本实验结语

这个范例主要让大家体会并熟悉 TAO 的配置文件与执行流程,事实上 TAO 所提供的范例几乎都是一样的流程,后面还有导出模型、INT8 优化、生成 TensorRT 引擎的步骤,我们结合在后面的物件检测范例中进行说明。

原文标题:NVIDIA Jetson Nano 2GB 系列文章(60):图像分类的模型训练与修剪

文章出处:【微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    4930

    浏览量

    102794
  • TAO
    TAO
    +关注

    关注

    0

    文章

    10

    浏览量

    6989
  • 模型训练
    +关注

    关注

    0

    文章

    18

    浏览量

    1330

原文标题:NVIDIA Jetson Nano 2GB 系列文章(60):图像分类的模型训练与修剪

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    springboot的项目如何既要用jar包启动,同时还可以为不同的机房设置不同的配置文件

    作者:京东科技 李意文 1、首先先把配置文件从jar中抽离 示例代码:   org.apache.maven.plugins maven-jar-plugin 3.2.0
    的头像 发表于 10-19 16:48 393次阅读
    springboot的项目如何既要用jar包启动,同时还可以为不同的机房设置不同的<b class='flag-5'>配置文件</b>

    HID over GATT配置文件(HOGP)低功耗蓝牙

    电子发烧友网站提供《HID over GATT配置文件(HOGP)低功耗蓝牙.pdf》资料免费下载
    发表于 09-26 11:01 0次下载
    HID over GATT<b class='flag-5'>配置文件</b>(HOGP)低功耗蓝牙

    确定LDO的任务配置文件兼容性

    电子发烧友网站提供《确定LDO的任务配置文件兼容性.pdf》资料免费下载
    发表于 09-24 10:44 0次下载
    确定LDO的任务<b class='flag-5'>配置文件</b>兼容性

    鸿蒙开发Ability Kit程序框架服务:FA模型应用配置文件

    应用配置文件中包含应用配置信息、应用组件信息、权限信息、开发者自定义信息等,这些信息在编译构建、分发和运行解决分别提供给编译工具、应用市场和操作系统使用。
    的头像 发表于 06-24 14:49 315次阅读
    鸿蒙开发Ability Kit程序框架服务:FA模型应用<b class='flag-5'>配置文件</b>

    鸿蒙开发:【Stage模型应用配置文件

    应用配置文件中包含应用配置信息、应用组件信息、权限信息、开发者自定义信息等,这些信息在编译构建、分发和运行解决分别提供给编译工具、应用市场和操作系统使用。
    的头像 发表于 06-15 09:15 1546次阅读
    鸿蒙开发:【Stage模型应用<b class='flag-5'>配置文件</b>】

    AMD FPGA中MicroBlaze的固化流程详解

    AMD FPGA在配置了适当的启动模式后,上电即会按该模式去加载配置文件。以7系列FPGA为例,假设设置模式引脚M[2:0]=3’b001,上电后FPGA会以Master SPI方式尝试从FLASH加载配置文件,其与工程是否含有
    发表于 04-25 12:49 458次阅读
    AMD FPGA中MicroBlaze的固化<b class='flag-5'>流程</b><b class='flag-5'>详解</b>

    labview生成exe文件如何配置文件

    执行文件之前,您需要确保正确配置文件,以便应用程序能够在不同计算机上正确运行。 下面是一个详尽、详实、细致的步骤指南,告诉您如何配置LabVIEW生成的可执行文件: 确保您的应用程序
    的头像 发表于 12-27 16:28 2052次阅读

    labview的opc生成配置文件

    的数据交互和通信。在 LabVIEW 中生成 OPC 配置文件有助于实现与其他设备的数据传输和共享,本文将详细介绍如何生成 OPC 配置文件。 首先,在 LabVIEW 中生成 OPC 配置文件,我们
    的头像 发表于 12-26 17:57 1719次阅读

    oracle配置文件类型关联

    Oracle是一种业界领先的关系型数据库管理系统,它在大型企业中被广泛使用。Oracle的配置文件对于数据库的稳定运行和性能优化至关重要。在这篇文章中,我们将详细讨论Oracle的一些重要配置文件
    的头像 发表于 12-06 10:17 457次阅读

    oracle配置文件tnsnames怎么配置

    Oracle配置文件tnsnames.ora是一个文本文件,用于定义数据库连接的别名和连接信息。通过配置文件,可以在应用程序中使用别名来连接数据库,而不必直接给出数据库的具体连接信息
    的头像 发表于 12-06 10:15 7822次阅读

    php的配置文件是什么

    PHP的配置文件是一种用于配置PHP解释器的文本文件。它包含了一系列的指令和选项,用于影响PHP的行为和性能。通过修改配置文件,可以改变PHP解释器的默认行为,从而满足不同的需求。 在
    的头像 发表于 12-04 15:55 1462次阅读

    zookeeper的核心配置文件是什么

    Zookeeper是一个常用的分布式协调服务,它被广泛应用于大型分布式系统中。Zookeeper的核心配置文件是zoo.cfg,它包含了Zookeeper服务器的各种配置参数,可以通过修改这些参数
    的头像 发表于 12-04 10:33 736次阅读

    springboot的核心配置文件有哪些

    的工作量。 Spring Boot的核心配置文件主要有以下几个: application.properties:Spring Boot应用程序的主要配置文件。它使用Java的键值对格式来定义各种配置属性
    的头像 发表于 12-03 15:30 1133次阅读

    springboot的全局配置文件有几种

    Spring Boot是一种快速开发框架,其通过提供配置文件来实现对应用程序的配置。全局配置文件在Spring Boot中起着非常重要的作用,可以用于配置各种不同的属性,包括数据库连接
    的头像 发表于 12-03 15:28 1505次阅读

    ROS编写参数配置文件示例程序

    _config.yaml这三个文件中,这三个文件均位于下图所示的目录下,下面依次进行详细的介绍 1、编写user_config.yaml参数配置文件 首先,我们来看作者提供的示例程序,如下所示:
    的头像 发表于 11-26 17:35 1526次阅读
    ROS编写参数<b class='flag-5'>配置文件</b>示例程序