NNI (Neural Network Intelligence) 是微软开发的一款AUTOML工具,涉及四个特性:
- 超参优化 Hyperparameter Optimization,HPO
- 模型搜索 Neural Architecture Search, NAS
- 模型压缩 Model Compression, MC
- 特征工程 Feature Engineering, FE
详细的使用方法和心得可以参考下面链接:
NNI调试记录-HPO
NNI调试记录-NAS
NNI调试记录-Pruning
文章中的代码可以参考:
fast-reid-nni
安装步骤
pip
pip install nni
从源码编译
有三种方式,建议使用docker。docker虽然有学习成本,但优点真的很多且很方便,强烈建议学习下。如果公司有服务器的话,直接在docker里面开发那就更爽了,具体配置ssh登录和图形转发可以参考这个链接
git clone https://github.com/microsoft/nni.git
cd nni
pip install --upgrade setuptools pip wheel
python setup.py develop
从docker安装
docker pull msranni/nni
测试
$ nnictl hello
A hyperparameter optimization example has been created at "nni_hello_hpo" directory.
Please run "python nni_hello_hpo/main.py" to try it out.
如果能看到上面的打印信息说明安装成功
nnctl
一组NNI命令行交互工具,方便进行实验创建,恢复,停止等控制,常用的有如下这些:
- nnictl create
创建一个实验 - nnictl resume
恢复实验 - nnictl view
查看已经完成的实验,这个有点用,因为NNI在实验结束后会断开request,导致链接失效,用这个命令可以重新打开网页缓冲。 - nnictl update
更新部分参数,包括搜索空间,尝试次数,并发数,最大尝试耗时 - nnictl stop
停止实验 - nnictl trial ls
查看某个实验下面的jobs(并发) - nnictl experiment save
导出某个实验,方便迁移到其他设备 - nnictl experiment load
加载用nnictl experiment save保存的镜像
Let’s Getting Start
NNI到底有多简单,从下面这段代码就能看出:
params = nni.get_next_parameter()
class Net(nn.Module):
...
model = Net()
optimizer = optim.SGD(model.parameters(),
params['lr'],
params['momentum'])
for epoch in range(10):
train(...)
accuracy = test(model)
nni.report_final_result(accuracy)
总结
从业这些年,发现很多人包括我过人(不管是新人还是老人,不管是大厂还是小厂)还是喜欢人工调参(专业点的用EXECL记录,不专业的直接纸笔),总结一些理由就是
1、寻优太耗时,可能卡还不够;
2、要写工具很麻烦;
3、靠经验调的参数配置也够用了,为了提升那点精度费时费力没必要;
后来我用shell写一些自动化调参脚本,能做到一定的自动化,效率低(网格搜索)、可视化都很低。NNI确实一定程度解决了上面说的问题:
- 利用了多并发,还有基于启发式、GD的寻优算法,资源不够,也能效率大大提升;
- 提供了功能强大但简单易用的API(继承pytorch);
- webui,可视化程度高;
- 完整的log记录,方便回溯;
- 可以打包和加载实验,方便迁移;