Zbuduj pakiet pip TensorFlow ze źródła i zainstaluj go na Ubuntu Linux i macOS. Chociaż instrukcje mogą działać w innych systemach, są testowane i obsługiwane tylko w systemach Ubuntu i macOS.
Konfiguracja dla systemu Linux i macOS
Zainstaluj następujące narzędzia do kompilacji, aby skonfigurować środowisko programistyczne.
Zainstaluj Pythona i zależności pakietów TensorFlow
Ubuntu
sudo apt install python3-dev python3-pip
System operacyjny Mac
Wymaga Xcode 9.2 lub nowszego.
Zainstaluj za pomocą menedżera pakietów 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
Zainstaluj zależności pakietu TensorFlow pip (jeśli używasz środowiska wirtualnego, pomiń argument --user
):
pip install -U --user pip numpy wheel packaging
pip install -U --user keras_preprocessing --no-deps
Zainstaluj Bazel
Aby zbudować TensorFlow, musisz zainstalować Bazel. Bazelisk to prosty sposób na zainstalowanie Bazela i automatyczne pobieranie prawidłowej wersji Bazela dla TensorFlow. Aby ułatwić korzystanie, dodaj Bazelisk jako wykonywalny plik bazel
w PATH
.
Jeśli Bazelisk nie jest dostępny, możesz ręcznie zainstalować Bazel . Upewnij się, że zainstalowałeś obsługiwaną wersję Bazela: dowolną wersję między _TF_MIN_BAZEL_VERSION
i _TF_MAX_BAZEL_VERSION
, jak określono w tensorflow/configure.py
.
Zainstaluj obsługę GPU (opcjonalnie, tylko Linux)
Nie ma obsługi GPU dla systemu macOS.
Przeczytaj przewodnik obsługi GPU , aby zainstalować sterowniki i dodatkowe oprogramowanie wymagane do uruchomienia TensorFlow na GPU.
Pobierz kod źródłowy TensorFlow
Użyj Git , aby sklonować repozytorium TensorFlow :
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
Repo domyślnie to master
gałąź programistyczna. Możesz również pobrać gałąź wydania, aby zbudować:
git checkout branch_name # r2.2, r2.3, etc.
Skonfiguruj kompilację
Skonfiguruj kompilację systemu, uruchamiając ./configure
w katalogu głównym drzewa źródłowego TensorFlow. Ten skrypt monituje o lokalizację zależności TensorFlow i prosi o dodatkowe opcje konfiguracji kompilacji (na przykład flagi kompilatora).
./configure
Jeśli używasz środowiska wirtualnego, python configure.py
priorytet ścieżkom w środowisku, podczas gdy ./configure
priorytet ścieżkom poza środowiskiem. W obu przypadkach możesz zmienić ustawienie domyślne.
Przykładowa sesja
Poniżej przedstawiono przykładowe uruchomienie skryptu ./configure
(Twoja sesja może się różnić):
Opcje konfiguracji
Obsługa GPU
Aby uzyskać obsługę GPU , ustaw cuda=Y
podczas konfiguracji i określ wersje CUDA i cuDNN. Jeśli w systemie jest zainstalowanych wiele wersji CUDA lub cuDNN, jawnie ustaw wersję zamiast polegać na domyślnej. ./configure
tworzy dowiązania symboliczne do bibliotek CUDA twojego systemu — więc jeśli zaktualizujesz ścieżki bibliotek CUDA, ten krok konfiguracji musi zostać uruchomiony ponownie przed budowaniem.
Optymalizacje
W przypadku flag optymalizacji kompilacji ustawienie domyślne ( -march=native
) optymalizuje wygenerowany kod pod kątem typu procesora komputera. Jeśli jednak budujesz TensorFlow dla innego typu procesora, rozważ bardziej konkretną flagę optymalizacji. Sprawdź w podręczniku GCC przykłady.
Wstępnie skonfigurowane konfiguracje
Dostępnych jest kilka wstępnie skonfigurowanych konfiguracji budowania, które można dodać do polecenia bazel build
, na przykład:
-
--config=dbg
Kompiluj z informacjami debugowania. Zobacz CONTRIBUTING.md , aby uzyskać szczegółowe informacje. -
--config=mkl
— Obsługa Intel® MKL-DNN . -
--config=monolithic
— Konfiguracja dla w większości statycznej, monolitycznej kompilacji. -
--config=v1
— Zbuduj TensorFlow 1.x zamiast 2.x.
Zbuduj pakiet pip
TensorFlow 2.x
Zainstaluj Bazel i użyj bazel build
, aby utworzyć pakiet TensorFlow 2.x z obsługą tylko procesora :
bazel build [--config=option] //tensorflow/tools/pip_package:build_pip_package
Obsługa GPU
Aby zbudować konstruktora pakietów TensorFlow z obsługą GPU:
bazel build --config=cuda [--config=option] //tensorflow/tools/pip_package:build_pip_package
TensorFlow 1.x
Aby zbudować starszy pakiet TensorFlow 1.x, użyj opcji --config=v1
:
bazel build --config=v1 [--config=option] //tensorflow/tools/pip_package:build_pip_package
Opcje budowania Bazela
Zapoznaj się z dokumentacją wiersza polecenia Bazel, aby zapoznać się z opcjami kompilacji .
Budowanie TensorFlow ze źródeł może zużywać dużo pamięci RAM. Jeśli twój system jest ograniczony pamięcią, ogranicz użycie pamięci RAM przez Bazel za pomocą: --local_ram_resources=2048
.
Oficjalne pakiety TensorFlow są zbudowane przy użyciu łańcucha narzędzi GCC 7.3, który jest zgodny ze standardem pakietów manylinux2010.
W przypadku GCC 5 i nowszych, kompatybilność ze starszym ABI można zbudować za pomocą: --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
. Kompatybilność z ABI zapewnia, że niestandardowe operacje zbudowane na podstawie oficjalnego pakietu TensorFlow będą nadal działać z pakietem zbudowanym w GCC 5.
Zbuduj pakiet
Polecenie bazel build
tworzy plik wykonywalny o nazwie build_pip_package
— jest to program, który buduje pakiet pip
. Uruchom plik wykonywalny, jak pokazano poniżej, aby zbudować pakiet .whl
w katalogu /tmp/tensorflow_pkg
.
Aby zbudować z gałęzi wydania:
./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
Aby zbudować z wzorca, użyj --nightly_flag
, aby uzyskać odpowiednie zależności:
./bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag /tmp/tensorflow_pkg
Chociaż możliwe jest zbudowanie zarówno konfiguracji CUDA, jak i innych niż CUDA w tym samym drzewie źródłowym, zaleca się uruchomienie bazel clean
podczas przełączania między tymi dwiema konfiguracjami w tym samym drzewie źródłowym.
Zainstaluj pakiet
Nazwa wygenerowanego pliku .whl
zależy od wersji TensorFlow i platformy. Użyj pip install
, aby zainstalować pakiet, na przykład:
pip install /tmp/tensorflow_pkg/tensorflow-version-tags.whl
Kompilacje Docker Linux
Obrazy programistyczne Docker firmy TensorFlow to łatwy sposób na skonfigurowanie środowiska do budowania pakietów Linux ze źródeł. Te obrazy zawierają już kod źródłowy i zależności wymagane do zbudowania TensorFlow. Przejdź do przewodnika po TensorFlow Docker, aby uzyskać instrukcje instalacji i listę dostępnych tagów obrazu .
Tylko procesor
Poniższy przykład używa obrazu :devel
do zbudowania pakietu tylko dla procesora z najnowszego kodu źródłowego TensorFlow. Sprawdź w przewodniku Dockera dostępne znaczniki TensorFlow -devel
.
Pobierz najnowszy obraz rozwojowy i uruchom kontener Docker, którego użyjesz do zbudowania pakietu pip :
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
Powyższe polecenie docker docker run
uruchamia powłokę w katalogu /tensorflow_src
— katalogu głównym drzewa źródłowego. Montuje bieżący katalog hosta w katalogu /mnt
kontenera i przekazuje informacje o użytkowniku hosta do kontenera za pomocą zmiennej środowiskowej (używanej do ustawiania uprawnień — Docker może to utrudnić).
Alternatywnie, aby zbudować kopię hosta TensorFlow w kontenerze, zamontuj drzewo źródłowe hosta w katalogu /tensorflow
kontenera:
docker run -it -w /tensorflow -v /path/to/tensorflow:/tensorflow -v $PWD:/mnt \ -e HOST_PERMS="\\((id -u):\\)(id -g)" tensorflow/tensorflow:devel bash
Po skonfigurowaniu drzewa źródłowego zbuduj pakiet TensorFlow w środowisku wirtualnym kontenera:
- Skonfiguruj kompilację — powoduje to monitowanie użytkownika o udzielenie odpowiedzi na pytania dotyczące konfiguracji kompilacji.
- Zbuduj narzędzie używane do tworzenia pakietu pip .
- Uruchom narzędzie, aby utworzyć pakiet pip .
- Dostosuj uprawnienia własności do pliku poza kontenerem.
./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
Zainstaluj i zweryfikuj pakiet w kontenerze:
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__)"
Na komputerze hosta pakiet TensorFlow pip znajduje się w bieżącym katalogu (z uprawnieniami użytkownika hosta): ./tensorflow- version - tags .whl
Obsługa GPU
Docker to najprostszy sposób na zbudowanie obsługi GPU dla TensorFlow, ponieważ maszyna hosta wymaga tylko sterownika NVIDIA® (nie trzeba instalować zestawu narzędzi NVIDIA® CUDA® ). Zapoznaj się z przewodnikiem obsługi GPU i przewodnikiem TensorFlow Docker, aby skonfigurować nvidia-docker (tylko Linux).
Poniższy przykład pobiera obraz TensorFlow :devel-gpu
i używa nvidia-docker
do uruchomienia kontenera z obsługą GPU. Ten obraz programistyczny jest skonfigurowany do budowania pakietu pip z obsługą GPU:
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
Następnie w środowisku wirtualnym kontenera zbuduj pakiet TensorFlow z obsługą GPU:
./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
Zainstaluj i zweryfikuj pakiet w kontenerze i sprawdź 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')))"
Testowane konfiguracje kompilacji
Linux
procesor
Wersja | Wersja Pythona | Kompilator | Narzędzia do budowania |
---|---|---|---|
przepływ tensorowy-2.9.0 | 3,7-3,10 | GCC 9.3.1 | Bazel 5.0.0 |
przepływ tensorowy-2,8.0 | 3,7-3,10 | GCC 7.3.1 | Bazylea 4.2.1 |
przepływ tensorowy-2.7.0 | 3,7-3,9 | GCC 7.3.1 | Bazylea 3.7.2 |
przepływ tensorowy-2,6,0 | 3,6-3,9 | GCC 7.3.1 | Bazylea 3.7.2 |
przepływ tensorowy-2,5,0 | 3,6-3,9 | GCC 7.3.1 | Bazylea 3.7.2 |
przepływ tensorowy-2.4.0 | 3,6-3,8 | GCC 7.3.1 | Bazel 3.1.0 |
przepływ tensorowy-2.3.0 | 3,5-3,8 | GCC 7.3.1 | Bazel 3.1.0 |
przepływ tensorowy-2.2.0 | 3,5-3,8 | GCC 7.3.1 | Bazel 2.0.0 |
przepływ tensorowy-2.1.0 | 2,7, 3,5-3,7 | GCC 7.3.1 | Bazylego 0.27.1 |
przepływ tensorowy-2.0.0 | 2,7, 3,3-3,7 | GCC 7.3.1 | Bazylego 0,26,1 |
przepływ tensorowy-1.15.0 | 2,7, 3,3-3,7 | GCC 7.3.1 | Bazylego 0,26,1 |
przepływ tensorowy-1.14.0 | 2,7, 3,3-3,7 | GCC 4,8 | Bazylego 0.24.1 |
przepływ tensorowy-1.13.1 | 2,7, 3,3-3,7 | GCC 4,8 | Bazylego 0.19.2 |
przepływ tensorowy-1.12.0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazel 0.15.0 |
przepływ tensorowy-1.11.0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazel 0.15.0 |
przepływ tensorowy-1.10.0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazel 0.15.0 |
przepływ tensorowy-1.9.0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazylego 0.11.0 |
przepływ tensorowy-1,8.0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazel 0.10.0 |
przepływ tensorowy-1,7.0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazel 0.10.0 |
przepływ tensorowy-1,6,0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazel 0.9.0 |
przepływ tensorowy-1.5.0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazel 0.8.0 |
przepływ tensorowy-1.4.0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazel 0,5,4 |
przepływ tensorowy-1,3,0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazyl 0,4,5 |
przepływ tensorowy-1.2.0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazyl 0,4,5 |
przepływ tensorowy-1.1.0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazel 0.4.2 |
przepływ tensorowy-1.0.0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazel 0.4.2 |
GPU
Wersja | Wersja Pythona | Kompilator | Narzędzia do budowania | cuDNN | CUDA |
---|---|---|---|---|---|
przepływ tensorowy-2.9.0 | 3,7-3,10 | GCC 9.3.1 | Bazel 5.0.0 | 8.1 | 11.2 |
przepływ tensorowy-2,8.0 | 3,7-3,10 | GCC 7.3.1 | Bazylea 4.2.1 | 8.1 | 11.2 |
przepływ tensorowy-2.7.0 | 3,7-3,9 | GCC 7.3.1 | Bazylea 3.7.2 | 8.1 | 11.2 |
przepływ tensorowy-2,6,0 | 3,6-3,9 | GCC 7.3.1 | Bazylea 3.7.2 | 8.1 | 11.2 |
przepływ tensorowy-2,5,0 | 3,6-3,9 | GCC 7.3.1 | Bazylea 3.7.2 | 8.1 | 11.2 |
przepływ tensorowy-2.4.0 | 3,6-3,8 | GCC 7.3.1 | Bazel 3.1.0 | 8,0 | 11,0 |
przepływ tensorowy-2.3.0 | 3,5-3,8 | GCC 7.3.1 | Bazel 3.1.0 | 7,6 | 10.1 |
przepływ tensorowy-2.2.0 | 3,5-3,8 | GCC 7.3.1 | Bazel 2.0.0 | 7,6 | 10.1 |
przepływ tensorowy-2.1.0 | 2,7, 3,5-3,7 | GCC 7.3.1 | Bazylego 0.27.1 | 7,6 | 10.1 |
przepływ tensorowy-2.0.0 | 2,7, 3,3-3,7 | GCC 7.3.1 | Bazylego 0,26,1 | 7,4 | 10,0 |
tensorflow_gpu-1.15.0 | 2,7, 3,3-3,7 | GCC 7.3.1 | Bazylego 0,26,1 | 7,4 | 10,0 |
tensorflow_gpu-1.14.0 | 2,7, 3,3-3,7 | GCC 4,8 | Bazylego 0.24.1 | 7,4 | 10,0 |
tensorflow_gpu-1.13.1 | 2,7, 3,3-3,7 | GCC 4,8 | Bazylego 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 | Bazylego 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 | Bazyl 0,4,5 | 6 | 8 |
tensorflow_gpu-1.2.0 | 2,7, 3,3-3,6 | GCC 4,8 | Bazyl 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 |
System operacyjny Mac
procesor
Wersja | Wersja Pythona | Kompilator | Narzędzia do budowania |
---|---|---|---|
przepływ tensorowy-2.9.0 | 3,7-3,10 | Clang z xcode 10.14 | Bazel 5.0.0 |
przepływ tensorowy-2,8.0 | 3,7-3,10 | Clang z xcode 10.14 | Bazylea 4.2.1 |
przepływ tensorowy-2.7.0 | 3,7-3,9 | Clang z xcode 10.11 | Bazylea 3.7.2 |
przepływ tensorowy-2,6,0 | 3,6-3,9 | Clang z xcode 10.11 | Bazylea 3.7.2 |
przepływ tensorowy-2,5,0 | 3,6-3,9 | Clang z xcode 10.11 | Bazylea 3.7.2 |
przepływ tensorowy-2.4.0 | 3,6-3,8 | Clang z xcode 10.3 | Bazel 3.1.0 |
przepływ tensorowy-2.3.0 | 3,5-3,8 | Clang z xcode 10.1 | Bazel 3.1.0 |
przepływ tensorowy-2.2.0 | 3,5-3,8 | Clang z xcode 10.1 | Bazel 2.0.0 |
przepływ tensorowy-2.1.0 | 2,7, 3,5-3,7 | Clang z xcode 10.1 | Bazylego 0.27.1 |
przepływ tensorowy-2.0.0 | 2,7, 3,5-3,7 | Clang z xcode 10.1 | Bazylego 0.27.1 |
przepływ tensorowy-2.0.0 | 2,7, 3,3-3,7 | Clang z xcode 10.1 | Bazylego 0,26,1 |
przepływ tensorowy-1.15.0 | 2,7, 3,3-3,7 | Clang z xcode 10.1 | Bazylego 0,26,1 |
przepływ tensorowy-1.14.0 | 2,7, 3,3-3,7 | Clang z xcode | Bazylego 0.24.1 |
przepływ tensorowy-1.13.1 | 2,7, 3,3-3,7 | Clang z xcode | Bazylego 0.19.2 |
przepływ tensorowy-1.12.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazel 0.15.0 |
przepływ tensorowy-1.11.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazel 0.15.0 |
przepływ tensorowy-1.10.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazel 0.15.0 |
przepływ tensorowy-1.9.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazylego 0.11.0 |
przepływ tensorowy-1,8.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazel 0.10.1 |
przepływ tensorowy-1,7.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazel 0.10.1 |
przepływ tensorowy-1,6,0 | 2,7, 3,3-3,6 | Clang z xcode | Bazel 0.8.1 |
przepływ tensorowy-1.5.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazel 0.8.1 |
przepływ tensorowy-1.4.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazel 0,5,4 |
przepływ tensorowy-1,3,0 | 2,7, 3,3-3,6 | Clang z xcode | Bazyl 0,4,5 |
przepływ tensorowy-1.2.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazyl 0,4,5 |
przepływ tensorowy-1.1.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazel 0.4.2 |
przepływ tensorowy-1.0.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazel 0.4.2 |
GPU
Wersja | Wersja Pythona | Kompilator | Narzędzia do budowania | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow_gpu-1.1.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2,7, 3,3-3,6 | Clang z xcode | Bazel 0.4.2 | 5.1 | 8 |