今天介绍的是 NVIDIA 推出的一款专门用于记录深度学习调 (lian) 参 (dan) 的工具,runx。
https://github.com/NVIDIA/runx
runx非常的新,大概是五天前正式开源的。正好在 Github 上面看到,感觉挺有意思的,就拿来仔细的看了一下。这篇文章也应该是中文全网第一个介绍这个工具。
简单来说,runx 生来就是用来方便深度炼丹师记录各种实验数据的。
因为深度学习里面,一个大模型一跑少则几个小时,多则几天或者几个星期,如果没有很好的把已经跑过实验很好的记录下来,会是一件非常低效而且恼火的事情。
我在我之前的文章也介绍过一些方便记录实验数据的小方法,比如:
如何记录实验的各种超参数设置。
而 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 都保存一个一个新的,还是永远只存一个最好的。不用自己写判断的代码了哦。方便~