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,
- Co to są SSE4.2 i AVX?
- W jaki sposób te SSE4.2 i AVX poprawiają obliczenia procesora dla zadań Tensorflow.
- Jak zmusić Tensorflow do kompilacji przy użyciu dwóch bibliotek?
tensorflow
x86
compiler-optimization
simd
compiler-options
GabrielChu
źródło
źródło
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)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_sourcesOdpowiedzi:
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.2
wystarczyłoby. W końcu udało mi się zbudowaćbez ostrzeżenia lub błędów.
Prawdopodobnie najlepszym wyborem dla dowolnego systemu jest:
( Aktualizacja: skrypty kompilacji mogą jeść
-march=native
, prawdopodobnie dlatego, że zawiera=
.)-mfpmath=both
działa tylko z gcc, a nie clang.-mfpmath=sse
jest 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-O3
jest.gcc -O3
umoż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=native
włącza wszystkie opcje obsługiwane przez procesor, dzięki czemu staje się-mavx512f -mavx2 -mavx -mfma -msse4.2
zbędny. (Również-mavx2
już włącza-mavx
i-msse4.2
tak 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-mfma
spowoduje utworzenie pliku binarnego, który będzie zawierał błędy w niezgodnych z prawem instrukcjach.TensorFlow
./configure
domyślnie włącza-march=native
, więc korzystanie z niego powinno unikać konieczności ręcznego określania opcji kompilatora.-march=native
włą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ć
-xHOST
zamiast-march=native
.)źródło
-march=native
nie 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.--copt=-mfpmath=both
aby działało z systememclang
macOS. Czy wpływa to na wynikowy plik binarny?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 .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
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
źródło
bazel
w tym przypadku?FAILED: Build did NOT complete successfully
. Samo skompilowanie nie jest takie proste.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.
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.
źródło
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 :
źródło
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.Postępuj zgodnie z instrukcjami w dokumentacji - instalacja TensorFlow ze źródeł
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:
(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
n
na 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
źródło
-march=native
powinno być jeszcze lepiej, jeśli Twój kompilator obsługuje go poprawnie. Pozwala również-mtune=native
na dokonywanie dobrych wyborów instrukcji dla twojego procesora. np. w Haswell i późniejszych, wyłącza-mavx256-split-unaligned-store
i-mavx256-split-unaligned-load
, które są domyślnie włączone-mtune=generic
i obniżają wydajność, gdy dane nie są wyrównane, ale okazuje się, że są w czasie wykonywania.-march=native
spowodował 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.=
zawartym, albo nie używaszgcc
lubclang
powinien działać. I czy-mtune=native -mavx2 -mfma
działa dla ciebie? Czy-mtune=skylake
? (Lub cokolwiek masz procesor). BTW,-mavx2
implikuje-mavx
i-msse4.2
. Uwzględnienie ich wszystkich w przepisie nie zaszkodzi i myślę, że łatwiej jest pominąć te, których procesor nie obsługuje.-march=native
jego systemem kompilacji, chciałbym wiedzieć. (I / lub powinieneś zgłosić to wcześniej, aby mogli naprawić swoje skrypty budowania).-march=native
i 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)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.
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
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:
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.
źródło
-c opt --copt=-march=native
powinno być co najmniej tak dobre, jak--copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2
. (Oba wyciszą ostrzeżenie, ale-march=native
mogą zrobić jeszcze szybszy kod, dostrajając specjalnie do procesora w systemie, na którym budujesz). Zauważ też, że--copt=-mavx2 --copt=-mfma
implikuje 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.--copt=-mavx2
to nie działa. Jeśli--copt=-mfma
działa,--copt=-march=native
powinno działać, chyba że parsowanie=
jest problemem. W przypadku gcc / clang / icc zdecydowanie chcesz, aby skrypt kompilacji ostatecznie przeszedł-march=native
do kompilatora. Sprawienie, by stało się to za pomocą skryptów kompilacji, staje się sztuczką.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
źródło
TensFlow
Wersja @ SurreaghAR to 1.10.0 i używaMacOS Sierra
. Pomóż mi znaleźć plik.Skompilowałem mały skrypt Bash dla komputerów Mac (z łatwością można go przenieść na system Linux), aby pobrać wszystkie funkcje procesora i zastosować niektóre z nich do budowy TF. Im na TF Master i często używam (kilka razy w miesiącu).
https://gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f
źródło
Aby skompilować TensorFlow z SSE4.2 i AVX, możesz użyć bezpośrednio
Źródło: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl
źródło
--copt="-march=native"
jadłem=
. (A BTW, te podwójne cudzysłowy nic nie robią; zostaną usunięte przez powłokę, zanimbazel
zobaczy wiersz poleceń.)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 :
źródło
-march=native
lub 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-mavx
praca, nie-march=native
? Jeśli to właśnie był problem w pierwszej odpowiedzi na to pytanie)Podczas budowania TensorFlow ze źródła uruchom
configure
skrypt. Jedno z pytańconfigure
zadanych przez skrypt jest następujące:configure
Skrypt 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:-march=native
). Ta opcja zoptymalizuje wygenerowany kod dla typu procesora komputera.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=opt
flagę do dowolnego uruchomionego polecenia bazel.źródło
Aby ukryć te ostrzeżenia, możesz to zrobić przed rzeczywistym kodem.
źródło