上新了! 热门开源 AutoML 工具 NNI 2.0 来袭!
编者按:NNI(Neural Network Intelligence)是微软亚洲研究院为研究人员和算法工程师量身定制的自动机器学习(AutoML)工具。在过去的两年中,NNI 不断迭代更新,持续将最前沿的算法加入其中,加强对各种分布式训练环境的支持,目前 NNI 已在 GitHub 上获得了 8.7K 星,成为最热门的自动机器学习开源项目之一。
近期,微软亚洲研究院发布了 NNI 2.0 版本,其中加入了对“探索性训练”框架 Retiarii、基于掩码的模型压缩加速工具的支持,提供了利用 Python 发起实验 (预览功能) 与多种算力混合训练的能力,并简化了自定义算法的安装方法。本文将全方位解读 NNI 2.0 最新版本中的各项功能,让大家了解这个简单、易用的自动机器学习工具。
NNI 官方 GitHub 地址:
https://github.com/microsoft/nni
近年来,随着 AI 技术的不断发展,自动机器学习正释放更多可能性,让奇思妙想成为现实。面对错综复杂的机器学习参数,人们往往耗费无数日夜进行调试,宛若海底捞针。
作为微软亚洲研究院为研究人员和算法工程师量身定制的自动机器学习工具, NNI 通过前沿的算法、自动化的框架和高效的分布式配置,可以节省训练时间与人力成本,赋能超参调优(Hyperparameter Optimization)、神经网络架构搜索(Neural Architecture Search)、特征工程(Feature Engineering)和模型压缩(Model Compression)等各个机器学习生命周期,具有易于使用、可扩展、灵活和高效的特点:
易于使用:NNI 可通过 pip 安装;只需要添加几行代码,就可以利用 NNI 来调优参数;支持使用简单的命令行工具或 Web 界面来查看实验(Experiment),并拥有大量示例和详细的中英文档。
可扩展:调优超参或网络结构通常需要大量的计算资源,NNI 支持多种计算资源,如远程服务器组、训练平台(包括OpenPAI,Kubernetes)等,可并行运行数百个 Trial,适用于具有不同能力的培训平台。
灵活性:除内置的算法外,NNI 还能轻松集成自定义的超参调优算法、神经网络架构搜索算法、提前终止算法等。此外,NNI 还可以连接到更多训练平台上,如云中的虚拟机集群、Kubernetes 服务,或外部环境中的特殊应用和模型上。
高效性:在系统及算法级别上,NNI 始终在加速改进 ,以提高调优效率。例如:NNI 支持通过早期反馈来加速调优过程。
深度学习框架(Deep Learning Framework)是目前研究人员开发深度神经网络(Deep Neural Network)的主要工具,对深度神经网络的成功应用和快速发展有重要的促进作用。设计深度学习网络是一个“探索性训练”(Exploratory-Training)的过程,通常以构建一个基础网络(Base Graph)为出发点进行训练,根据训练情况的反馈,对该神经网络的结构进行调整,然后通过一系列反复训练、调整,最终找到符合要求的神经网络。
训练过程中,研究人员往往需要探索一类神经网络结构,而不是单个具体的神经网络。目前的深度学习框架,如 TensorFlow 和 PyTorch,仅支持开发单个神经网络,但这只是探索性训练过程中的一步而已。另一方面,现有自动机器学习的方案如神经网络结构搜索或超参数优化,缺乏可编程性和模块化,这使得一种 NAS/HPO 解决方案通常只能应用在某一类神经网络结构上。此外,在探索性训练过程中,很多神经网络结构是相似的,但现有深度神经网络开发工具却没有系统性地利用相似性加速探索过程。
针对以上问题,微软亚洲研究院系统与网络组的研究员们在系统领域顶会 OSDI 2020的论文中提出了一种支持“探索性训练”的新型深度学习框架 Retiarii。Retiarii 能够帮助用户灵活、自由地表示各种搜索空间、重用前沿搜索算法,并利用系统级优化加速搜索过程。目前,Retiarii 已经正式集成在 NNI 2.0 中。
Retiarii 创新性地将神经网络的开发看成一系列网络模型的“变形”(Mutation),这一系列变形组成了在网络空间(Model Space)内的搜索过程。Retiarii 提出将“变形器”(Mutator)作为基本编程范式,神经网络开发人员可以利用“变形器”对基础网络进行编程变形,如增加或删除某个网络节点。在每次变形时,“变形器”通过选择(choose())接口将网络变形的选择权交给“探索策略”(Exploration Strategy),甚至可以实时地交给开发者本人。由此,整个探索性训练将一系列的“变形器”作用于一个基础网络上,并交由探索策略来驱动整个探索过程。
实验结果表明,Retiarii 通过单个变形器的抽象将 DNN 模型空间、探索策略和跨模型优化完美地分离开来,能够简化编程过程,重用各个组件,极大地改善整个探索性训练过程的效率,在实验中达到了8.58倍的搜索加速。
使用 Retiarii 框架并不需要学习一门全新的框架语言,只需要对原始 TensorFlow 或 PyTorch 代码进行细小的改动。对 NNI 的“老粉”来说,Retiarii 也将是一种全新的体验:搜索空间直接定义在用户模型代码中,实验直接由 Python 启动,NAS 和 HPO 候选项的支持也更为友好…… NNI 目前正在将原始的 NAS 框架迁移到 Retiarii 框架,在此,推荐大家尝试新的框架并帮助 NNI 进行改进。
Retiarii 使用示例
想要了解更多 Retiarii 的详细信息,请点击:
• 文档链接:
https://nni.readthedocs.io/en/latest/NAS/retiarii/retiarii_index.html
• 论文链接:
https://www.usenix.org/conference/osdi20/presentation/zhang-quanlu
随着更多层和节点大型神经网络的使用,降低模型的存储和计算成本变得至关重要。NNI 的模型压缩工具包能够有效解决此问题。该工具包提供了最先进的模型压缩算法和策略,可以在不显著损失模型性能的条件下压缩并加速模型。
模型压缩技术可以分为两类:剪枝和量化。NNI 内置了丰富的剪枝算法,它们通常使用权重掩码来模拟实际的剪枝,然而掩码虽然可以用来检验压缩模型的性能(如精度),但并没有真正加速模型,而加速模型才是剪枝算法的最终目标。为此,NNI 从1.4版本开始就提供了通用的、基于掩码的模型加速工具,以减少推理延迟和模型大小,并在1.7版本和1.8版本中持续改进和更新。
NNI 的模型压缩加速工具目前支持粗粒度剪枝算法。该工具利用稀疏的掩码将待剪枝模块更换为压缩后的模块。更换模块后,权重或输入输出张量的形状常常会被改变,所以此工具还具备形状推理功能,以检查其他未修剪的层由于形状变化是否需要被替换。加速后的模型有着较低的时延,Resnet18 的实验效果如下:
欲了解更多关于基于掩码的模型压缩加速工具的信息,请点击链接:
https://nni.readthedocs.io/en/latest/Compression/ModelSpeedup.html
在 NNI 1.0 版本中,使用 NNI 发起实验需要四个步骤:编写 JSON 格式的搜索空间文件、修改 Trial 代码获取超参、定义 YAML 格式的配置文件、使用交互式命令 nnictl 启动实验。对于 Trial 的管理,交互式的命令是非常自然合理的,但只能利用日志进行调试,过程相对繁琐。
在 2.0 版本中,NNI 提供了一种全新的、更为灵活的启动模式,用户可以直接在 Python 文件中定义搜索空间、配置和发起实验。开发者可以直接在代码里初始化调参器(tuner)对象,tuner 处于当前进程,更加易于 debug 和做一些“魔改”。
目前利用 Python 启动实验的功能尚处于 Alpha 阶段,暂不支持断点和交互式执行。NNI 团队将会在以后的版本中改进这个功能,并提供更多 API 来编程式地操控实验,以收集实验结果并基于实验结果进行更加高阶的分析,也希望广大 NNI 粉丝们在 GitHub 提出宝贵的意见和建议,共同将该功能做的更实用。
欲了解更多该功能的相关信息,请点击链接:
https://nni.readthedocs.io/en/latest/Tutorial/HowToLaunchFromPython.html
自动机器学习属于计算密集型工作,发现最佳的超参数/挖掘最优的神经网络架构往往会消耗大量算力资源与时间。为了节约时间,研究人员总希望自己拥有的各种设备能够“齐心协力”。在 2.0 版本中,NNI 提供了混合训练模式(Hybrid Mode),支持同一个实验(Experiment) 在不同训练平台上并行运行,以实现资源利用效率最大化。例如,以前的实验只能单独使用远程机器或者 AML,现在则可以同时使用两个训练平台。
需要注意的是,NNI 混合训练模式目前只支持本地、远程、AML 和 PAI 四种训练平台的混合训练。此外,在发起实验之前,需要开启训练平台并配置对应的环境。
为了更加友好地可视化实验结果、方便快捷地操控和管理实验,除了命令行工具 nnictl 之外,NNI 还提供了简单易用的 Web 界面,使得用户能够直接查看实验的状态、更改实验的配置,对实验结果做更高级的分析。
在2.0 版本中,NNI 新增了实验管理页,所有运行过(包括运行中、运行完成、已停止状态)的实验都会在此页面上展示,并通过点击实验 ID 可以轻松切换到任意一个未停止实验的详情页,这无疑为用户查看历史实验信息和管理所有实验提供了一个新的窗口,实验之间的切换也更加快速便捷。在今后的版本中,NNI 团队还将支持直接在实验管理界面对历史实验进行操作,如停止、恢复实验等,也欢迎粉丝们提供更多使用反馈。
NNI 实验管理界面示例
更多相关信息,请点击:
https://nni.readthedocs.io/en/latest/Tutorial/WebUI.html
NNI 内置了丰富的前沿 Tuner、Advisor 和 Assessor,可以直接应用于超参数优化中。同时,为了满足不同场景下的需求,NNI 允许自定义 Tuner、Advisor 和 Assessor,并通过简单易用的接口将其安装注册为内置算法。
在 NNI 2.0中,自定义算法的安装进一步得到了简化。通过运行简单的命令用户可以将自定义的算法打包成 whl 文件,其他用户则可以通过 pip install 安装算法,并通过 nnictl algo register 将其注册到 NNI 中,就可以用与 NNI 内置算法相同的方式使用自定义的算法了。这使得自定义算法在不同用户之间的分享和传播变得更加轻松、容易。通过提供一个强大完备的系统,NNI 希望帮助研究人员专注于 Tuner、Advisor 和 Assessor 算法研发,推动各类想法方案应用的落地。
关于简化自定义算法安装方面的更多信息,请点击链接:
https://nni.readthedocs.io/en/latest/Tutorial/InstallCustomizedAlgos.html
降低人工智能门槛,加速深度学习普及化是微软一直追求的目标。NNI 内置的前沿自动机器学习(AutoML)算法,能够帮助用户在没有专业机器学习专家指导的情况下,获得高质量的模型,着重解决了一系列支持 AutoML 的系统问题,并通过开放的方式有效加速算法研究者在这一领域的创新。未来,NNI 将会以更强的自动化框架、更丰富的算法、更高效的分布式调参效率帮助研究人员和算法工程师们,以更灵活的方式从海量数据中洞察未来的人工智能世界。
作为一个开源项目,NNI 团队期待大家为 NNI 贡献更多新的算法、功能和示例,也欢迎为 NNI 提出建议和报告问题。如果有任何反馈与建议,欢迎在 GitHub 社区中与我们交流。
想要了解 NNI 上新背后的故事,敬请关注明天的文章推送!
你也许还想看: