給妹紙的深度學習教學(6)——實用技巧
本以為這個專欄將永遠不會更新,
所以早前給催更的朋友的回復都是妹子拋棄我找學長去了。然而,妹子又給我打電話啦,那麼就把對話整理一下發第六篇吧。文中涉及到的code: for_girl
文中涉及到的ppt: Tutorial.pdf
1. Tensorflow/Keras 中指定 GPU 及 GPU顯存
妹紙:花花,為什麼我不管訓練什麼模型,Keras的GPU顯存都是佔滿的吖?
花花:額,這個,這個嘛,很多新手都有這個煩惱,罪魁禍首其實是Google啦,因為默認情況下,TensorFlow會把可用的顯存全部佔光,也就是你的機器不管剩下多少顯存,都會全部被Tensorflow佔用哦。妹紙:啊啊,這樣啊,好坑啊。拿有解決辦法嗎??(期待狀~~)花花:當然當然,需要加幾代碼哦。具體的我發給你看。// TensorFlow默認是使用儘可能多的顯存。有兩種方式可以改變它// 第一種是定量設置顯存,給它一個0-1的比例,強制規定它使用多少,// 缺點嘛,就是你要實現算好具體的顯存佔用gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.7)sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) //第二種就是按需分配,讓TF更具具體的需要來分配 gpu_options = tf.GPUOptions(allow_growth=True)sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))// 如果是Keras 的 話, 直接在代碼最前面加入這幾行代碼即可from keras import backend as K# set GPU memory if(tensorflow == K.backend()): import tensorflow as tf from keras.backend.tensorflow_backend import set_session config = tf.ConfigProto() config.gpu_options.allow_growth = True sess = tf.Session(config=config)
這份原始代碼:00_original.py ,沒有做任何的處理,TF霸道地把所有顯存都吃掉了,XD。
加上限制之後:02_set_momory.py ,實際上我們只用了不到400MB的顯存呢。
妹紙:wow,萬惡的TensorFlow,原來是這麼回事啊。
花花:是啊,就是這麼回事。
妹紙:花花,那我實驗室有台學長的機器有兩張GPU,他每次都說用TensorFlow的時候千萬要制定GPU,不然就全被用起來了。
花花:嗯,所以你在執行程序的時候,也是加一條指令就好了//終端執行程序時設置使用的GPUCUDA_VISIBLE_DEVICES=1 python my_script.py//python代碼中設置使用的GPUimport osos.environ["CUDA_VISIBLE_DEVICES"] = "2"
花花: CUDA_VISIBLE_DEVICES=1
代表的一般是用第二張顯卡,
比如我這台機器有四張卡,就是0, 1, 2, 3.
你要用哪張,就制定哪張就好了。這樣就不會被罵了啊。如果要用多張,就把數字連著寫噢。妹紙:這麼簡單哦,好耶!!!ヽ(??▽?)ノ2. 查看Tensorflow/Keras/PyTorch版本
妹紙:花花,大家用的TensorFlow的版本都不一樣,怎麼樣快速查看框架的版本啊。
花花:噢噢,這個也很簡單,你看哦。如果你是使用pip或則pip3來安裝的框架,可以直接使用
pip/pip3 freeze | grep xxx
來查詢版本。
bg@bg-MS-7A62:~$ pip3 freeze | grep KerasKeras==2.1.3bg@bg-MS-7A62:~$ pip3 freeze | grep tensorflowtensorflow-gpu==1.4.1tensorflow-tensorboard==0.4.0rc3bg@bg-MS-7A62:~$ pip3 freeze | grep torchtorch==0.3.0.post4torchfile==0.1.0torchnet==0.0.1torchvision==0.2.0
3. SSH 遠程 訪問 Tensorboard
妹紙:花花,如果我不在實驗室的話,怎麼看到tensorboard的圖啊。
花花:這個,,這個,其實我從來都是用server跑的,,所以是用SSH遠程連過去的。妹紙:具體怎麼操作啊。花花:SSH 命令你用過吧,之前教過你的,可以連接到遠程計算機的那個命令。妹紙:嗯嗯。花花:那我們還是用那個指令:
ssh -L 6006:127.0.0.1:6006 account@server.address -p port
前面 -L 6006:127.0.0.1:6006
可以把遠程主機的6006埠映射到本地端的6006埠account@server.address
就是一樣你要連主機的IP地址和用戶名,最後如果是還有設置ssh對應的port的話,還要用 -p port
。所以比如你的IP是192.168.1.111
,用戶名是ilovedl
,埠是23022
,那指令就是ssh -L 6006:127.0.0.1:6006 ilovedl@192.168.1.111 -p 23022
.輸入密碼後一樣進入到遠程的系統了,然後再開啟tensorboard,就可以再本地端用localhost:6006
來查看了。妹紙:有點複雜,沒聽懂啦。花花:額,那我操作一遍給你看咯?
妹紙:好啊好啊!
https://www.zhihu.com/video/9638597896804229124. CUDA / cuDNN 版本的選擇
妹紙:花花,CUDA的版本和cuDNN的版本,這兩個東西,到底怎麼弄吖,貌似老是裝不對版本。
花花:額。。這個。。是略坑。我一個一個講吧首先,TensorFlow的版本,比如我現在習慣用的1.4.1,是不支持CUDA9.0及以上的版本的。換句話講吖,TensorFlow1.5以下的版本,目前只能使用CUDA8.0,而1.5以上的版本,貌似也只支持9.0而不支持最新的9.1,不過好像也有人成功裝好了9.1。總之啦,默認情況下,tf1.5以下的版本,就乖乖裝CUDA8.0啦,1.5以上的,就乖乖裝9.0啦。PyTorch的話就沒有這個問題了。8.0,9.0,9.1都支持的,裝對應的包就可以了啦。至於cuDNN,需要和CUDA配套起來裝,裝了什麼版本的CUDA,就要裝對應能用的cuDNN。總之,不要隨便亂裝唔!!
妹紙:吖吖,吖,原來這麼多坑吖。PyTorch沒有用過呢。花花:PyTorch無敵好用吖!!妹紙:你又不教我。(¬︿??¬☆)
花花:(MMP,搞得我很會一樣)5. 查看 CUDA / cuDNN 版本
妹紙:那我怎麼查看CUDA 和 cuDNN的版本呢???
花花:如果你的CUDA安裝正確的話,你應該可以使用cat /usr/local/cuda/version.txt
或nvcc --version
來查看版本信息 bg@bg-MS-7A62:~$ cat /usr/local/cuda/version.txtCUDA Version 8.0.61bg@bg-MS-7A62:~$ nvcc --versionnvcc: NVIDIA (R) Cuda compiler driverCopyright (c) 2005-2016 NVIDIA CorporationBuilt on Tue_Jan_10_13:22:03_CST_2017Cuda compilation tools, release 8.0, V8.0.61
如果你的cuDNN安裝正確的話,你可以使用
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
來查看版本信息bg@bg-MS-7A62:~$ cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2#define CUDNN_MAJOR 6#define CUDNN_MINOR 0#define CUDNN_PATCHLEVEL 21--#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)#include "driver_types.h"
可以看到我這台機器的CUDA和cuDNN分別是8.0和6.0.21啦,再換一台給你看:
dl2018@dl2018-1025:~$ cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2#define CUDNN_MAJOR 7#define CUDNN_MINOR 0#define CUDNN_PATCHLEVEL 5--#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)#include "driver_types.h"dl2018@dl2018-1025:~$ cat /usr/local/cuda/version.txtCUDA Version 9.0.176dl2018@dl2018-1025:~$
這台的話就是CUDA9.0和cuDNN7.0.5了。
因為既要要PyTorch又要用TensorFlow,折中的做法就是裝CUDA9.0啦。妹紙:那可以裝多個版本的CUDA嘛??花花:理論上也是可以,不過你就不要瞎折騰這個了啦。妹紙:(_ _)。゜zzZ哼6. 輸出Keras模型參數 以及 模型的可視化
妹紙:花花吖,那個我看別人都有輸出一個看起像一個表格一樣的模型的參數表。
花花:哦哦,那個簡單吖。你在這個00_original.py的基礎上,加一行print(model.summary())
就搞定了01_print_summary.py# build networkmodel = build_model() # print summaryprint(model.summary())
然後你就會看到類似這樣的圖了。
妹紙:對對對,就是這個!妹紙:那我還看到有的人有保存一張圖,就是黑白色的,可以看到整個模型的樣子。花花:哦哦,那個嘛,也是加兩行就好了。//你在model建好之後,再加下面兩行就好了 # save model picture from keras.utils import plot_model plot_model(model, to_file=model.png)
然後就可以看到會保存一張叫model.png
的圖片,打開它看看。
妹紙:就是這個,好神奇!!!
花花:(。。。) 花花:對了,那什麼。。import這個包的時候啊,可能會報錯,因為我記得默認Ubuntu是沒有安裝需要的依賴的,記得如果報錯要自己裝以下依賴才能用啊。妹紙:好好好。7. Terminator的使用
妹紙:花花,我每次開終端的時候都要切來切去的好麻煩。有那種可以分割屏幕的軟體嘛?
花花:哦,你說terminal啊,有是有,不過。。花花:好吧,我給你介紹幾個,有一個東西叫做Tmux,不過不教你了,教你另外一個,叫做terminator。花花:安裝的方法很簡單,就是sudo apt install terminator
就好了,裝好之後就有你想要的效果。那具體的操作細節,這個表應該足夠你用的了。妹紙:你演示一遍給我看啦。。。
花花:??哦?? https://www.zhihu.com/video/9639008919921664008. 關於Model 顯存佔用的計算
妹紙:那個,可以問你,模型的Batch Size怎麼決定嘛?或者說,怎樣計算模型所需要的顯存啊。。
花花:這個問題,就有那麼一丟丟複雜了。。你聽我慢慢說嗎??妹紙:額,這個,那還是算了吧。。花花:。。。還是補一個模型怎麼計算吧。
正常來講,顯存的佔用主要是Model本身和每一層的output。計算方式為:
如上圖所示,以 INPUT 為 224x224 的ImageNet(架構使用VGG16)來講,
VGG16的參數量為138M (乘以4是32位的float需要佔用4個位元組)所以VGG的模型,需要佔用528MB的顯存。那麼,如果我們使用SGD,那還需要額外再加一份,如果還使用了momentum,那還要再加一份。所以SGD with momentum下,整個模型需要 的顯存。(若是Adam,以為有二階的動量,所以還要再加一份)再考慮每層輸出所佔用的內存,換句話說,batch size 為 1 的話,需要 而訓練時候需要有forward和backward,就需要乘以 2如果batch size 為128的話,就再乘以128,這樣乘完大概是 兩個加起來大概就是 了。兩張1080TI才裝得下batch size 128.
所以一般情況,如果塞不下那麼大的batch,就減小它。當然,為了訓練速度考慮,老鐵,再多買幾張卡吧!!XD9. 什麼時候畢業啊
妹紙:你碩士什麼時候畢業啊,,
花花:寥寥無期啊,別問我啊,愚人節你不好好過節研究Deep Learning幹嘛啊。妹紙:又不是情人節,有什麼好過的。花花:(1W點暴擊)花花:我肚子不舒服,我先撤了。妹紙:喂。。花花:(趕緊溜)一期一會???還有下次???愚人節快樂??可能沒有了??
推薦閱讀:
※tf.Variable and tf.Variable.eval
※GAN的理解與TF的實現
※TensorFlow保留中間層的Feature Map
※學習筆記TF022:產品環境模型部署、Docker鏡像、Bazel工作區、導出模型、伺服器、客戶端
※Numpy基本語法示例①
TAG:深度學習DeepLearning | TensorFlow | 機器學習 |