有没有什么可以节省大量时间的 Deep Learning 效率神器?

点击上方“码农突围”,马上关注

这里是码农充电第一站,回复“666”,获取一份专属大礼包

真爱,请设置“星标”或点个“在看”

有没有什么可以节省大量时间的 Deep Learning 效率神器?_第1张图片

编辑:Amusi

来源:https://www.zhihu.com/question/384519338

有没有什么可以节省大量时间的 Deep Learning 效率神器?

作者:Jeremy Zhou
https://www.zhihu.com/question/384519338/answer/1152322804

推荐一个基于PyTorch的Deep Learning框架PyTorch Lightning。

https://github.com/PyTorchLightning/pytorch-lightning

有没有什么可以节省大量时间的 Deep Learning 效率神器?_第2张图片

经过我的试用,这个框架现在优点很多,使用方便,节省大量时间,让用户只需要关注模型和数据。

  1. 不再需要关注很多无关但必要的繁杂细节,例如控制训练流程、保存模型checkpoint、fp16支持、多机多卡训练、梯度累计等等。这些东西全部由框架实现。

  2. 对于一般的模型训练,只需要关注模型设计和数据读取。模型部分就不谈了。对于数据读取,除了具体的读数据,只需要写一个如何将多个instance打包成一个batch的函数即可。

  3. 扩展性强。这是我认为这个框架最优秀的地方。PyTorch实际上有很多不同的框架,但是增加的易(无)用(脑)性的同时,其扩展性往往大打折扣。PyTorch Lightning对于这点的处理很好。可能某高级炼金术师不止需要控制模型设计和数据读取,而是想要进行更精细的控制,例如学习率的自定义调节。PyTorch Lightning也通过hook的方式提供了支持,几乎所有常见的可以插入自定义控制流程的地方都可以使用hook进行更精细的控制。

有没有什么可以节省大量时间的 Deep Learning 效率神器?_第3张图片

下面说说缺点:

  1. 老生常谈的第一点,对于某些国家炼金术师,他们想要控制每一个细节,那么PyTorch Lightning可能无法提供支持。但是我觉得这些人也没必要用这个,自己从头写最好了。

  2. 框架还处于高频更新中,可能前后版本存在兼容性问题。甚至有一些小坑。

作者:金天
https://www.zhihu.com/question/384519338/answer/1150941204

谢药。

来推广一波我的Alfred库,首先请大家pip安装一波:

sudo pip3 install alfred-py

然后是Github链接:

https://github.com/jinfagang/alfred

这个库目前有143个star,30个fork,看完觉得有用的老铁记得回过头来三连(疯狂暗示)。

alfred是什么

这是个啥库?这里贴一个github官方的定义:

英文不大好,大概意思是这是一个lib,同时也是一个tool,你只要安装了上面的命令,你就可以在terminal召唤alfred了!

大家安装完了使一下??

alfred -h

是不是感觉很顺手?到目前为止大家还是不知道alfred是干啥的。但是你看看-h应该会看到一大堆指令。我感觉alfred里面*最装比,最牛x,最掉炸天的应该是visualize你的任何格式的标注数据*.

曾几何时,我都有这样的需求:我有一堆数据,目标检测或者实力分割的,它是VOC或者coco的format,我每次想可视化一下,看看数据有没有标错,都需要自己写脚本,很麻烦。

现在有了alfred,你要可视化VOC,只需要:

alfred data vocview -i JPEGImages/ -l Annotations/

简单吗?只要把图片路径和标注路径穿过去即可。然后你就可以看到了:

有没有什么可以节省大量时间的 Deep Learning 效率神器?_第4张图片

就可以可视化出来了。请注意,你标注和图片放在同一个文件夹也是可以的噢,很鲁帮性的哦。

这其实没啥,当然coco的数据集也是一样的,这里我不做过多的演示。我想要介绍的alfred里面一个很神奇的功能,也是十分牛逼的功能:

*各式各样的画box的函数*.

你还在为box烦恼吗?每次做完一个检测模型,画框的代码我觉得很麻烦,虽然复制粘贴很爽,但不是那么的优雅。而在alfred里面,你可以很方便的画bounding box:

有没有什么可以节省大量时间的 Deep Learning 效率神器?_第5张图片

比如这个box的API,大概代码如下:

from alfred.vis.image.det import visualize_det_cv2_partfrom alfred.vis.image.get_dataset_label_map import coco_label_map_list

boxes = b.pred_boxes.tensor.cpu().numpy()scores = b.scores.cpu().numpy()classes = b.pred_classes.cpu().numpy()visualize_det_cv2_part(ori_img, scores, classes, boxes, class_names=coco_label_map_list, thresh=0.16,                                   is_show=True)

你只要把box,scores,和classes传进去就可以了,甚至你连coco的labelmap你都可以省掉去了歪!然后出来的效果就是上图所示,所有的画框,score大小的抑制,颜色都可以自动帮你处理。

当然这不是说alfred里面的画框多牛逼,也有很多其他的好用的画框库,但我想说的不是某个库不行,而是在座的库都是...... 2D框好画,3D框你行吗?

有没有什么可以节省大量时间的 Deep Learning 效率神器?_第6张图片

有没有什么可以节省大量时间的 Deep Learning 效率神器?_第7张图片

很多人以为alfred只是一个image相关的库,图样图森破,那衣服。点云照样处理!

甚至可以给你在点云上画3D的Boundingbox,还不够,甚至可以帮助把点云里面的3D box投影到图片显示。。。

好了,介绍到这里大家应该知道alfred库是干啥的吧。案例一个十分好用的snippet,来自于alfred。我们每次写pytorch的代码,都喜欢托裤子放屁:

if use_cuda:    a = a.cuda()

