MXBoard — 助力 MXNet 数据可视化

发现问题了,先导入mxnet再导入mxboard就会有这个问题,而先导入mxboard,再导入mxnet就没有这个问题。

复现代码:
import mxnet
import mxboard

我在ubuntu和mac上试了一下,还是不能重现警告。这跟python内部的库在不同平台上的实现有关。

grads = [i.grad() for i in net.collect_params().values()]
assert len(grads) == len(param_names)
# logging the gradients of parameters for checking convergence
for i, name in enumerate(param_names):
sw.add_histogram(tag=name, values=grads[i], global_step=epoch, bins=1000)

如果net在GPU上会报错,请问怎么解决?
‘net0_conv0_weight’ was not initialized on context cpu(0). It was only initialized on [gpu(0), gpu(1), gpu(2), gpu(3), gpu(4), gpu(5), gpu(6), gpu(7)].

1.0.1版本的mxnet想用mxboard咋办呢,由于一些原因代码暂时不能升级框架到1.2 :joy:

这个出错信息看像是Gluon报的错,原因是weight分布在各个GPU上,你需要传一个ctx list给grad()函数,否则会用当前默认ctx就是cpu(0)。看这个逻辑


改成

ctx_list = [mx.gpu(i) for i in range(8)]
grads = [i.grad(ctx_list) for i in net.collect_params().values()]

grads最终是一个2维list,grads[i, j]表示第i个param的gradient在第j个gpu上,然后就可以log gradient了。

老版本应该也是可以用mxboard的,只是记录图片相关的功能用不了,如果你只是需要用到scalar, histogram之类的应该是可以的。

好像是可以,刚刚是我mxnet环境变量问题

from mxboard import SummaryWriter 报错

代码

报错

依赖都已安装

mxboard是module的名字,不能用来做文件名。把mxboard.py改成别的名字再试试。

改了,可以用了。谢了!
好细心,竟发现了这个:joy:

新的问题
使用mxboard可视化训练,参考
https://github.com/reminisce/mxboard-demo#monitoring-training-mnist-model
https://zh.mxnet.io/blog/mxboard

参考代码如下:

grads = [i.grad() for i in net.collect_params().values()]
assert len(grads) == len(param_names)
# logging the gradients of parameters for checking convergence
for i, name in enumerate(param_names):
    sw.add_histogram(tag=name, values=grads[i], global_step=epoch, bins=1000)

问题一:
param_names 是什么?
另外,这种对于API不熟悉的情况下,遇到问题,我应该怎么做,只能看源码吗,源码中很多注释也并不清楚;API之间有相互联系的说明文档吗?
问题二:
训练是在GPU上跑的,运行至

grads = [i.grad() for i in net.collect_params().values()]

时,报错

RuntimeError: Parameter 'first-3x3-conv-conv2d_weight' was not initialized on context cpu(0). It was only initialized on [gpu(0), gpu(1), gpu(2), gpu(3)].

param_names是parameters的名字list。Gluon有很详细的教程和文档,建议还是先看看这些再动手也不迟,所谓磨刀不误砍柴工。
http://zh.gluon.ai/

第二个问题看着跟上面某个帖子比较像。

非常感谢!

  1. param_names 的问题 知道了
param_names = [p for p in net.collect_params().keys()]

(1)不过,不是在 gloun 文档中看到的,文档里没有看到。最后是根据values的声明处的其他函数,一个一个试,找出来的。还是不懂怎么看文档,怎么看API。
(2)mxboard 的示例中为什么不写全呢,用一个片段的代码来做示例?

  1. grads 中加了ctx 参数
    设置了一个 gpu list
# ctx=[gpu(0), gpu(1), gpu(2), gpu(3)]
grads = [p.grad(ctx=ctx) for p in net.collect_params().values()]

报错,查询各方,未果

另一种尝试
只设置一个 gpu

for i, batch in enumerate(train_loader):
            data = gluon.utils.split_and_load(
                batch[0], ctx_list=ctx,
                batch_axis=0, even_split=False)
            labels = gluon.utils.split_and_load(
                batch[1], ctx_list=ctx,
                batch_axis=0, even_split=False)
            with autograd.record():
                outputs = [net(t) for t in data]
                loss = [Loss(output, label) for output, label in zip(outputs, labels)]
            for l in loss:
                l.backward()
            trainer.step(batch_size)     
            for p in net.collect_params().values():
                grads = p.grad(ctx=ctx[0])

报错:

调试,提示:

我是在网络定义之外,用了 SoftmaxCrossEntropyLoss ,反向传播用的 loss,是否是此时认为 params 的梯度是中间层,而无法获取梯度。

这轮子真的是越来越好用了

啥是轮子?

下面这种很多小块,怎么设置可以用一个大块包起来,保存的图是 hybridize之后的,网络结构里也加了with self.name_scope()

目前显示的单位就是operator,mxboard暂时没有办法把他们合并起来,不知道这种linked list的网络变得很长后,tensorboard会不会自动把他们group起来。

之前用pytorch的tensorboardx的时候是有自动合并功能的

tensorboard不会自动合并,需要用一个大的namescope包裹起来才会合并

想请问一下,训练中断之后再继续训练,画出来的图怎么连起来啊?在新的训练中必须要自己手动指定中断前的global_step吗?