在 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 建構選項
從原始碼開始建構 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 套件:
- 設定建構:使用者必須依提示回答建構設定問題。
- 建構用於建立 pip 套件的工具。
- 執行工具以建立 pip 套件。
- 調整檔案在容器外的擁有權。
./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.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 |
tensorflow-2.5.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 |
tensorflow-2.4.0 | 3.6-3.8 | GCC 7.3.1 | Bazel 3.1.0 |
tensorflow-2.3.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 3.1.0 |
tensorflow-2.2.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 2.0.0 |
tensorflow-2.1.0 | 2.7、3.5-3.7 | GCC 7.3.1 | Bazel 0.27.1 |
tensorflow-2.0.0 | 2.7、3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 |
tensorflow-1.15.0 | 2.7、3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 |
tensorflow-1.14.0 | 2.7、3.3-3.7 | GCC 4.8 | Bazel 0.24.1 |
tensorflow-1.13.1 | 2.7、3.3-3.7 | GCC 4.8 | Bazel 0.19.2 |
tensorflow-1.12.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.11.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.10.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.9.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.11.0 |
tensorflow-1.8.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
tensorflow-1.7.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
tensorflow-1.6.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.9.0 |
tensorflow-1.5.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.8.0 |
tensorflow-1.4.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.5.4 |
tensorflow-1.3.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
tensorflow-1.2.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
tensorflow-1.1.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |
tensorflow-1.0.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |
GPU
版本 | Python 版本 | 編譯器 | 建構工具 | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow-2.6.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 | 8.1 | 11.2 |
tensorflow-2.5.0 | 3.6-3.9 | GCC 7.3.1 | Bazel 3.7.2 | 8.1 | 11.2 |
tensorflow-2.4.0 | 3.6-3.8 | GCC 7.3.1 | Bazel 3.1.0 | 8.0 | 11.0 |
tensorflow-2.3.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 3.1.0 | 7.6 | 10.1 |
tensorflow-2.2.0 | 3.5-3.8 | GCC 7.3.1 | Bazel 2.0.0 | 7.6 | 10.1 |
tensorflow-2.1.0 | 2.7、3.5-3.7 | GCC 7.3.1 | Bazel 0.27.1 | 7.6 | 10.1 |
tensorflow-2.0.0 | 2.7、3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 | 7.4 | 10.0 |
tensorflow_gpu-1.15.0 | 2.7、3.3-3.7 | GCC 7.3.1 | Bazel 0.26.1 | 7.4 | 10.0 |
tensorflow_gpu-1.14.0 | 2.7、3.3-3.7 | GCC 4.8 | Bazel 0.24.1 | 7.4 | 10.0 |
tensorflow_gpu-1.13.1 | 2.7、3.3-3.7 | GCC 4.8 | Bazel 0.19.2 | 7.4 | 10.0 |
tensorflow_gpu-1.12.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.11.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.10.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.9.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.11.0 | 7 | 9 |
tensorflow_gpu-1.8.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.10.0 | 7 | 9 |
tensorflow_gpu-1.7.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.6.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.5.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.8.0 | 7 | 9 |
tensorflow_gpu-1.4.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.5.4 | 6 | 8 |
tensorflow_gpu-1.3.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 6 | 8 |
tensorflow_gpu-1.2.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 5.1 | 8 |
tensorflow_gpu-1.1.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
macOS
CPU
版本 | Python 版本 | 編譯器 | 建構工具 |
---|---|---|---|
tensorflow-2.6.0 | 3.6-3.9 | Clang from xcode 10.11 | Bazel 3.7.2 |
tensorflow-2.5.0 | 3.6-3.9 | Clang from xcode 10.11 | Bazel 3.7.2 |
tensorflow-2.4.0 | 3.6-3.8 | Clang from xcode 10.3 | Bazel 3.1.0 |
tensorflow-2.3.0 | 3.5-3.8 | Clang from xcode 10.1 | Bazel 3.1.0 |
tensorflow-2.2.0 | 3.5-3.8 | Clang from xcode 10.1 | Bazel 2.0.0 |
tensorflow-2.1.0 | 2.7、3.5-3.7 | Clang from xcode 10.1 | Bazel 0.27.1 |
tensorflow-2.0.0 | 2.7、3.5-3.7 | Clang from xcode 10.1 | Bazel 0.27.1 |
tensorflow-2.0.0 | 2.7、3.3-3.7 | Clang from xcode 10.1 | Bazel 0.26.1 |
tensorflow-1.15.0 | 2.7、3.3-3.7 | Clang from xcode 10.1 | Bazel 0.26.1 |
tensorflow-1.14.0 | 2.7、3.3-3.7 | Clang from xcode | Bazel 0.24.1 |
tensorflow-1.13.1 | 2.7、3.3-3.7 | Clang from xcode | Bazel 0.19.2 |
tensorflow-1.12.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.15.0 |
tensorflow-1.11.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.15.0 |
tensorflow-1.10.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.15.0 |
tensorflow-1.9.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.11.0 |
tensorflow-1.8.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.10.1 |
tensorflow-1.7.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.10.1 |
tensorflow-1.6.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.8.1 |
tensorflow-1.5.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.8.1 |
tensorflow-1.4.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.5.4 |
tensorflow-1.3.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.4.5 |
tensorflow-1.2.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.4.5 |
tensorflow-1.1.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.4.2 |
tensorflow-1.0.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.4.2 |
GPU
版本 | Python 版本 | 編譯器 | 建構工具 | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow_gpu-1.1.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2.7、3.3-3.6 | Clang from xcode | Bazel 0.4.2 | 5.1 | 8 |