從原始碼開始建構

在 Ubuntu Linux 和 macOS 上從原始碼開始建構 TensorFlow pip 套件並進行安裝。雖然下列操作說明可能適用於其他系統,但僅針對 Ubuntu 和 macOS 進行測試,並確認支援這兩個系統。

Linux 和 macOS 設定

請安裝下列建構工具來設定開發環境。

安裝 Python 和 TensorFlow 套件依附元件

Ubuntu

sudo apt install python3-dev python3-pip

macOS

需要 Xcode 9.2 以上版本。

使用 Homebrew 套件管理員進行安裝:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
export PATH="/usr/local/opt/python/libexec/bin:$PATH"
# if you are on macOS 10.12 (Sierra) use export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
brew install python

安裝 TensorFlow pip 套件依附元件 (如果使用虛擬環境,請省略 --user 引數):

pip install -U --user pip numpy wheel
pip install -U --user keras_preprocessing --no-deps

安裝 Bazel

您必須安裝 Bazel 才能建構 TensorFlow。Bazelisk 可讓您輕鬆安裝 Bazel,且 Bazelisk 會自動為 TensorFlow 下載正確的 Bazel 版本。為方便使用,請在 PATH 中將 Bazelisk 新增為 bazel 執行檔。

如果無法取得 Bazelisk,可以手動安裝 Bazel。請務必安裝系統支援的 Bazel 版本:依照 tensorflow/configure.py 指定,介於 _TF_MIN_BAZEL_VERSION_TF_MAX_BAZEL_VERSION 之間的任何版本。

安裝 GPU 支援項目 (選擇性,僅支援 Linux)

GPU「不」支援 macOS。

請閱讀 GPU 支援指南,瞭解如何安裝在 GPU 上執行 TensorFlow 所需的驅動程式和其他軟體。

下載 TensorFlow 原始碼

請使用 Git 來複製 TensorFlow 存放區

git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow

存放區預設為 master 開發分支版本,您也可以查看版本分支進行建構:

git checkout branch_name  # r2.2, r2.3, etc.

設定版本

請在 TensorFlow 來源樹狀結構的根層級執行 ./configure,以設定系統版本。這個指令碼會提示您輸入 TensorFlow 依附元件的位置,並要求其他的建構設定選項 (例如編譯器旗標)。

./configure

如果使用虛擬環境,python configure.py 會以環境內的路徑為優先,./configure 則會以環境外的路徑為優先。在這兩種情況下,您都可變更預設設定。

範例階段

下方是 ./configure 的執行範例 (實際階段可能會有所不同):

設定選項

GPU 支援

如需 GPU 支援,請在設定期間設定 cuda=Y,並指定 CUDA 和 cuDNN 的版本。如果您的系統安裝了多個版本的 CUDA 或 cuDNN,請明確設定版本,不要使用預設值。./configure 會建立系統 CUDA 程式庫的符號連結。因此,如果您更新了 CUDA 程式庫的路徑,必須再次執行這個設定步驟才能進行建構。

最佳化

編譯最佳化旗標的預設值 (-march=native) 會針對電腦的 CPU 類型,將產生的程式碼最佳化。不過,如果是針對不同的 CPU 類型建構 TensorFlow,請考慮使用較為特定的最佳化旗標。請參閱 GCC 手冊中的範例。

預設的設定

您可以將一些預設的建構設定加入 bazel build 指令,例如:

  • --config=dbg:以偵錯資訊為建構基礎。詳情請參閱 CONTRIBUTING.md
  • --config=mkl:支援 Intel® MKL-DNN
  • --config=monolithic:這項設定適用於大部分靜態的單體式建構。
  • --config=v1:建構 TensorFlow 1.x,而不是 2.x。

建構 pip 套件

TensorFlow 2.x

安裝 Bazel,並使用 bazel build 來建立「僅支援 CPU」的 TensorFlow 2.x 套件:

bazel build [--config=option] //tensorflow/tools/pip_package:build_pip_package

GPU 支援

如要建構支援 GPU 的 TensorFlow 套件建構工具,請使用以下指令碼:

bazel build --config=cuda [--config=option] //tensorflow/tools/pip_package:build_pip_package

TensorFlow 1.x

如要建構較舊的 TensorFlow 1.x 套件,請使用 --config=v1 選項:

