記錄:Ubuntu 18.04 安裝 tensorflow-gpu 版本

来源:https://www.cnblogs.com/mbcbyq-2137/archive/2018/12/09/10093819.html
-Advertisement-
Play Games

最近需要跑比較大的模型,電腦上的 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 進行替換即可。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 正式開始 首先我在這介紹兩個新的小知識,要在下麵用到。一個是函數 id() ,另一個是運算符 is。id() 函數就是返回對象的記憶體地址;is 是比較兩個變數的對象引用是否指向同一個對象,在這裡請不要和 == 混了,== 是比較兩個變數的值是否相等。 copy 這個詞有兩種叫法,一種是根據它的發音音 ...
  • 這裡主要介紹ANSI C的特性:當執行算術運算時,操作數的類型如果不同,就會發生轉換。數據類型一般朝著精度更高、長度更長的方向轉換,整型數如果轉換為signed不會丟失信息,就轉換為signed,否則轉換為unsigned。 一、算術轉換(K&R C) 首先: 任何類型為char或short的操作數 ...
  • using System; namespace ConsoleApp1 { interface IInterface1 { void ft(); } interface IInterface2 { void ft(); } class MyClass : IInterface1, IInterfa.... ...
  • 本周終於發佈了.NET Core 2.2,ASP.NET Core 2.2以及Entity Framework Core 2.2,雖然更大的新聞可能是.NET Core 3.0的特性公佈,但不妨先將現有的.NET Core版本升級到2.2,及時體驗一下新的功能。 .NET Core 2.2 分層編譯 ...
  • 1、錯誤案例: Index:1 Uncaught ReferenceError: 系統管理 is not defined at HTMLAnchorElement.onclick (Index:1) 2、錯誤寫法 3、正確寫法(加入轉義符號 ' \ ' ) ...
  • 在 Asp.Net Core 1.0 時代,由於設計上的問題, HttpClient 給開發者帶來了無盡的困擾,用 Asp.Net Core 開發團隊的話來說就是:我們註意到,HttpClient 被很多開發人員不正確的使用。得益於 .Net Core 不斷的版本快速升級;解決方案也一一浮出水面,本... ...
  • 一、緩存機制介紹 在Linux系統中,為了提高文件系統性能,內核利用一部分物理記憶體分配出緩衝區,用於緩存系統操作和數據文件,當內核收到讀寫的請求時,內核先去緩存區找是否有請求的數據,有就直接返回,如果沒有則通過驅動程式直接操作磁碟。緩存機制優點:減少系統調用次數,降低CPU上下文切換和磁碟訪問頻率。 ...
  • 一、實驗環境 1、VMware12、倆台Linux(Ser 和 Client )、DHCP安裝包。 二、操作流程 1、安裝DHCP 2、配置DHCP的配置文件: /etc/dhcp/dhcpd.conf 3、測試服務 三、實操如下 1、# yum -y install dhcp* //安裝DHCP, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...