Jak skompilować Tensorflow z instrukcjami SSE4.2 i AVX?


289

Oto wiadomość otrzymana z uruchomienia skryptu, aby sprawdzić, czy Tensorflow działa:

I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so.8.0 locally
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:910] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero

Zauważyłem, że wspomniał o SSE4.2 i AVX,

  1. Co to są SSE4.2 i AVX?
  2. W jaki sposób te SSE4.2 i AVX poprawiają obliczenia procesora dla zadań Tensorflow.
  3. Jak zmusić Tensorflow do kompilacji przy użyciu dwóch bibliotek?

18
Lubię budować z tymi flagami bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package na Xeon E5 v3, co daje mi 3-krotną poprawę szybkości procesora 8k matmul w porównaniu do oficjalnej wersji (0.35 -> 1.05 Ts / s)
Jarosław Bułatow

4
i nie zapomnij NOTE on gcc 5 or later: the binary pip packages available on the TensorFlow website are built with gcc 4, which uses the older ABI. To make your build compatible with the older ABI, you need to add --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" to your bazel build command. ABI compatibility allows custom ops built against the TensorFlow pip package to continue to work against your built package.stąd tensorflow.org/install/install_sources
Ivan Kush

4
Mam kilka skompilowanych plików binarnych dla TF obsługujących te instrukcje github.com/lakshayg/tensorflow-build . Może ci się to przydać.
Lakshay Garg,

1
@IvanKush po dodaniu tej flagi nadal nie mogę pomyślnie zaimportować tensorflow (kompilacja w porządku). Jeśli udało Ci się skompilować z gcc 5, zobacz: stackoverflow.com/questions/45877158/...
anon01

1
Jeśli korzystasz z Ubuntu 16.04, mamy kompilacje dla prawie wszystkich wariantów, których prawdopodobnie będziesz potrzebować na github.com/mind/wheels
Danqing

Odpowiedzi:


160

Właśnie natknąłem się na ten sam problem, wydaje się, że sugestia Jarosława Bułatowa nie obejmuje wsparcia SSE4.2, dodawanie --copt=-msse4.2wystarczyłoby. W końcu udało mi się zbudować

bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

bez ostrzeżenia lub błędów.

Prawdopodobnie najlepszym wyborem dla dowolnego systemu jest:

bazel build -c opt --copt=-march=native --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

( Aktualizacja: skrypty kompilacji mogą jeść-march=native , prawdopodobnie dlatego, że zawiera= .)

-mfpmath=bothdziała tylko z gcc, a nie clang. -mfpmath=ssejest prawdopodobnie równie dobry, jeśli nie lepszy, i jest domyślny dla x86-64. Wersje 32-bitowe są domyślnie ustawione na -mfpmath=387, więc ich zmiana pomoże w wersji 32-bitowej. (Ale jeśli chcesz mieć wysoką wydajność w przypadku łamania liczb, powinieneś zbudować 64-bitowe pliki binarne).

Nie jestem pewien, jakie są domyślne ustawienia TensorFlow -O2 lub -O3jest. gcc -O3umożliwia pełną optymalizację, w tym automatyczną wektoryzację, ale czasem może to spowolnić kod.


Co to robi: --copt forbazel build przekazuje opcję bezpośrednio do gcc w celu kompilacji plików C i C ++ (ale nie łączy, więc potrzebujesz innej opcji do optymalizacji czasu łączenia plików między plikami)

x86-64 gcc domyślnie używa tylko SSE2 lub starszych instrukcji SIMD, więc możesz uruchomić pliki binarne na dowolnym systemie x86-64. (Zobacz https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html ). Nie tego chcesz. Chcesz stworzyć plik binarny, który będzie korzystał ze wszystkich instrukcji, które procesor może uruchomić, ponieważ uruchamiasz ten plik binarny tylko w systemie, w którym go zbudowałeś.

-march=nativewłącza wszystkie opcje obsługiwane przez procesor, dzięki czemu staje się -mavx512f -mavx2 -mavx -mfma -msse4.2zbędny. (Również -mavx2już włącza-mavx i -msse4.2tak polecenie Jarosława powinno być w porządku). Również jeśli używasz procesora, który nie obsługuje jednej z tych opcji (np. FMA), użycie -mfmaspowoduje utworzenie pliku binarnego, który będzie zawierał błędy w niezgodnych z prawem instrukcjach.

