重要提示


  • TF 2.10 是 Windows 平台上 原生環境最後一版可以支援 GPU 的版本.
  • 如果需要在 Windows 中使用 TF2.11 及以後的版本, 請改用WSL 2 環境.

前言


這個主題大概是所有平時只用 Windows 的人士心中永遠的痛 (尤其是不懂系統, 或者不十分了解系統的人). 其實 Linux 用戶也好不到哪裡去啦 (如果你不是 Linux 上系統工程師), 差別只是無解有點希望. 不過這個問題在 Win10/Win11 上現在幾乎已經完全解開, 不再是無解的問題了.

目前在 Win10/Win11 平台上, 要啟用 GPU 對於 TensorFlow 的支援, 可用的作法可以分為四類:

  • 使用 Windows 原生環境 (及 Python 虛擬環境)
  • 使用 WSL2 環境
  • 使用 docker 環境
  • 使用 Anaconda for Windows 環境

不過在開始安裝之前, 各位有二件事要決定一下:

  1. 要用哪個版本的 TensorFlow? (一般會先決定這個)
  2. 要用哪個版本的 Python?

如果你是正要準備上課學習 TensorFlow 的新手, 那可能要看一下教材, 教材裡教的 TensorFlow 1.x 還是 2.x (免得自己還要上網查如何轉換 TensorFlow 的寫法). 如果是自己研究研究, 那就 (用自己熟悉的!? 那還幹麻花時間看我的貼文??) 我的建議是不要用最新的, 用接近最新的就可以了. 之所以要決定版本是因為 TensorFlow 自己的支援矩陣綁得很死(註一), 一但錯了, 就無法用 GPU, 可能得重來一遍. 同時 NVIDIA 提供的 dll/library 也可能會出一些讓人意想不到的錯, 所以也可能無解, 得換個舊一點的版本試試?

因此我們常會在網路上找到明明是 20212023 年了(註二), 還有人在重複 2019~2016 的舊環境, 很大一部份原因是出於這個舊環境確定可以運作. 其實也不是說, 舊的就錯了, 只是如果前因後果都沒有交代清楚就貼了一分舊環境, 那我很可能就直接認為文章是不知從哪兒參考來的或者抄來的, 然後再用自己的機器重製一遍囉?(註三)

註一: 指的是相關的底層 dll/library 的版本. 這一點, PyTorch 比起 TensorFlow 作得要好太多. PyTorch 把需要的 CUDA Toolkit 版本資訊都包在自己的安裝包裡了, 使用者只需在 PyTorch 網站上選擇要需要的環境, 再把對應的指令複製貼上即可, 完全不用理是否安裝了 CUDA Toolkit, 或者安裝的是哪一版的 CUDA Toolkit. 這對一個沒有系統管理經驗的初學者來說簡直是大大的福音啊.

註二: 歹勢, 明明是 2021/01 寫的 (2021-01-22 12:40:58), 但是不知為何就是沒把閱讀狀態改為公開 (忘了?? 真的想不起來了). 所以現在 (2023/02) 又多花了一點時間, 重新更新並校閱, 這才公開給大家.

註三: 這個也是誠歹勢, 是說我自己也常這麼幹來著, 但是至少我不會一字不落的抄, 同時我還一定會標明參考來源.

好了, 廢話不再多說, 來看如何進行安裝吧!

使用 Windows 原生環境


需求環境:

  • 平台: Windows 7 ~ Windows 10, Windows 11
  • Python for Windows.
  • Python 本身的 venv 虛擬環境 (或者非 Anaconda 環境下的虛擬環境).

在 Windows 環境下主要是經由 Windows 原生的命令提示列 CMD 視窗 (PowserShell 指令視窗理論上也沒有問題, 只不過本人不熟, 所以在此不作介紹), 或者 git-for-windows 的 git bash 視窗來操作. 當然也可以在終端機 (Windows Terminal) 或者 VS Code 開啟終端機視窗來操作 (CMD 或 git bash 子視窗). 以下的操作我主要以 git-for-windows 的 git bash 視窗來操作.

概要的安裝步驟如下:

  1. 安裝 Microsoft Visual C++ 開發工具及執行環境.
  2. 確定硬體支援
  3. 確定相關元件的版本
    (主要有 Python, TensorFlow, Display Driver, CUDA Toolkit, CuDNN).
  4. 安裝 NVIDIA 相關元件
    • 安裝 CUDA Toolkit
    • 安裝 cuDNN SDK
    • 安裝 NVIDIA 顯卡趨動程式 (選項)
  5. 安裝 Python for Windows (選項, 除非目前版本不在相容矩陣中).
  6. 開設 Python venv 虛擬環境.
  7. 安裝 Python package tensorflow.
  8. 驗證 tensorflow 可以使用 GPU.

步驟 1~5 只要作過一次就可以了. 以後只要重複步驟 6~7 就可以開出許許多多的 tensorflow 的虛擬環境.

版本小知識


目前許多軟體都依循 x.y.z 的規範來標注版次.

  • x: 一般重大改變時才會更動大版次x.
  • y: 一般有新增加的功能時會更動小版次y. 但通常是定期發佈 (或者累積一段時間發佈), 而且會累積好幾個新功能, 不會有一個新功能就發佈一個更新.
  • z: Bug 修正版次. 若發現某個 bug 並修正時, 除了修正現下的版本也會修正先前幾個有此功能問題的小版次. 和小版次 y 一樣是累積一段時間才發佈, 但週期會比小版次更新的週期來得短.

以 Python 來說, 前幾天 2023/02/08 發佈了二個 Bug 修正版次 3.11.2 和 3.10.10. 而它們的前一個版次是 2022/12/06 發佈的, 但同一天卻發佈了 3.11.1, 3.10.9, 3.9.16, 3.8.16, 3.7.16 等五個修正版次.

Python Release

Python 最近的版本 Release

因此, 一般我們挑選版本時, 都會選擇最新的 Bug 修正版次 (除非有特別目的). 所以, 以下我們挑選安裝 tensorflow 及其他相關的軟體元件也都請遵此規則: 相同的小版次 x.y, 選 z 為最大的修正版次.

Step 1: 安裝 Microsoft Visual C++ 開發工具及執行環境


需要安裝 Microsoft Visual C++ 開發工具及執行環境的原因有二:

  1. CUDA Toolkit 內有 Microsoft Visual C++ 的擴充套件, 如果你以後打算專門從事 CUDA 相關的應用程式開發, 應該一定會用到. Python 畢竟比原生 C++ 慢了一些 (不要懷疑, TensorFlow 和 PyTorch 都有 C++ API).
  2. pip 安裝 Python 套件有時會發生部份套件沒有你所用的 Python 版本所對應的 .whl 檔, 因此可能會需要臨時重新編譯/連結.

其實我們只需要安裝 MS Build Tools 即可 (即 Visual C++ 相關的編譯及連結工具). 不過, 自 MS Visual Studio 2017 之後, Visual C++ 的安裝界面就長得和 MS Visual Studio 一模一樣了, 不常用真的很容易弄錯. 如果考慮到日後 CUDA 的開發也會用到, 你可以選擇安裝 Visual Studio 的 C++ 開發環境, 而不是只裝 Build Tools for VS 20xx. 反之, 如果你只管 Python 的部份, 那就安裝 Build Tools for VS 20xx 即可.

所以請至 MS Visual Studio 網站的下載頁 下載並安裝 "Build Tools for Visual Studio 2022" 或者 "MS Visual Studio" (community 版即可).

另外我在 Python: 自行安裝 Jupyter 環境 (jupyterlab+numpy+pandas+matplotlib) 這一篇貼文的註四部份, 有解譯為何現在可以不必管 Visual C++ 的版本. 在此我就不再重複, 有興趣的自行參考. 目前大家只需知道現在可以不必管 Visual C++ 的版本了 (所以安裝哪一版的 Build Tools for Visual Studio 20xx 都行). 如果一定要舊版 VS, 也可以在這個連結裡找到 (VS 2013 ~ VS 2019).

Visual Studio 的下載連結在該網頁的上方, 很醒目.

下載 VS 2022

選擇下載 Visual Studio Community 版.

如果只要裝 MS Build Tools, 則要一直捲到接近底部的位置.

下載 MS Build Tools

選擇下載 Build Tools for Visual Studio 2022

安裝 Build Tools for Visual Studio 2022 時, 什麼都不必選, 直接按下安裝按鈕即可.

安裝 Build Tools for VS2022

安裝 Build Tools for Visual Studio 2022.

安裝 Visual Studio 的 C++ 開發環境時, 請選擇使用 VC++ 桌面開發.

安裝 VS 2022  VC++ 桌面開發

安裝 Visual Studio 的 C++ 開發環境時, 請選擇 "使用 VC++ 的桌面開發"

Step 2: 確定硬體支援


顯卡越來越貴, 一張 RTX 4090 官方報價 1,599 美元, 幾乎和主機一樣貴了. 經濟較差的或許就選擇不買它了, 用舊卡將就一下 (買新的舊款顯卡, 或者上網找二手顯卡), 可以跑得動 TF 就好. 如果你的顯卡是 5 年內的 (或者 NVIDIA 最新版的顯卡趨動還有支援它), 那應該不會有太大的問題. 但是如果出廠超過 5 年了, 那還是檢查一下為好.

首先要查的是顯卡的算力: TF 1.x 要求的最低算力是 3.0, TF 2.x 則需要 3.5

備註: 這裡所謂的顯卡算力 (compute capability) 並不是指單一計算指令有多快, 而是指 NVIDIA 顯卡的架構版本. 當然, 隨著科技的演進, 算力版本數大對應的是比較新近的架構版本, 所以其整體計算能力會比較大. 如果你想知道各個算力版本之間的差異可以從 CUDA Toolkit '文件集' 裡的 Programming Guide 裡找到 (12.3 版文件只比較 5.0 版之後的架構, 更舊的版本需要你自己從各個舊版本 '文件集' 裡自行拼補).

以我自己的 Acer 舊 NB (2013年) 為例, 它配的顯卡是 GeForce 630M, 它的算力版本只到 2.1 版, 所以是不必多費心思. 可是當時我卻不知它所支援的算力版本如此的低, 不但花時間到 NVIDIA 網站上找最後一版的 Driver (版本是 391.35, 2018/03/27 發布), 還查找了 NVCUDA.DLL 的版本是 9.1.84. 再對照 Step 3 的 TF 版本相容性列表, 知道這台 NB 還可以用 TF 1.12 以下的版本, 而 python 可以選 3.5 或 3.6.

不過, 悲劇的是裝好一測才發現: 顯卡是偵測到了, 但是算力版本太低最終還是被 TF 給排除掉了, 喝喝...大冏 orz. 所以對於在使用舊顯卡的機器上安裝 TF, 我們可能還需要查一下顯卡的算力版本: https://developer.nvidia.com/cuda-gpus.

