2020/7/3
因為tensorflow 2.0 開始普及辐宾,需要時間學(xué)習(xí)適應(yīng)奄喂,所以回歸使用pytorch寫一些模型撤师。由于長時間沒有碰過pytorch了泻肯,記錄一些注意點(diǎn)渊迁。
Pytorch原本沒有像tensorboard這樣的可視化工具,為了彌補(bǔ)這一不足灶挟,就借雞生蛋琉朽,直接將tensorflow的tensorboard拿過來使用,tensorboardx就是這樣來的稚铣。換句話說箱叁,tensorboardx和tensorflow中的tensorboard是同一個東西惕医,只是讓tensorboard能在pytorch上運(yùn)行耕漱。
ps: 早期沒有tensorboardx時,pytorch通過??torch.utils.tensorboard 使用tensorboard抬伺,有些函數(shù)目前依舊是??actually processed by?torch.utils.tensorboard
Step1: 安裝
我使用的conda的虛擬環(huán)境安裝螟够,相當(dāng)于在系統(tǒng)的大盒子里面創(chuàng)造一個小盒子,把需要的東西裝進(jìn)小盒子里峡钓,隨時有問題可以把小盒子卸載不影響大盒子妓笙,tensorflow官方也推薦使用虛擬環(huán)境,雖然pytorch官方?jīng)]有這么說能岩,我還是用conda單獨(dú)新建了一個pytorch environment寞宫, 具體可以查看anaconda的官方文檔 ,搜索manage environment就行捧灰。
1. 激活pytorch虛擬環(huán)境
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
再次查看官網(wǎng)后發(fā)現(xiàn) tensorboardx在依舊需要tensorboard的支持?“To run tensorboard web server, you need to?install?it using: pip?install?tensorboard”.?
于是我嘗試搜索單獨(dú)只安裝tensorboard不安裝tensorflow是否可行统锤,沒有發(fā)現(xiàn)很好的方案 (類似的issue:https://github.com/tensorflow/tensorboard/issues/2438)所以還是要安裝tensorflow.?
3. 安裝tensorflow
之所以大費(fèi)周章毛俏,是因為tensorflow對cuda,python都又匹配要求饲窿,十分麻煩煌寇,既然避免不了也只能安裝,見招拆招逾雄。先檢查各種版本阀溶,我電腦上
GPU GTX1080
python 3.8
torchvision 0.6.0
pytorch 1.5.0
cuda10.2 cudnn 7.0
PS: 其實cuda 我之前安裝了多個版本, 不過pytorch安裝對應(yīng)的是10.2
然后直接安裝tensorflow, 我原來用過多個版本的tensorflow1.0腻脏,后面的版本(至少我現(xiàn)在用的1.14)在安裝的時候都自動安裝了tensorboard,所以不需要單獨(dú)安裝tensorboard?
pip install tensorflow
這里也可以明確版本號
pip install tensorflow = 1.14
或者使用conda安裝, 理論上也可以银锻,可能出錯幾率更小一些永品,但是我沒有嘗試過。
理論上安裝已經(jīng)完成了击纬,但是如果tensorflow版本不對鼎姐,會出現(xiàn)一些問題,比如我直接用pip沒有明確版本號更振, 結(jié)果
tensorflow 2.2.0
tensorboard 2.2.2
高版本很容易出錯炕桨,不穩(wěn)定不兼容問題頻繁,在我運(yùn)行tensorboard的時候就出現(xiàn)了一些問題
step 2: 運(yùn)行
1. 選擇可視化變量
在模型代碼里面要選擇可視化的變量肯腕, 具體做法是首先import?SummaryWriter, 這個就是定義一份名單献宫,告訴tensorboard你要可視化哪些變量
from tensorboardX import SummaryWriter
然后明確一個 writer 去申明這些變量,把這些變量保存成一個event实撒,可以理解為一份名單
writer=SummaryWriter(logdir=None姊途, comment='')
logdir 是 event 的存儲路徑, 默認(rèn)在你代碼運(yùn)行目錄下新建一個runs文件夾,每次 "run" 產(chǎn)生一個份名單 (event) 存儲成名為當(dāng)前時間文件夾下的一個文件奈惑,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新建后要記得關(guān)閉避免資源浪費(fèi)
writer.close()
writer.flush()
或者直接用with實現(xiàn)
with SummaryWriter(comment='Haha')as w:
????w.add_graph(model, dummy_input,True)
tensorbord有多種添加變量方式原在,比如scalar等
writer.add_scalar("loss", total_loss, epoch)
申明變量名稱友扰,變量 , iteration相當(dāng)于你的x軸是什么
2. 打開tensorboard
重開一個Anaconda prompt命令行庶柿,激活環(huán)境
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完全一致村怪,默認(rèn)是./runs
為了避免麻煩,也可以寫絕對路徑浮庐; --host 是指定服務(wù)監(jiān)聽的IP甚负, --port是指定服務(wù)的端口, 在自己電腦上其實IP可以不用指定审残,remote的時候可能需要特別的IP
在自己電腦上直接
tensorboard?--logdir=F:\projects\TRY\runs? --port?6006?
然后在瀏覽器里面打如網(wǎng)址
tensorboard就出來了
程序沒運(yùn)行前梭域,會這樣顯示,運(yùn)行后
3. 幾個小坑
由于tensorboard繼承tensorflow的傳統(tǒng)搅轿,版本不匹配問題一定存在病涨。
比如說在安裝完tensorflow后, 運(yùn)行
tensorboard?--logdir=your_log_dir --host?0.0.0.0?--port?6006?
雖然tensorboard成功運(yùn)行了璧坟,但會給出這樣的提示
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. 我在網(wǎng)上看到有人直接把CUDA\v10.2\bin里面的cudart64_102.dll復(fù)制了一份,并且改名叫cudart64_101.dll和cudart64_102.dll放在一起幻工,據(jù)說完美運(yùn)行
2.因為我有多個cuda版本励两,包括10.1? 我直接在10.1的bin里面找到了cudart64_101.dll,復(fù)制到了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負(fù)責(zé)開發(fā)的人員也對這個問題有回復(fù)https://github.com/lanpa/tensorboardX/issues/520
總之就是要用tensorboard先鱼,代碼格式要進(jìn)行一些修改,個人覺得如果能直接add_graph(model)不需要其他的參數(shù)就好了
還有一個坑也是add_graph的奸鬓,這就是純粹的版本不匹配無法顯示graph, 具體效果就是我上面那張圖焙畔,只有兩個空白框
網(wǎng)上有不少出現(xiàn)這種問題的, 例如
https://github.com/pytorch/pytorch/issues/24157
有嘗試用降級版本解決的
https://blog.csdn.net/caiguanhong/article/details/106924606
好在scalar能正常顯示串远,還是等官方修復(fù)bug吧