TensorFlow ./configuredomyślnie włącza-march=native , więc korzystanie z niego powinno unikać konieczności ręcznego określania opcji kompilatora.

-march=nativewłącza -mtune=native, więc optymalizuje pod kątem procesora , np. która sekwencja instrukcji AVX jest najlepsza dla niezrównanych obciążeń.

Wszystko to dotyczy gcc, clang lub ICC. (W przypadku ICC możesz użyć -xHOSTzamiast -march=native.)


6
To działa rzeczywiście> +1! Wygląda więc na to, że -march=nativenie działa. Poza tym upuszczanie --config=cuda(jeśli obsługa CUDA nie jest potrzebna) i -k(ponieważ nie wystąpił błąd podczas kompilacji) również działa.
Marc

4
Po odinstalowaniu i ponownej instalacji nowej skompilowanej wersji nadal otrzymuję ostrzeżenia dla AVX, AVX2 i FMA.
Benedikt S. Vogler

5
Musiałem upuścić, --copt=-mfpmath=bothaby działało z systemem clangmacOS. Czy wpływa to na wynikowy plik binarny?
gc5

2
Tylko dla wyjaśnienia: kiedy tworzę plik konfiguracyjny ... czy używam po prostu --copt = -march = native? Czy też umieszczam wszystkie te optymalizacje, które widzę w oryginalnych postach, w których mam opcję wprowadzenia optymalizacji?
Thornhale,

1
Pojawia się błąd informujący, że polecenie „build” jest obsługiwane tylko z obszaru roboczego? Co robić?
skromny

133

Zacznijmy od wyjaśnienia, dlaczego widzisz te ostrzeżenia w pierwszej kolejności .


Najprawdopodobniej nie zainstalowałeś TF ze źródła i zamiast tego użyłeś czegoś podobnego pip install tensorflow. Oznacza to, że zainstalowałeś wcześniej zbudowane (przez kogoś innego) pliki binarne, które nie zostały zoptymalizowane dla Twojej architektury. I te ostrzeżenia mówią dokładnie to: coś jest dostępne w twojej architekturze, ale nie zostanie użyte, ponieważ plik binarny nie został z nim skompilowany. Oto część z dokumentacji .

TensorFlow sprawdza przy starcie, czy został skompilowany z optymalizacjami dostępnymi na CPU. Jeśli optymalizacje nie zostaną uwzględnione, TensorFlow wyśle ​​ostrzeżenia, np. Instrukcje AVX, AVX2 i FMA nie zostaną uwzględnione.

Dobrą rzeczą jest to, że prawdopodobnie po prostu chcesz się uczyć / eksperymentować z TF, aby wszystko działało poprawnie i nie powinieneś się tym martwić


Co to są SSE4.2 i AVX?

Wikipedia ma dobre wyjaśnienie dotyczące SSE4.2 i AVX . Ta wiedza nie musi być dobra w uczeniu maszynowym. Możesz myśleć o nich jako o zestawie dodatkowych instrukcji dla komputera, aby używać wielu punktów danych przeciwko pojedynczej instrukcji do wykonywania operacji, które mogą być naturalnie zrównoleglone (na przykład dodanie dwóch tablic).

Zarówno SSE, jak i AVX są implementacją abstrakcyjnej idei SIMD (pojedyncza instrukcja, wiele danych), którą jest

klasa równoległych komputerów w taksonomii Flynna. Opisuje komputery z wieloma elementami przetwarzania, które wykonują tę samą operację na wielu punktach danych jednocześnie. Zatem takie maszyny wykorzystują równoległość na poziomie danych, ale nie współbieżność: istnieją równoczesne (równoległe) obliczenia, ale tylko jeden proces (instrukcja) w danym momencie

To wystarczy, aby odpowiedzieć na twoje następne pytanie.


W jaki sposób te SSE4.2 i AVX poprawiają obliczenia procesora dla zadań TF

Pozwalają na bardziej wydajne obliczanie różnych operacji wektorowych (macierz / tensor). Możesz przeczytać więcej w tych slajdach


Jak zmusić Tensorflow do kompilacji przy użyciu dwóch bibliotek?

