微软提出自动化神经网络训练剪枝框架OTO,一站式获得高性能轻量化模型

简介: 微软提出自动化神经网络训练剪枝框架OTO,一站式获得高性能轻量化模型


作者: 陈天翼-微软西雅图-高级研究员

OTO 是业内首 个自动化、 一站式、 用户友好 且通用的神经网络训练与结构压缩框架。


在人工智能时代,如何部署和维护神经网络是产品化的关键问题考虑到节省运算成本,同时尽可能小地损失模型性能,压缩神经网络成为了 DNN 产品化的关键之一。


DNN 压缩通常来说有三种方式,剪枝,知识蒸馏和量化。剪枝旨在识别并去除冗余结构,给 DNN 瘦身的同时尽可能地保持模型性能,是最为通用且有效的压缩方法。三种方法通常来讲可以相辅相成,共同作用来达到最佳的压缩效果。


然而现存的剪枝方法大都只针对特定模型,特定任务,且需要很强的专业领域知识,因此通常需要 AI 开发人员花费大量的精力才能将这些方法应用于自己的场景中,非常消耗人力物力成本。


OTO 概述为了解决现存剪枝方法的问题并给 AI 开发者提供便利,微软团队提出了 Only-Train-Once OTO 框架。OTO 是业内首个自动化、一站式、用户友好且通用的神经网络训练与结构压缩框架,系列工作陆续发表于 ICLR2023 和 NeurIPS2021。

通过使用 OTO,AI 工程师可以方便地训练目标神经网络,一站式地取得高性能且轻量化的模型。OTO 最小化了开发者的工程时间精力的投入,且全程无需现有方法通常需要的非常耗时的预训练和额外的模型微调。



框架核心算法

理想化的结构剪枝算法应该做到:针对通用神经网络,自动化地一站式地从零开始训练,同时达到高性能且轻量化的模型,并无需后续微调。但因为神经网络的复杂性,实现这一目标是一件极其有挑战性的事情。为了实现这一最终目的,下面的三个核心问题需要被系统性地解决:

  • 如何找出哪些网络结构可以被移除?
  • 如何在移除网络结构的过程中,尽可能不损失模型性能?
  • 如何能自动化地完成如上两点?


微软团队设计并实现了三套核心算法,首次系统性地,全面性地解决这三个核心问题。

自动化 Zero-Invariant Groups (零不变组) 分组

由于网络结构的复杂性和关联性,删去任意网络结构可能会导致剩余的网络结构无效。因此自动化网络结构压缩的一个最大的问题之一是如何找到必须要被一起剪枝的模型参数,使得余下的网络依然有效。为了解决该问题,微软团队在 OTOv1 中提出了零不变组 Zero-Invariant Groups  (ZIGs)。零不变组可以理解为一类最小的可移除单元,使得该组对应的网络结构移除后剩余网络依然有效。零不变组的另一大特性是,如果一个零不变组等于零,那么无论输入值是什么,输出值永远是零。在 OTOv2 中,研究者进一步提出并实现了一套自动化算法来解决通用网络的零不变组的分组问题。自动化分组算法是由一系列图算法精心设计组合而成,整套算法非常高效,具有线性的时间空间复杂度。


双半平面投影梯度优化算法 (DHSPG)

当划分目标网络所有的零不变组后,接下来的模型训练和剪枝任务需要找出哪些零不变组是冗余的,哪些又是重要的。冗余的零不变组对应的网络结构需要被删除,重要的零不变组需要保留并保证压缩模型的性能。研究者公式化这个问题为一个结构性稀疏化问题,并提出全新的 Dual Half-Space Projected Gradient  (DHSPG) 优化算法来解决。


DHSPG 可以非常有效地找出冗余的零不变组并将其投影成零,并持续训练重要的零不变组来取得跟原始模型相媲美的性能。

与传统稀疏优化算法相比,DHSPG 具有更强更稳定地稀疏结构探索能力,且扩展了训练搜索空间并因此通常要获得更高的实际表现效果。


自动化构建轻量压缩模型

通过使用 DHSPG 对模型进行训练,我们会得到一个服从于零不变组的高结构稀疏性的解,即该解里有很多被投影成零的零不变组,此外该解还会具有很高的模型性能。接下来,研究者把所有对应与冗余零不变组的结构删去来自动化地构建压缩网络。由于零不变组的特性,即如果一个零不变组等于零,那么无论输入值是什么,输出值永远是零,因此删去冗余的零不变组不会对网络产生任何影响。所以通过 OTO 得到的压缩网络和完整网络会有相同的输出,无需传统方法所需要的进一步模型微调。


数值实验

分类任务

表 1:CIFAR10 中的 VGG16 及 VGG16-BN 模型表现。