再來是要還查一下顯卡趨動的版本可以支援到哪一版 CUDA Toolkit, 尤其是當你的顯卡趨動已經停更了.

CUDA Toolkit 與 Display Driver 對應表更新至 2023/12/12
CUDA Toolkit
Version
Toolkit Driver Version
Linux x86_64
Driver Version
Windows x86_64
Driver Version
CUDA 12.3 Update 1≥ 545.23.08≥ 546.12
CUDA 12.3 GA≥ 545.23.06≥ 545.84
CUDA 12.2 Update 2≥ 535.104.05≥ 537.13
CUDA 12.2 Update 1≥ 535.86.09≥ 536.67
CUDA 12.2 GA≥ 535.54.03≥ 536.25
CUDA 12.1 Update 1≥530.30.02≥ 531.14
CUDA 12.1 GA≥ 530.30.02≥ 531.14
CUDA 12.0 Update 1≥ 525.85.12≥ 528.33
CUDA 12.0 GA≥ 525.60.13≥ 527.41
CUDA 11.8 GA≥ 520.61.05≥ 520.06
CUDA 11.7 Update 1≥ 515.65.01≥ 516.94
CUDA 11.7 GA≥ 515.43.04≥ 516.01
CUDA 11.6 Update 2≥ 510.47.03≥ 511.65
CUDA 11.6 Update 1≥ 510.47.03≥ 511.65
CUDA 11.6 GA≥ 510.39.01≥ 511.23
CUDA 11.5 Update 2≥ 495.29.05≥ 496.13
CUDA 11.5 Update 1≥ 495.29.05≥ 496.13
CUDA 11.5 GA≥ 495.29.05≥ 496.04
CUDA 11.4 Update 4≥ 470.82.01≥ 472.50
CUDA 11.4 Update 3≥ 470.82.01≥ 472.50
CUDA 11.4 Update 2≥ 470.57.02≥ 471.41
CUDA 11.4 Update 1≥ 470.57.02≥ 471.41
CUDA 11.4.0 GA≥ 470.42.01≥ 471.11
CUDA 11.3.1 Update 1≥ 465.19.01≥ 465.89
CUDA 11.3.0 GA≥ 465.19.01≥ 465.89
CUDA 11.2.2 Update 2≥ 460.32.03≥ 461.33
CUDA 11.2.1 Update 1≥ 460.32.03≥ 461.09
CUDA 11.2.0 GA≥ 460.27.03≥ 460.82
CUDA 11.1.1 Update 1≥ 455.32≥ 456.81
CUDA 11.1 GA≥ 455.23≥ 456.38
CUDA 11.0.3 Update 1≥ 450.51.06≥ 451.82
CUDA 11.0.2 GA≥ 450.51.05≥ 451.48
CUDA 11.0.1 RC≥ 450.36.06≥ 451.22
CUDA 10.2.89≥ 440.33≥ 441.22
CUDA 10.1 (10.1.105 general release, and updates)≥ 418.39≥ 418.96
CUDA 10.0.130≥ 410.48≥ 411.31
CUDA 9.2 (9.2.148 Update 1)≥ 396.37≥ 398.26
CUDA 9.2 (9.2.88)≥ 396.26≥ 397.44
CUDA 9.1 (9.1.85)≥ 390.46≥ 391.29
CUDA 9.0 (9.0.76)≥ 384.81≥ 385.54
CUDA 8.0 (8.0.61 GA2)≥ 375.26≥ 376.51
CUDA 8.0 (8.0.44)≥ 367.48≥ 369.30
CUDA 7.5 (7.5.16)≥ 352.31≥ 353.66
CUDA 7.0 (7.0.28)≥ 346.46≥ 347.62

其實我們也可以由 "NVIDIA Control Pannel" (NVIDIA 控制面板) 查到相關的資訊.

請由 "所有應用程式" 裡叫出 "NVIDIA Control Pannel" (NVIDIA 控制面板), 然後在選單上點選 "說明 (H)" --> "系統資訊 (I)". 出現系統資訊頁面後再點選頁面上的 "元素", 在 3D 設定裡找到 NVCUDA64.DLL 就可以知道現在這一版的顯卡趨動可以配合到 (up to) 哪個版本的 CUDA Toolkit.

注意: 早期 "NVIDIA Control Pannel" (NVIDIA 控制面板) 是包含在 Display Drive 的安裝包裡, 但是目前安裝包裡已經不再包含它. 目前在 Win10/W11 上 "NVIDIA Control Pannel" 需經由 Microsoft Store 安裝. 如果不小心把它移除了, 或者系統裡根本沒有 "NVIDIA 控制面板", 請開啟 Microsoft Store, 並在搜尋框中輸入 "nvidia" 即可找到 "NVIDIA Control Pannel" 這個 APP, 找到之後直接按下安裝鈕即可.

Step 3: 確定相關元件的版本


軟體需求及版本需求相關的連結:

  1. 安裝 TensoFlow GPU 的軟體需求的頁面:
    https://www.tensorflow.org/install/gpu#software_requirements
  2. TensorFlow 與 CUDA Toolkit 版本相容性 (最初編譯成功的版本需求):
    https://www.tensorflow.org/install/source_windows#gpu
  3. CUDA Toolkit 相容性說明文件:
    https://docs.nvidia.com/deploy/cuda-compatibility/#default-to-minor-version
  4. CUDA Toolkit 各版本和顯卡趨動程式版本列表:
    https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#id4
  5. CUDA Toolkit ver 11.7.1 的 Release Notes
    https://docs.nvidia.com/cuda/archive/11.7.1/cuda-toolkit-release-notes/index.html#title-new-features
    其他版本可以在這個連結裡找到.
  6. cuDNN SDK 最新版本的相容性文件
    https://docs.nvidia.com/deeplearning/cudnn/support-matrix/index.html#cudnn-cuda-hardware-versions
    這個連結有 cuDNN 各個版本的 Release Notes

列出這一大票文件主要是要說明 TensorFlow, Python, CUDA Toolkit, cuDNN SDK 這 4 者之間有版本配對的關係需要依實際的狀況一一檢查. 原則上是:

  • 一般是先由顯卡可以支援的 CUDA Toolkit 版本決定 TF 版本 (1.x 或 2.x), 再選 Python 版本.
  • 但也有可能 Python 版本只能固定使用哪一版, 再來選 TF 的版本.
  • 再來才是選可以配合上述二者的 CUDA/cuDNN 版本.
  • 但要注意 NVIDIA 只提供 cuDNN 和某幾個版本的 CUDA 版本配合. 和下面 Tensorflow 官網提供的版本配對關係表不大一樣, 請先依下表選擇, 測試不行時, 再換用其他和 CUDA 版本配對的 cuDNN 試試看.

下表所列是 TensorFlow 網站上列的各個版本最初編譯成功的版本組合 (更新至 2023/02/11). (即來源於上述的第二個連結)

TensorFlow GPU support matrix
TensorFlow
Version
Python
version
CompilerBuild toolscuDNNCUDA
Toolkit
tensorflow_gpu-2.6.03.6-3.9MSVC 2019Bazel 3.7.28.011.2
tensorflow_gpu-2.5.03.6-3.9MSVC 2019Bazel 3.7.28.011.2
tensorflow_gpu-2.4.03.6-3.8MSVC 2019Bazel 3.1.08.011.0
tensorflow_gpu-2.3.03.5-3.8MSVC 2019Bazel 3.1.07.610.1
tensorflow_gpu-2.2.03.5-3.8MSVC 2019Bazel 2.0.07.610.1
tensorflow_gpu-2.1.03.5-3.7MSVC 2019Bazel 0.27.1-0.29.17.610.1
tensorflow_gpu-2.0.03.5-3.7MSVC 2017Bazel 0.26.17.410
tensorflow_gpu-1.15.03.5-3.7MSVC 2017Bazel 0.26.17.410
tensorflow_gpu-1.14.03.5-3.7MSVC 2017Bazel 0.24.1-0.25.27.410
tensorflow_gpu-1.13.03.5-3.7MSVC 2015 update 3Bazel 0.19.0-0.21.07.410
tensorflow_gpu-1.12.03.5-3.6MSVC 2015 update 3Bazel 0.15.07.29.0
tensorflow_gpu-1.11.03.5-3.6MSVC 2015 update 3Bazel 0.15.079
tensorflow_gpu-1.10.03.5-3.6MSVC 2015 update 3Cmake v3.6.379
tensorflow_gpu-1.9.03.5-3.6MSVC 2015 update 3Cmake v3.6.379
tensorflow_gpu-1.8.03.5-3.6MSVC 2015 update 3Cmake v3.6.379
tensorflow_gpu-1.7.03.5-3.6MSVC 2015 update 3Cmake v3.6.379
tensorflow_gpu-1.6.03.5-3.6MSVC 2015 update 3Cmake v3.6.379
tensorflow_gpu-1.5.03.5-3.6MSVC 2015 update 3Cmake v3.6.379
tensorflow_gpu-1.4.03.5-3.6MSVC 2015 update 3Cmake v3.6.368
tensorflow_gpu-1.3.03.5-3.6MSVC 2015 update 3Cmake v3.6.368
tensorflow_gpu-1.2.03.5-3.6MSVC 2015 update 3Cmake v3.6.35.18
tensorflow_gpu-1.1.03.5MSVC 2015 update 3Cmake v3.6.35.18
tensorflow_gpu-1.0.03.5MSVC 2015 update 3Cmake v3.6.35.18

各位可以依需求找到要安裝的這 4 個元件對應的版本(註四).

註四: 由於 Windows 版本的編譯工作已交付第三方 (intel) 了, 故這張表 TensorFlow 團隊好像許久沒有已經不再更新了.

2023/02/11: tensoflow 現在已經是 ver. 2.11.0 了, 上表中間少了 5 個版本. 還有 CUDA Toolkit 的版本也已經是 version 12 update1 了, 中間少了 7 個版次 (若含 Bug 修正版則總共少了 19 個版次). 所以我自己花了一點時間作了個支援矩陣的測試. 不過, 這裡我先將必要的正規的東西先說完, 後面再把測試的結果分享給各位.

2023/12/12 更新: tensoflow ver. 2.15.0, CUDA Toolkit version 12.3 update1

Step 4a: 安裝 CUDA Toolkit


CUDA Toolkit 的部份請選擇下載並安裝相容的最新版本, 下載網址:

舊版本下載連結選擇版本之後和最新版本下載的操作畫面近似:

CUDA download

CUDA Toolkit 下載操作畫面.