Musisz mieć plik binarny, który został skompilowany, aby skorzystać z tych instrukcji. Najłatwiej jest to skompilować samodzielnie . Jak sugerowali Mike i Yaroslav, możesz użyć następującego polecenia bazel

bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package


4
Co oznacza ta linia poleceń? I czy powinienem zainstalować bazelw tym przypadku?
YZ

1
Czy ktoś buduje pod Windowsem 64-bitowy z MSYS2 lub Visual Studio 2017 ommunity Edition? i może udostępniać kroki?
James Chang

1
Czy ten pakiet pip można zainstalować w środowisku conda na komputerze lokalnym?
dgketchum

3
Po ponad 3 godzinach (Czas, który upłynął: 11984.258s) dostałem FAILED: Build did NOT complete successfully. Samo skompilowanie nie jest takie proste.
imbrizi

to samo tutaj. Moja kompilacja również nie powiodła się, a następnie w dziennikach widzę, że: cl: ostrzeżenie wiersza polecenia D9002: ignorowanie nieznanej opcji „-mavx” cl: ostrzeżenie wiersza polecenia D9002: ignorowanie nieznanej opcji „-mavx2” cl: ostrzeżenie wiersza polecenia D9002: ignorowanie nieznana opcja „-mfma” cl: Ostrzeżenie wiersza polecenia D9002: ignorowanie nieznanej opcji „-mfpmath = oba” cl: Ostrzeżenie wiersza polecenia D9002: ignorowanie nieznanej opcji „-msse4.2” cl: Ostrzeżenie wiersza polecenia D9002: ignorowanie nieznanej opcji ”- fno-strict-aliasing 'cl: Ostrzeżenie wiersza polecenia D9002: ignorowanie nieznanej opcji „-fexceptions”, więc te opcje nie są znane
Shilan

53

Pozwól mi najpierw odpowiedzieć na twoje trzecie pytanie:

Jeśli chcesz uruchomić samodzielnie skompilowaną wersję w Conda-env, możesz to zrobić. Są to ogólne instrukcje, które uruchamiam, aby zainstalować tensorflow w moim systemie z dodatkowymi instrukcjami. Uwaga: Ta kompilacja dotyczyła kompilacji AMD A10-7850 (sprawdź procesor pod kątem obsługiwanych instrukcji ... może się różnić) z systemem Ubuntu 16.04 LTS. Używam Python 3.5 w moim conda-env. Kredyt trafia na stronę instalacji źródła tensorflow i odpowiedzi podane powyżej.

git clone https://github.com/tensorflow/tensorflow 
# Install Bazel
# https://bazel.build/versions/master/docs/install.html
sudo apt-get install python3-numpy python3-dev python3-pip python3-wheel
# Create your virtual env with conda.
source activate YOUR_ENV
pip install six numpy wheel, packaging, appdir
# Follow the configure instructions at:
# https://www.tensorflow.org/install/install_sources
# Build your build like below. Note: Check what instructions your CPU 
# support. Also. If resources are limited consider adding the following 
# tag --local_resources 2048,.5,1.0 . This will limit how much ram many
# local resources are used but will increase time to compile.
bazel build -c opt --copt=-mavx --copt=-msse4.1 --copt=-msse4.2  -k //tensorflow/tools/pip_package:build_pip_package
# Create the wheel like so:
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
# Inside your conda env:
pip install /tmp/tensorflow_pkg/NAME_OF_WHEEL.whl
# Then install the rest of your stack
pip install keras jupyter etc. etc.

Co do twojego drugiego pytania:

Moim zdaniem warto samodzielnie skompilować wersję z optymalizacjami. W mojej konkretnej konfiguracji obliczenia, które wcześniej zajmowały 560–600 sekund, teraz zajmują tylko około 300 sekund! Chociaż dokładne liczby będą się różnić, myślę, że można spodziewać się ogólnie około 35-50% wzrostu prędkości w konkretnej konfiguracji.

Wreszcie twoje pierwsze pytanie:

Wiele odpowiedzi podano już powyżej. Podsumowując: AVX , SSE4.1, SSE4.2 , MFA to różne rodzaje rozszerzonych zestawów instrukcji na procesorach X86. Wiele zawiera zoptymalizowane instrukcje przetwarzania operacji macierzowych lub wektorowych.