在 CIFAR10 的 VGG16 实验中,OTO 将浮点数减少了 86.6%,将参数量减少了 97.5%,性能表现令人印象深刻。

表 2:CIFAR10 的 ResNet50 实验。

在 CIFAR10 的 ResNet50 实验中,OTO 在没有量化的情况下优于 SOTA 神经网络压缩框架 AMC 和 ANNC,仅使用了 7.8% 的 FLOPs 和 4.1% 的参数。

表 3. ImageNet 的 ResNet50 实验。

在 ImageNet 的 ResNet50 实验中,OTOv2 在不同结构稀疏化目标下,展现出跟现存 SOTA 方法相媲美甚至更优的表现。

表 4: 更多结构和数据集。

OTO 也在更多的数据集和模型结构上取得了不错的表现。

Low-Level Vision 任务

表 4:CARNx2 的实验。

在 super-resolution 的任务中,OTO 一站式训练压缩了 CARNx2 网络,得到了跟原始模型有竞争力的性能且压缩了越 75% 的运算量和模型大小。

语言模型任务


此外,研究者还在 Bert 上针对核心算法之一,DHSPG 优化算法,进行了对比试验,验证了其相较于其他稀疏优化算法的高性能性。可以发现在 Squad 上,利用 DHSPG 进行训练所得到的参数量减小和模型性能要远远优于其他稀疏优化算法。

结论

微软团队提出了一个名为 OTO(Only-Train-Once)的 自动化一站式神经网络训练结构剪枝框架。它可以将一个完整的神经网络自动化地压缩为轻量级网络,同时保持较高的性能。OTO 大大简化了现有结构剪枝方法复杂的多阶段流程,适合各类网络架构和应用,且最小化了用户的额外工程投入,具有通用性,有效性和易用性。

相关文章
|
7月前
|
机器学习/深度学习 人工智能 算法
AI 基础知识从 0.6 到 0.7—— 彻底拆解深度神经网络训练的五大核心步骤
本文以一个经典的PyTorch手写数字识别代码示例为引子,深入剖析了简洁代码背后隐藏的深度神经网络(DNN)训练全过程。
1209 56
|
8月前
|
C++
基于Reactor模型的高性能网络库之地址篇
这段代码定义了一个 InetAddress 类,是 C++ 网络编程中用于封装 IPv4 地址和端口的常见做法。该类的主要作用是方便地表示和操作一个网络地址(IP + 端口)
367 58
|
8月前
|
机器学习/深度学习 算法 量子技术
GQNN框架:让Python开发者轻松构建量子神经网络
为降低量子神经网络的研发门槛并提升其实用性,本文介绍一个名为GQNN(Generalized Quantum Neural Network)的Python开发框架。
193 4
GQNN框架:让Python开发者轻松构建量子神经网络
|
8月前
|
网络协议 算法 Java
基于Reactor模型的高性能网络库之Tcpserver组件-上层调度器
TcpServer 是一个用于管理 TCP 连接的类,包含成员变量如事件循环(EventLoop)、连接池(ConnectionMap)和回调函数等。其主要功能包括监听新连接、设置线程池、启动服务器及处理连接事件。通过 Acceptor 接收新连接,并使用轮询算法将连接分配给子事件循环(subloop)进行读写操作。调用链从 start() 开始,经由线程池启动和 Acceptor 监听,最终由 TcpConnection 管理具体连接的事件处理。
281 2
|
8月前
基于Reactor模型的高性能网络库之Tcpconnection组件
TcpConnection 由 subLoop 管理 connfd,负责处理具体连接。它封装了连接套接字,通过 Channel 监听可读、可写、关闭、错误等
229 1
|
8月前
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
446 3
|
8月前
基于Reactor模式的高性能网络库github地址
https://github.com/zyi30/reactor-net.git
201 0
|
8月前
基于Reactor模型的高性能网络库之Poller(EpollPoller)组件
封装底层 I/O 多路复用机制(如 epoll)的抽象类 Poller,提供统一接口支持多种实现。Poller 是一个抽象基类,定义了 Channel 管理、事件收集等核心功能,并与 EventLoop 绑定。其子类 EPollPoller 实现了基于 epoll 的具体操作,包括事件等待、Channel 更新和删除等。通过工厂方法可创建默认的 Poller 实例,实现多态调用。
399 60
|
8月前
|
安全 调度
基于Reactor模型的高性能网络库之核心调度器:EventLoop组件
它负责:监听事件(如 I/O 可读写、定时器)、分发事件、执行回调、管理事件源 Channel 等。
418 57
|
8月前
基于Reactor模型的高性能网络库之时间篇
是一个用于表示时间戳(精确到微秒)**的简单封装类
272 57

热门文章

最新文章