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
然后直接安装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就出来了
程序没运行前,会这样显示,运行后
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吧