Podkreślę moje własne nieporozumienie, aby, mam nadzieję, zaoszczędzić ci trochę czasu: to nie tak, że SSE4.2 jest nowszą wersją instrukcji zastępujących SSE4.1. SSE4 = SSE4.1 (zestaw 47 instrukcji) + SSE4.2 (zestaw 7 instrukcji).

W kontekście kompilacji tensorflow, jeśli komputer obsługuje AVX2 i AVX oraz SSE4.1 i SSE4.2, powinieneś umieścić te flagi optymalizacji dla wszystkich. Nie rób tak jak ja i po prostu idź z SSE4.2 myśląc, że jest nowszy i powinien zastąpić SSE4.1. To oczywiście ŹLE! Musiałem ponownie skompilować z tego powodu, który kosztował mnie dobre 40 minut.


gdzie jest przechowywany plik .whl, bo chcę go również zainstalować w systemie Windows?
WiLL_K

Jest przechowywany tutaj: / tmp / tensorflow_pkg (na dysku linux)
Thornhale

Czy możesz mi powiedzieć, ile czasu to zajmie. Jest około 2 godzin, a mój laptop zamarł. Działa Ububtu z 4 GB pamięci RAM i procesorem i5
WiLL_K

Hmm, kompilacja tensorflow zajmuje dużo czasu. Na moim laptopie z 8 GB zajęło to około 1,5 godziny. Jednak czasy instalacji mogą się różnić i będzie zależał od dostępnego pamięci RAM. Te kompilacje są znane z tego, że zajmują dużo pamięci RAM. Aby zmniejszyć wymagania dotyczące zasobów i być może zapobiec zawieszeniu się, możesz uruchomić kompilację, dodając następującą flagę po „kompilacji bazel”: --local_resources 2048, .5,1.0 Często pomaga to w zawieszaniu się, ale prawdopodobnie wydłuży czas kompilacji. Na przykład: W jednym z moich szybszych systemów kompilacja bez flagi zajęła 2200 sekund, z flagą 4500!
Thornhale,

1
Ogólnie rzecz biorąc, odkryłem, że ML na oknach to duży ból z tyłu. W końcu spędzasz dużo czasu próbując sprawić, by rzeczy działały tak, że działają, jeśli pracujesz w środowisku Linux. Uważam, że tensorflow należy skompilować dla każdego systemu operacyjnego. Ponadto, jeśli przejdziesz tutaj: link , zobaczysz, że tensorflow nie jest oficjalnie obsługiwany. Istnieje przewodnik dotyczący kompilacji tensorflow dla Windows tutaj: link . Chociaż muszę przyznać, że tego nie próbowałem. Używam tylko Ubuntu.
Thornhale,

25

Są to zestawy instrukcji przetwarzania wektorowego SIMD .

Korzystanie z instrukcji wektorowych jest szybsze w przypadku wielu zadań; Uczenie maszynowe jest takim zadaniem.

Cytując dokumenty instalacyjne tensorflow :

Aby być kompatybilnym z jak najszerszą gamą maszyn, TensorFlow domyślnie używa tylko instrukcji SIME SSE4.1 na maszynach x86. Większość współczesnych komputerów PC i Mac obsługuje bardziej zaawansowane instrukcje, więc jeśli --copt=-march=nativebudujesz plik binarny, który będziesz działał tylko na własnym komputerze, możesz je włączyć, używając polecenia kompilacji bazel.


Dlaczego binarny Tensorflow nie korzysta z wysyłania CPU? Czy to źle obsługiwane przez GCC?
Chris Pushbullet

4
Link „Dokumenty instalacyjne tensorflow” nie działa. Zastanawiam się więc, czy ta odpowiedź jest nadal aktualna. Proszę odpowiedz!
Thornhale,

@ChrisPushbullet możesz skompilować Tensorflow w celu obsługi kilku różnych możliwości obliczeniowych dla GPU, ale znacznie zwiększają one rozmiar binarny. Domyślam się, że to samo dotyczy procesora.
Davidmh,

22