bazel build --config=v1 [--config=option] //tensorflow/tools/pip_package:build_pip_package

Bazel 建構選項

如需瞭解建構選項,請參閱 Bazel 指令列參考資料

從原始碼開始建構 TensorFlow 可能會使用大量 RAM。如果您的系統有記憶體限制,請使用 --local_ram_resources=2048 限制 Bazel 的 RAM 使用量。

官方 TensorFlow 套件是使用符合 manylinux2010 套件標準的 GCC 7.3 工具鏈建構而成。

如果是 GCC 5 以上版本,可使用 --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" 建構與舊版 ABI 的相容性。建構 ABI 相容性可確保透過官方 TensorFlow 套件建構的自訂運算可繼續與 GCC 5 建構的套件搭配使用。

建構套件

bazel build 指令會建立名為 build_pip_package 的執行檔,這是建構 pip 套件的程式。請執行下方顯示的執行檔,以在 /tmp/tensorflow_pkg 目錄中建構 .whl 套件。

如要從版本分支建構:

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

如要從主要版本建構,請使用 --nightly_flag 來取得正確的依附元件:

./bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag /tmp/tensorflow_pkg

雖然您可以在同一個來源樹狀結構下建構 CUDA 和非 CUDA 設定,但在相同來源樹狀結構中切換這兩個設定時,我們建議您執行 bazel clean

安裝套件

產生的 .whl 檔案檔名取決於 TensorFlow 版本和您使用的平台。請使用 pip install 來安裝套件,例如:

pip install /tmp/tensorflow_pkg/tensorflow-version-tags.whl

Docker Linux 版本

TensorFlow 的 Docker 開發映像檔可讓您輕鬆設定環境,從原始碼開始建構 Linux 套件。這些映像檔已包含建構 TensorFlow 所需的原始碼和依附元件。請參閱 TensorFlow Docker 指南瞭解如何安裝,並查看可用映像檔標記清單

僅支援 CPU

下列範例使用 :devel 映像檔,從最新的 TensorFlow 原始碼建構僅支援 CPU 的套件。請參閱 Docker 指南,瞭解可用的 TensorFlow -devel 標記。

請下載最新的開發映像檔,並啟動要用來建構 pip 套件的 Docker 容器:

docker pull tensorflow/tensorflow:devel
docker run -it -w /tensorflow_src -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" \
    tensorflow/tensorflow:devel bash

git pull  # within the container, download the latest source code

上述 docker run 指令會在 /tensorflow_src 目錄 (來源樹狀結構的根層級) 中啟動殼層。這個指令會在容器的 /mnt 目錄中掛接主機目前的目錄,並透過環境變數將主機使用者的資訊傳遞至容器 (環境變數是用來設定權限,如果使用 Docker,作業過程可能會更加複雜)。

您也可以在容器的 /tensorflow 目錄中掛接主機來源樹狀結構,以便在容器內建構 TensorFlow 的主機副本:

docker run -it -w /tensorflow -v /path/to/tensorflow:/tensorflow -v $PWD:/mnt \
    -e HOST_PERMS="$(id -u):$(id -g)" tensorflow/tensorflow:devel bash

設定來源樹狀結構後,請在容器的虛擬環境中建構 TensorFlow 套件:

  1. 設定建構:使用者必須依提示回答建構設定問題。
  2. 建構用於建立 pip 套件的工具。
  3. 執行工具以建立 pip 套件。
  4. 調整檔案在容器外的擁有權。
./configure  # answer prompts or use defaults

bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /mnt  # create package

chown $HOST_PERMS /mnt/tensorflow-version-tags.whl

在容器中安裝套件並進行驗證:

pip uninstall tensorflow  # remove current version

pip install /mnt/tensorflow-version-tags.whl
cd /tmp  # don't import from source directory
python -c "import tensorflow as tf; print(tf.__version__)"

在主體機器上,TensorFlow pip 套件位於目前的目錄中 (擁有主機使用者權限):./tensorflow-version-tags.whl

GPU 支援

Docker 能讓您以最簡單的方式替 TensorFlow 建構 GPU 支援,因為主體機器只需有 NVIDIA® 驅動程式即可,不必安裝 NVIDIA® CUDA® Toolkit。請參閱 GPU 支援指南和 TensorFlow Docker 指南,瞭解如何設定 nvidia-docker (僅適用於 Linux)。

