[教學] 手把手帶你學 Tensorflow、Pytorch、CUDA、NVIDIA-SMI、cuDNN、Ubuntu、NGC、Docker、NVIDIA-Docker 的安裝與設定

[2024/05/04 更新]

首先,這網誌荒廢了一陣子,但翻了一下,關於深度學習好像也是積累了幾篇,有興趣的可以看一下,但我想年代有點久遠,可能會不太適合現在的安裝了;網路很多教學文,所以這次就不說幹話,手把手教你自己打造安全的深度學習開發測試環境;希望能幫助大家踩越少坑越好 ! 選在 May the Fourth be with You 這天也不錯 ! 從最開始心血來潮自己亂摸索,順手買了 960,直到狠下心的工欲善其事必先利其器的用力勸敗哦 ! 記得,有時候,不討高層長官們喜的話,冒著被凍或被踢出還是要講,千萬不要讓你的高層長官們(不用自己動手的都算)覺得不用買 GPU,不用花錢招募(就是想找即戰力但只招得起新鮮人),用想的就可以做出天下無敵的落地應用。。。最最重要的還有數據 !!! 難道你覺得最後落不了地,高層長官們會不怪你嗎 ?

由於大家很容易沒仔細瞭解互相的相依性,一股腦的就裝,常常也看到很多人說裝不起來;所以首先來好好關注一下你需要注意以下這些東西,然後你全部看完後再決定到底要怎樣搭配各個版本:OS, GPU, CUDA, cuDNN, Docker / NGC / nVIDIA Docker, Python / Anaconda, Tensorflow, Pytorch。
(很重要) 強列建議,本機端順利裝好後,就快點看 docker 的處理吧 ! (很重要)
  1. OS:建議 ubuntu 16.04 LTS (支援至2021年04月),我個人之前機器都是14.04 LTS(支援至 2019年04月),後來都是用 docker,就沒再去做升級這樣;這次為了寫這篇則是裝了 16.04 LTS 這樣。。。2023/08 已經改使用 Ubuntu 22.04 LTS,但 USB Wifi 編譯一直失敗,又換回 Ubuntu 20.04 LTS

    *** USB Wifi 驅動程式番外篇 ***
    心血來潮的想說幫Ubuntu這台工作站搞個Wifi,或者是 4G LTG 分享器,想不到整個囧爆,碰到 USB Wifi 在 ubuntu 20.04 跟 22.04 上會發生找不到 wifi 選項的問題 ! 如左上圖所示,導致無法像右上圖一樣選擇連線隱藏的wifi。
    (1.) 首先是想搞 4G LTE 網路分享,去買了 TP-Link Deco X20-4G,結果,NAT、Port 轉發,都 GG
    (2.) 後來改換用手機吃4G,然後USB網路共用,嗯 ! 可以 WORK;但是重開機就得去現場按一下
    (3.) 接著又買了這些支援Linux的USB 無線網卡:USB-N10 NANOAC600 MU-MIMO 雙頻無線網卡AC1200 MU-MIMO 雙頻USB 3.0 無線網路卡;悲劇的是編譯驅動好幾次,查用的晶片型號,最後只有AC600 這個 DWA-171 (C) 用 D 可以成功在 Ubuntu 20.04 上連線隱藏網路
    A. https://github.com/uzh-rpg/rpg_dwa171_wifidongle
    B. https://github.com/aircrack-ng/rtl8188eus
    C. https://github.com/drygdryg/rtl8188eus
    D. https://github.com/morrownr/8821cu-20210916
    (4.) 你以為只有這樣就能風平浪靜嗎 ? 錯 ! 萬一你不小心給它 apt-get upgrade 或升級了什麼,就會發生這又找不到 wifi 選項了 ! 然後當你用 lsusb 跟 sudo dkms status 時會看到這樣的字串:
    rtl8821CU, 5.4.1, 5.4.0-73-generic, x86_64: installed (WARNING! Diff between built and installed module!)
    經過一番研究,找到下方連結,參考了下這樣的指令把它移除:
    sudo dkms remove -m rtl8821CU -v 5.4.1 --all
    然後再到前述的D下載檔案,然後直接用 install-driver.sh 安裝:
    D-Link DWA-171 AC600 wifi dongle not detected at all in Ubuntu 20.04
  2. GPU 規格及型號 (驅動程式):有2個網址需要注意;很多時候因為驅動版本就會跟下方的cuda還有cudnn再互相衝到,需要特別注意 ! 以我自己為例,是使用 440.82。。。2023/08是用535.104.05

    首先是 https://en.wikipedia.org/wiki/CUDA#GPUs_supported 這個 wiki,裡面清楚寫了各種 GPU 的Micro-architecture,基本上建議如果真的要跑深度學習,請務必以 Pascal 為基本款出發 ! 記得在安裝前先切到 tty2 然後 sudo service lightdm stop 關閉服務。

    接著安裝相依套件:
    sudo apt install dkms build-essential linux-headers-generic

    然後在本機端前面按 ctrl + alt + F1,切換到 tty 2 記議直接在本機端前做安裝驅動這件事;不然這裡可能會碰上一些奇怪的錯誤。接著建議都先把安裝OS自帶的移除:sudo apt-get remove --purge nvidia* 或 dpkg -l 'nvidia*' 然後再 dpkg --remove nvidia-(XXX)。;或者知道被預安裝的版本的就像下面這樣:

    sudo apt-get remove --purge nvidia-driver-535
    sudo apt-get autoremove




    確認了 GPU 型號後,就到這個網址挑選驅動程式下載吧,強烈建議看完全部想清楚再來挑選版本:
    https://www.nvidia.com/Download/index.aspx?lang=tw

    RTX 6000 Ada:wget https://tw.download.nvidia.com/XFree86/Linux-x86_64/535.104.05/NVIDIA-Linux-x86_64-535.104.05.run

    A100:wget https://tw.download.nvidia.com/tesla/535.86.10/NVIDIA-Linux-x86_64-535.86.10.run

    下載好後記得 chmod a+x 補上執行權限,然後一定要 sudo service lightdm stop 接著

    ./NVIDIA-Linux-x86_64-XXX.run -no-x-check -no-nouveau-check -no-opengl-files -no-x-check


    一般來說應該都正常,但如果碰上問題,可以試試這幾篇文章,有提到一些動作:

    https://blog.csdn.net/ksws0292756/article/details/79160742
    https://zhuanlan.zhihu.com/p/31575356

    sudo ./NVIDIA-Linux-x86_64-535.98.run

    正常來說,都是照上面這樣安裝成功的,疏不知,就是有那個 BUT ... 會裝不起來
    (1.) NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.
    https://blog.csdn.net/wjinjie/article/details/108997692
    https://andy51002000.blogspot.com/2019/01/nvidia-smi-has-failed-because-it.html
    https://blog.csdn.net/wjinjie/article/details/108997692
    (2.) 【nvidia-smi】Failed to initialize NVML: Driver/library version mismatch
    https://www.cnblogs.com/duby0/p/17060960.html
    https://zhuanlan.zhihu.com/p/94378201
    (3.) 安裝NVIDIA驅動出現: An NVIDIA kernel module 'nvidia-drm'
    https://zhuanlan.zhihu.com/p/135875408
    [Linux] Ubuntu 安裝、移除 NVIDIA 顯示卡驅動程式(Driver)教學
    (這篇蠻清楚的)

    最後這次我是採取用 apt-get 安裝的
    sudo add-apt-repository ppa:graphics-drivers
    sudo apt-get update
    sudo apt-cache search nvidia-driver-*
    # sudo apt-get install nvidia-driver-535
    # sudo reboot












  3. CUDA:這個就非常重要了,因為跟上下兩個提到的都會互相依存,比如說 CUDA 10 就需要TensorFlow >= 1.13.0,然後驅動版本是自帶410.48 這樣就會把你第二步的440.82給蓋掉,這些都可以透過這個網站  https://developer.nvidia.com/cuda-toolkit-archive 來找到;另外附上網址與截圖,希望可以注意到裡面 cuda 版本跟驅動程式版本也是會有影響的,當下載好了以後,都是直接執行然後安裝的,要注意的是,一定要注意好 cuda 版本跟對應的驅動版本。



    wget https://developer.download.nvidia.com/compute/cuda/12.2.1/local_installers/cuda_12.2.1_535.86.10_linux.run

    sudo sh cuda_12.2.1_535.86.10_linux.run

    sudo apt install nvidia-cuda-toolkit


    /Developer/NVIDIA/CUDA-#.#
    Do you accept the previously read EULA?
    accept/decline/quit: accept
    Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?
    (y)es/(n)o/(q)uit: n
    Install the CUDA 10.0 Toolkit?
    (y)es/(n)o/(q)uit: y
    Enter Toolkit Location
    [ default is /usr/local/cuda-10.0 ]:
    Do you want to install a symbolic link at /usr/local/cuda?
    (y)es/(n)o/(q)uit: y
    Install the CUDA 10.0 Samples?
    (y)es/(n)o/(q)uit: n
    ===========
    = Summary =
    ===========
    Driver: Not Selected
    Toolkit: Installed in /usr/local/cuda-10.0
    Samples: Not Selected

  4. cuDNN:這個也是會跟上方有互相搭配,全名是 NVIDIA CUDA® Deep Neural Network library,請先到後面網址註冊個帳號,https://developer.nvidia.com/rdp/form/cudnn-download-survey;後面 nVIDIA GPU Cloud 也會需要用到 ... 當然這個也需要注意一下跟 cuda 版本的搭配;下載好了之後,就是把相關的檔案復制到 cuda 資料夾的對應目錄裡;這邊比較麻煩的就是沒辦法直接 wget 在 ubuntu 上直接用,得想辦法自己先下載了再上傳這樣 !

    NVIDIA cuDNN  Installation Guide



    cd /usr/local/cuda-12.2/
    sudo cp ~/cudnn-linux-x86_64-8.9.4.25_cuda12-archive/include/* /usr/local/cuda-12.2/include/
    sudo cp ~/cudnn-linux-x86_64-8.9.4.25_cuda12-archive/lib/* /usr/local/cuda-12.2/lib64/


  5. Docker / nVIDIA Docker:接著是要安裝 docker,這兩個指令就可以搞定

    sudo apt-get install curl
    curl -sSL https://get.docker.com | sudo sh


    接著看硬碟配置狀況做改動

    ps faux | grep -i docker
    sudo docker info
    sudo systemctl stop docker
    sudo rsync -avh /var/lib/docker/ /path/to/your/docker/


    sudo vi /etc/docker/daemon.json
    "data-root": "/path/to/your/docker", #加上這行

    sudo systemctl daemon-reload
    sudo systemctl start docker
    sudo docker info
    ps faux | grep -i docker


    接著是要安裝 nvidia-docker2 (https://github.com/NVIDIA/nvidia-docker)

    curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -

    distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

    curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
    apt-get update

    apt-get install nvidia-docker2


    安裝 nvidia-container-runtime:https://github.com/nvidia/nvidia-container-runtime#docker-engine-setup

    apt-get install nvidia-container-runtime
    service docker restart

    【超快速教學】如何在Ubuntu安裝Docker,使用官方推薦方式
    更改 Docker 預設路徑

    接著來補充一下在使用一些開源套件時很常碰到 cuda、cudnn、driver 跟 pytorch 等版本不一樣的問題 ! 請愛用 docker來解決,並且請到這兩個地方去找到並 pull 你會用到的版本

    https://hub.docker.com/r/nvidia/cuda/tags
    https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda/tags

    docker pull nvidia/cuda:11.6.1-cudnn8-runtime-ubuntu20.04 (舉例,然後就準備 run)

    docker network ls
    docker network inspect  network_name
    (看看你現在有那些 docker 網路)
    docker network connect network_name docker_name (這樣才有把你的docker加到同網路)

    nvidia-docker run -it --name twman -m 32g -v /etc:/opt/etc -v /home/twman:/opt/data nvidia/cuda:11.6.1-cudnn8-runtime-ubuntu20.04 bash
    (加 -v /etc 是懂的人就會懂,有時就是剛好只能用 docker 但不能 sudo 就是用起來不舒服,-m 則應該是可以避免偶爾跑下去會被 killed 的問題?)

    apt-get install pip git vim htop screen libgl1-mesa-glx libglib2.0-0 -y 

    最後面那兩個 libgl1-mesa-glx libglib2.0-0 是為了避免以下錯誤
    ImportError: libGL.so.1: cannot open shared object file: No such file or directory
    ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory

    adduser twman (新增帳號前記得先 root 做一下 apt-get update 跟 install 上面的;接著就是盡量新增一個普通帳號,然後切換過去吧,因為你實際佈署上線時,通常你不是 root)
    su xxxx

    cd /opt/data/ (再來,就是快點裝 conda 啦)
    ./Anaconda3-2024.02-1-Linux-x86_64.sh

    conda create -n env_name python=3.8 (記得改名)
    conda activate env_name

    conda install pytorch=1.9.1 torchvision=0.10.1 torchaudio=0.9.1 cudatoolkit=11.1 -c pytorch -c nvidia
    pip3 install torch==1.9.1+cu111 torchvision==0.10.1+cu111 torchaudio==0.9.1 -f https://download.pytorch.org/whl/torch_stable.html

  6. python / anaconda
    這個就是需要到anaconda官網下載 https://www.anaconda.com/distribution/
    wget https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh
    sh Anaconda3-2020.02-Linux-x86_64.sh
    如果做好一台的環境後可以這樣做,來匯入匯出避免反覆設定相關套件
    conda env export --name yourenv --file yourenv.yml
    conda env create -f yourenv.ymlconda info --envs


  7. Tensorflow
    conda install tensorflow==1.15.0



  8. Pytorch
    這個就應該是最簡單的了,直接看網頁上就能裝
    https://pytorch.org/get-started/locally/
    conda install pytorch torchvision cudatoolkit=10.0 -c pytorch
    至於驗證版本等則是用這樣的指令 !
    python -c "import torch; print(torch.__version__)"
    1.3.0
    python3 -c "import torch; print(torch.version.cuda)"
    10.1.243
    python3 -c "import torch; print(torch.backends.cudnn.version())"
    7603
    python -c "import torch; print(torch.cuda.is_available())"
    True