MapTR 参考算法基于 Horizon Algorithm Toolkit(HAT,地平线自研深度学习算法包)开发。训练config位于 configs/map/ 路径下。 下文以configs/map/maptrv2_resnet50_bevformer_nuscenes.py为例介绍如何配置并训练 MapTR 参考算法。
如果你只是想简单的把 MapTR 的模型训练起来,那么可以首先阅读一下这一章的内容。和其他任务一样,对于所有的训练,评测任务,HAT统一采用 tools + config 的形式来完成。在准备好原始数据集之后,可以通过下面的流程,方便地完成整个训练的流程。
这里以nuscense数据集为例,可以从 https://www.nuscenes.org/nuscenes 下载数据集 。同时,为了提升训练的速度,我们对原始的jpg格式的数据集做了一个打包,将其转换成lmdb格式的数据集。只需要运行下面的脚本,就可以成功实现转换:
上面这两条命令分别对应着转换训练数据集和验证数据集,打包完成之后,data目录下的文件结构应该如下所示:
train_lmdb和val_lmdb就是打包之后的训练数据集和验证数据集,也是网络最终读取的数据集。metas中包含模型需要的地图信息。
数据集准备好之后,就可以开始 MapTR 模型的训练了。
如果你只是单纯的想启动这样的训练任务,只需要运行下面的命令就可以:
以上命令分别完成float、calibration、qat阶段的训练,其中calibration阶段的训练需要以训练好的浮点模型为基础,qat阶段的训练则需要训练好的calibration模型为基础,具体内容请阅读 量化感知训练 章节的内容。
完成qat训练后,便可以开始导出定点模型。可以通过下面命令来导出:
在完成训练之后,可以得到训练完成的float、calibration和qat模型。和训练方法类似,我们可以用相同方法来对训好的模型做指标验证,得到为 Float 、Calibration 和 QAT 的指标。
和训练模型时类似,--stage 后面的参数为 float、calibration、qat 时,分别可以完成对训练好的浮点模型、calibration模型、qat模型的验证。
定点模型精度验证也可使用下面命令,但需要注意,必须要先导出hbir:
HAT 提供了 infer_hbir.py 脚本提供了对定点模型的推理结果进行可视化展示:
除了上述模型验证之外,我们还提供和上板完全一致的精度验证方法,可以通过下面的方式完成:
在HAT中集成的量化训练工具链主要是为了地平线的计算平台准备的,因此,对于量化模型的检查和编译是必须的。我们在HAT中提供了模型检查的接口,可以让用户定义好量化模型之后,先检查能否在 BPU 上正常运行:
在模型训练完成后,可以通过 compile_perf_hbir 脚本将量化模型编译成可以上板运行的 hbm 文件:
以上就是从数据准备到生成量化可部署模型的全过程。
在这个说明中,我们对模型训练需要注意的一些事项进行说明,主要为 config 的一些相关设置。
其中,model 下面的 type 表示定义的模型名称,剩余的变量表示模型的其他组成部分。这样定义模型的好处在于我们可以很方便的替换我们想要的结构。例如,如果我们想训练一个backbone为resnet18的模型,只需要将 model 下面的 backbone 替换掉就可以。
跟 model 的定义一样,数据增强的流程是通过在config配置文件中定义 data_loader 和 val_data_loader 这两个dict来实现的,分别对应着训练集和验证集的处理流程。如下所示:
其中type直接用的pytorch自带的接口torch.utils.data.DataLoader,表示的是将 batch_size 大小的图片组合到一起。 这里面唯一需要关注的可能是 dataset 这个变量, data_path 表示lmdb数据集的路径,map_path 表示地图数据的路径,也就是我们在第一部分数据集准备中提到的路径。transforms 下面包含着一系列的数据增强。你也可以通过在 transforms 中插入新的dict实现自己希望的数据增强操作。
为了训练一个精度高的模型,好的训练策略是必不可少的。对于每一个训练任务而言,相应的训练策略同样都定义在其中的config文件中,从 float_trainer 这个变量就可以看出来。
float_trainer 从大局上定义了我们的训练方式,包括使用多卡分布式训练(distributed_data_parallel_trainer),模型训练的epoch次数,以及优化器的选择。同时 callbacks 中体现了模型在训练过程中使用到的小策略以及用户想实现的操作,包括学习率的变换方式(CosineAnnealingLrUpdater),在训练过程中验证模型的指标(Validation),以及保存(Checkpoint)模型的操作。当然,如果你有自己希望模型在训练过程中实现的操作,也可以按照这种dict的方式添加。
如果需要复现精度,config中的训练策略最好不要修改。否则可能会有意外的训练情况出现。
使用 float_trainer 的设置,可以训练出来一个高精度的浮点模型。当我们有了浮点模型之后,就可以开始训练相应的量化模型了。此时我们使用的训练策略来自于config文件中的 calibration_trainer 和 qat_trainer。
量化训练其实是在纯浮点训练基础上的finetue,因此量化训练的时候,学习率 qat_lr 要比 float_lr 小得多,qat训练的epoch次数也大大减少,最重要的是 model 定义的时候,calibration模型的 pretrained 需要设置成已经训练出来的纯浮点模型的地址,qat模型则需要设置为校准出来的calibration模型地址。
当我们训练量化模型的时候,需要设置模型的qconfig,浮点模型会按照qconfig的设置被转换成对应的量化模型,qconfig设置如下:
其中,cali_qconfig_setter 和 qat_qconfig_setter 分别为calibration模型和qat模型对应的qconfig设置,关于qconfig的设置方法与调试步骤,比如默认qconfig的设置、量化敏感算子设置等,请阅读 量化感知训练-Qconfig详解 章节的内容。
量化训练过程中,我们需要将某些量化敏感的算子设置为int16,以满足模型的量化精度需求。量化敏感算子的排序可以通过运行以下命令获得。
其中的关键步骤,请阅读 量化感知训练-精度调优工具使用指南 章节的内容。