下列範例會下載 TensorFlow :devel-gpu 映像檔,並使用 nvidia-docker 來執行支援 GPU 的容器。這個開發映像檔經過設定,會建構支援 GPU 的 pip 套件:

docker pull tensorflow/tensorflow:devel-gpu
docker run --gpus all -it -w /tensorflow -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" \
    tensorflow/tensorflow:devel-gpu bash
git pull  # within the container, download the latest source code

然後,請在容器的虛擬環境中建構支援 GPU 的 TensorFlow 套件:

./configure  # answer prompts or use defaults

bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /mnt  # create package

chown $HOST_PERMS /mnt/tensorflow-version-tags.whl

在容器中安裝套件並進行驗證,然後查看 GPU 現況:

pip uninstall tensorflow  # remove current version

pip install /mnt/tensorflow-version-tags.whl
cd /tmp  # don't import from source directory
python -c "import tensorflow as tf; print(\"Num GPUs Available: \", len(tf.config.list_physical_devices('GPU')))"

經過測試的建構設定

Linux

CPU

版本Python 版本編譯器建構工具
tensorflow-2.6.03.6-3.9GCC 7.3.1Bazel 3.7.2
tensorflow-2.5.03.6-3.9GCC 7.3.1Bazel 3.7.2
tensorflow-2.4.03.6-3.8GCC 7.3.1Bazel 3.1.0
tensorflow-2.3.03.5-3.8GCC 7.3.1Bazel 3.1.0
tensorflow-2.2.03.5-3.8GCC 7.3.1Bazel 2.0.0
tensorflow-2.1.02.7、3.5-3.7GCC 7.3.1Bazel 0.27.1
tensorflow-2.0.02.7、3.3-3.7GCC 7.3.1Bazel 0.26.1
tensorflow-1.15.02.7、3.3-3.7GCC 7.3.1Bazel 0.26.1
tensorflow-1.14.02.7、3.3-3.7GCC 4.8Bazel 0.24.1
tensorflow-1.13.12.7、3.3-3.7GCC 4.8Bazel 0.19.2
tensorflow-1.12.02.7、3.3-3.6GCC 4.8Bazel 0.15.0
tensorflow-1.11.02.7、3.3-3.6GCC 4.8Bazel 0.15.0
tensorflow-1.10.02.7、3.3-3.6GCC 4.8Bazel 0.15.0
tensorflow-1.9.02.7、3.3-3.6GCC 4.8Bazel 0.11.0
tensorflow-1.8.02.7、3.3-3.6GCC 4.8Bazel 0.10.0
tensorflow-1.7.02.7、3.3-3.6GCC 4.8Bazel 0.10.0
tensorflow-1.6.02.7、3.3-3.6GCC 4.8Bazel 0.9.0
tensorflow-1.5.02.7、3.3-3.6GCC 4.8Bazel 0.8.0
tensorflow-1.4.02.7、3.3-3.6GCC 4.8Bazel 0.5.4
tensorflow-1.3.02.7、3.3-3.6GCC 4.8Bazel 0.4.5
tensorflow-1.2.02.7、3.3-3.6GCC 4.8Bazel 0.4.5
tensorflow-1.1.02.7、3.3-3.6GCC 4.8Bazel 0.4.2
tensorflow-1.0.02.7、3.3-3.6GCC 4.8Bazel 0.4.2

GPU

