← Back to list

[AI] 於 Linux 安裝 Tensor Flow / CUDA / CuDNN

簡單記錄一下我在 Linux Mint 21.1 作業系統安裝 Tensor Flow 的過程。

Ahead Mobility 源碼行者 · 2025-07-18 16:12 · 0 claps · 18.9 min read
#tensorflow #cuda #cudnn #linux
Open on Medium ↗
Wiki topics: OPS · LLMOps & Inference ML · Machine Learning 🔓 · Open Source

[AI] 於 Linux 安裝 Tensor Flow

簡單記錄一下我在 Linux Mint 21.1 作業系統安裝 Tensor Flow with CUDA / cuDNN 的過程。

我的顯卡是 Nvidia GTX970M,GPU Compute Capability 為 5.2(Maxwell 架構)。

透過指令查詢 CC(Compute Capability)

透過指令查詢 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 原始碼過程

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