Jestem nowy w TensorFlow. Niedawno go zainstalowałem (wersja Windows CPU) i otrzymałem następujący komunikat:
Pomyślnie zainstalowano tensorflow-1.4.0 tensorflow-tensorboard-0.4.0rc2
Następnie, gdy próbowałem uruchomić
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
sess.run(hello)
'Hello, TensorFlow!'
a = tf.constant(10)
b = tf.constant(32)
sess.run(a + b)
42
sess.close()
(który znalazłem przez https://github.com/tensorflow/tensorflow)
Otrzymałem następującą wiadomość:
2017-11-02 01:56:21.698935: I C:\tf_jenkins\home\workspace\rel-win\windows\36\tensorflow\core\platform\cpu_feature_guard.cc:137] Twój procesor obsługuje instrukcje, których ta wersja binarna TensorFlow nie została skompilowana do użycia: AVX AVX2
Ale kiedy uruchomiłem
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
uruchomił się tak jak powinien i wyprowadził Hello, TensorFlow!
, co wskazuje, że instalacja rzeczywiście się powiodła, ale jest coś innego, co jest nie tak.
Czy wiesz, na czym polega problem i jak go naprawić?
Nowoczesne procesory udostępniają wiele instrukcji niskiego poziomu, oprócz zwykłych arytmetycznych i logicznych, znanych jako rozszerzenia, np. SSE2, SSE4, AVX, itp. Z Wikipedii:
Advanced Vector Extensions (AVX) to rozszerzenia instrukcji x86. zestawu instrukcji architektury dla mikroprocesorów firm Intel i AMD zaproponowane przez Intel w marcu 2008 roku i po raz pierwszy obsługiwane przez Intel z Sandy Bridge procesor wysyłki w Q1 2011, a później przez AMD z > Bulldozer Bulldozer procesor wysyłki w Q3 2011. AVX zapewnia nowe funkcje, nowe instrukcje i nowy schemat kodowania.
W szczególności AVX wprowadza fused multiply-accumulate (FMA) operacje, które przyspieszają obliczenia algebry liniowej, a mianowicie dot-product, multiply matrix, convolution, itp. Prawie każdy trening uczenia maszynowego wymaga dużej ilości takich operacji, dlatego będzie szybszy na procesorze, który obsługuje AVX i FMA (do 300%). Ostrzeżenie mówi, że Twój procesor obsługuje AVX (hurra!).
Chciałbym podkreślić, że chodzi tu o tylko i wyłącznie o procesor.
Ponieważ domyślna dystrybucja tensorflow jest zbudowana bez rozszerzeń CPU, takich jak SSE4.1, SSE4.2, AVX, AVX2, FMA, itd. Domyślne kompilacje (te z pip install tensorflow
) są przeznaczone do bycia kompatybilnymi z tak wieloma procesorami jak to tylko możliwe. Innym argumentem jest to, że nawet z tymi rozszerzeniami CPU jest dużo wolniejszy niż GPU, a oczekuje się, że średnio- i wielkoskalowe szkolenia z uczenia maszynowego będą przeprowadzane na GPU.
Jeśli posiadasz układ GPU, nie powinieneś przejmować się obsługą AVX, ponieważ większość kosztownych operacji będzie wysyłana na urządzenie GPU (chyba że zostanie to wyraźnie wyłączone). W tym przypadku, możesz po prostu zignorować to ostrzeżenie poprzez
# Just disables the warning, doesn't enable AVX/FMA
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
... lub ustawiając export TF_CPP_MIN_LOG_LEVEL=2
, jeśli używasz systemu Unix. Tensorflow i tak działa dobrze, ale nie zobaczysz tych irytujących ostrzeżeń.
Jeśli nie masz GPU i chcesz wykorzystać CPU tak bardzo, jak to tylko możliwe, powinieneś zbudować tensorflow ze źródła zoptymalizowanego dla twojego CPU** z AVX, AVX2 i FMA włączonymi, jeśli twój CPU je obsługuje. Zostało to omówione w to pytanie, a także ten problem GitHub. Tensorflow używa systemu budowania ad-hoc o nazwie bazel i budowanie go nie jest takie trywialne, ale z pewnością jest do zrobienia. Po tym, nie tylko ostrzeżenie zniknie, ale również wydajność tensorflow powinna się poprawić.
Zaktualizuj binaria tensorflow dla swojego CPU & OS używając tej komendy
pip install --ignore-installed --upgrade "Download URL"
Adres url do pobrania pliku whl można znaleźć tutaj
Istnieją zyski wydajności, które można uzyskać instalując TensorFlow ze źródła, nawet jeśli posiadasz GPU i używasz go do szkolenia i wnioskowania. Powodem jest to, że niektóre operacje TF są implementowane tylko na CPU i nie mogą być uruchamiane na GPU.
Istnieją również pewne wskazówki dotyczące zwiększenia wydajności, które dobrze wykorzystują twój procesor. TensorFlow's performance guide zaleca następujące czynności:
Umieszczenie operacji potoku wejściowego na CPU może znacząco poprawić wydajność. Wykorzystanie CPU do potoku wejściowego uwalnia GPU od konieczności skupienia się na treningu.
Aby uzyskać najlepszą wydajność, powinieneś napisać swój kod tak, aby wykorzystać CPU i GPU do pracy w tandemie, a nie zrzucać wszystko na GPU, jeśli go posiadasz. Posiadanie binarek TensorFlow zoptymalizowanych dla CPU może zaprocentować godzinami zaoszczędzonego czasu pracy, a wystarczy zrobić to raz.