最近需要跑比較大的模型,電腦上的 cpu 版本太慢了,跑了兩天實驗室,大冬天的,還是待在宿舍學習比較舒服,於是狠下心來重新裝了系統,探索一下 gpu 版本的安裝。比較令人可喜的是,跟著前輩們的經驗,還是讓我給安裝成功了。由於我是新裝的系統,就像嬰兒般純凈,所以進入系統的第一步就是安裝 cuda,只要 ...
最近需要跑比較大的模型,電腦上的 cpu 版本太慢了,跑了兩天實驗室,大冬天的,還是待在宿舍學習比較舒服,於是狠下心來重新裝了系統,探索一下 gpu 版本的安裝。比較令人可喜的是,跟著前輩們的經驗,還是讓我給安裝成功了。由於我是新裝的系統,就像嬰兒般純凈,所以進入系統的第一步就是安裝 cuda,只要這個不出錯,後面的幾乎就不會出錯了。
首先,得先確定自己的顯卡是否支持(這個一般支持,我這幾年前的電腦的顯卡都支持安裝 cuda)。然後確定自己要安裝的是什麼版本的 TensorFlow,因為不同的版本對 cuda 和 cudnn 的版本要求不一樣。具體可以參考此鏈接:https://tensorflow.google.cn/install/source_windows
我安裝的是最新的 1.12 版本,所以支持的是 cuda 9 系列版本,我選擇安裝的是 cuda9.0,所以下載的 cudnn 版本也和 cuda9.0 版本對應。安裝 cuda 當然少不了關於 gpu 的顯卡驅動,這裡不同的 cuda 版本要求的顯卡驅動是有要求的,可參見此鏈接:https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
但是需要說明的是,我並沒有單獨安裝顯卡驅動,而是在安裝 cuda 的過程中自動安裝顯卡驅動。所以打開電腦的第一步就是安裝 cuda。哦,不對,第一步是更改 apt 下載源,在 Ubuntu 的軟體和更新中選擇第一項 “Ubuntu 軟體”,然後選擇 “下載自” 中的其他站點,選擇一個就可以了,這裡我選擇的是阿裡雲的源。接下來可以選擇 sudo apt install fcitx,然後安裝一個搜狗拼音輸入法。當然直接進入主題也是很棒的。
進入下載好的 cuda 的 deb 包所在的目錄,使用命令: sudo dpkg --install cuda9.0.deb,然後一通設置後,會提示你什麼 key 沒添加,然後可以去 /var/cuda-repo-×× 目錄下找到一個以 .pub 結尾的文件,一般是第一個,我這裡是 /var/cuda-repo-cuda-9-0-local/7fa2af80.pub,然後使用: sudo apt-key add /var/cuda-repo-cuda-9-0-local/7fa2af80.pub 進行添加。如果之前安裝過其他版本的 cuda,並且也進行了這一步,不會進行提示,但是最後安裝得到的版本號有問題(我這裡之前安裝過 cuda10,沒有去掉這個添加的什麼 .pub,所以後來安裝 cuda9.2 時最後的版本依舊是 10,我也不懂為什麼)。然後 sudo apt update 更新倉庫,然後 sudo apt install cuda 就完成了基本的安裝操作。如果不出錯的話會直接開始安裝 cuda。
但是這裡我安裝 cuda9.0 版本的時候出現了一個錯誤:“cuda : 依賴: cuda-9-0 (>= 9.0.176) 但是它將不會被安裝E: 無法修正錯誤”。我也不知道這個錯誤是什麼意思,一般不應該出現才對,因為我安裝 cuda10 的時候沒出現過,會很直接的開始安裝,我姑且認為是我安裝的 cuda 版本低了(瞎猜的),是不是我應該安裝 9.1 或者 9.2 版本呢?這個我也沒有去驗證,因為我最後還是成功地安裝了 cuda9.0。
當我出現這個錯誤後,我沒有選擇另外的版本進行安裝,而是按照某個網友的解決方案,使用 aptitude 來安裝,所以使用命令 sudo aptitude install cuda 來開始安裝 cuda,沒錯一切又開始正常運行了。如果沒有安裝 aptitude,需要先安裝: sudo apt install aptitude。
無論正常使用 apt 還是使用 aptitude 進行 cuda 的安裝,中途都不會出現任何提示,如果你提前安裝了顯卡驅動的話,會粗暴地給你卸載掉,然後安裝 cuda 自帶的顯卡驅動。所以在安裝過程中會彈出一個淡紫色(不能確定是否記錯)的提示框,會告訴你一堆東西,然後確定就可以了,然後會讓你輸入一個密碼,輸入完之後,會要求重覆輸入密碼進行確認。都確定完之後,會繼續進行 cuda 的安裝。靜待安裝完成。安裝完成後將 cuda 安裝路徑寫入 PATH,打開用戶配置文件 gedit ~/.bashrc,然後 將以下內容加到 .bashrc 文件的最後:
export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
可以使用 echo $PATH 命令查看系統中的 PATH 變數,對 LD_LIBRARY_PATH 同樣適用。
安裝完之後需要重啟電腦,這次重啟十分重要。因為一開始會出現一個藍色的界面,問你是否進入什麼 enroll mok,這時候千萬要選是,進入這個,然後會問你是否 view mok key,選擇是,然後好像就可以看到一些東西,這時候要輸入你安裝 cuda 時設置的密碼(我記不得這個輸入密碼的步驟在前還是在後,但一定要輸入的),然後選擇 continue,然後 reboot,重啟電腦,然後在設置裡面查看電腦的詳細信息可以看到使用的圖形卡是 NVIDIA 的顯卡,而不是集成顯卡了。這時候使用 nvidia-smi 指令即可查看 gpu 信息。整個過程中我覺得重啟這個步驟最重要。
如果想確認是否成功安裝 cuda,可以驗證一下跑 cuda 自帶的樣例的結果。因為 Ubuntu 18.04 自帶的 gcc g++ 版本號是 7,而 cuda9.0 不能使用高於 6.0 版本的 gcc 進行編譯(如果我沒記錯的話),反正想要驗證就必須將 gcc 版本降級。首先安裝你喜歡的低級的 gcc 版本,我安裝的是:sudo apt install gcc-5 g++-5。然後使用如下的指令對不同的 gcc g++ 版本指定優先程度:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 70,sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 50。這裡我指定 gcc-5 的分數為 70,gcc-7 分數為 50。對 g++ 使用相同的命令,將 gcc 替換成 g++ 就行。使用 update-alternatives --config gcc 命令可以查看當前多版本 gcc 的情況,對 g++ 也是一樣。這時候再使用 gcc --version 命令查看,可以看到當前 gcc 預設版本為 5.5.0。
這時候進入 cuda 的安裝目錄,cd /usr/local/cuda,如果不知道 cuda 安裝目錄的話可以使用 whereis cuda 命令進行查看。然後進入 cuda 安裝目錄下的 samples 目錄,cd ./samples,然後使用 sudo make 命令開始所有樣例的編譯環節,這會花很長的時間。等到編譯完成,進入 samples 下的 bin 文件夾,然後一路進入,直到存儲編譯結果的文件夾,我這裡是 /usr/local/cuda/samples/bin/×86_64/linux/release,然後隨便選擇一個文件,例如旗下的 deviceQuery 文件,終端輸入 ./deviceQuery 便可以看到輸出內容,最後顯示 Result = PASS 表示編譯成功,也預示著 cuda 安裝成功。
在終端輸入 nvidia-smi 命令可以看到 gpu 的具體使用情況,也可以看到使用的顯卡驅動號,我這裡 cuda 給我安裝的是版本號為 390.77 的顯卡驅動。nvidia-smi 命令很重要,因為我們可以根據這個指令確定 gpu 還不是處於滿負荷狀態,所以訓練模型的時候 就可以根據這個命令的顯示信息進行 batch 的設置等等。然後接下來就是其他組件的安裝。
我首先安裝了一個 miniconda,miniconda 安裝實在不要太簡單,安裝過程中指定安裝目錄即可。然後打開新的終端,可以查看 conda 的信息,例如 conda --version。然後使用命令:conda create --name tensorflow-gpu python=3.6 創建一個名為 tensorflow-gpu 的環境,這裡的 Python 版本千萬不能選擇很低的版本,也不能選擇 Python 3.7,否則後續無法安裝 tensorflow-gpu 版本,各個 tensorflow 需要的 Python 版本詳見給出的第一個鏈接。這裡不在創建環境的同時安裝 tensorflow,因為 conda 源速度很慢,我也沒有試過更改 conda 的下載源,當然也可以在修改下載源後直接在創建環境時安裝 tensorflow,這樣的話 conda 會自動給我們配置各種依賴。如果修改了 conda 的下載源,可以這樣安裝 tensorflow:conda create --name tensorflow-gpu python=3.6 tensorflow-gpu,這時候會自動安裝 tensorflow-gpu 版本。針對第一種情況,也就是我的做法,只會安裝 Python 和一些簡單的包,很快就創建完畢。打開新的終端,使用命令:source activate tensorflow-gpu 就可以激活我們創建的 tensorflow-gpu 環境。然後使用 pip 來進行 tensorflow 的安裝:pip install tensorflow-gpu,這會自動安裝 1.12 版本的 gpu 版本的 tensorflow 和對應的 numpy 庫。安裝成功後使用 python 進入 Python 環境,然後 import tensorflow,會出現 cudnn.so(好像是這個)缺失的錯誤,此時需要安裝 cudnn。我下載的是 cudnn 的壓縮包,而不是 deb 包。進入解壓後的 cudnn 目錄,然後使用以下命令進行 cudnn 的安裝:
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 /usr/local/cuda/lib64/libcudnn*,我不知道有沒有必要,但是使用了肯定是沒錯的。
這時候重新進入 Python 環境,import tensorflow 就不會出錯了。而且第一次導入時會出現很多信息,其中就包括使用的 gpu 的信息。這時候進行簡單的測試,可以知道 tensorflow-gpu 版本安裝成功。
按照我的安裝過程,可以知道此時系統中存在 3 個版本的 Python,系統自帶的,miniconda 安裝的,以及 tensorflow-gpu 環境下的。如果需要使用不同的 Python 進行工作,需要對不同的 Python 進行別名的設置。其中 tensorflow-gpu 環境下的 Python 不用管,因為需要使用 source activate tensorflow-gpu 命令激活環境後才能使用,此時輸入 Python 進入的就是此環境下的 Python 環境。如果你的電腦自帶的 Python 版本和你安裝到 tensorflow-gpu 中的 Python 版本是一樣的,你可能會發現在 tensorflow-gpu 環境下的 pip 來源於系統中的 pip,但是不用理會,這時候使用 pip 安裝的包會處於 tensorflow-gpu 環境中,而不是系統中。系統中一開始是不會自帶 pip 的,需要使用 sudo apt install python3-pip 進行簡單的安裝,如果沒有更新過倉庫,安裝的 pip 版本可能很低,可以進行升級,升級後使用 pip 可能會出現錯誤:Import Error: cannot import name main,這時候需要修改系統中的文件,sudo gedit /usr/bin/pip3,將其中的 from pip import main 修改成 from pip._internal import main 即可。話題扯遠了,當沒有激活 tensorflow-gpu 環境時,系統中存在兩個 Python 版本,而且 miniconda 下的 Python 好像會覆蓋掉系統自帶的 Python,所以使用別名機制,打開配置文件:gedit ~/.bashrc,然後可以在末尾添加如下指令:
alias python3=/usr/bin/python3.6
alias pip3=/usr/bin/pip3
alias python3-conda=/home/xyf/Install/miniconda3/bin/python3.7
alias pip3-conda=/home/xyf/Install/miniconda3/bin/pip
這時候在終端中輸入 python3 使用的就是系統自帶的 Python,輸入 python3-conda 使用的就是 miniconda 中的 Python。pip 同理。如果激活了 tensorflow-gpu 環境後需要退出該環境,最簡單粗暴的方法就是直接關閉該終端,溫和一點的方法是使用指令:source deactivate tensorflow-gpu。如果需要在每次啟動終端時自動激活 tensorflow-gpu 環境,可以在 .bashrc 文件的最後加上:source activate tensorflow-gpu 即可,每次打開終端自動讀取配置文件 ~/.bashrc 文件,所以會自動激活 tensorflow-gpu 環境。
最後說明一點,預設 pip 下載源實在太慢,需要更改預設下載源。在 home 目錄下,也就是用戶目錄下:mkdir .pip,然後 cd ~/.pip,然後 gedit ./pip.conf,在 pip.conf 中加上自己喜歡的源即可,這裡我:
[global]
index-url = https://mirrors.aliyun.com/pypi/simple
喜歡其他源的將 https://mirrors.aliyun.com/pypi/simple 進行替換即可。