Dzięki tym wszystkim odpowiedziom + próbom i błędom udało mi się zainstalować go na komputerze Mac z clang. Więc po prostu udostępnij moje rozwiązanie, na wypadek, gdyby było komuś przydatne.

  1. Postępuj zgodnie z instrukcjami w dokumentacji - instalacja TensorFlow ze źródeł

  2. Gdy pojawi się monit o

    Podaj flagi optymalizacji do użycia podczas kompilacji, gdy podano opcję bazel „--config = opt” [Domyślnie jest to -arch = macierzysty]

następnie skopiuj i wklej ten ciąg:

-mavx -mavx2 -mfma -msse4.2

(Domyślna opcja spowodowała błędy, podobnie jak niektóre inne flagi. Nie otrzymałem błędów z powyższymi flagami. BTW Odpowiedziałem nna wszystkie pozostałe pytania)

Po instalacji weryfikuję przyspieszenie ~ 2x do 2,5x podczas szkolenia modeli głębokich w odniesieniu do innej instalacji opartej na domyślnych kołach - Instalowanie TensorFlow na macOS

Mam nadzieję, że to pomoże


4
-march=nativepowinno być jeszcze lepiej, jeśli Twój kompilator obsługuje go poprawnie. Pozwala również -mtune=nativena dokonywanie dobrych wyborów instrukcji dla twojego procesora. np. w Haswell i późniejszych, wyłącza -mavx256-split-unaligned-storei -mavx256-split-unaligned-load, które są domyślnie włączone -mtune=generici obniżają wydajność, gdy dane nie są wyrównane, ale okazuje się, że są w czasie wykonywania.
Peter Cordes,

1
Dzięki! W moim przypadku -march=nativespowodował błąd, podczas gdy inne opcje nie. Może to specyficzny kompilator. Dzieliłem się tym właśnie na wypadek, gdyby inni doświadczyli tej samej blokady.
JARS,

1
Jaki błąd? O ile system kompilacji nie dusi się na łańcuchu z nim =zawartym, albo nie używasz gcclub clangpowinien działać. I czy -mtune=native -mavx2 -mfma działa dla ciebie? Czy -mtune=skylake? (Lub cokolwiek masz procesor). BTW, -mavx2implikuje -mavxi -msse4.2. Uwzględnienie ich wszystkich w przepisie nie zaszkodzi i myślę, że łatwiej jest pominąć te, których procesor nie obsługuje.
Peter Cordes,

1
Jakiś czas temu zredagowałem najlepszą odpowiedź na to pytanie, ale sam nie używam tensorflow. Jeśli coś jest nie tak z -march=nativejego systemem kompilacji, chciałbym wiedzieć. (I / lub powinieneś zgłosić to wcześniej, aby mogli naprawić swoje skrypty budowania).
Peter Cordes,

1
Wielkie dzięki za sugestię. Aby to sprawdzić, ponownie uruchomiłem tylko skrypt .configure -march=nativei jest to błąd: / Users / jose / Documents / code / tmptensorflow / tensorflow / tensorflow / core / BUILD: 1442: 1: Kompilacja C ++ reguła „// tensorflow / core: lib_internal_impl” nie powiodła się (wyjście 1). W pliku dołączonym z tensorflow / core / platform / denormal.cc: 37: /Library/Developer/CommandLineTools/usr/bin/../lib/clang/7.0.2/include/pmmintrin.h:28:2: error: „zbiór instrukcji SSE3 nie włączone” #error „zestaw instrukcji SSE3 nie włączone” za pomocą Jabłko LLVM w wersji 7.0.2 (dzyń-700.1.81)
JARS

7

Niedawno zainstalowałem go ze źródła i poniżej przedstawiono wszystkie kroki potrzebne do zainstalowania go ze źródła z dostępnymi wymienionymi instrukcjami.

Inne odpowiedzi już opisują, dlaczego te komunikaty są wyświetlane. Moja odpowiedź podaje krok po kroku, jak zainstalować, co może pomóc ludziom walczyć z samą instalacją tak jak ja.

  1. Zainstaluj Bazel

Pobierz go z jednego z dostępnych wydań , na przykład 0.5.2 . Wyodrębnić go, przejdź do katalogu i skonfigurowanie go: bash ./compile.sh. Skopiuj plik wykonywalny do /usr/local/bin:sudo cp ./output/bazel /usr/local/bin

  1. Zainstaluj Tensorflow

