昨天和前天在搭建 mask-rcnn 環境的時候發現發現無論怎麼搭環境都會報下面一個錯:
AttributeError: module 'tensorflow' has no attribute 'log'
後來在 github 裡的 issue 中找到了答案,就是 tensorflow 的版本過高了(高於了 2.0).
這就帶來了一個問題, tensorflow 需要 degrade 到 1.3.0 到 2.0 之間的版本,所以我想按照指示將其 degrade 到 1.15.0 ,查官網,發現 tensorflow 1.15.0 對應的 Python、CUDA 和 CUDNN 的版本對應的關係。
選擇 1.15.0 是因為沒法選擇 CUDA 9.0 不支持 Ubuntu 18.04 的版本,所以換了 1.15.0
看到 tensorflow 1.15.0 對應的 Python 版本為 3.6, 對應的 CUDA 為 10.0,CUDNN 為7.4 ,所以會出現多個版本的 Python 和多個版本的 CUDA、CUDNN 共存的問題。
多個版本的 Python 共存的問題說實話,一開始我以為要去 anaconda 去多下幾個發行版,後來偶然翻 issue 的時候發現 conda create -n env-name python=x.x.x 的時候可以指定 python 的版本(其實一開始就知道能指定 python 版本,但是不知道這樣能不能算數…),也就是說, anaconda 創建 virtualenv 的時候能夠自動下載 python 對應的版本,所以,無需再下 anaconda 對應的發行版,只需要讓 anaconda 自動去下相應版本的 python 就可以了(即 conda 創建虛擬環境的時候會自動安裝對應的 python 版本)。
我嘗試激活了一下 mask-rcnn 的虛擬環境,並且啟動 python 的 env,發現 python 的版本為 3.6.13 即是我要的 python 3.6 的版本。
多個 CUDA 共存的問題在這我查找的一段資料原文是:
Installing multiple versions won’t cause any of the previous versions to get overwritten, so no need to worry. Each version you install will overwrite the configurations that cause the operating system to use a certain version, but by default they all get installed under /usr/local in separate directories by their version numbers.
即,安裝多個 CUDA 並不會導致先前安裝的版本被覆蓋,而是覆蓋了使用的權限——也就是說,你需要用哪個版本的 CUDA 的時候就去給哪個 CUDA 權限就可以了!
所以只是安裝 CUDA 的問題,然後再給它指派軟連結的事情。
首先下載 CUDA 10.0 ,下載的時候發現 11.0 好像不支持拉下本地文件,而是一定要用 wget 命令,而 10.0 是支持拉下本地文件解壓後下載的。可以用 runfile 或者 deb下載。
所以就用 deb 方式下載吧,比較 dpkg 比較熟練(hhhhhh)。
事實上,CUDA 安裝幾個都是無所謂的,只要在運行的時候選擇好需要的 CUDA 即可, CUDA 又可以分為 runtime 和 drivertime,即 nvcc -V獲取到的是 runtime 的 cuda,而 nvidia-smi獲取到的是顯卡驅動自帶的連結,
而 nvcc -v 才是我們需要運行時候需要的 cuda 的版本。
一般來說下載完 cuda 後, 在 /usr/local下會有 cuda 對應版本的文件夾,例如:
可以看到這裡面有 cuda 10.0,cuda 11.0,而由於我需要跑 mask-RCNN時候的版本是 tensorflow-gpu==1.15.0,其對應的 cuda 版本為 10.0,所以我需要取消原來的 cuda 11.0 的軟連結,然後將 10.0 給連結上,連結的方式為:
sudo rm -rf cuda
sudo ln -s /usr/local/cuda-<verision> /usr/local/cuda
實際上,想要對 cuda 進行軟連結。只需要先移除 /usr/local 下的 cuda 文件夾,然後用 ln 命令對 cuda 特定的版本進行軟連結即可。
唯一無法確定的是 CUDA 安裝時候的環境變量的導出問題,網上眾說紛紜,官網也沒找到合適的答案,只能等待以後慢慢理解了,下面掛一下目前的環境變量導出的方法。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.0/lib64
export PATH=$PATH:/usr/local/cuda-10.0/bin
CUDNN 是深層卷積神經網絡加速的工具,對於 CUDNN 的安裝,其實之前的公眾號或者博客也已經講過了,用 tar 解壓的方式其實很簡單,其實就是把相應的 *.h 文件拷貝到 cuda 裡,然後賦予權限即可。例如:
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
就是將 library 文件加壓後的 cuda 文件中的 cudnn.h 複製到 cuda/inlcude 裡面,把 lib64裡面的 libcudnn* 複製到 lib64 裡面去,就安裝成功了。然後可以使用下面的方法查看 CUDNN 的版本
查看 CUDNN 的方法
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
例如,這裡面就是 7.4.2 的版本。
關於 Mask-RCNN env 的搭建Mask-RCNN 實際上也是目標檢測中的一種算法,它就是所謂的 fast-rcnn 再進行 mask,我預計我後期的 target 重點在於 training 還有 geocode,即在訓練出一種泛化的權重下然後進行 extraction。
關於 Mask-RCNN 的搭建,坑真的好多,一方面自己煞筆了一晚上,另一方面,它就是 bug 太多了。
首先,在上面已經講了可以用 conda create -n mask-rcnn python=3.6 創建一個虛擬環境,專門用來一個深度學習框架的使用,然後,需要把 code 給拉下來,
numpy
scipy
Pillow
cython
matplotlib
scikit-image
keras>=2.0.8
opencv-python
h5py
tensorflow-gpu==1.15.0
keras
imgaug
jupyter
這是我裡面 requirements.txt 需要的東西,結果最讓我沒想到的是,pip install 和 conda install 也存在著區別,pip install安裝著裡面相應的庫的同時也加入一些必要的依賴庫的安裝,但是conda install 也安裝,同時,它還安裝了 cuda-toolkit 還有 CUDNN 的安裝,真的是裝到氣吐血,一堆錯誤。最關鍵的一開始還把 tensorflow-gpu==1.15.0 裝成了 tensorflow-gpu==1.5.0 ,然後一直報錯
h5py 的 error,版本太高,需要 degrade 到 version
AttributeError: 『str』 object has no attribute 『decode』
pip install h5py==2.10.0
ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory
出現這個問題很可能是 tf 的版本和 CUDA 和 CUDNN 沒有對應,我出現這個問題就是因為裝錯了 tf 的版本(曹)。
3. tensorflow 的 error
Error : Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above
出現這個問題可能是 CUDNN 沒安裝正確,但是我用 cat 命令檢查過 CUDNN 的版本了,學長建議我用 conda install 代替 pip install 後來在安裝的過程中我確實看到了 cuda-toolkit10.0 還有 CUDNN,但是具體是不是本地不需要裝,無法確定,學長建議我還是裝一下,反正現在裝的挺熟練了....。
這是終於安裝成功的結果了,tf-gpu 正確各種錯誤也排完了,但是由於電腦顯存的問題,無法 inference,所以…後續租伺服器或者用 colab 或者用 pytorch 框架去跑,學長和我說 batch-size 設成 1 勉強能 training,那沒辦法了,深度學習就是個吃顯卡的怪獸~-~