2020 7 15
NNI 优化 Yolo5
1. NNI 简介
NNI (Neural Network Intelligence) 是自动机器学习(AutoML)的工具包。
它通过多种调优的算法来搜索最好的神经网络结构和(或)超参,并支持单机、本地多机、云等不同的运行环境。
NNI开源地址:https://github.com/Microsoft/nni
不同于神经网络中参数的调节, 使用NNI几乎可以调节任意参数, 无论该参数对所要求的指标可导或者不可导。
在神经网络中网络使用BP算法、梯度下降, 需要满足偏导数存在
我通过NNI调节yolov5中的 conf_thresh 和 iou_thresh 其实可以直接调节网络结构、学习率之类的值, 介于耗时太长, 没有调节
2. NNI的安装
具体安装可以参考https://blog.csdn.net/u014025201/article/details/87179698
我是通过下载github中的开源代码后使用pip安装: python3 -m pip install --upgrade nni
3. NNI的使用
3.1 修改函数
找出哪些参数需要调节, 并将其与相关函数分离, 成为 main(params) 形式, 当然没有必要完全按照这个来, 只是这样看起来清晰明了。
该处需注意, 参数尽量为键值对形式 {key: value}, 方便NNI进行调节, 千万别像我一样用namesapce
3.2 套路
①导入NNI模块 (import nni)
②设置参数更新: nni.get_next_parameter()和params.update(tuner_params)
③设置反馈 nni.report_final_result(指标)
④编写 config.yml 文件
设置 最大试验时间为1小时 maxExecDuration: 1h
设置 最大试验次数为100次 maxTrialNum: 100
搜索空间在search_space.json文件中 searchSpacePath: search_space.json
优化算法为TPE builtinTunerName: TPE
优化目标为使得指标最大 optimize_mode: maximize
对python detect_nni.py进行实验 command: python detect_nni.py
⑤编写 search_space 文件
格式: "变量名":{"_type": 数据格式, "_value": [数据取值]}
数据格式有 uniform 和 choice (我就知道这两种☺)
在进行 conf_thresh 和 iou_thresh 的调节时为:
{
"conf_thres":{"_type":"uniform","_value":[0.0, 1.0]},
"iou_thres":{"_type":"uniform","_value":[0.0, 1.0]}
}
⑥执行
终端输入: nnictl create --config 你的config文件
可以点开链接查看详细实验情况
4. 注意事项
在经历了4-5小时的试错后, 总结出以下注意事项:
①变量名里不要出现'-'(减号), 因为在运行时就会莫名其妙的变为'_'(下划线), 我也不知道是不是和环境有关(ubuntu16.04+PyCharm2019)
②可以查看日志文件, 检查实验情况, 查找报错原因
③一定要反馈指标, 且指标必须是int或float