不知道大家有没有发现,最近在Adlik的GitHub中多出了一个仓库——ZenNAS。可能大家会疑惑这是什么,和Adlik的关键组件推理引擎、模型优化器等是什么关系。那今天就为大家揭开它的面纱。
关于NenNAS
ZenNAS是阿里提出的一个神经架构搜索(NAS)算法,可以在半个GPU day内找到最佳性能的神经网络结构。它是怎么做到的呢?
我们回顾以往的NAS算法,可以注意到NAS通常有两个关键组件,其中模型结构生成器用于生成潜在的高性能神经网络结构,精度预测器用于评估搜索到的模型的精度。对于精度预测器来说,无论采用何种精度预测方法,都离不开模型训练,这一步所需要的巨大算力成本往往是精度预测器的效率瓶颈。
为解决这个问题,ZenNAS的作者提出了一种新的方式来预测精度,即Zen-Score。Zen-Score 是一种衡量神经网络表达能力的指数,与模型准确率正相关。计算Zen-Score 无需模型训练,只需要在随机初始化的网络上执行数次前向推理即可,因此能做到快、轻量级且不需要数据。
ZenNAS算法正是基于Zen-Score,能以足够快的速度找到精度足够高的模型。ZenNAS算法采用进化算法生成并选择神经网络结构,最终搜索出Zen-Score最大的结构。
关于ZenNAS更详细的介绍请见今天的第二条推文。
Adlik ZenNAS repo
在对作者开源代码https://github.com/idstcv/ZenNAS测试过程中发现,开源的代码中仅提供了单卡训练部分,并且进化算法搜索模型耗时长。我们对代码进行了优化。增加了模型分布式训练,进化算法随机初始化,优化了搜索算法,使得模型搜索和训练速度得到明显提升,改进的代码已开源https://github.com/Adlik/zen_nas。
代码中增加了Horovod和apex分布式训练,在测试中发现Horovod多卡训练速度要比apex慢。后面模型的训练均使用apex和混合精度,使用8个Tesla V100 GPUs 在5天内完成了训练,训练结果与论文一致,如表1所示。
表1. 模型多卡训练测试结果
论文模型 | 论文精度 | 多卡训练精度 |
---|---|---|
ZenNet-0.1ms | 77.8% | 77.922% |
ZenNet-0.8ms | 83.0% | 83.214% |
未优化前的搜索代码,搜索速度比较慢,为了加快搜索过程,对代码进行了重构,优化后的代码搜索速度有一定的提升,同时,能够在相同迭代次数下,搜索出score更大的模型。表2中的数据是在V100上迭代50000次后的结果。
表2. 优化算法与原始算法模型搜索结果
latency模型 | 搜索时间(h) | 模型Score | |
---|---|---|---|
ZenNAS | latency01ms | 98.4274 | 126.038 |
latency05ms | 22.0189 | 243.104 | |
latency08ms | 28.5952 | 304.323 | |
latency12ms | 44.6237 | 375.027 | |
opt-ZenNAS | latency01ms | 64.988 | 134.896 |
latency05ms | 20.9895 | 245.712 | |
latency08ms | 25.0358 | 310.629 | |
latency12ms | 43.239 | 386.669 |
由于顾及算法的完整性,导致目前搜索模型的速度没有很大的提升。若仅为了更快的搜索模型,可以对代码进行精简。我们在论文开源前,对算法进行过复现,对实现的算法进行测试,网络latency越大,搜索时间越长。算法迭代96000次,基本可以在两天内完成。
使用复现算法,在不同的latency条件下,搜索出了几种模型,使用论文提供的训练方法,得到表3的结果。在latency较小的情况下,可以搜索出更好的模型,但在latency比较大时,需要搜索更长的时间,并且从表中可以看到搜索出的模型与论文结果仍有差距。
表3. 复现搜索模型与论文模型对比
搜索模型 | 论文模型精度 | 搜索模型精度 |
---|---|---|
latency01ms | 77.8%(ZenNet-0.1ms) | 78.622% |
latency05ms | 82.7%(ZenNet-0.5ms) | 82.752% |
latency12ms | 83.6%(ZenNet-1.2ms) | 83.466% |
目前,论文中的模型评估的方式在一定条件下是有效的,但是仍然存在许多未解决的问题,我们后面将继续研究如何将论文方法有效的应用到实际中。
Adlik的目标一直是为各种人工智能的应用提供一个端到端的推理工具链。此前,Adlik工作pipeline是基于模型优化器、模型推理引擎功能的串联。而通过NAS的研究,我们希望能将这个pipeline再向前延伸一个节点,实现模型从生成到应用的一条龙支持。欢迎大家能够加入到Adlik,一起学习探索。