[AI] 於 Linux 安裝 Tensor Flow / CUDA / CuDNN
簡單記錄一下我在 Linux Mint 21.1 作業系統安裝 Tensor Flow 的過程。
[AI] 於 Linux 安裝 Tensor Flow
簡單記錄一下我在 Linux Mint 21.1 作業系統安裝 Tensor Flow with CUDA / cuDNN 的過程。
我的顯卡是 Nvidia GTX970M,GPU Compute Capability 為 5.2(Maxwell 架構)。

透過指令查詢 CC(Compute Capability)
Step 1:安裝顯卡驅動
首先在 Linux 先將 Nvidia 顯卡驅動安裝完畢。 最簡單的安裝方式可以去驅動程式管理員頁面內,點選建議的驅動直接安裝:

有時後過一段時間就會有更新的驅動可使用,就安裝最新的即可:

Step 2:安裝 CUDA
先移除舊版 CUDA:
sudo apt remove --purge "*cuda*" "*cublas*" "*cufft*" "*cufile*" "*curand*" "*cusolver*" "*cusparse*" "*gds-tools*" "*npp*" "*nvjpeg*" "nsight*" "*nvvm*"
sudo apt autoremove --purge
卸載後,檢查 /usr/local/cuda 是否存在,若有,手動移除:
sudo rm -rf /usr/local/cuda
去 Nvidia 官網 選擇想安裝的 CUDA 版本。
可以先用以下指令得知目前的顯示卡驅動程式能支援最大的 CUDA 版本:
nvidia-smi

可以看到輸出的資訊內,右上角有顯示 CUDA Version: 12.9,因此可以去 Nvidia 網站下載對應的 CUDA 版本安裝。
依照指示點選對應的系統環境:(如果要查詢自己 Linux 版本,可以用 cat /proc/version 指令查詢)

Nvidia 網頁下方會顯示安裝指令:

執行完之後,將以下兩行加入 .bashrc 內:
export PATH=/usr/local/cuda-12.9/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-12.9/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
其中環境變數中的 cuda 版本,端看你安裝的版本為何,就輸入特定的版本號。
接下來 source ~/.bashrc 之後,可以用以下指令確定 cuda 版本:
nvcc --version

這樣就是安裝成功了!
Step 3:安裝 cuDNN
去 Nvidia 官網點選自己電腦的核心版本等資訊:


依照官網自動產生的指令執行即可。
驗證是否安裝成功:
編譯並運行樣本程式: 複製樣本:cp -r /usr/src/cudnn_samples_v9 $HOME(假設版本 9)。 進入目錄:cd $HOME/cudnn_samples_v9/mnistCUDNN 編譯:make clean && make 運行:./mnistCUDNN,若輸出正確結果(如 “Test passed”),則安裝成功。
如果沒有 Pass,可能代表 cuDNN 跟 CUDA 版本不相容,這個時候可以去訪問 NVIDIA cuDNN 文件:https://docs.nvidia.com/deeplearning/cudnn/latest/reference/support-matrix.html
裡面有相容性表格,可以跟自己的 CUDA 版本對照。
如果舊的顯卡,有可能需要安裝舊版本的 cuDNN,可以依照以下方式安裝:
下載並安裝 cuDNN 8.9.7(從 NVIDIA 官網 https://developer.nvidia.com/cudnn-archive,下載匹配你的 CUDA 版本的 tar 檔): 解壓:
tar -xvf cudnn-linux-*.tgz。
sudo cp cudnn-linux-*/include/cudnn*.h /usr/local/cuda-12.9/include/
sudo cp -P cudnn-linux-*/lib/libcudnn* /usr/local/cuda-12.9/lib64/。
sudo chmod a+r /usr/local/cuda-12.9/include/cudnn*.h /usr/local/cuda-12.9/lib64/libcudnn*
更新 LD_LIBRARY_PATH:加到 ~/.bashrc:export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
然後 source ~/.bashrc。
驗證:重新編譯 mnistCUDNN(make clean && make),然後執行 ./mnistCUDNN
下面的指令也可以確認 cuDNN 版本:
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
確定以下變數設定,都已在 .bashrc 內:
export LD_LIBRARY_PATH=/usr/local/cuda-12.9/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
接著 source ~/.bashrc 後,再次編譯 mnistCUDNN 測試程式,重新執行一次:

我的舊 GPU 跑 Testing half precision (math in single precision) 會測試失敗:

因為我的舊 GPU 是 Maxwell 系列(SM 5.2),cuDNN 8.9.7 雖然支援 CC 5.0+(包括 Maxwell),但 FP16 在舊架構上並非原生支援。Maxwell 只支援 FP16 儲存(storage),計算需模擬為 FP32,這可能導致性能降低或數值不穩定,尤其是範圍有限的 FP16(最大值 ~65504)容易溢位(overflow)成 Inf,進而使 Softmax 產生 NaN。
這樣的結果,大部分可以忽略半精度測試,因為既然單精度通過,cuDNN 已可使用於大多數應用(如 TensorFlow GPU 版)。如果不需 FP16(例如,訓練或推論不依賴半精度加速),這不算問題。mnistCUDNN 只是驗證樣本,不是必要條件。
Step 4:安裝 Tensorflow
pip uninstall tensorflow numpy
pip install tensorflow numpy
先移除然後再次安裝 tensorflow 和 numpy 可以讓 pip 自動解決套件衝突的問題。有時候 numpy 版本太新或太舊都會跟 tensorflow 衝突。
然後用 python 程式可以看 tensorflow 版本:
import tensorflow as tf
tf.__version__
TensorFlow 2.1 開始,pip 安裝 tensorflow 即同時包含 GPU 支援。不需要額外安裝 gpu 版本的 tensorflow。
如果你的 tensorflow 版本跟 cuDNN 有衝突,可以用手動編譯的方式安裝:
像我的舊電腦的 cuDNN 版本安裝 8.9.7,就必須搭配 tensorflow 2.17.0。
sudo apt install build-essential python3-dev libcurl4-openssl-dev
git clone https://github.com/tensorflow/tensorflow -b v2.17.0
先安裝新版 gcc:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install gcc-12 g++-12
接著 Set Environment Variables for TMP (to fix the auto-configuration warning):
export TMP=/tmp
export TMPDIR=/tmp
然後用 bazel (from https://bazel.build/install)安裝:
Clean Bazel Cache (to resolve any stale state from previous builds):
bazel clean
然後用設定 configure
export CC=/usr/bin/gcc-12
export CXX=/usr/bin/g++-12
cd tensorflow && ./configure (enable CUDA, set paths, compute capabilities="5.2").
安裝過程的記錄如下:
You have bazel 6.5.0 installed.
Please specify the location of python. [Default is /usr/bin/python3]: /usr/bin/python3
Found possible Python library paths:
/usr/lib/python3.10/dist-packages
/usr/lib/python3/dist-packages
/usr/local/lib/python3.10/dist-packages
Please input the desired Python library path to use. Default is [/usr/lib/python3.10/dist-packages]
/usr/lib/python3.10/dist-packages
Do you wish to build TensorFlow with ROCm support? [y/N]: n
No ROCm support will be enabled for TensorFlow.
Do you wish to build TensorFlow with CUDA support? [y/N]: y
CUDA support will be enabled for TensorFlow.
Do you wish to build TensorFlow with TensorRT support? [y/N]: n
No TensorRT support will be enabled for TensorFlow.
Found CUDA 12.9 in:
/usr/local/cuda-12.9/targets/x86_64-linux/lib
/usr/local/cuda-12.9/targets/x86_64-linux/include
Found cuDNN 8 in:
/usr/local/cuda-12.9/targets/x86_64-linux/lib
/usr/local/cuda-12.9/targets/x86_64-linux/include
Please specify a list of comma-separated CUDA compute capabilities you want to build with.
You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus. Each capability can be specified as "x.y" or "compute_xy" to include both virtual and binary GPU code, or as "sm_xy" to only include the binary code.
Please note that each additional compute capability significantly increases your build time and binary size, and that TensorFlow only supports compute capabilities >= 3.5 [Default is: 3.5,7.0]: 5.2
Do you want to use clang as CUDA compiler? [Y/n]: n
nvcc will be used as CUDA compiler.
Please specify which gcc should be used by nvcc as the host compiler. [Default is /usr/bin/gcc]: /usr/bin/gcc-12
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -Wno-sign-compare]:
Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]: n
Not configuring the WORKSPACE for Android builds.
Preconfigured Bazel build configs. You can use any of the below by adding "--config=<>" to your build command. See .bazelrc for more details.
--config=mkl # Build with MKL support.
--config=mkl_aarch64 # Build with oneDNN and Compute Library for the Arm Architecture (ACL).
--config=monolithic # Config for mostly static monolithic build.
--config=numa # Build with NUMA support.
--config=dynamic_kernels # (Experimental) Build kernels into separate shared objects.
--config=v1 # Build with TensorFlow 1 API instead of TF 2 API.
Preconfigured Bazel build configs to DISABLE default on features:
--config=nogcp # Disable GCP support.
--config=nonccl # Disable NVIDIA NCCL support.
Configuration finished
當詢問是否要使用 Clang 作為 CUDA 編譯器(Clang 是 LLVM 的一部分,支援 CUDA 編譯,但這是實驗性選項)。預設是 ‘Y’(yes),但推薦回答 ‘n’(no),因為標準 NVIDIA CUDA 環境應使用 nvcc(NVIDIA 的官方 CUDA 編譯器)。使用 nvcc 可以確保相容性和穩定性,尤其我的 GPU 是舊 Maxwell 架構(CC 5.2)。
為什麼選 ‘n’:nvcc 是官方推薦,處理 CUDA 特定擴展更好;Clang 可能導致建置問題或性能不佳,除非你有特定需求(如跨平台編譯)。 如果選 ‘Y’:需確保 Clang 已安裝並支援 CUDA(Clang 17+),但不推薦初次建置。
— config=cuda:啟用 CUDA 支援(基於你的配置,啟用了 CUDA 和 cuDNN)。
bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:wheel --repo_env=USE_PYWRAP_RULES=1 --repo_env=WHEEL_NAME=tensorflow