安裝:

  • 選用 "快速" 安裝即可.
  • 或者選用 "自訂", 然後不安裝 "NVIDIA GeForece Experience".

    注意: 安裝包裡有 NVIDIA 顯卡趨動程式, 它不會是最新的, 但一定相容於該版本的 CUDA Toolkit. 一般我會使用先使用該版本的顯卡趨動程式, 以避免撞牆. 所以使用自訂安裝時, 顯卡趨動程式請勿取消不裝, 除非你的 GPU 真的很舊, 或者你確定現在使用的顯卡趨動程式相容於這一版的 CUDA Toolkit. 另外, 安裝多個版本的 CUDA Toolkit 時, 請選擇安裝當中最新的 CUDA Toolkit 安裝包裡的顯卡趨動程式, 其他的版本則選擇不安裝.

這一步安裝完成之後你可以檢查一下狀況, 請輸入指令 nvidia-smi.

CUDA Toolkit 安裝後至少會多二個環境變數 CUDA_PATH_Vx_yCUDA_PATH. CUDA_PATH_Vx_y 是每安裝一版就會有一個, 內容是這個版本的安裝路徑. 而 CUDA_PATH 內容是最後安裝的 CUDA 版本的路徑, 它也是目前使用的 CUDA 版本的路徑. 如果安裝了多個 CUDA 版本, 使用者可以使用 Windows 的 SETX 指令自行修改成想要使用的那一個版本(註五). 在 CMD 視窗下可以使用以下指令:

:: 本視窗有效
SET "CUDA_PATH=%CUDA_PATH_Vx_y%"

:: 永久更動, 重開視窗才生效
SETX CUDA_PATH "%CUDA_PATH_Vx_y%"

如果是使用 git bash 視窗則請改用以下:

# 本視窗有效
export CUDA_PATH=$CUDA_PATH_Vx_y

# 永久更動, 重開視窗才生效
setx CUDA_PATH "$CUDA_PATH_Vx_y"

註五: 用 SET 指令只在目前的操作視窗內 (CMD 或 git bash) 改變環境變數內容, 操作視窗一旦關掉再重新開啟環境變數依然還是原本的內容. 用 SETX 才能永久改變環境變數內容, 但是它並不會同時改變目前的操作視窗內改變環境變數內容.

注意: 如果你使用的是 Windows Terminal 來開啟操作視窗, 當使用 SETX 更動了環境變數內容之後, 再用同一個 WT 實例 (Windows Terminal instant) 開啟新的子窗視, 該變數內容並不會有所更動. 因為他們都依然從原始開啟 WT 實例的環境變數中繼承環境變數內容. 必需是新開啟的 WT 實例才會包含更動過的環境變數內容.
因此, 安裝 CUDA Toolkit 之後請務必關閉原本的 WT 實例, 再重新開啟.

事實上在 Windows 平台上, 使用者環境變數是存放在 registry HKCU\Environment; 系統環境變數則是存放在 registry HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 裡.

Step 4b: 安裝 cuDNN SDK


第一次下載 cuDNN SDK 需要另外填一些資料. 下載網址:

請下載 Windows 平台的, 與 CUDA Toolkit 版本對應的 cuDNN SDK 版本.

安裝:

  • 解開 ZIP 檔, 並將其中內含的三個子目錄 copy 到 CUDA Toolkit 安裝路徑中對應的子目錄中 (即: 安裝路徑也含有這三個子目錄).
    例如: CUDA Toolkit v11.7 預設的安裝路徑為 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7, 請將它們拷貝到這裡.
    • bin <--> bin
    • lib <--> lib
    • include <--> include
  • 因為拷貝的目的地是在 C:\Program Files\ 的子目錄底下, 因此系統會要求你有管理者權限.

Step 4c: 安裝 NVIDIA 顯卡趨動程式


如前 Step 4a 所述, 這一個步驟是選項, 非必要.

NVIDIA 顯卡趨動下載網址:

若有需要, 請依自己的 NVIDIA GPU 型號下載並安裝. 下載時, 可以選 Studio 版本 (即: 非 Game Ready 版). 二者的差別只在於安裝包內沒有 NVIDIA GeForece Experience, 這個程式只有玩 Game 時才會用到 (吧?)

注意: 部份 TensorFlow 的網頁, Microsoft 的網頁, 甚至 NVIDIA 自己的網頁上說是要你用最新的版本, 但是請務必記得千萬不要一開始就使用 NVIDIA 網站上的最新版本, 免得自找罪受. 就像現在 (2023/02/11) CUDA Toolkit 的版本是 12.0 update 1, NVIDIA 網站下載到的新版 Display Driver 版本一般也會包含支援 CUDA Tookkit 12.0 的部份, 但是我們卻還不知道 TF 是否相容於 TF 卻還不支援 CUDA Toolkit 12.0. 所以版本不要跟太緊以免在還自己對他們的掌握還不高的時候, 浪費時間在不明確的事上.

Step 5: 安裝 Python for Windows


如果你已經安裝 Python for Windows, 但它不是你所需要的 Python 版本? 沒關係, 原來的版本放著, 請再下載並安裝一次需要的版本即可. 詳細安裝多版本 Python 的注意事項及步驟請參考這一篇貼文: Python: Python 多版本管理.

Step 6: 開設 Python venv 虛擬環境


請依需求開設 Python 虛擬環境 (非 Anaconda, 或 Miniconda). 以下以 Python venv 虛擬環境為例, 虛擬環境名稱為 envTF2.

使用目前安裝的 Python 版本 (第一個在 PATH 環境變數裡的 Python 版本) 開設虛擬環境, 請用以下指令:

python -m venv envTF2

指定以特定版本的 Python 開設虛擬環境 (即: 在虛擬環境中使用的是該版本的 Python), 則請用以下指令:

py -3.x -m venv envTF2

還不了解如何操作 Python venv 虛擬環境的人可以參考這一篇貼文: Python: Python 虛擬環境.

Step 7: 安裝 tensorflow


請在開設好的 Python 虛擬環境中以 pip install 安裝 tensorflow. 安裝前請先啟動虛擬環境 envTF2(註六).

source envTF2/Scripts/activate
  • 安裝最新版本指令如下:
    pip install tensorflow
    
  • 安裝特定版本的最新的 Bug 修正版次指令如下: (使用 ~=)
    pip install tensorflow~=2.x.0
    
  • 安裝特定版本的指令如下: (使用 ==)
    pip install tensorflow==2.x.y
    

注意事項:

  • TF 1.x 版分為 tensorflow (只用 CPU), tensorflow-gpu (有支援 NVIDIA GPU). TF 2.x 已經將 CPU 及 GPU 的版本整在一起, 只需安裝 tensorflow 即可.
  • TF 2.x 已經將 Keras 整合至 tensorflow, 成為 tf.keras. 原先獨立版本的 keras (可以支援各種不同底層框架) 已經不再繼續開發及支援 (解 bug).
    • 最近發現自 2021/06 月中 Keras 就從 tensorflow repo 中分離出來, 回復為獨立維護自已的 repo. 並且最近 2023/11 發表 Keras 3 又回到支援多重底層的狀態. 目前可以使用 JAX, PyTorch, TensorFlow 作為底層框架, 甚至也可以只用 NumPy. 至於 TensorFlow, ver. 2.15.0 是支援 Keras 2 的最後一個版本, 後續的版本才會支援 Keras 3. 2023/12/12 更新
  • 這一步驟和安裝順序無關, 可以 NVIDIA 相關元件都安裝好了之後安裝; 也可以相關 NVIDIA 元件都還沒有安裝之前就安裝 TF.

註六: 當然在不啟動虛擬環境的狀況下也是可以把套件安裝到虛擬環境裡啦. 只要把 pip 指令換成 python -m pip, 並明確指定使用虛擬環境裡的 python 執行檔即可. 例如:

envTF2/Scripts/python -m pip install tensorflow~=2.10.0

Step 8a: 驗證


辛苦了半天總要驗證一下我們新建好的虛擬環境 tensorflow 是否可以支援 GPU.

請建立一個 Python script 檔 tftest.py, 檔案內容如下:

from tensorflow.python.client import device_lib
dev = device_lib.list_local_devices()
print(dev)

然後在裝好 tensorflow 虛擬環境中執行該 Python script

python tftest.py

如果你得到類似以下的輸出, 那麼恭喜你出運囉.

Python TensorFlow GPU detect

tftest.py 執行結果

Step 8b: 在 jupyter 裡驗證


即然在一般的操作視窗裡可以用 NVIDIA GPU 來加速 TF 了, 那麼有人會問: "那... jupyter 環境呢?"

當然沒問題. 你只要在建好的 venv 虛擬環境裡再加裝 jupyterlab 即可. 例如: 以下我安裝了 jupyterlab 之外, 同時還加裝了 numpy, pandas 以及 matplotlib (反正就是少了什麼 package 就加裝什麼 package).

# 安裝
pip install jupyterlab numpy pandas matplotlib

# 啟動 lab 介面
jupyter lab

# 或者啟動 notebook 介面
jupyter notebook

jupyter server 啟動時會在操作視窗輸出許多訊息, 完成啟動之後會輸出上線的網址訊息 http://127.0.0.1:8888/lab?token=.... 雖然在 Windows 平台上它會自動開啟 Browser 並連上這個網址, 但並非每一個平台都是如此. 使用 WT 時, 你可以很輕鬆的將它複製下來: 按住滑鼠左鍵, 滑過整個網址列, 然後放開滑鼠左鍵, 完成複製範圍的標定. 之後再按一下滑鼠右鍵完成複製. 最後在 Browser 的網址欄貼上.

jupyter server 啟動之後, 這個操作視窗就會被 jupyter server 佔據了. 而當我們在 Browser 對 .ipynb 檔進行操作時, 它也會輸出一些相關的訊息. 直到我們在 Browser 上把 jupyter server shutdown (關機), 操作視窗才會回到可以和我們進行互動的模式. 所以一般我們都是把它放著不理.

後台輸出範例:

jupyter backend

jupyterlab 環境後台

前台輸出範例:

jupyter frontend

有支援 NVIDIA GPU 的 jupyterlab 環境前台

補充說明: 控制 tensorflow 的輸出訊息


tensorflow 載入及執行時會有大量的訊息輸出. 這些訊息 tensorflow 將它們分為 4 個等級:

tensorflow logging Level
LevelLevel for HumansLevel Description
0INFO所有訊息均會輸出 (預設行為)
1WARNINGINFO 類訊息不輸出
2ERRORINFO 類, WARNING 類訊息不輸出
3NONE所有訊息均不輸出

使用者可以經由設定環境變數 TF_CPP_MIN_LOG_LEVEL 來改變它的行為. 例如 CMD 操作視窗:

SET TF_CPP_MIN_LOG_LEVEL=2
python tftest.py