版本Python 版本編譯器建構工具cuDNNCUDA
tensorflow-2.6.03.6-3.9GCC 7.3.1Bazel 3.7.28.111.2
tensorflow-2.5.03.6-3.9GCC 7.3.1Bazel 3.7.28.111.2
tensorflow-2.4.03.6-3.8GCC 7.3.1Bazel 3.1.08.011.0
tensorflow-2.3.03.5-3.8GCC 7.3.1Bazel 3.1.07.610.1
tensorflow-2.2.03.5-3.8GCC 7.3.1Bazel 2.0.07.610.1
tensorflow-2.1.02.7、3.5-3.7GCC 7.3.1Bazel 0.27.17.610.1
tensorflow-2.0.02.7、3.3-3.7GCC 7.3.1Bazel 0.26.17.410.0
tensorflow_gpu-1.15.02.7、3.3-3.7GCC 7.3.1Bazel 0.26.17.410.0
tensorflow_gpu-1.14.02.7、3.3-3.7GCC 4.8Bazel 0.24.17.410.0
tensorflow_gpu-1.13.12.7、3.3-3.7GCC 4.8Bazel 0.19.27.410.0
tensorflow_gpu-1.12.02.7、3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.11.02.7、3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.10.02.7、3.3-3.6GCC 4.8Bazel 0.15.079
tensorflow_gpu-1.9.02.7、3.3-3.6GCC 4.8Bazel 0.11.079
tensorflow_gpu-1.8.02.7、3.3-3.6GCC 4.8Bazel 0.10.079
tensorflow_gpu-1.7.02.7、3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow_gpu-1.6.02.7、3.3-3.6GCC 4.8Bazel 0.9.079
tensorflow_gpu-1.5.02.7、3.3-3.6GCC 4.8Bazel 0.8.079
tensorflow_gpu-1.4.02.7、3.3-3.6GCC 4.8Bazel 0.5.468
tensorflow_gpu-1.3.02.7、3.3-3.6GCC 4.8Bazel 0.4.568
tensorflow_gpu-1.2.02.7、3.3-3.6GCC 4.8Bazel 0.4.55.18
tensorflow_gpu-1.1.02.7、3.3-3.6GCC 4.8Bazel 0.4.25.18
tensorflow_gpu-1.0.02.7、3.3-3.6GCC 4.8Bazel 0.4.25.18

macOS

CPU

版本Python 版本編譯器建構工具
tensorflow-2.6.03.6-3.9Clang from xcode 10.11Bazel 3.7.2
tensorflow-2.5.03.6-3.9Clang from xcode 10.11Bazel 3.7.2
tensorflow-2.4.03.6-3.8Clang from xcode 10.3Bazel 3.1.0
tensorflow-2.3.03.5-3.8Clang from xcode 10.1Bazel 3.1.0
tensorflow-2.2.03.5-3.8Clang from xcode 10.1Bazel 2.0.0
tensorflow-2.1.02.7、3.5-3.7Clang from xcode 10.1Bazel 0.27.1
tensorflow-2.0.02.7、3.5-3.7Clang from xcode 10.1Bazel 0.27.1
tensorflow-2.0.02.7、3.3-3.7Clang from xcode 10.1Bazel 0.26.1
tensorflow-1.15.02.7、3.3-3.7Clang from xcode 10.1Bazel 0.26.1
tensorflow-1.14.02.7、3.3-3.7Clang from xcodeBazel 0.24.1
tensorflow-1.13.12.7、3.3-3.7Clang from xcodeBazel 0.19.2
tensorflow-1.12.02.7、3.3-3.6Clang from xcodeBazel 0.15.0
tensorflow-1.11.02.7、3.3-3.6Clang from xcodeBazel 0.15.0
tensorflow-1.10.02.7、3.3-3.6Clang from xcodeBazel 0.15.0
tensorflow-1.9.02.7、3.3-3.6Clang from xcodeBazel 0.11.0
tensorflow-1.8.02.7、3.3-3.6Clang from xcodeBazel 0.10.1
tensorflow-1.7.02.7、3.3-3.6Clang from xcodeBazel 0.10.1
tensorflow-1.6.02.7、3.3-3.6Clang from xcodeBazel 0.8.1
tensorflow-1.5.02.7、3.3-3.6Clang from xcodeBazel 0.8.1
tensorflow-1.4.02.7、3.3-3.6Clang from xcodeBazel 0.5.4
tensorflow-1.3.02.7、3.3-3.6Clang from xcodeBazel 0.4.5
tensorflow-1.2.02.7、3.3-3.6Clang from xcodeBazel 0.4.5
tensorflow-1.1.02.7、3.3-3.6Clang from xcodeBazel 0.4.2
tensorflow-1.0.02.7、3.3-3.6Clang from xcodeBazel 0.4.2

GPU

版本Python 版本編譯器建構工具cuDNNCUDA
tensorflow_gpu-1.1.02.7、3.3-3.6Clang from xcodeBazel 0.4.25.18
tensorflow_gpu-1.0.02.7、3.3-3.6Clang from xcodeBazel 0.4.25.18