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

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

3天内不再提示

NNI:自动帮你做机器学习调参的神器

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-30 10:28 次阅读

NNI 自动机器学习调参,是微软开源的又一个神器,它能帮助你找到最好的神经网络架构或超参数,支持 各种训练环境

它常用的使用场景如下:

  • 想要在自己的代码、模型中试验 不同的机器学习算法
  • 想要在不同的环境中加速运行机器学习。
  • 想要更容易实现或试验新的机器学习算法的研究员或数据科学家,包括:超参调优算法,神经网络搜索算法以及模型压缩算法。

它支持的框架有:

  • PyTorch
  • Keras
  • TensorFlow
  • MXNet
  • Caffe2
  • Scikit-learn
  • XGBoost
  • LightGBM

基本上市面上所有的深度学习和机器学习的框架它都支持。

下面就来看看怎么使用这个工具。

1.准备

开始之前,你要确保Pythonpip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

**(可选1) **如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

**(可选2) **此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

请选择以下任一种方式输入命令安装依赖

  1. Windows 环境 打开 Cmd (开始-运行-CMD)。
  2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
  3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install nni

2.运行示例

让我们运行一个示例来验证是否安装成功,首先克隆项目:

git clone -b v2.6 https://github.com/Microsoft/nni.git

如果你无法成功克隆项目,请在Python实用宝典后台回复 **nni **下载项目。

运行 MNIST-PYTORCH 示例, Linux/macOS

nnictl create --config nni/examples/trials/mnist-pytorch/config.yml

Windows

nnictl create --config nniexamplestrialsmnist-pytorchconfig_windows.yml

出现这样的界面就说明安装成功,示例运行正常:

图片

访问 http://127.0.0.1:8080 可以配置运行时间、实验次数等:

图片

3.模型自动调参配置

那么如何让 NNI 和我们自己的模型适配呢?

观察 config_windows.yaml 会发现:

searchSpaceFile: search_space.json
trialCommand: python mnist.py
trialGpuNumber: 0
trialConcurrency: 1
tuner:
  name: TPE
  classArgs:
    optimize_mode: maximize
trainingService:
  platform: local

我们先看看 trialCommand, 这很明显是训练使用的命令,训练代码位于 mnist.py,其中有部分代码如下:

def get_params():
    # Training settings
    parser = argparse.ArgumentParser(description='PyTorch MNIST Example')
    parser.add_argument("--data_dir", type=str,
                        default='./data', help="data directory")
    parser.add_argument('--batch_size', type=int, default=64, metavar='N',
                        help='input batch size for training (default: 64)')
    parser.add_argument("--batch_num", type=int, default=None)
    parser.add_argument("--hidden_size", type=int, default=512, metavar='N',
                        help='hidden layer size (default: 512)')
    parser.add_argument('--lr', type=float, default=0.01, metavar='LR',
                        help='learning rate (default: 0.01)')
    parser.add_argument('--momentum', type=float, default=0.5, metavar='M',
                        help='SGD momentum (default: 0.5)')
    parser.add_argument('--epochs', type=int, default=10, metavar='N',
                        help='number of epochs to train (default: 10)')
    parser.add_argument('--seed', type=int, default=1, metavar='S',
                        help='random seed (default: 1)')
    parser.add_argument('--no_cuda', action='store_true', default=False,
                        help='disables CUDA training')
    parser.add_argument('--log_interval', type=int, default=1000, metavar='N',
                        help='how many batches to wait before logging training status')
    args, _ = parser.parse_known_args()
    return args

如上所示,这个模型里提供了 10 个参数选择。也就是说 NNI 可以帮我们自动测试这10个参数。

那么这些参数在哪里设定?答案是在 searchSpaceFile 中,对应的值也就是 search_space.json:

{
    "batch_size": {"_type":"choice", "_value": [16, 32, 64, 128]},
    "hidden_size":{"_type":"choice","_value":[128, 256, 512, 1024]},
    "lr":{"_type":"choice","_value":[0.0001, 0.001, 0.01, 0.1]},
    "momentum":{"_type":"uniform","_value":[0, 1]}
}

这里有4个选项,NNI 是怎么组合这些参数的呢?这是 tuner 参数干的事,为了让机器学习和深度学习模型适应不同的任务和问题,我们需要进行超参数调优,而自动化调优依赖于优秀的调优算法。NNI 内置了先进的调优算法,并且提供了易于使用的 API。

