ubuntu16.04安裝CUDA 8.0(很詳盡,包括一些坑的解決方法)

left4back發表於2019-05-30

每次配置環境都頭疼得要死,總是會遇到各種各樣的問題,這次決心一勞永逸地解決這個問題,踩最多的坑,裝最穩的環境。

先介紹用於測試的電腦:作業系統是在清華映象上下載的ubuntu16.04LTS,核心版本是4.15.0-29-generic,電腦是聯想Y430P,顯示卡我沒記錯的話是GTX850M。

本篇絕大部分操作需要管理員許可權,即sudo,也許不把cuda安裝到/usr/lib而是自己的home目錄下可以不用sudo許可權,但我沒有嘗試,有興趣的可以自己嘗試一下。

一、更換核心

CUDA8.0最高僅支援4.4版本核心,因此第一步工作就是更換系統核心。如你的核心不高於4.4,可以跳過整個該步驟。

先介紹兩個命令,一個是sudo dpkg --get-selections|grep linux-image,該命令會檢查apt下載的所有linux-image開頭的包,也就是核心;另外一個命令是uname -r,該命令返回結果是當前系統所用核心版本。

在我自己的電腦上,命令列敲入sudo dpkg --get-selections|grep linux-image並執行,返回了四個結果,分別為:

linux-image-4.15.0-29-generic

linux-image-4.4.0-148-generic

linux-image-generic

linux-image-generic-hwe-16.04

執行uname -r返回的結果是linux-image-4.15.0-29-generic,說明我當前使用的核心版本是第一個。

關於核心操作的詳細解釋,請參考附錄1,為保證正文簡潔,只記錄如何更換核心。

首先用grep menuentry /boot/grub/grub.cfg命令檢視有哪些核心,如沒有需要的核心可以用apt-get下載(這個我沒有嘗試,因為系統自帶了一個4.4)。我執行這個命令後顯式如下圖。

 

我想要將linux-image-4.15.0-29-generic修改為linux-image-4.4.0-148-generic,執行sudo vim /etc/default/grub,開啟grub設定檔案,將GRUB_DEFAULT=0改為GRUB_DEFAULT='Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-148-generic'。隨後執行sudo update-grub,如無錯誤提示,即意味著/boot/grub/grub.cfg修改成功,然後sudo reboot重啟電腦。注意,重啟電腦後,本來游標預設位置應該在Ubuntu,現在游標位置預設在Ubuntu的下一行,即Advanced options for Ubuntu,直接回車進入,下一個介面游標的預設位置應該在Ubuntu, with Linux 4.4.0-148-generic,直接回車即可。進入介面,uname -r檢查顯示更改核心成功。

這裡我本來是希望可以直接登入Ubuntu即是更改後的核心,但嘗試了很多方法,最終都必須通過Advanced options for Ubuntu修改載入核心,如果有高手搞定了,還請不吝賜教。

此外,如果你是強迫症患者,但又不知道如何處理這種情況,可以選擇將Kernel 4.15直接刪掉,但我個人認為這個方法不夠優雅,因此不列出了。

二、禁用nouveau

簡單介紹一下nouveau,簡單來說它和nvidia系列有衝突,不禁用的話可能會導致黑屏或迴圈登陸,因此一定要禁掉。

這裡提供一個不太一樣的禁用方法,這種方法不需要重啟電腦。

分為四部:1.首先ctrl+alt+f1切換到命令列介面,輸入賬號密碼登入;2.然後sudo service lightdm stop關閉圖形介面;3.sudo modprobe -r nouveau將nouveau徹底幹掉;4.執行lsmod | grep nouveau返回空說明nouveau已經清理乾淨。

modeprobe是核心模組管理一個很好用的工具,這裡不做具體介紹了,詳情請參考鳥哥的linux私房菜19章。

三、安裝CUDA

