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

    文章

    6246

    浏览量

    103077
  • 神经网络
    +关注

    关注

    42

    文章

    4572

    浏览量

    98749
  • NNI
    NNI
    +关注

    关注

    0

    文章

    3

    浏览量

    6301
  • 机器学习
    +关注

    关注

    66

    文章

    8122

    浏览量

    130562
收藏 人收藏

    评论

    相关推荐

    仓库必备机器人,仓库管理神器

    给大家分享一下美国制造的仓库神器。简直就是。。。给我来10个劳力,我要一个机器人顶10个。真心仓库必备。
    发表于 01-13 11:22

    酷卡机器人提示要求零的目的是什么?

    公司的酷卡机器人有一个零的程序,就是把机器人移动靠近到防护围栏上的一个传感器,直到触发传感器动作。在机器人发生碰撞后就提示要求零,但一
    发表于 01-14 14:35

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

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

    函数的实参与形

    和实参出现不同类型时,则按照不同类型数值的赋值规则进行转换。主调函数在在调用函数之前,应对被函数原型声明。实参向形的数据传递是单向传递,不能由形再回传给实参,也就是说实参值传递
    发表于 10-18 20:15

    自制飞控板能用地面站软件进行刷固件或者吗?

    如果是自制飞控板的话,还能用地面站软件(mission planner)进行刷固件或者么?有哪位大神可以提供一些入门的学习资料,刚开始,有点懵,不知如何下手。
    发表于 06-27 04:35

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

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

    Python机器学习的重要库

    开发用 Python 机器学习不得不收藏的重要库
    发表于 06-10 09:24

    ADRC的使用方法和大致的方向

    由于串级PID还没搞定,就转向了自抗扰控制,用STM32控制无刷电机做了一个ADRC速度闭环,没静差是真的,但感觉也没想象中那么强,就写篇博文记录一下ADRC大概的使用方法和大致的方向。
    发表于 09-07 06:33

    教你怎样学会PID

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

    PID的相关资料分享

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

    针对PID进行详细的讲解

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

    NNI Signalling Test Software A

    NNI Signal
    发表于 07-10 11:30 12次下载

    NNI

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

    自动机器学习简述

    自动机器学习(AutoML)的目标就是使用自动化的数据驱动方式来做出上述的决策。用户只要提供数据,自动机器学习系统
    的头像 发表于 12-26 10:56 699次阅读

    自动驾驶中的机器学习

    近年来,自动驾驶技术技术的发展速度非常快。预计达到完全自动驾驶L5的程度是指日可待的。自动驾驶的核心技术主要是人工智能中的机器学习与深 度
    发表于 06-06 10:06 0次下载
    <b class='flag-5'>自动</b>驾驶中的<b class='flag-5'>机器</b><b class='flag-5'>学习</b>