:: 或者一定一行搞定的話可以用 & 連接起來
SET TF_CPP_MIN_LOG_LEVEL=2 & python tftest.py

如果使用 git bash 操作視窗, 則可以在執行指令時才臨時更動它.

TF_CPP_MIN_LOG_LEVEL=2 python tftest.py

也可以在 python script 裡更動它, 不過必需在 import tensorflow 之前完成. 例如:

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

import tensorflow as tf

除了上述作法, tensorflow 2.x 另外提供了一個新的寫法:

import tensorflow as tf
tf.get_logger().setLevel('ERROR')

如果第一個作法對你正在使用的 tensorflow 版本無效 (查看 issue), 你就只能透過第二種作法了.

Python TensorFlow GPU detect-2

比較簡潔的 tftest.py 執行結果

新手速成


上面 Step 3 我提到 TensorFlow 團隊許久沒有更新新版本編譯時的版本條件了. 所以我自己花了一點時間作了個支援矩陣的測試. 在此把成果分享給各位. 如果各位要裝的不是古董版本 (呃...也沒太老啦, TF 2.5 之後的版本), 那整個安裝的工作會簡單許多.

現下的 (2023/02) 建議安裝版本清單:

  • CUDA Toolkit: CUDA 11.7.xCUDA 11.8.x
  • cuDNN SDK: cuDNN v8.7.0 for CUDA 11.xcuDNN v8.8.0 for CUDA 11.x
  • 顯卡趨動程式: 使用 CUDA Toolkit 安裝包中附帶的版本.
  • Python 版本: 3.7~3.10
  • TensorFlow 版本: TF 2.5~TF 2.10
  • Python + TensorFlow 請選下表中標示為 OK 的組合.

TensorFlow GPU support matrix (Unofficial)
TensorFlow
Version
Python VersionCUDA
Toolkit
cuDNN SDK
3.63.73.83.93.103.11
tensorflow_gpu-2.11.0GPU*GPU*GPU*GPU*11.2, 11.7 GA8.7 for CUDA 11.x
tensorflow_gpu-2.10.1OKOKOKOK11.2, 11.7 GA8.7 for CUDA 11.x
tensorflow_gpu-2.9.3OKOKOKOK11.2, 11.7 GA8.7 for CUDA 11.x
tensorflow_gpu-2.8.4OKOKOKOK11.2, 11.7 GA8.7 for CUDA 11.x
tensorflow_gpu-2.7.4OKOKOK11.2, 11.7 GA8.7 for CUDA 11.x
tensorflow_gpu-2.6.52.6.2OKOKOK11.2, 11.7 GA8.7 for CUDA 11.x
tensorflow_gpu-2.5.32.5.2OKOKOK11.2, 11.7 GA8.7 for CUDA 11.x
tensorflow_gpu-2.4.4GPU-GPU-GPU-11.1, 11.2,
11.7 GA
8.7 for CUDA 11.x
OKOKOK11.0.38.7 for CUDA 11.x

這個測試裡 CUDA Toolkit 我主要選了二個版本: 一是 2021/01 撰文時所用的 11.2 版 (重新測了一遍); 另一個則是 11.7 GA (11 版的倒數第二個). cuDNN SDK 則是 cuDNN 8.7 for CUDA 11.x. (除了後來測 TF 2.4, 又多安裝了幾個)

幾個重要的結果如下:

  • 安裝 TF2 時請使用以下指令
    pip install tensorflow~=2.x.0
    安裝該版本的最新的 Bug 修正版次. 而不是用一般部落格中教的
    pip install tensorflow==2.x
    不然會有 protobuf 這個 package 版本錯誤的問題 (只要是含 Python 3.7 或 TF 2.8 的組合, 都會有這個問題) . 如果已經錯了但又不想重裝, 你也可以用以下幾個方法修復
    • TF 升級到該小版次的最新 Bug 修正版本:
      pip install --upgrade tensorflow~=2.x.0
      
    • 將 protobuf 降版至 3.20.x:
      pip install tensorflow==2.x
      pip install --upgrade protobuf~=3.20.0
      
  • TF 2.11 (即表格中 GPU* 的部份) 在 Windows 原生平台上不支援 GPU 偵測, 故只能用 CPU 執行.
    • 依據 Github 上版本 2.11.0 的 Release Note 說 Windows 平台上 CPU-build 的工作已經轉移給 Intel 了 (所以是 tensorflow-intel 的 build, 然後就都不支援 GPU 了); 要使用 GPU 必需轉移到 WSL2 環境. 結論是: TF 2.10 是 Windows 原生平台上最後一版可以支援 GPU 的版本.
    • 經過在 WSL2 環境中測試驗證, 也確實可以偵測到 GPU.
    • 其實還有一個替代方案: 改用 MS 的 DirectML 方案 (詳見後面段落)
  • TF 2.11 ~ TF 2.5 使用 CUDA Toolkit 11.x (11.2 及以上) 都 OK.
    TF 2.4 是一個分界點, 需要降版改裝 CUDA 11.0(註七).
  • TensorFlow 還不支援 Python 3.11, 不論哪一個版本都無法安裝, 沒有對應的 .whl 檔. TensorFlow 已經支援 Python 3.11 了(2023/12/12 更新)
  • Python 3.6 則是己經不支援了 (大部份都無法安裝, 沒有對應的 .whl 檔. 一部份則只有較早的幾個版本).

註七: gpu_device.cc回報有找到 GPU. 但在載入 cusolver64_10.dll 時出錯, 找不到該檔案, 研判該檔應該是 CUDA Toolkit 10.x 或者是 CUDA Toolkit 11.0 的檔案, 因為我的系統裡只有 cusolver64_11.dll.

後來, 又加裝了 CUDA Toolkit 11.0.3 (+ cuDNN SDK 8.7), 果真在安裝路徑裡找到了 cusolver64_10.dll. 再測試一下, 結果 TF 2.4.4 也可以在 Python 3.6~3.8 環境中使用 GPU 了. 不過, 如果換成只加裝 CUDA Toolkit 11.1.1, TF 2.4.4 就又動不了 GPU.

補充說明: 使用 MS DirectML


如果你用的不是 NVIDIA 的顯卡, 那麼 Microsoft 的 DirectML 會是一個很好的解決方案. (將來如何? 它號稱三家的顯卡都吃, 香不香? 可是支援的 TF 版本太少):

TF 1.x 安裝方法: (目前只支援 TF 1.15.x 有點少)

python -m venv envTF-DML
source envTF-DML/Scripts/activate

# 直接安裝這一包即可
pip install tensorflow-directml

TF 2.x 安裝方法: (目前只支援 TF 2.10.0 有點少)

python -m venv envTF2-DML
source envTF2-DML/Scripts/activate

# 必需安裝二包
pip install tensorflow-cpu==2.10
pip install tensorflow-directml-plugin

注意: 一定要用 tensorflow-cpu 套件. 另外 tensorflow-cpu~=2.10.0 也可以, 可是 tensorflow-directml-plugin 檢查相依性時會將它降版, 所以安裝時必需加上參數 --no-deps 來跳過版本檢查.

pip install tensorflow-cpu~=2.10
pip install --no-deps tensorflow-directml-plugin

輸出範本: 可以看到二張 GPU, 一張是 Intel 內顯, 一張是 NVIDIA 外顯.

MS DirectML

TF 2.10.0 + MS DirectML 輸出

使用 WSL2 環境


WSL2 GPU-PV 架構圖

WSL2 GPU-PV 架構圖
圖片來源:NVIDIA 網站: WSL 使用手冊

時間大約是 2020/10 我參加了 Windows 10 的 Windows 測試人員計劃, 並訂閱 Dev 通道. 然後 2021/01 我在安裝 Docker Desktop 3.1.0 版時發現新的 Docker Desktop 需要先安裝 WSL2. 並且可以透過選項的設定, 直接在 WSL2 的 distro (Linux Distribution, Linux 發行版) 中使用 docker 指令, 不需要再另外安裝 docker.

因此, 我花了一些時間在網路上查找並測試 WSL2 的新功能; 與此同時, 我也發現了 NVIDIA GPUs 上也有 Beta 版本開始支援 WSL2 GPU Paravirtualization (GPU-PV) 功能. 於是, 在 WSL2 的 distro 中, 我們安裝的 tensorflow 也可以有 GPU 支援; 也可以直接使用 NVIDIA GPU 的功能. 例如: 執行 GUI 應用程式; 或者來個圖形桌面環境.

需求及概要步驟


在開始之前提醒一個有關 WSL2 和 Docker Desktop for Windows 的重要知識點:

  • 在 Windows 平台上, Decker Desktop for Windows 依附於 WSL2.
    (安裝 Docker Desktop for Windows 之前, 需先安裝好 WSL2)
  • WSL2 不需要 Docker Desktop for Windows.
    (即使是想要在 WSL2 的 distro 裡使用 NVIDIA GPU 也不需要它)

系統需求:

  • Windows 10 version 21H2 or Windows 11.
    其實 Windows 10 Insider version build 20150 以後也可以.
  • 顯卡趨動程式則請使用 Windows 版的 CUDA Toolkit 11.2.x (及以後的版本) 安裝包內的.

安裝步驟概要:

  1. 安裝/啟用 WSL2.
  2. 安裝 NVIDIA 相關元件.
    • 安裝前置工作
    • 安裝 Linux x86 CUDA Toolkit (WSL-Ubuntu 平台)
    • 驗證 CUDA Toolkit (WSL-Ubuntu) 安裝 OK
    • 安裝 Linux x86 cuDNN SDK
  3. 驗證 TF 2.x (WSL-Ubuntu) 可以使用 GPU

Step 1: 安裝/啟用 WSL2


如果你現在用的是 Win11 (或者 Win10 21H2), 那麼恭喜你, 你只要系統管理員身分執行以下指令即可 "啟用執行 WSL 並安裝 Linux 的 Ubuntu 發行版本".

wsl --install

如果原本就有使用 WSL2, 可以使用以下的指令將 WSL2 更新至最新版.

wsl --update

然後, 記得電腦要重新開機.

補充說明: WSL 指令常用參數