終於到了安裝CUDA的步驟了,在禁用nouveau後,不要急著啟用lightdm,轉到cuda安裝檔案所在目錄,用sudo命令進行安裝,我的cuda安裝檔名為cuda_8.0.61_375.26_linux.run,記得要禁用opengl,所以我的命令就是sudo ./cuda_8.0.61_375.26_linux.run --no-opengl-lib,禁用opengl據說是為了防止和系統原有的opengl衝突。其餘預設安裝即可。

四、測試CUDA是否安裝成功

轉到sample儲存目錄,像我在安裝過程中用的預設儲存位置,因此它們在我的~/NVIDIA_CUDA-8.0_Samples/目錄下,在這個目錄下,進入./1_Utilities/deviceQuery/,在這個目錄下make然後執行./deviceQuery。如果出現如下畫面說明CUDA安裝成功。

 

 

五、其他坑

說點其他比較零碎的坑。

1.首當其衝就是安裝CUDA結束時,安裝程式提醒一切就緒,但是測試不通過,nvidia-smi也無法執行,但是nvcc -V顯示結果無誤。

這個問題的解決方法是我誤打誤撞試出來的,具體為什麼我也不清楚,搜了很久也沒找到答案。解決方法是這樣的,用sudo apt-get install nvidia-375安裝顯示卡驅動,然後重啟兩遍(對的,重啟一遍沒用,絕望之下我又重啟了一遍),一切問題消失,出現了測試結果中的截圖,nvidia-smi也能正確工作了。

2.用blacklist方式禁用nouveau的時候,禁用掉的是4.15核的nouveau,禁不掉4.4核的,所以我一怒之下,直接把nouveau幹掉了,問題解決。

至此CUDA已經順利安裝,後續會嘗試在另一臺電腦上安裝CUDA,並在這個帖子更新安裝結果。此外還會在下一篇文章嘗試不用sudo安裝caffe的其他依賴。

 

附錄1:核心操作的詳細解釋(由鳥哥的linux私房菜(基礎篇)19章部分內容總結)

先簡單介紹一下系統啟動流程:1.載入BIOS的硬體資訊並進行自我檢查,並根據設定讀取第一個可啟動的裝置;2.讀取並執行第一個啟動裝置內MBR的啟動載入程式(linux的啟動載入程式一般為grub或grub2);3.根據啟動載入程式的設定載入Kernel,Kernel會開始檢測硬體並載入驅動程式;4.餘下部分主要是systemd部分,暫且不提。其中啟動載入程式又被稱為boot loader,主要提供三個功能:1.提供選項,是多重引導的重要功能;2.載入核心檔案;3.轉交其他loader,是實現linux和win雙系統的重要功能。

藉由boot loader讀取核心檔案,核心開始從BIOS手中接管硬體,一般來說核心檔案儲存在/boot目錄下,以vmlinuz開頭,比如我的核心檔案絕對路徑為/boot/vmlinuz-4.15.0-29-generic。除kernel以外,boot loader還會讀取initrd(虛擬檔案系統),這裡暫不表。

boot loader分為兩個階段:1.執行boot loader主程式,沒有安裝loader的相關配置檔案;2.主程式載入配置檔案,一般都在/boot/grub/(或/boot/grub2/,我的系統是/boot/grub/目錄)目錄下。其中最重要的就是配置檔案grub.cfg。官方不建議手動修改grub.cfg檔案,而是通過grub-mkconfig(grub2-mkconfig)命令產生新的grub.cfg檔案。配置檔案的內容簡介詳情見鳥哥的linux私房菜(基礎篇)19章。

 

參考文獻:

https://www.linkedin.com/pulse/installing-nvidia-cuda-80-ubuntu-1604-linux-gpu-new-victor 這篇文章介紹了很多安裝CUDA中常見的坑,囿於自身水平,其中部分方法在我這裡是失效的,但我不知道原因。

https://blog.csdn.net/yhaolpz/article/details/71375762 這是一篇特別詳盡的介紹安裝caffe的部落格

鳥哥的linux私房菜

相關文章