美文网首页
Pytorch tensorboard/tensorboardx

Pytorch tensorboard/tensorboardx

作者: 瞿港 | 来源:发表于2020-07-04 02:26 被阅读0次

    2020/7/3

    因为tensorflow 2.0 开始普及,需要时间学习适应,所以回归使用pytorch写一些模型。由于长时间没有碰过pytorch了,记录一些注意点。

    Pytorch原本没有像tensorboard这样的可视化工具,为了弥补这一不足,就借鸡生蛋,直接将tensorflow的tensorboard拿过来使用,tensorboardx就是这样来的。换句话说,tensorboardx和tensorflow中的tensorboard是同一个东西,只是让tensorboard能在pytorch上运行。

    ps: 早期没有tensorboardx时,pytorch通过  torch.utils.tensorboard 使用tensorboard,有些函数目前依旧是  actually processed by torch.utils.tensorboard

    Step1: 安装

    我使用的conda的虚拟环境安装,相当于在系统的大盒子里面创造一个小盒子,把需要的东西装进小盒子里,随时有问题可以把小盒子卸载不影响大盒子,tensorflow官方也推荐使用虚拟环境,虽然pytorch官方没有这么说,我还是用conda单独新建了一个pytorch environment, 具体可以查看anaconda的官方文档 ,搜索manage environment就行。

    1. 激活pytorch虚拟环境

    conda activate pytorch

    2. 安装 tensorboardx

    虽然官方教程里面提到可以直接安装tensoboardx:  

     pip install tensorboardX

    但是安装完后,如果在命令行里面输入:

    tensorboard --logdir {} --host 0.0.0.0 --port 6006 

    会抛出错误:'tensorboard' is not recognized as an internal or external command

    再次查看官网后发现 tensorboardx在依旧需要tensorboard的支持 “To run tensorboard web server, you need to install it using: pip install tensorboard”. 

    于是我尝试搜索单独只安装tensorboard不安装tensorflow是否可行,没有发现很好的方案 (类似的issue:https://github.com/tensorflow/tensorboard/issues/2438)所以还是要安装tensorflow. 

    3. 安装tensorflow

    之所以大费周章,是因为tensorflow对cuda,python都又匹配要求,十分麻烦,既然避免不了也只能安装,见招拆招。先检查各种版本,我电脑上

    GPU GTX1080

    python 3.8

    torchvision 0.6.0

    pytorch 1.5.0

    cuda10.2 cudnn 7.0

    PS: 其实cuda 我之前安装了多个版本, 不过pytorch安装对应的是10.2

    cuda 版本

    然后直接安装tensorflow, 我原来用过多个版本的tensorflow1.0,后面的版本(至少我现在用的1.14)在安装的时候都自动安装了tensorboard,所以不需要单独安装tensorboard 

    pip install tensorflow

    这里也可以明确版本号

    pip install tensorflow = 1.14

    或者使用conda安装, 理论上也可以,可能出错几率更小一些,但是我没有尝试过。

    理论上安装已经完成了,但是如果tensorflow版本不对,会出现一些问题,比如我直接用pip没有明确版本号, 结果

    tensorflow 2.2.0

    tensorboard 2.2.2

    高版本很容易出错,不稳定不兼容问题频繁,在我运行tensorboard的时候就出现了一些问题

    step 2: 运行

    1. 选择可视化变量

    在模型代码里面要选择可视化的变量, 具体做法是首先import SummaryWriter, 这个就是定义一份名单,告诉tensorboard你要可视化哪些变量

    from tensorboardX import SummaryWriter

    然后明确一个 writer 去申明这些变量,把这些变量保存成一个event,可以理解为一份名单

    writer=SummaryWriter(logdir=None, comment='')

    logdir 是 event 的存储路径, 默认在你代码运行目录下新建一个runs文件夹,每次 "run" 产生一个份名单 (event) 存储成名为当前时间文件夹下的一个文件,runs/CURRENT_DATETIME_HOSTNAME  

    例如

    runs\Jul03_10-46-30_DESKTOP-0H5RF/events.out.tfevents.1593791190.DESKTOP-0H5RFM1 

    通过改变logdir, 可以改变存储路径, 也就不会新建runs文件夹

    comment就是改变event存储的文件名, 如果之前是CURRENT_DATETIME_HOSTNAME ,加了comment之后, 比如comment=’51HAHA‘, 就会变成CURRENT_DATETIME_HOSTNAME51HAHA. 另外如果申明了logdir, comment就没有用了, 可以直接用路径直接指定一个文件夹, 比如

    writer=SummaryWriter(logdir=’./runs/Jul03_10-46-30_Hahaha‘)

    另外writer新建后要记得关闭避免资源浪费

    writer.close()

    writer.flush()

    或者直接用with实现

    with SummaryWriter(comment='Haha')as w:

        w.add_graph(model, dummy_input,True)

    tensorbord有多种添加变量方式,比如scalar等

    writer.add_scalar("loss", total_loss, epoch)

    申明变量名称,变量 , iteration相当于你的x轴是什么

    2. 打开tensorboard

    重开一个Anaconda prompt命令行,激活环境

    conda activate pytorch

    输入命令打开tensorboard

    tensorboard --logdir=your_log_dir --host 0.0.0.0 --port 6006 

    tensorboard --logdir=./log --host $SERVER_IP --port $SERVER_PORT

    your_log_dir必须和之前writer的logdir完全一致,默认是./runs

    为了避免麻烦,也可以写绝对路径; --host 是指定服务监听的IP, --port是指定服务的端口, 在自己电脑上其实IP可以不用指定,remote的时候可能需要特别的IP

    在自己电脑上直接

    tensorboard --logdir=F:\projects\TRY\runs  --port 6006 

    然后在浏览器里面打如网址

    http://localhost:6006/

    tensorboard就出来了

    tensorboard 运行前

    程序没运行前,会这样显示,运行后

    tensorboard运行后

    3. 几个小坑

    由于tensorboard继承tensorflow的传统,版本不匹配问题一定存在。


    比如说在安装完tensorflow后, 运行

    tensorboard --logdir=your_log_dir --host 0.0.0.0 --port 6006 

    虽然tensorboard成功运行了,但会给出这样的提示

    load dynamic library 'cudart64_101.dll'; dlerror: cudart64_101.dll not found

    Ignore above cudart dlerror if you do not have a GPU set up on your machine.

    原因很简单,我cuda使用10.2,所以在10.2cuda里面没找到cudart64_101.dll

    解决方法:

    1. 我在网上看到有人直接把CUDA\v10.2\bin里面的cudart64_102.dll复制了一份,并且改名叫cudart64_101.dll和cudart64_102.dll放在一起,据说完美运行

    2.因为我有多个cuda版本,包括10.1  我直接在10.1的bin里面找到了cudart64_101.dll,复制到了10.2的bin里面,问题就解决了


    writer.add_graph不能使用,有两种情况

    1. 使用pytorch的dataloader时,data包括输入的x和label,如果直接

    example: pred = model(data)

    add_graph(model, data)

    会报错 

    RuntimeError: Type 'Tuple[Tensor, bool]' cannot be traced. Only Tensors and (possibly nested) Lists, Dicts, and Tuples of Tensors can be traced (toTraceableIValue at ../torch/csrc/jit/pybind_utils.h:298)

    必须把模型的输入改成x, y

    example: pred = model(x, y)

    add_graph(model, x)

    pytorch负责开发的人员也对这个问题有回复https://github.com/lanpa/tensorboardX/issues/520

    总之就是要用tensorboard,代码格式要进行一些修改,个人觉得如果能直接add_graph(model)不需要其他的参数就好了


    还有一个坑也是add_graph的,这就是纯粹的版本不匹配无法显示graph, 具体效果就是我上面那张图,只有两个空白框

    网上有不少出现这种问题的, 例如

    https://github.com/pytorch/pytorch/issues/24157

    有尝试用降级版本解决的

    https://blog.csdn.net/caiguanhong/article/details/106924606

    好在scalar能正常显示,还是等官方修复bug吧

    相关文章

      网友评论

          本文标题:Pytorch tensorboard/tensorboardx

          本文链接:https://www.haomeiwen.com/subject/rcoeqktx.html