設定及其他進階用法可以參考 WSL 2 快速使用指南 (含 GUI 及遠端桌面)這一篇貼文. 常用使用參數說明如下:

  • 列出已安裝的 distro 及其執行狀態
    wsl -l -v
    # 或者是
    wsl --list --verbose
    

    輸出範例:

      NAME          STATE           VERSION
      CentOS7       Stopped         2
      CentOS8       Stopped         2
    * Ubuntu        Running         2
      Ubuntu-22.4   Stopped         2
    
  • 連線至某個已安裝的 <Distro> (使用預設帳號).
    wsl -d <Distro>
    # 或者是
    wsl --distribution <Distro>
    
  • 使用其他帳號 (連線預設 <Distro>).
    wsl -u <user_name>
    # 或者是
    wsl --user <user_name>
    
  • 例如:

    wsl -u root
    
  • 在 Windows 直接執行某個 Linux 指令 (預設 <Distro>)
    wsl <linux-command>
    

    例如: 列出家目錄中所有的檔案資訊:

    wsl ls -al ~

    輸出範例:

    WSL 執行 linux 指令

    指令 wsl ls -al ~ 輸出範例

  • <Distro> 裡, 也可以使用 windows 應用程式 (只限 exe 指令).
    # 取得 Windows 的網路資訊
    ipconfig.exe /all
    
    # 打開檔案總管
    explorer.exe .
    
    # 使用 Windows 的 ping
    ping.exe google.com
    
    # 查看 WSL2 distro 狀態
    wsl.exe -l -v
    
  • <Distro> 關機 (terminate)
    wsl -t <Distro>
    # 或者是
    wsl --terminate <Distro>
    
  • 全部關機 (shutdown WSL)
    wsl --shutdown
    

補充說明: 在 Linux 裡套件的版本錯了怎麼辦?


這事偶而會發生, 可以用以下指令將套件刪除, 並清理 apt 的快取:

# 清除之前下載的套件
sudo apt clean

# 解除安裝 (以 nvidia- 開頭的) 套件及並清除其設定
sudo apt purge nvidia-*

# 清理相依性 (解除安裝所有自動安裝且不再使用的套件,
#  即隨著某套件下載/安裝, 但目前已經不用的相依套件)
sudo apt autoremove

重裝時請指定套件版本 sudo apt-get install <package name>=<version>.

Step 2a: 安裝 NVIDIA 相關元件--前置工作


下載安裝包:

前置步驟:

  1. 如果上一段的使用 Windows 原生環境 什麼也沒幹 (不想用它), 那麼你需要檢查一下你的顯卡趨動版本, 至少要能支援你想在 WSL2 裡安裝的 CUDA Toolkit 版本.
  2. 連線到 WSL2 Ubuntu distro.
    wsl
    
  3. 移除舊的 NVIDIA GPG key
    sudo apt-key del 7fa2af80
    

Step 2b: 安裝 Linux x86 CUDA Toolkit (WSL-Ubuntu 平台)


Linux x86 CUDA Toolkit (WSL-Ubuntu 平台) 有三種安裝包. 下載時, 網站都有給出相應版本的安裝指示. 這裡我用的是使用本地 deb 安裝包. 請依照網站給的指示進行安裝(註八). 如下圖:

CUDA WSL-Ubuntu Install Instruction

Linux x86 CUDA Toolkit (WSL-Ubuntu) 的安裝指示.

安裝步驟範例 (請依下載時網站給的安裝指示):

wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.7.1/local_installers/cuda-repo-wsl-ubuntu-11-7-local_11.7.1-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-7-local_11.7.1-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

Step 2c: 驗證 CUDA Toolkit (WSL-Ubuntu) 安裝 OK


安裝後, 有指令 nvcc 可以用. 你可以使用 nvcc -V 來查看一下 nvcc 的版本資訊.

/usr/local/cuda/bin/nvcc -V

或者你也可以修改一下檔案 ~/.bashrc, 在最後面附加以下二行:

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
這二行有一種複雜一點的寫法, 可以順便解決前綴變數值時需要判斷原環境變數是否為空值 (或未定義) 的狀況(註九).
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

然後重開操作視窗. 或者你也可以使用以下指令讓它立即生效:

source ~/.bashrc

如此, 使用 nvcc 時可以省事一些:

nvcc -V

輸出範例:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Jun__8_16:49:14_PDT_2022
Cuda compilation tools, release 11.7, V11.7.99
Build cuda_11.7.r11.7/compiler.31442593_0

除了 nvcc 之外, 還有另一個指令 nvidia-smi 可以用. 你可以用它來查看一下顯卡趨動的狀況(註十).

WSL distro nvidia-smi

WSL Ubuntu distro 的 nvidia-smi指令輸出

注意: 它的 Driver VersionCUDA Version 這二項一定和你在 Windows 中看到的一樣. 因為這裡安裝的顯卡趨動程式其實一個穿透的版本. 也因此請務必注意日後如果更新了 Windows 的 NVIDIA 相關元件, 也請務必來 WSL 的 Ubuntu distro 裡查驗是否一切都還正常.

註八: 最新的安裝文件:
https://docs.nvidia.com/cuda/wsl-user-guide/index.html
舊版本 CUDA 的安裝文件, 在下載的地方可以找到.

打開相關版本的 CUDA 安裝文件之後, 請在頁面上搜尋 CUDA on WSL 的連結, 再進入即可.

註九: 如果你覺得這二個 export 指令的後半段長相有點陌生. 可以參考一下 Bash Reference Manual 有關 Shell Parameter Expansion 這一段裡的 ${parameter:+word}.

它的意思是: 若 parameter 的值

  • 是 null 或者未定義: 不取代 (即使用 null 或者未定義)
  • null 或者未定義: 展開 word 來取代 parameter.

應用例:

PATH="${PATH:+${PATH}:}~/opt/bin"   # 後綴
PATH="~/opt/bin${PATH:+:${PATH}}"   # 前綴

代入前綴的例子: 後面串接的${PATH:+:${PATH}}: 如果環境變數 PATH 是 null 或者未定義則為 ~/opt/bin; 否則變成 ~/opt/bin:${PATH}

參考來源: StackExchange How to correctly add a path to PATH?

註十: nvidia-smi 這個指令只要安裝過一次 CUDA Toolkit (WSL-Ubuntu) 就會一直存在, 即便是在安裝 CUDA Toolkit (WSL-Ubuntu) 之後才安裝的 distro. 也會有 nvidia-smi 這個指令可以使用. 因此請用 nvcc -V 來查驗是否已安裝.

Step 2d: 安裝 Linux x86 cuDNN SDK


依據 cuDNN 的安裝文件, cuDNN 在 Linux 上有 3 種安裝包, 4 種安裝方法. 以下我摘列了二種.

  • 方法一: 用 tar 包.
    先解開壓縮的 tar 包 ("Local Installer for Linux x86_64 (Tar)").
    tar -xvf cudnn-linux-x86_64-8.7.0.84_cuda11-archive.tar.xz
    
    解開之後, 執行以下指令將它拷貝到特定目錄 /usr/local/cuda 底下.
    sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include 
    sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64 
    sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
    
  • 方法二: 用 deb 安裝包
    這裡順便示範一下如何將由 Windows 下載的 cuDNN 檔案, 分享給 Ubuntu distro 使用:
    1. 先在 Windows 以瀏覽器下載 Ubuntu 用的 cuDNN deb 安裝包.
      這裡我們展開下載頁面中的 "cuDNN v8.7 for CUDA 11.x", 選擇裡面的 "Local Installer for Ubuntu22.04 x86_64 (Deb)".
    2. 下載回來的檔案是
      D:\Download\Cuda\cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb
    然後用以下指令將它由 Windows 檔案系統拷到 WSL2 裡面來:
    cp /mnt/d/Download/Cuda/cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb .
    

    接著就和安裝文件上 "Debian Local Installation" 這一段說的一樣作法.

    sudo dpkg -i cudnn-local-repo-ubuntu2204-8.7.0.84_1.0-1_amd64.deb
    sudo cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/
    sudo apt-get update
    sudo apt-get install libcudnn8=8.7.0.84-1+cuda11.8
    sudo apt-get install libcudnn8-dev=8.7.0.84-1+cuda11.8
    sudo apt-get install libcudnn8-samples=8.7.0.84-1+cuda11.8
    

    注意: 這裡有一隻小怪, 上一個 Step 我安裝的 Cuda Toolkit11.7 版! cuDNN下載時選的是 cuDNN v8.7 for CUDA 11.x 裡的 Local Installer for Ubuntu22.04 x86_64 (Deb). 但是為何安裝時我用的卻是 8.7.0.84-1+cuda11.8?

    其實, 這個和上一個 Step 並沒有太大關係. 我們安裝時 sudo apt-get install 指令的 = 前面及後面該打什麼, 其實是和 deb 安裝包的內容相關.

    在解開 deb 之後 (sudo dpkg -i), 可以用指令 sudo ls -l 查看一下 /var/cudnn-local-repo-ubuntu2204-8.7.0.84 (即 deb 檔名的前半段名稱) 的內容就知道安裝時 sudo apt-get install 指令的=前面及後面自己該打什麼字了. (其實就是 deb 的檔名去掉後段的 _amd64.deb, 然後將 _ 改為 = 即可)

    cudnn-local-repo-ubuntu

    目錄 /var/cudnn-local-repo-ubuntu2204-8.7.0.84 的內容

Step 3: 驗證 TF 2.x (WSL-Ubuntu) 可以使用 GPU


WSL 的 Ubuntu distro 裡預先安裝的 python3 套件並沒有 venv 這個模組(註十一). 所以需要先安裝一下.

sudo apt-get install python3-venv

接著可以建立虛擬環境然後安裝 tensorflow, 並驗證是否可以使用 GPU(註十二).

# 建立 python venv 虛擬環境
python3 -m venv envTF2

# 啟動虛擬環境
source envTF2/bin/activate

# 安裝 tensorflow
pip install tensorflow~=2.9.0

# 測試 TF 2.x 可否使用 GPU
python tftest.py

注意: 第一個指令使用的是 python3, 這是 Linux 上的習慣. 但是建好的虛擬環境裡是有 python 可以用的. 所以啟動虛擬環境後, 我用的是 python (和在 Windwos 的虛擬環境裡一致). 如果想和 Windows 一樣, 直接使用 python 來替代 python3, 只要加裝 python-is-python3 這個安裝包即可, 指令如下:

sudo apt-get install python-is-python3

想要在 WSL 安裝 jupyter 也沒問題, 一樣是:

# 安裝
pip install jupyterlab numpy pandas matplotlib

# 啟動 lab 介面
jupyter lab

# 或者啟動 notebook 介面
jupyter notebook

啟動後要自己打開 Browser 貼上 console 上出現的的網址 http://127.0.0.1:8888/lab?token=....

註十一: 你或許注意到 Ubuntu distro 裡預先安裝的 python3 套件也沒有 pip 這個指令, 不過建好的 venv 虛擬環境裡卻是會有 pip 指令可以用, 完全不用擔心.

註十二: 這裡例子是用 tensorflow 2.9.x 因為 tensorflow 2.10.x 執行時會發生 cuBLAS 註冊錯誤的訊息 (查看issue1, issue2), 不過並沒有影響偵測 GPU. 因為不知道後續還會有什麼問題發生, 因此暫時降版使用 tensorflow 2.9.x. (也可以改用 tensorflow 2.11.x)
錯誤訊息: E tensorflow/stream_executor/cuda/cuda_blas.cc:2981] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered.