Klonuj tensorflow: git clone https://github.com/tensorflow/tensorflow.git Przejdź do sklonowanego katalogu, aby go skonfigurować:./configure

Poprosi Cię o kilka pytań, poniżej zasugerowałem odpowiedź na każde z pytań, możesz oczywiście wybrać własne odpowiedzi według własnego uznania:

Using python library path: /usr/local/lib/python2.7/dist-packages
Do you wish to build TensorFlow with MKL support? [y/N] y
MKL support will be enabled for TensorFlow
Do you wish to download MKL LIB from the web? [Y/n] Y
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]: 
Do you wish to use jemalloc as the malloc implementation? [Y/n] n
jemalloc disabled
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] N
No Google Cloud Platform support will be enabled for TensorFlow
Do you wish to build TensorFlow with Hadoop File System support? [y/N] N
No Hadoop File System support will be enabled for TensorFlow
Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N] N
No XLA JIT support will be enabled for TensorFlow
Do you wish to build TensorFlow with VERBS support? [y/N] N
No VERBS support will be enabled for TensorFlow
Do you wish to build TensorFlow with OpenCL support? [y/N] N
No OpenCL support will be enabled for TensorFlow
Do you wish to build TensorFlow with CUDA support? [y/N] N
No CUDA support will be enabled for TensorFlow
  1. Pakiet pip. Aby go zbudować, musisz opisać, jakich instrukcji chcesz (wiesz, te Tensorflow poinformowały, że ich brakuje).

Zbuduj skrypt pip: bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.1 --copt=-msse4.2 -k //tensorflow/tools/pip_package:build_pip_package

Zbuduj pakiet pip: bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

Zainstaluj właśnie utworzony pakiet pip Tensorflow: sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl

Teraz przy następnym uruchomieniu Tensorflow nie będzie już narzekać na brakujące instrukcje.


4
Budowanie z just -c opt --copt=-march=nativepowinno być co najmniej tak dobre, jak --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2. (Oba wyciszą ostrzeżenie, ale -march=nativemogą zrobić jeszcze szybszy kod, dostrajając specjalnie do procesora w systemie, na którym budujesz). Zauważ też, że --copt=-mavx2 --copt=-mfmaimplikuje to wszystkie wcześniejsze opcje AVX i SSE, więc ten długi ciąg opcji został wyraźnie napisany przez kogoś, kto nie rozumie opcji gcc.
Peter Cordes

1
@PeterCordes, spójrz na ten problem ( github.com/tensorflow/tensorflow/issues/7449 ), nawet opiekunowie bazela nie byli asertywni, dlaczego march = native nie działał zgodnie z oczekiwaniami. Jak się wydaje, „rozumiesz opcje gcc”, prawdopodobnie możesz pomóc im to naprawić, ponieważ oznaczyli problem jako wymagający „wsparcia społeczności”.
Eduardo,

Dzięki, spojrzę ... Hmm, niektórzy mówią, że --copt=-mavx2to nie działa. Jeśli --copt=-mfma działa, --copt=-march=nativepowinno działać, chyba że parsowanie =jest problemem. W przypadku gcc / clang / icc zdecydowanie chcesz, aby skrypt kompilacji ostatecznie przeszedł -march=nativedo kompilatora. Sprawienie, by stało się to za pomocą skryptów kompilacji, staje się sztuczką.
Peter Cordes

7

To jest najprostsza metoda. Tylko jeden krok.

Ma znaczący wpływ na prędkość. W moim przypadku czas potrzebny na trening był prawie o połowę mniejszy.

Zobacz niestandardowe wersje tensorflow


2
Kompilacje systemu Windows, w tym AVX2 github.com/fo40225/tensorflow-windows-wheel
Chris Moschini

@Seragagar Twoja metoda obniżyła mój tensorflow i keras.
KPMG

Upewnij się, że instalujesz poprawny plik zgodnie z wersją TensorFlow, Python i sprzętem.
Sreeragh AR

TensFlowWersja @ SurreaghAR to 1.10.0 i używa MacOS Sierra. Pomóż mi znaleźć plik.
KPMG

Hmm .. Nie mogę znaleźć jednego odpowiadającego twoim wersjom. Ktoś musi zbudować niestandardowe koło. github.com/yaroslavvb/tensorflow-community-wheels Natychmiastowym rozwiązaniem może być użycie Tensorflow 1.9.0
Sreeragh AR