build tensorflow 原始碼過程
在這行指令中,//tensorflow/tools/pip_package:build_pip_package:指定建置目標,生成 Python 可安裝的 wheel 檔。 注意:這會花費一些時間(可能數小時),因為指定了 Compute Capability 5.2(舊 Maxwell 架構),且從源碼編譯需要大量計算。確保系統有足夠記憶體(建議至少 16GB RAM 和 20GB 磁碟空間)。
建置成功後,安裝 wheel 檔案:
pip install bazel-bin/tensorflow/tools/pip_package/*.whl
Step 5:測試 Tensorflow 是否可使用 CUDA / cuDNN / GPU 資源
用以下程式碼測試 GPU 是否有偵測到:
import tensorflow as tf
print("TensorFlow version:", tf.__version__)
gpus = tf.config.list_physical_devices('GPU')
print("Num GPUs Available:", len(gpus))
if gpus:
print("GPU details:", gpus)
應輸出 TensorFlow 2.17.0,且顯示 “Num GPUs Available: 1”(表示 GPU 已偵測,CUDA/cuDNN 正常)。 如果顯示 0 GPU,檢查環境變數(export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH)或驅動(nvidia-smi 應顯示 >= 525.60.13)。

顯卡成功被呼喚起來
— — — — — — — — — — — — — — — — — — — — — — — — —
Appendix
有時,比較舊的 GPU 也有可能會遇到類似以下問題:
GPU Compute Capability 為 5.2(Maxwell 架構),但 cuDNN 9.11.0 已移除對 Maxwell(5.x)、Pascal(6.x)和 Volta(7.0)等舊架構的支援。它僅支援 Turing(7.5)及更新的架構(如 Ampere 8.x、Ada 9.x 等)。這導致樣本程式在嘗試執行 cuDNN 引擎時失敗,具體表現為 INTERNAL_ERROR(內部錯誤)和 NOT_SUPPORTED(不支援的演算法)。
這時候可以到 Nvidia 網站找尋之前 cuDNN Release 的版本。例如降級到 cuDNN 8.x 系列(如 8.9.7),這些版本支援 Compute Capability 3.0+(包括 5.2)。
下載 tar.xz 壓縮檔後,安裝步驟如下:
tar Jxvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz
sudo cp ./cudnn-linux-x86_64-8.9.7.29_cuda12-archive/include/cudnn*.h /usr/local/cuda-12.9/include/
sudo cp -P ./cudnn-linux-x86_64-8.9.7.29_cuda12-archive/lib/libcudnn* /usr/local/cuda-12.9/lib64/
sudo chmod a+r /usr/local/cuda-12.9/include/cudnn*.h
sudo chmod a+r /usr/local/cuda-12.9/lib64/libcudnn*
以往的懶人安裝方式是在 Linux 執行 apt-get install nvidia-cudnn。但這樣安裝的版本可能會有點舊。
注意如果是用這樣的方式安裝,將來要移除 nvidia-cudnn 時,執行 apt-get purge nvidia-cudnn 時,有時會遭遇以下的錯誤訊息:
installed nvidia-cudnn package pre-removal script 子進程傳回了 1 錯誤退出狀態碼
dpkg: 錯誤太多,停止執行
這代表套件的 prerm script 有一些問題,可以手動去以下路徑尋找 prerm script:
/var/lib/dpkg/info/nvidia-cudnn.prerm
將 nvidia-cudnn.prerm 內的指令手動執行完後刪除 nvidia-cudnn.prerm 檔案,並再次執行 sudo apt-get purge nvidia-cudnn 即可成功移除 nvidia-cudnn。
Tensorflow 用原始碼編譯有可能很久,或者記憶體不夠(最好 16 GB 或更高),因此可以直接執行 pip install “tensorflow[and-cuda]”,這是 TensorFlow 2.17+ 的官方安裝方式,它會自動處理 GPU 支援所需的 CUDA 和 cuDNN 庫(透過 pip 依賴下載用戶級版本),即使你的系統已安裝 CUDA 12.3 和 cuDNN 8.9.7,也不會有重大衝突,因為版本匹配官方要求。
當然也可以安裝特定版本 tensorflow:
pip install "tensorflow[and-cuda]==2.17.0"
在此記錄手寫辨識的程式執行結果(2024/05/08 跑的範例程式):
Epoch 1/5
469/469 ━━━━━━━━━━━━━━━━━━━━ 5s 8ms/step - accuracy: 0.8729 - loss: 0.4366
Epoch 2/5
469/469 ━━━━━━━━━━━━━━━━━━━━ 4s 8ms/step - accuracy: 0.9675 - loss: 0.1153
Epoch 3/5
469/469 ━━━━━━━━━━━━━━━━━━━━ 4s 8ms/step - accuracy: 0.9780 - loss: 0.0740
Epoch 4/5
469/469 ━━━━━━━━━━━━━━━━━━━━ 4s 8ms/step - accuracy: 0.9854 - loss: 0.0506
Epoch 5/5
469/469 ━━━━━━━━━━━━━━━━━━━━ 4s 8ms/step - accuracy: 0.9895 - loss: 0.0367
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9758 - loss: 0.0783 메타데이터
- post_id
- 0c1e0fc4bd72
- slug
- ai-於-linux-安裝-tensor-flow-cuda-cudnn-0c1e0fc4bd72
- url
- https://medium.com/@aheadmb/ai-%E6%96%BC-linux-%E5%AE%89%E8%A3%9D-tensor-flow-cuda-cudnn-0c1e0fc4bd72
- canonical_url
- https://medium.com/@aheadmb/ai-%E6%96%BC-linux-%E5%AE%89%E8%A3%9D-tensor-flow-cuda-cudnn-0c1e0fc4bd72
- author_url
- https://medium.com/@aheadmb
- status
- ok
- fetched_at
- 2026-06-25 07:00:49