实际上使用alfred你可以防止这种不优雅的if操作:

from alfred.dl.torch.common import device
a = a.to(device)

虽然代码函数差不多,但是你只需要import一句,任何变量都可以使用,简化的代码就不止一行了。

最后告诉大家alfred它不是一个专注pytorch的库,如果你用tensorflow,你照样可以用它的一些API去简化你的操作。譬如tensorflow烦人的log,你不用设置环境变量也可以去掉它:

from alfred.dl.tf.common import mute_tf()mute_tf()import tensorflow as tf

然后整个世界就清净了许多。

alfred的彩蛋

其实要说彩蛋,那其实很多,挑比较有意思的将,其实alfred还有一个爬虫功能,当你需要某些图片的时候可以让alfred给你爬:

alfred scrap image -q '美女'

然后你就有了一堆美女。。。图片。。

最后alfred其实有一个兄弟库,纯C++编写的,功能差不多,只不过C++里面也有很多人烦人的操作,用thor就可以让世界安静:

https://github.com/jinfagang/thor

有没有什么可以节省大量时间的 Deep Learning 效率神器?_第8张图片

作者:董鑫
https://www.zhihu.com/question/384519338/answer/1123898006


"工欲善其事, 必先利其器"

今天介绍的是 NVIDIA 推出的一款专门用于记录深度学习调 (lian) 参 (dan) 的工具,runx。(为即将的新东家打免费广告了,哈哈)

https://github.com/NVIDIA/runx

runx非常的新,大概是五天前正式开源的。正好在 Github 上面看到,感觉挺有意思的,就拿来仔细的看了一下。这篇文章也应该是中文全网第一个介绍这个工具。

简单来说,runx 生来就是用来方便深度炼丹师记录各种实验数据的。

因为深度学习里面,一个大模型一跑少则几个小时,多则几天或者几个星期,如果没有很好的把已经跑过实验很好的记录下来,会是一件非常低效而且恼火的事情。

我在我之前的文章也介绍过一些方便记录实验数据的小方法,比如:

https://zhuanlan.zhihu.com/p/112583368

而 runx 则更像是把各种常用的工具做了一个集合,可以把他理解为深度学习炼丹中的”瑞士军刀“。工具很小,本身也很简单简洁,但是很多时候可以给你很大方便。

目前 runx 的文档还很不全,我先来介绍他的一个用法—- 记录实验输出及方便的Tensorboard记录

主要用的是 runx 下面的子模块, runx.logx


logx.initialize

 

在实验开始前进行一些必要的设置。

logx.initialize(logdir=args.logdir, coolname=True, tensorboard=True,                    hparams=vars(args))

上面就是定义了:

logdir 把所有保存的结果存在哪。如果指定的文件夹不存在,会自动的新建,不用再手动的 os.makedirs(logroot, exist_ok=True) 了哦。方便~

tensorboard 是否开启 tensorboard 记录。这个也很方便,不用再手动的 writer = SummaryWriter() 了哦。方便~

global_rank 分布式训练的时候,防止多个输出,自动只log rank=0,不用自己写判断了哦。方便~

coolname 是否在 logdir 下面再新建一个随机命名的文件夹来用 logging(这样你可以在 logdir 下面存一些除了logging之外的东西,方便分类)。随机命名的文件夹的画风是这样的 industrious-chicken , arrogant-buffalo ,哈哈哈哈哈。

hparams 把所有的超参数都存起来,功能和我上面推荐的文章基本一样,虽然砸了我上面文章的”饭碗“,但是不得不说,方便~

eager_flush 如果每次 tensorboard 写的东西比较多,那就把这个打开,以防因为IO太快没写上。(有些服务器开启了IO限制,经常会遇到实际没写上的情况,建议常开)


logx.msg()

把你程序之前 pirnt 都换成这个就对了,他会帮你自动保存所有 print 输出,方便日后查看。方便~


logx.metrics

用来记录各种变量的,比如

# capture metricsmetrics = {'loss': loss.item()}iteration = epoch * len(train_loader) + batch_idxlogx.metric('train', metrics, iteration)

phase 指定是 train 还是 test

metrics 一个字典,里面装着所有你打算在这一步你要记录的值。

global_step 这个是第几步的结果。

这其实就是一个 保存训练变量+TensorBoard自动写入 器。


save_model

用法

logx.save_model(        save_dict,        metric=accuracy,        epoch=epoch,        higher_better=True)

epoch 会用这个来命名存的模型

metric 以什么为标准来决定当前模型是否是最好的模型,并由此决定要不要存。如果你的 metric 是准确率,那么 higher_better 就要置为 True

delete_old 是否每个 epoch 都保存一个一个新的,还是永远只存一个最好的。不用自己写判断的代码了哦。方便~

---END---

重磅!码农突围-技术交流群已成立

扫码可添加码农突围助手,可申请加入码农突围大群和细分方向群,细分方向已涵盖:Java、Python、机器学习、大数据、人工智能等群。

一定要备注:开发方向+地点+学校/公司+昵称(如Java开发+上海+拼夕夕+猴子),根据格式备注,可更快被通过且邀请进群

▲长按加群

顺说句题外话,有不少人想加鱼哥微信,鱼哥姑且放出来,但是坑位有限哦


有热门推荐????

1、我是培训机构出身的程序员,不敢告诉任何人

2、太有才了,网友总结的罗志祥事件吃瓜文案!每一个都能笑抽

3、2020年4月程序员工资统计,人工智能工资大跌

4、阿里中台搞了3年,搞凉了?网传:副总裁玄难“背锅”,辞职创业!

如有收获,点个在看,诚挚感谢

你可能感兴趣的:(有没有什么可以节省大量时间的 Deep Learning 效率神器?)