在 NNI 中,Tuner 向 trial 发送超参数,接收运行结果从而评估这组超参的性能,然后将下一组超参发送给新的 trial。

下表简要介绍了 NNI 内置的调优算法。

Tuner算法简介
TPETree-structured Parzen Estimator (TPE) 是一种基于序列模型的优化方法。SMBO方法根据历史数据来顺序地构造模型,从而预估超参性能,并基于此模型来选择新的超参。
Random Search (随机搜索)随机搜索在超算优化中表现出了令人意外的性能。如果没有对超参分布的先验知识,我们推荐使用随机搜索作为基线方法。
Anneal (退火)朴素退火算法首先基于先验进行采样,然后逐渐逼近实际性能较好的采样点。该算法是随即搜索的变体,利用了反应曲面的平滑性。该实现中退火率不是自适应的。
Naive Evolution(朴素进化)朴素进化算法来自于 Large-Scale Evolution of Image Classifiers。它基于搜索空间随机生成一个种群,在每一代中选择较好的结果,并对其下一代进行变异。朴素进化算法需要很多 Trial 才能取得最优效果,但它也非常简单,易于扩展。
SMACSMAC 是基于序列模型的优化方法 (SMBO)。它利用使用过的最突出的模型(高斯随机过程模型),并将随机森林引入到SMBO中,来处理分类参数。NNI 的 SMAC tuner 封装了 GitHub 上的 SMAC3。参考论文注意:SMAC 算法需要使用pip install nni[SMAC]安装依赖,暂不支持 Windows 操作系统
Batch(批处理)批处理允许用户直接提供若干组配置,为每种配置运行一个 trial。
Grid Search(网格遍历)网格遍历会穷举搜索空间中的所有超参组合。
HyperbandHyperband 试图用有限的资源探索尽可能多的超参组合。该算法的思路是,首先生成大量超参配置,将每组超参运行较短的一段时间,随后抛弃其中效果较差的一半,让较好的超参继续运行,如此重复多轮。参考论文
Metis大多数调参工具仅仅预测最优配置,而 Metis 的优势在于它有两个输出:(a) 最优配置的当前预测结果, 以及 (b) 下一次 trial 的建议。大多数工具假设训练集没有噪声数据,但 Metis 会知道是否需要对某个超参重新采样。参考论文
BOHBBOHB 是 Hyperband 算法的后续工作。Hyperband 在生成新的配置时,没有利用已有的 trial 结果,而本算法利用了 trial 结果。BOHB 中,HB 表示 Hyperband,BO 表示贝叶斯优化(Byesian Optimization)。BOHB 会建立多个 TPE 模型,从而利用已完成的 Trial 生成新的配置。参考论文
GP (高斯过程)GP Tuner 是基于序列模型的优化方法 (SMBO),使用高斯过程进行 surrogate。参考论文
PBTPBT Tuner 是一种简单的异步优化算法,在固定的计算资源下,它能有效的联合优化一组模型及其超参来最优化性能。参考论文
DNGODNGO 是基于序列模型的优化方法 (SMBO),该算法使用神经网络(而不是高斯过程)去建模贝叶斯优化中所需要的函数分布。

可以看到本示例中,选择的是TPE tuner.

其他的参数比如 trialGpuNumber,指的是使用的gpu数量,trialConcurrency 指的是并发数。trainingService 中 platform 为 local,指的是本地训练。

当然,还有许多参数可以选,比如:

trialConcurrency: 2                 # 同时运行 2 个 trial
maxTrialNumber: 10                  # 最多生成 10 个 trial
maxExperimentDuration: 1h # 1 小时后停止生成 trial

不过这些参数在调优开始时的web页面上是可以进行调整的。

图片

所以其实NNI干的事情就很清楚了,也很简单。你只需要在你的模型训练文件中增加你想要调优的参数作为输入,就能使用NNI内置的调优算法对不同的参数进行调优,而且允许从页面UI上观察调优的整个过程,相对而言还是很方便的。

不过,NNI可能不太适用一些数据量极大或模型比较复杂的情况。比如基于DDP开发的模型,在NNI中可能无法实现大型的分布式计算。

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

    关注

    4

    文章

    6627

    浏览量

    104423
  • 神经网络
    +关注

    关注

    42

    文章

    4779

    浏览量

    101132
  • NNI
    NNI
    +关注

    关注

    0

    文章

    3

    浏览量

    6361
  • 机器学习
    +关注

    关注

    66

    文章

    8438

    浏览量

    133028