補充說明: Ubuntu 裡的 Python packages


前面提到 Ubuntu distro 裡安裝的 python3 套件沒有 pip 這個指令, 如果在 Ubuntu distro 裡你也需要使用 pip 指令, 你可以透過以下幾個方法取得:

  1. 直接安裝 python3-pip 安裝包.
    sudo apt-get install python3-pip
    
  2. 透過 get-pip.py 來取得:
    curl -sSL https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    python3 get-pip.py
    
    或者改用 wget 來取得 get-pip.py
    wget https://bootstrap.pypa.io/get-pip.py
    python3 get-pip.py
    

    不過, 透過 get-pip.py 取得的 pip 指令是被安裝在 ~/.local/bin 目錄裡. 我們並不需要自己修改設定, get-pip.py 會在 ~/.profile 裡附加上這個設定.

    if [ -d "$HOME/.local/bin" ] ; then
        PATH="$HOME/.local/bin:$PATH"
    fi
    

    我們只需要退出系統重新連線即可. 或者使用以下指令也行.

    source ~/.profile
    

另外, Ubuntu 的 Python 還有一個獨有的特性: dist-packages, 和 pytohn 原有的 site-packages 有點不同.

  • dist-packages: 是 Ubuntu 預先編譯好的 Python packages, 要用 sudo apt-get install 指令安裝.
  • site-packages: 使用 pip install 安裝.

只要是 Debian 的衍生 distro 都有此特性, Debian 這麼做是為了避免系統編譯的 Python package 和由 pip 指令安裝的 Python package 混在一起, 引發不必要的 Bug.

還有, Ubuntu distro 也預先安裝了許多 dist-packages. 如前面說的, 這些 dist-packages 是用 sudo apt-get install 安裝的, 所以無法用 pip 指令移除. 想要移除必需改用 sudo apt-get remove 指令. 下列清單即是 Ubuntu 22.04 預先安裝的 dist-packages.

blinker==1.4
command-not-found==0.3
cryptography==3.4.8
dbus-python==1.2.18
distro==1.7.0
distro-info===1.1build1
httplib2==0.20.2
importlib-metadata==4.6.4
jeepney==0.7.1
keyring==23.5.0
launchpadlib==1.10.16
lazr.restfulclient==0.14.4
lazr.uri==1.0.6
more-itertools==8.10.0
netifaces==0.11.0
oauthlib==3.2.0
PyGObject==3.42.1
PyJWT==2.3.0
pyparsing==2.4.7
python-apt==2.4.0+ubuntu1
PyYAML==5.4.1
SecretStorage==3.3.1
six==1.16.0
systemd-python==234
ubuntu-advantage-tools==8001
ufw==0.36.1
unattended-upgrades==0.1
wadllib==1.3.6
zipp==1.0.0

不過我們並不用擔心這個, 在 venv 虛擬環境中預設並不會有這些 dist-packages. 想要在 venv 虛擬環境中使用這些 dist-packages, 可以直接修改虛擬環境目錄裡的 pyvenv.cfg, 將 include-system-site-packages 的設定值改為 true.

include-system-site-packages = true
或者在建立 venv 虛擬環境時多下一個參數 --system-site-packages.
python3 -m venv --system-site-packages envTF2

使用 docker 環境


在 Windows 平台上使用 Docker, 原本只能在 Linux VM (虛擬機, Virtual Machine) 裡安裝 docker 及 docker compose(註十三). 後來, 隨著 Docker Desktop ver. 3.1.0 的出現, Windows 裡的 Docker Desktop 不再依賴 Linux VM, 取而代之的是依賴 WSL2. 而 Docker Desktop for Windows 更提供設定選項, 讓使用者在 WSL2 的 Linux distro 中直接使用 Windows 版本的 Docker Desktop (不必額外安裝 linux 版本的 docker).

注意: 如果你啟用了 WSL2 之後依然想用 VirtualBox 或者其他 VM 軟體, 那麼你需要使用有支援 WSL2 的最新版本 (2020 年以前的舊版本是直接使用軟體自己內建的獨佔式 Hyper-V, 新版本則換成使用 Microsoft 所提供的非獨佔式 Hyper-V).

註十三: 此處指的是安裝了 Linux 作業系統的 VM. 一般使用免費的虛擬機軟體 Virtual Box (Oracle 公司) 或者 VMware 公司的 VMware Workstation Player (免費) 或者 VMware Workstation Pro (付費).

系統需求:

  • 安裝/啟用 WSL2.
  • Docker Desktop for Windows 3.1.0 版以上 (目前的版本為 4.13.0)
    如果已經安裝舊版 Docker Desktop for Windows 者, 請升級至最新版.

Step 1: 安裝/啟用 WSL2


請依前段 "使用 WSL2 環境" 的 "Step1" 安裝/啟用 WSL2.

Step 2: 安裝 Docker Desktop for Windows


我們只需下載最新的 Docker Desktop for Windows, 直接像一般 Windows 應用軟體安裝即可. 安裝完成後需要重新啟動 PC.

安裝 Docker Desktop for Windows 之後, 就可以在 CMD 或者 git bash 操作視窗中使用 docker 以及 docker compose 指令.

安裝完成後, 可以用以下指令在 WSL2 裡看到二個 docker-desktop 相關的 distro.

wsl -l -v
docker-desktop

docker-desktop 安裝在 WSL2 裡的二個 distro

Step 3: 啟用 WSL2 相關設定


  1. 設定 "啟用" 以 WSL2 為基礎的引擎.
    Enable WSL2 Based Engine

    啟用以 WSL2 為基礎的引擎

  2. 設定 "整合" 到預設的 Linux distro 及需要的使用 docker 功能的 Linux distro.
    Enable Integration with WSL2 distro

    設定哪一個 Linux 發行版需要使用 docker 指令

設定完成後, 我們也可以在 WSL 的 Linux distro 中使用 docker 以及 docker compose 指令.

而且, Windows 和 WSL2 裡操作的是同一個 docker engin. 即二者 (在 Windows 的操作視窗裡或者在 WSL 的操作視窗裡) 看到的 docker images, docker process... 都是同一份.

Step 4: 測試驗證


請分別在三種操作視窗中, 完成以下指令:

docker run --rm -it --gpus=all \
    nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

三種操作視窗分別為: (建議使用 Windows Terminal 分別開啟這三種操作視窗)

  • Linux distro 的 bash 操作視窗
  • CMD 操作視窗
  • git bash 操作視窗

這三種操作視窗, 第一個下指令的視窗應該會將所需要的 docker image nvcr.io/nvidia/k8s/cuda-sample 下載下來, 並執行一次. 另二個操作視窗則會直接執行. 並且, 三個的結果應該完全一致.

輸出範例:

docker GPU

docker image nvcr.io/nvidia/k8s/cuda-sample 測試結果.

補充說明: 支援 NVIDIA GPU 的基底 docker image


NVIDIA Container Toolkit

NVIDIA Container Toolkit 架構圖
圖片來源:Github 網站: NVIDIA/nvidia-docker

一般狀況下我們並不需要自製支援 NVIDIA GPU 的 docker image. 不過利用 NVIDIA 提供的公版 docker image 來加工客製總會需要的. NVIDIA 提供的公版 docker image 名稱是 nvidia/cuda. 後面接的 tag 名稱則有點小複雜, 它被分為三段, 以 - (減號) 串接起來. 中間段有三種選擇 (base, runtime, devel) 各自包含的內容說明如下:

  • {CUDA 版本}-base-{OS 版本}: 包含 CUDA runtime (cudart)
  • {CUDA 版本}-runtime-{OS 版本}: base 包 + CUDA 數學函數庫及 NCCL. (還有 cuDNN)
  • {CUDA 版本}-devel-{OS 版本}: runtime 包 + 開發工具及 header 檔.

以前我們可以直接用 docker pull nvidia/cuda 指令即可取得最新版 (latest) 的 docker image, 不過現在已經不行了. 現在 docker pull nvidia/cuda 時, 後面還要加上明確完整的 tag 名稱才能把 docker image 下載下來.

  • 一般我都是選擇 runtime 或者 devel 的版本.
  • {CUDA 版本} 則要用你的 Windows 現在安裝的版本 (或相容的版本). 例如: 我的 Windows 安裝的是 CUDA Toolkit 11.7 GA, 所以 {CUDA 版本} 我選 11.7.1 或者 11.6.0 則 pull 下來的 docker image 都可以正常執行, 但是選 12.0.1 則執行時會有錯誤訊息.
  • {OS 版本} 現在有許多版本可選, 但是也是要 dockerhub 上有才行. 如果不知道都有哪些可以選, 你可以到 nvidia/cuda 在 gitlab 的網站上找一下. 那裡有全部可以選的版本, 你可以依 {CUDA 版本} 選擇有支援的 {OS 版本}.

    注意: gitlab 網站上只有 Dockerfile 內容, 除非你有配套的建置環境, 否則是沒有辦法在你的 local 端直接用該 Dockerfile 建立 docker image 的 (一般狀況下也是不必要的, 除非你真的非要那一個環境才行)

接著你就可以執行以下指令來檢視一下你的 docker 環境配合你挑選的 docker image 是否可以支援 NVIDIA GPU, 例如:

docker run --rm --gpus all \
    nvidia/cuda:11.7.1-base-ubuntu22.04 nvidia-smi

輸出範例:

docker image nvidia/cuda

docker image nvidia/cuda 測試結果.

接下來, 就可以在這個 docker image 上自己添磚加瓦了: 加 python, tensorflow, jupyter... 不過這些就不屬於本篇範疇了, 這裡就先貼一個 sample, 其他的以後貼 docker 筆記時再補充吧!(註十四)

註十四: 只是非專業例子, 內容還有許多需要調整...僅供參考, 如果真的需要自建可以參考 dockerhub 上 cschranz/gpu-jupyter 這一份 docker image 的說明文件, 上面有手把手的教你如何自建支援 GPU 的 jupyter notebook docker image.

檔案 dockerfile 內容:

FROM nvidia/cuda:11.7.1-base-ubuntu22.04
SHELL ["/bin/bash", "-c"]

#set up environment
RUN apt-get update \
 && apt-get install --no-install-recommends --no-install-suggests -y \
    curl \
    unzip \
    python3 \
    python3-venv

# Remove cache
RUN apt-get clean autoclean \
 && apt-get autoremove --yes \
 && rm -rf /var/lib/{apt,dpkg,cache,log}/

COPY requirements.txt .

# Build virtual env
RUN python3 -m venv envTF2