5

Aby skompilować TensorFlow z SSE4.2 i AVX, możesz użyć bezpośrednio

bazel build --config = mkl --config = "opt" --copt = "- march = broadwell" --copt = "- O3" // tensorflow / tools / pip_package: build_pip_package

Źródło: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl


1
Czy ostatnio coś się zmieniło? Ostatnio sprawdziłem, czy --copt="-march=native"jadłem =. (A BTW, te podwójne cudzysłowy nic nie robią; zostaną usunięte przez powłokę, zanim bazelzobaczy wiersz poleceń.)
Peter Cordes

4

2.0 KOMPATYBILNE ROZWIĄZANIE:

Wykonaj poniższe polecenia w Terminalu (Linux / MacOS) lub w wierszu polecenia (Windows), aby zainstalować Tensorflow 2.0 za pomocą Bazel :

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

#The repo defaults to the master development branch. You can also checkout a release branch to build:
git checkout r2.0

#Configure the Build => Use the Below line for Windows Machine
python ./configure.py 

#Configure the Build => Use the Below line for Linux/MacOS Machine
./configure
#This script prompts you for the location of TensorFlow dependencies and asks for additional build configuration options. 

#Build Tensorflow package

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

#GPU support
bazel build --config=opt --config=cuda --define=no_tensorflow_py_deps=true //tensorflow/tools/pip_package:build_pip_package

2
Która część tego określa -march=nativelub inne opcje GCC / clang? Nie widzę w tym żadnej wzmianki o AVX, FMA ani SSE4.2. (A czy skrypt kompilacji Bazela lub Tensorflow jest nadal zepsuty w taki sposób, że tylko opcje takie jak -mavxpraca, nie -march=native? Jeśli to właśnie był problem w pierwszej odpowiedzi na to pytanie)
Peter Cordes

do obsługi procesorów z tf w wersji 2.1.0 opcja --config = opt nie działała dla mnie, rozwiązałem to z --config = v2. Warto również wspomnieć, że odpowiednia wersja bazela do jej zbudowania to 29,0.
Tolik

2

Podczas budowania TensorFlow ze źródła uruchom configureskrypt. Jedno z pytań configurezadanych przez skrypt jest następujące:

Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]

configureSkrypt przyczepić flagę (ów), zdefiniowanych do polecenia Bazel że buduje pakiet TensorFlow PIP. Ogólnie rzecz biorąc, możesz odpowiedzieć na ten monit na jeden z dwóch sposobów:

  • Jeśli budujesz TensorFlow na tym samym typie procesora co ten, na którym będziesz uruchamiał TensorFlow, powinieneś zaakceptować default ( -march=native). Ta opcja zoptymalizuje wygenerowany kod dla typu procesora komputera.
  • Jeśli budujesz TensorFlow na jednym typie procesora, ale uruchomisz TensorFlow na innym typie procesora, rozważ podanie bardziej szczegółowej flagi optymalizacji, zgodnie z opisem w dokumentacji gcc .

Po skonfigurowaniu TensorFlow zgodnie z opisem na poprzedniej liście punktowanej powinieneś być w stanie zbudować TensorFlow w pełni zoptymalizowany dla docelowego procesora, po prostu dodając --config=optflagę do dowolnego uruchomionego polecenia bazel.


-1

Aby ukryć te ostrzeżenia, możesz to zrobić przed rzeczywistym kodem.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf

5
Ciche działanie wolniej, niż mogłoby na twoim sprzęcie, wydaje się złym pomysłem.
Peter Cordes,

Ogólnie zgadzam się z @Peter Cordes - ale czasem miło (w zdyscyplinowany, uważny sposób) ukryć ostrzeżenia i skupić się na zadaniu.
westsider

2
@westsider: tak, może to być przydatne w niektórych przypadkach, ale nie jest to dobra odpowiedź, chyba że wskazuje na konsekwencje: rzeczywista utrata wydajności nastąpi, jeśli ukryjesz ostrzeżenia zamiast kompilacji. (Z wyjątkiem może, jeśli używasz GPU do ciężkiego podnoszenia, może nadal ostrzegać o opcjach procesora?)
Peter Cordes
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.