收藏 人收藏

    评论

    相关推荐

    【OK210申请】智能家电(厨房神器之帮厨机器人)开发

    申请理由:公司根据市场需求,将要开发一款叫帮厨机的机器,希望可以用这套开发板来开发。项目描述:帮厨机器人,之所以叫厨房神器,是因为它具有强大的功能,它具有北方人喜欢的生面条,熟面条,
    发表于 06-28 17:57

    阿里巴巴大数据产品最新特性介绍--机器学习PAI

    以下内容根据演讲视频以及PPT整理而成。本次分享主要围绕以下五个方面:PAI产品简介自定义算法上传数加智能生态市场AutoML2.0自动AutoLearning自动
    发表于 09-18 14:57

    教你怎样学会PID

    不会PID?这篇文章图文结合带你学会PID!让你成为PID大神!!!
    发表于 01-06 07:47

    PID的相关资料分享

    说明:本文章适用于STM32初学者,想完成一个好玩且有深度的项目但不知道从何下手的同学。PID是平衡车的精髓所在,参数整定的好坏直接影响到平衡车的平衡效果。有的车平衡时来回晃而参数选的好的车就能
    发表于 01-14 09:14

    针对PID进行详细的讲解

      大家好,我是小政。本篇文章我将针对PID进行详细的讲解,让每位小伙伴能够对比例、积分、微分三个参数如何调节有更加清晰的理解。一、步骤确立机械中值直立环(内环)——Kp极性、
    发表于 01-14 06:26

    NNI

    NNI包括内部网络节点接口(I-NNI)和外部网络节点接口(E-NNI)两种。I-NNI指属于一个管理域或多个具有信任关系的控制面实体间的双向信令接口,负责支持网络中连
    发表于 06-06 12:48 4608次阅读

    WinGUI_2.3软件

    英文版软件,很好的软件,WinGUI_2.3软件
    发表于 12-08 14:28 3次下载

    NAZA_驱动软件及说明书

    NAZA 驱动软件,需要的可以看一看了
    发表于 02-15 15:10 0次下载

    CF飞控说明

    CF飞控说明
    发表于 10-09 14:56 15次下载

    深度学习机器学习深度的不同之处 浅谈深度学习的训练和

    近年来,深度学习作为机器学习中比较火的一种方法出现在我们面前,但是和非深度学习机器学习相比(我
    发表于 05-02 10:30 4357次阅读

    深度学习经验

    对于深度学习本人也是半路出家. 现在的工作内容主要就是使用CNNCV任务. 干这种活也有两年时间了. 我的回答可能更多的还是侧重工业应用, 技术上只限制在CNN这块.
    的头像 发表于 06-08 14:41 2357次阅读

    机器学习全靠?谷歌发布颠覆性研究

    不训练不调,AI自动构建超强网络,告别炼丹一大步
    的头像 发表于 06-16 09:41 2671次阅读

    机器学习的模型评估与大法 想学的快上车

    由于文章较长,所以我还是先把目录提前。 一、认识管道流 1.1 数据导入 1.2 使用管道创建工作流 二、K折交叉验证 2.1 K折交叉验证原理 2.2 K折交叉验证实现 三、曲线 3.1 模型
    的头像 发表于 09-25 10:57 2134次阅读
    结<b class='flag-5'>机器</b><b class='flag-5'>学习</b>的模型评估与<b class='flag-5'>调</b><b class='flag-5'>参</b>大法  想学的快上车

    机器学习8大技巧

    今天给大家一篇关于机器学习技巧的文章。超参数优是机器
    的头像 发表于 03-23 08:26 696次阅读
    <b class='flag-5'>机器</b><b class='flag-5'>学习</b>8大<b class='flag-5'>调</b><b class='flag-5'>参</b>技巧

    LSTM神经网络的技巧

    长短时记忆网络(Long Short-Term Memory, LSTM)是一种特殊的循环神经网络(RNN),它能够学习长期依赖信息。在实际应用中,LSTM网络的是一个复杂且关键的过程,直接影响
    的头像 发表于 11-13 10:01 794次阅读