# Install python packages into venv
RUN ./envTF2/bin/pip install --no-cache-dir -r ./requirements.txt

# 這行還不確定, 下次再更正
CMD source envTF2/bin/activate && jupyter lab

檔案 requirements.txt 內容:

tensorflow~=2.10
jupyterlab
numpy
pandas
matplotlib

使用 Anaconda for Windows 環境


如果你查一下英漢字典: Anaconda 是 (或水蚺), 是卵胎生的; 而 Python 則是, 是卵生的. 二者都是長虫 (蛇). 有趣吧?

Anaconda 是軟體管理工具, 主要專注在科學運算所需的各種套件/程式庫的管理及部署, 它兼具套件管理虛擬環境管理二大功能. 所以, 它除了可以管理 Python 所需的套件及虛擬環境之外, 還可以管理 R 語言所需的套件及虛擬環境.

而 Python 則是使用 pip 模組來管理套件, venv 模組來管理虛擬環境. 雖然, 也可以完成類似 Anaconda 的工作, 但之間還是有很大的差異:

  • 虛擬環境管理:
    • Python 的 venv 對虛擬環境的管理是鬆散式的, 屬於射後不理型: 只負責建立虛擬環境, 後續的使用及管理完全依賴使用者. 虛擬環境不用了直接刪除其目錄即可.
    • Anaconda 明確嚴謹的管理虛擬環境: 建立及刪除都必需使用 conda 指令來完成. 所以 Anaconda 知道每一個虛擬環境的位置 (其實是都在特定的檔案夾裡), 甚至環境裡安裝了什麼套件及其版本.
  • 套件管理: 以 Python 的套件來說:
    • Python 的 pip 只管理 python 自己的套件, 相依性通常比較單純. 套件包裡頂多是有動態連結檔, 外部指令則不會包含在套件裡頭.
    • Anaconda 不只管理 Python 套件, 同時也管理二位元可執行檔 (例如: ffmpeg, Python 本身...). 其實大多數的 Anaconda 套件和 Python 的 .whl 套件包相差無幾. 但有些套件其實是需要額外再安裝一些配合的套件才能順利運作. 對於這類套件 Anaconda 就會將需要額外安裝的配合套件一併打包在同一個套件包裡寫在套件的相依性資料裡. 最明顯的例子就是 TensorFlow: 在 Anaconda 的版本中, 只要安裝的是有支援 GPU 的版本, 它就會連同 cudatoolkit 及 cudnn 都打包在一起安裝.

      Anaconda 之所以這樣作主要就是不希望從事科學運算的人員分心去處理作業環境的諸多問題 (因為他們不見得熟悉作業系統). 不過有好處必定也會有壞處: 套件的相依性變大了, 測試工作量也變得異常龐大. 因此, Anaconda 官方的套件更新就異常的慢了 (其實還有另一個因素是他們也不希望已經穩定的版本有所變動).

其實, 最初個人並不喜歡 Anaconda (好啦, 我承認現在也還是不喜歡...所以它被安排在最後段), 主要是因為 Anaconda 的 GUI (圖形使用介面) 有點厚重, 在我家的舊 NB 上反應真的非常慢. 再來就是官方的套件更新很慢. 不過後來知道有輕量型的 miniconda 可用, 還有 conda-forge.org 可以提供相對較新的更新, 才對它印象好一些.

好了, 來看看如何在 Anaconda 環境中使用 GPU 加速 TensorFlow 吧!

Step 1: 安裝 Anaconda for Windows


安裝 Anaconda 有以下幾點需要特別注意:

  1. 一定不要將 Anaconda 加入環境變數 PATH.
    • 選擇 "Install for All User" (系統安裝), 這個設定項是無法勾選的.
    • 若選 "Install for Just Me" (個人安裝), 則請不要勾選第一個設定項.
  2. 一定不要將 Anaconda3 註冊為系統 Python 3.x,
    所以第二個設定項也請不要勾選. 除非你確定這台電腦不會再加裝 Python for Windows 只用 anaconda 環境, 否則真的不要勾選第二個設定項.

這二項設定不勾選, 並不影響 Anaconda 的運作. 不勾選的原因請參看這一篇貼文: Python: 搶救 Python 大兵 (如何擺脫 anaconda 的糾纏)

Step 2: 建立/啟動虛擬環境


安裝 Anaconda 之後, Windows 開始選單裡有 Anaconda3 (64bit) 的子目錄, 裡面有 Anaconda Prompt (Anaconda3) 的啟動連結. 我們需要由此啟動 Anaconda 預設的 base 虛擬環境 .

注意: 以下操作都是在 Anaconda 提供的 Anaconda Prompt (Anaconda3) 操作視窗 (屬於 cmd, 不是 git bash). 不過 conda 指令在 Windows, Linux, macOS 三種平台上都是一致的, 所以不必擔心換平台又要重新熟悉一遍. 另外, 部份 conda 指令在 git bash 操作視窗是不相容的, 故不建議在 git bash 操作視窗中操作.

進入之後請輸入以下指令建立一個 python 3.9 的虛擬環境 myenv(註十五):

conda create -n myenv python=3.9

也可以一併把需要的 python 套件一起安裝起來:

conda create -n myenv python=3.9 tensorflow-gpu jupyterlab

這裡我們用 python 3.9 是因為目前的 Anaconda repo 只建到這個版本. 然後你可以查一下虛擬環境列表裡是否有 myenv:

conda env list

啟動新建的虛擬環境 myenv:

conda activate myenv
conda env list & activate

虛擬環境列表及進入 myenv 虛擬環境.

註十五: 版本指定可以用 >, >=, <, <=, ==, != 等 6 個運算. 其中 ==, != 二者是完全相等運算 (exact equality).

, 為 AND 運算; | 為 OR 運算; , 優先於 |

* 為零或多個字元; python=3.9 轉譯為 python 3.9* (即 3.9 開頭的 python 版本).

Step 3: 安裝 tensorflow (+cudatoolkit +cudnn)


安裝之前你可以先查一下它有哪一些版本可以用 (注意並非每一個版本 Anaconda 都有建置):

:: 查 cudatoolkit 有哪些版本
conda search cudatoolkit

:: 查 cudnn 有哪些版本
conda search cudnn

:: 查 tensorflow-gpu 有哪些版本
conda search tensorflow-gpu

輸出範例:

conda search

搜尋 cudatoolkit, cudnn, tensorflow-gpu 可用版本

接著就是 Anaconda 展現它強大利害的時候了. 你只要安裝 TF 就可以順便把相關的 cudatoolkit, cudnn 一併安裝下來. 不過, 這裡需要注意: Anaconda 的 tensorflow 其實有二個系列:

  • 一個延用 TF 1.x 的命名習慣: tensorflow 是沒有支援 GPU 的版本, tensorflow-gpu 是有支援 GPU 的版本 (這種只支援到 TF 2.6). 安裝指令如下:
    :: 安裝最新的版本
    conda install tensorflow-gpu
    
    :: 安裝指定的版本
    conda install tensorflow-gpu=2.5
    
  • 另一個使用 TF 2.x 的命名習慣: 有沒有支援 NVIDIA GPU 都是 tensorflow. 你可以用以下的指令找到它們:
    conda search tensorflow | find /i "gpu"
    

    輸出範例:

    支援 GPU 的 tensorflow 版本

    支援 NVIDIA GPU 的 tensorflow 版本

    安裝時需要指定是要安裝 GPU 的版本, 例如:

    :: 安裝最新的版本
    conda install "tensorflow=*=gpu*"
    
    :: 安裝指定的版本
    conda install "tensorflow=2.9*=gpu*"
    

小結一下它們之間的關係:

:: tensorflow-gpu 有支援 GPU
conda install tensorflow-gpu

:: tensorflow 沒有支援 GPU
conda install tensorflow

:: tensorflow 有支援 GPU (因為沒有 < 和 > 所以不加雙引號括住也可以)
conda install tensorflow=*=gpu*

Step 4a: 驗證


同樣使用之前的 tftest.py.

python tftest.py

輸出範例:

conda tensorflwo GPU support

驗證結果

Step 4b: 驗證 jupyter 環境


同樣, 需要 jupyter 環境只要加裝 jupyterlab 即可

conda install jupyterlab

啟動 jupyterlab.

jupyter lab

jupyterlab

jupyterlab 網頁

在 jupyterlab 網頁上逐行執行 tftest.py 內容, 結果應該和之前的 圖13 一致, 此處就不再貼一次了.

補充說明: Anaconda 環境整合


如果你慣用 Windows Termainal, 可以把 "Anaconda Prompt (Anaconda3)" 直接整到 WT 的設定裡. 只要將下列的例子 (依照你的 Anaconda 安裝的方式) 抄到 WT 的設定裡的適當位置並依自己的需求修改啟動目錄及啟用的虛擬環境即可. 不會操作的朋友可以參考這一篇貼文:
Windows Terminal's 設定 Git Bash, SSH, Docker, Anaconda

系統安裝 Anaconda 的例子:

{
    "name": "Anaconda (base)",
    "commandline": "%SystemRoot%\\System32\\cmd.exe /K %ALLUSERSPROFILE%\\Anaconda3\\Scripts\\activate.bat",
    "icon": "%ALLUSERSPROFILE%\\Anaconda3\\MENU\\anaconda-navigator.ico",
    "startingDirectory": "%USERPROFILE%",
    "hidden": false
},

個人安裝 Anaconda 的例子 (同時還改了啟動目錄及啟用的虛擬環境 myenv):

{
    "name": "Anaconda (myenv)",
    "commandline": "%SystemRoot%\\System32\\cmd.exe /K %USERPROFILE%\\Anaconda3\\Scripts\\activate.bat myenv",
    "icon": "%USERPROFILE%\\Anaconda3\\MENU\\anaconda-navigator.ico",
    "startingDirectory": "D:\\zWorks",
    "hidden": false
},

設定範例:

Anaconda WT integration

Windows Terminal 與 Anaconda 整合


當你在自建的虛擬環境 myenv 裡安裝 jupyterlab 之後, Windows 開始選單裡的 Anaconda3 (64bit) 的子目錄, 裡面也會多一個 Jupyter Notebook (myenv) 的啟動連結. 不過這個連結啟動的是 jupyter notebook, 你可以手動把它改成 jupyter lab.

  1. 先在啟動選單上點選滑鼠右鍵, 開啟檔案位置. 它應該是在 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Anaconda3 (64-bit).
  2. 選到新增加的 jupyter notebook 選單連結, 按滑鼠右鍵, 選擇開啟內容.
  3. 修改目標(T)的內容: 將 jupyter-notebook-script.py 改為 jupyter-lab-script.py 即可.

    原始內容如下:

    C:\ProgramData\Anaconda3\python.exe C:\ProgramData\Anaconda3\cwp.py C:\Users\User\.conda\envs\myenv C:\Users\User\.conda\envs\myenv\python.exe C:\Users\User\.conda\envs\myenv\Scripts\jupyter-notebook-script.py "%USERPROFILE%/"

    更動後內容:

    C:\ProgramData\Anaconda3\python.exe C:\ProgramData\Anaconda3\cwp.py C:\Users\User\.conda\envs\myenv C:\Users\User\.conda\envs\myenv\python.exe C:\Users\User\.conda\envs\myenv\Scripts\jupyter-lab-script.py "%USERPROFILE%/"

完成之後就可以使用 Windows 開始選單裡的圖示來啟動 jupyterlab 了.

補充說明: 換用 miniconda


miniconda 是輕量版的 Anaconda. 二者相異之處:

  1. 安裝路徑不同
  2. 沒有圖形使用介面
  3. 沒有預先安裝的 jupyter notebook 環境
  4. 沒有預先安裝的常用 python 套件

其他的完全一致: 相同的 conda 指令, 相同的套件來源 (Anaconda channel). 所以上面的內容除了上一個段落 "補充說明: Anaconda 環境整合" 裡一些和路徑相關的東西要改一下, 其他的完全不必更動.

  • 安裝路徑: 一樣是分為:
    • 預設系統安裝路徑: 由 "%ALLUSERSPROFILE%\Anaconda" 換成 "%ALLUSERSPROFILE%\miniconda"
    • 預設個人安裝路徑: 由 "%USERPROFILE%\Anaconda" 換成 "%USERPROFILE%\miniconda"
  • 與 WT 整合時:
    • 系統安裝 miniconda 的例子:
      {
          "name": "conda (base)",
          "commandline": "%SystemRoot%\\System32\\cmd.exe /K %ALLUSERSPROFILE%\\miniconda3\\Scripts\\activate.bat",
          "icon": "%ALLUSERSPROFILE%\\miniconda3\\Lib\\site-packages\\conda\\shell\\conda_icon.ico",
          "startingDirectory": "%USERPROFILE%",
          "hidden": false
      },
      
    • 個人安裝 miniconda 的例子 (同時還改了啟動目錄及啟用的虛擬環境 myenv):
      {
          "name": "Anaconda (myenv)",
          "commandline": "%SystemRoot%\\System32\\cmd.exe /K %USERPROFILE%\\miniconda3\\Scripts\\activate.bat myenv",
          "icon": "%USERPROFILE%\\miniconda3\\Lib\\site-packages\\conda\\shell\\conda_icon.ico",
          "startingDirectory": "D:\\zWorks",
          "hidden": false
      },
      
  • 安裝 jupyterlab 之後不會自動產生開始選單. 如果需要可以自行在桌面上新增捷徑, 然後在 "輸入項目的位置(T):" 欄位裡貼上以下的字串.
    此處用的虛擬環境為 myenv 請自行更換, 還有新增完成後自行將圖示檔更換為 jupyterlab 提供的 jupyter.ico (在 %USERPROFILE%\.conda\pkgs 裡, 請自行搜尋):
    %ALLUSERSPROFILE%\miniconda3\python.exe %ALLUSERSPROFILE%\miniconda3\cwp.py %USERPROFILE%\.conda\envs\myenv %USERPROFILE%\.conda\envs\myenv\python.exe %USERPROFILE%\.conda\envs\myenv\Scripts\jupyter-lab-script.py "%USERPROFILE%/"
    

補充說明: Anaconda / tensorflow 版本相容矩陣


  • 延用 TF 1.x 的命名習慣的tensorflow-gpu:
    目前 (2023/03) tensorflow-gpu 的環境組合
    TensorFlow GPU support matrix (using Anaconda for Windows)
    TensorFlow
    Version
    Python VersionCUDA
    Toolkit
    cuDNN
    SDK
    3.53.63.73.83.93.103.11
    tensorflow-gpu 2.6.0OKOKOK11.3.18.2.1
    tensorflow-gpu 2.5.0OKOKOK11.3.18.2.1
    tensorflow-gpu 2.3.0OK-OK-10.1.2437.6.5
    tensorflow-gpu 2.1.0OKOK10.1.2437.6.5
    tensorflow-gpu 2.0.0OKOK10.0.1307.6.5
    tensorflow-gpu 1.15.0OKOK10.0.1307.6.5
    tensorflow-gpu 1.14.0OKOK10.0.1307.6.5
    tensorflow-gpu 1.13.1OKOK10.0.1307.6.5
    tensorflow-gpu 1.12.0OK9.07.6.5
    tensorflow-gpu 1.11.0OK9.07.6.5
    tensorflow-gpu 1.10.0OKOK9.07.6.5
    tensorflow-gpu 1.9.0OKOK9.07.6.5
    tensorflow-gpu 1.8.0NGNG9.07.6.5
    • 上表中, tensorflow 2.3 為 OK- 是因為: 必需自己手動加裝 cudatoolkit=10.1 cudnn=7.6.
    • 上表中, tensorflow 1.8 為 NG 是因為: 需然有該套件, 疑似因為相依條件錯誤而無法安裝.
    • 上表中, CUDA Toolkit 及 cuDNN SDK 二欄為目前 Anaconda 自動安裝的版本 (TF 2.3 除外), 僅供參考.
  • 使用 TF 2.x 的命名習慣的tensorflow:
    目前 (2023/03) tensorflow 的環境組合
    TensorFlow GPU support matrix (using Anaconda for Windows)
    TensorFlow
    Version
    Python VersionCUDA
    Toolkit
    cuDNN
    SDK
    3.53.63.73.83.93.103.11
    tensorflow 2.10.0OKOKOKOK11.3.18.2.1
    tensorflow 2.9.1OKOKOKOK11.3.18.2.1
    tensorflow 2.8.2OKOKOKOK11.3.18.2.1
    tensorflow 2.6.0OKOKOK11.3.18.2.1
    tensorflow 2.5.0OKOKOK11.3.18.2.1
    tensorflow 2.1.0OKOK10.1.2437.6.5
    tensorflow 2.0.0OKOK10.0.1307.6.5
    tensorflow 1.15.0OKOK10.0.1307.6.5
    tensorflow 1.14.0OKOK10.0.1307.6.5
    tensorflow 1.13.1OKOK10.0.1307.6.5
    tensorflow 1.12.0OK9.07.6.5
    tensorflow 1.11.0OK9.07.6.5
    tensorflow 1.10.0OKOK9.07.6.5
    tensorflow 1.9.0OKOK9.07.6.5
    • 上表中, CUDA Toolkit 及 cuDNN SDK 二欄為目前 Anaconda 自動安裝的版本, 僅供參考.
    • 上表中, 沒有 TF 2.3 是因為 Anaconda 完全沒有提供 TF 2.3 支援 GPU 版本.
  • 安裝指令及驗證
    以 Python 3.10 + tensorflow 2.8.2 的虛擬環境為例:
    conda create -n myenv python=3.10 "tensorflow=2.8*=gpu*"
    conda activate myenv
    python tftest.py
    
    以 Python 3.8 + tensorflow-gpu 2.5 的虛擬環境為例:
    conda create -n myenv python=3.8 "tensorflow-gpu=2.5*"
    conda activate myenv
    python tftest.py
    
  • 勿以升降版的方式更新 tensorflow-gputensorflow, 容易出現問題會花許多時間在解決版本相依性的問題上, 尤其是多加了許多其他套件之後, 最好是刪掉再重新建立環境. (此時, 記錄你用指令安裝了什麼套件, 哪個版本就變得很重要了)
    :: 換回環境 base
    conda deactivate
    :: 刪除環境
    conda env remove -n myenv
    :: 重建環境
    conda create -n myenv python=3.8
    :: 啟用環境
    conda activate myenv
    

    注意: conda activate 指令支援巢狀啟用虛擬環境, 所以不要一直使用 conda activate 來更換虛擬環境. 而是應該使用 conda deactivate 指令退出目前的環境, 再進入新的虛擬環境.

補充說明: 混用 conda 和 pip


Windows 平台上混用 conda installpip install 其實不是一個好主意 (在 linux 平台上是 OK). 在 conda 的虛擬環境中使用 conda install 安裝的 python package 都會出現在 pip list 的清單中, 但它們的來源是 Anaconda channel.

在 conda 的虛擬環境中也是可以使用 pip install 來安裝的 python package, 不過此時 package 的來源會是 pypi. 這個現象你可以使用 conda list 指令觀察到. 當 package 來源變成 pypi 時, 套件的行為就會是 windows 版本的行為 (因為我們的基底平台是 Windows 不是 Linux), 使用的也都是 Windows 原生的資源了. 因此, 一旦出現問題我們會搞不清楚應該要查 Windows, 還是查 conda 環境.

例如: 你在 conda 的虛擬環境中使用 pip 安裝 tensorflow, 它就不會使用 conda 的虛擬環境裡的 cudatoolkit 及 cudnn. 而是需要 Windows 原生平台上安裝的 CUDA Toolkit 及 cuDNN SDK. 因此這個版本的 tensorflow 可不可以執行, 就看 Windows 的 CUDA Toolkit 及 cuDNN SDK 有沒有安裝正確了; 而不是 conda 裡的 cudatoolkit 和 cudnn 有沒有安裝正確. 還有另外一種可能是 pipconda 安裝的套件都需要某個程式庫, 到時候二邊就有可能會打架了.

因此混用 conda installpip install 並不是明智之舉. 不過, 實務上我們還是可以在 Windows 平台上使用 conda 來作為純綷的虛擬環境管理工具 (即: 除了建立虛擬環境之外, 不使用 conda install 來安裝套件).

:: 使用 conda 建立虛擬環境 envTF
conda create -n envTF python=3.10

:: 啟用虛擬環境 envTF
conda activate envTF

:: 在虛擬環境 envTF 中使用 pip 安裝 tensorflow 2.10.x
pip install tensorflow~=2.10.0

:: 使用 conda list 檢查結果
conda list

輸出範例:

conda list

conda list (來源為 pypi 的 python packages)

結語


費了九牛二虎之力, 總算把這一篇全部改完. 其實還有在 linux 或者 macOS 環境使用的議題, 不過如果你掌握了在 Windows 上使用 conda 的技巧 (建議研讀一下 conda 的手冊), 其實也就可以靠它在 linux 及 macOS 環境橫行無阻. 而且這一篇的主要重點在 Windows 平台, 所以就不多寫了.

希望對大家有所幫助, 如果真的有幫到你也請按個讚. 有問題或者發現我哪邊弄錯了也可以留個言, 我會儘快回覆你.

arrow
arrow

    MagicJackTing 發表在 痞客邦 留言(2) 人氣()