SSE4.2 और AVX निर्देशों के साथ Tensorflow को कैसे संकलित करें?


289

यह संदेश है कि एक स्क्रिप्ट चलाने से प्राप्त होता है यह जांचने के लिए कि क्या Tensorflow काम कर रहा है:

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

मैंने देखा कि इसने SSE4.2 और AVX का उल्लेख किया है,

  1. SSE4.2 और AVX क्या हैं?
  2. ये SSE4.2 और AVX Tensorflow कार्यों के लिए CPU संगणना में कैसे सुधार करते हैं।
  3. Tensorflow को दो पुस्तकालयों का उपयोग करके कैसे संकलित करें?

18
मैं इन झंडों के साथ bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package Xeon E5 v3 पर निर्माण करना पसंद करता हूँ जो मुझे आधिकारिक रिलीज़ (0.35 -> 1.05 T ops / sec) की तुलना में 8k matmul CPU स्पीड में 3x सुधार देता है
यारोस्लाव Bulatov

4
और 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.यहां से भूल न जाएं तनसोरफ्लो.ऑर्इ.इंस्टाल
इवान कुश

4
मैं इन निर्देशों github.com/lakshayg/tensorflow-build का समर्थन करने वाले TF के लिए कुछ संकलित बायनेरिज़ है । आपको यह मददगार लग सकता है।
लक्षय गर्ग

1
@ इवानकुश ने उस झंडे को जोड़ा है, मैं अभी भी टेंसोफ़्लो (ठीक संकलन) को सफलतापूर्वक आयात करने में असमर्थ हूं। यदि आपने सफलतापूर्वक gcc 5 का संकलन किया है, तो कृपया देखें: stackoverflow.com/questions/45877158/…
anon01

1
यदि उबंटू 16.04 का उपयोग कर रहे हैं, तो हमारे पास लगभग सभी वेरिएंट्स हैं, जिनकी आपको संभवतः github.com/mind/wheels
danqing

जवाबों:


160

मैं बस इसी समस्या में भाग गया, ऐसा लगता है कि यारोस्लाव बुलटोव का सुझाव SSE4.2 समर्थन को कवर नहीं करता है, जोड़ना --copt=-msse4.2पर्याप्त होगा। अंत में, मैंने सफलतापूर्वक बनाया

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

बिना किसी चेतावनी या त्रुटियों के।

किसी भी प्रणाली के लिए संभवतः सबसे अच्छा विकल्प है:

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

( अपडेट: बिल्ड स्क्रिप्ट खा सकते हैं-march=native , संभवतः क्योंकि इसमें ए शामिल है= ।)

-mfpmath=bothकेवल जीसीसी के साथ काम करता है, न कि क्लैंग। -mfpmath=sseशायद उतना ही अच्छा है, अगर बेहतर नहीं है, और x86-64 के लिए डिफ़ॉल्ट है। 32-बिट डिफ़ॉल्ट को बनाता है -mfpmath=387, इसलिए इसे बदलना 32-बिट के लिए मदद करेगा। (लेकिन अगर आप नंबर क्रंचिंग के लिए उच्च प्रदर्शन चाहते हैं, तो आपको 64-बिट बायनेरिज़ का निर्माण करना चाहिए।)

मुझे यकीन नहीं है कि TensorFlow की डिफ़ॉल्ट क्या है -O2या क्या -O3है। gcc -O3ऑटो-वेक्टरकरण सहित पूर्ण अनुकूलन सक्षम करता है, लेकिन कभी-कभी कोड धीमा बना सकता है।


इस क्या करता है: --coptके लिएbazel build C और C ++ फ़ाइलें संकलन के लिए जीसीसी के लिए सीधे एक विकल्प गुजरता है (लेकिन लिंक नहीं है, तो आप पार फ़ाइल लिंक समय अनुकूलन के लिए एक अलग विकल्प की जरूरत है ताकि)

x86-64 gcc केवल SSE2 या पुराने SIMD निर्देशों का उपयोग करने के लिए डिफॉल्ट करता है, इसलिए आप किसी भी x86-64 सिस्टम पर बायनेरिज़ को चला सकते हैं । ( Https://gcc.gnu.org/onbuildocs/gcc/x86-Options.html देखें )। वही नहीं जो आप चाहते हैं। आप एक बाइनरी बनाना चाहते हैं जो आपके सीपीयू द्वारा चलाए जा रहे सभी निर्देशों का लाभ उठा सकता है, क्योंकि आप केवल इस बाइनरी को सिस्टम पर चला रहे हैं जहां आपने इसे बनाया था।

-march=nativeआपके सीपीयू द्वारा -mavx512f -mavx2 -mavx -mfma -msse4.2समर्थित सभी विकल्पों को सक्षम करता है, इसलिए यह अनावश्यक बनाता है । (इसके अलावा, -mavx2पहले से ही सक्षम है -mavxऔर -msse4.2, इसलिए यारोस्लाव की आज्ञा ठीक होनी चाहिए)। यदि आप एक सीपीयू का उपयोग कर रहे हैं जो इन विकल्पों में से एक (जैसे एफएमए) का समर्थन नहीं करता है, तो उपयोग -mfmaकरना एक द्विआधारी बनाता है जो अवैध निर्देशों के साथ दोष करता है।

./configureसक्षम करने के लिए TensorFlow की चूक-march=native , इसलिए इसका उपयोग करके मैन्युअल रूप से संकलक विकल्प निर्दिष्ट करने की आवश्यकता से बचना चाहिए।

-march=nativeसक्षम करता है -mtune=native, इसलिए यह आपके CPU के लिए उन चीजों के लिए अनुकूलन करता है जैसे कि AVX निर्देशों का अनुक्रम अनलग्टेड लोड के लिए सबसे अच्छा है।

यह सब gcc, clang या ICC पर लागू होता है। (आईसीसी के लिए, आप -xHOSTइसके बजाय उपयोग कर सकते हैं -march=native।)


6
यह वास्तव में काम करता है> +1! तो ऐसा लगता है -march=nativeकि यह अपना काम नहीं है। इसके अलावा, --config=cuda(यदि CUDA समर्थन की आवश्यकता नहीं है) को छोड़ देना और -k(संकलन के दौरान कोई त्रुटि नहीं हुई) भी काम करता है।
मार्क

4
नए संकलित संस्करण को अनइंस्टॉल करने और पुन: स्थापित करने के बाद मुझे अभी भी AVX, AVX2 और FMA के लिए चेतावनी मिलती है।
बेनेडिकट एस वोगलर

5
मुझे --copt=-mfpmath=bothइसे clangmacOS पर काम करने के लिए छोड़ना पड़ा । क्या यह परिणामी बाइनरी को प्रभावित करता है?
gc5

2
बस स्पष्टीकरण के लिए: जब मैं कॉन्फ़िगर फ़ाइल बनाता हूं .... क्या मैं बस --copt = -march = मूल का उपयोग करता हूं? या क्या मैं उन सभी आशाओं में डाल देता हूं जो मूल पदों में देखी जाती हैं, जहां मेरे पास अनुकूलन में डालने का विकल्प है?
थोर्नहेल

1
मुझे यह कहते हुए एक त्रुटि मिलती है कि 'बिल्ड' कमांड केवल कार्यक्षेत्र से समर्थित है? क्या करें?
विनम्र

133

आइए इस स्पष्टीकरण के साथ शुरू करें कि आप इन चेतावनियों को पहले स्थान पर क्यों देखते हैं


ज्यादातर शायद आपने टीएफ को स्रोत से स्थापित नहीं किया है और इसके बजाय कुछ ऐसा इस्तेमाल किया है pip install tensorflow। इसका मतलब है कि आपने पूर्व-निर्मित (किसी और द्वारा) बायनेरिज़ को स्थापित किया था जो आपकी वास्तुकला के लिए अनुकूलित नहीं थे। और ये चेतावनी आपको वास्तव में यह बताती है: आपके आर्किटेक्चर पर कुछ उपलब्ध है, लेकिन इसका उपयोग नहीं किया जाएगा क्योंकि बाइनरी को इसके साथ संकलित नहीं किया गया था। यहाँ प्रलेखन से हिस्सा है ।

TensorFlow स्टार्टअप पर जाँच करता है कि क्या यह सीपीयू पर उपलब्ध अनुकूलन के साथ संकलित किया गया है। यदि अनुकूलन शामिल नहीं हैं, तो TensorFlow चेतावनी, जैसे AVX, AVX2 और FMA निर्देश शामिल होंगे।

अच्छी बात यह है कि शायद आप केवल टीएफ के साथ सीखना / प्रयोग करना चाहते हैं, इसलिए सब कुछ ठीक से काम करेगा और आपको इसके बारे में चिंता नहीं करनी चाहिए


SSE4.2 और AVX क्या हैं?

SSE4.2 और AVX के बारे में विकिपीडिया की अच्छी व्याख्या है । मशीन-लर्निंग में अच्छा होने के लिए इस ज्ञान की आवश्यकता नहीं है। आप कुछ अतिरिक्त निर्देशों के एक सेट के रूप में उनके बारे में सोच सकते हैं एक कंप्यूटर के लिए ऑपरेशन करने के लिए एक एकल निर्देश के खिलाफ कई डेटा बिंदुओं का उपयोग करें जो स्वाभाविक रूप से समानांतर हो सकते हैं (उदाहरण के लिए दो सरणियों को जोड़ना)।

SSE और AVX दोनों SIMD (एकल निर्देश, एकाधिक डेटा) के एक अमूर्त विचार के कार्यान्वयन हैं , जो है

फ्लिन के वर्गीकरण में समानांतर कंप्यूटरों का एक वर्ग। यह कई प्रसंस्करण तत्वों वाले कंप्यूटरों का वर्णन करता है जो एक साथ कई डेटा बिंदुओं पर एक ही ऑपरेशन करते हैं। इस प्रकार, ऐसी मशीनें डेटा स्तर समानता का फायदा उठाती हैं, लेकिन संगामिति नहीं: एक साथ (समानांतर) संगणनाएं होती हैं, लेकिन एक निश्चित समय में केवल एक ही प्रक्रिया (निर्देश) होती है।

यह आपके अगले प्रश्न का उत्तर देने के लिए पर्याप्त है।


ये SSE4.2 और AVX TF कार्यों के लिए CPU संगणना में कैसे सुधार करते हैं

वे विभिन्न वेक्टर (मैट्रिक्स / टेंसर) संचालन के अधिक कुशल गणना की अनुमति देते हैं। आप इन स्लाइड्स में और पढ़ सकते हैं


Tensorflow को दो पुस्तकालयों का उपयोग करके कैसे संकलित करें?

आपको एक बाइनरी की आवश्यकता है जिसे इन निर्देशों का लाभ उठाने के लिए संकलित किया गया था। सबसे आसान तरीका यह है कि आप इसे स्वयं संकलित करें । जैसा कि माइक और यारोस्लाव ने सुझाव दिया था, आप निम्नलिखित 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
इस कमांड लाइन का क्या अर्थ है? और क्या मुझे bazelइस मामले में स्थापित करना चाहिए ?
YZ

1
क्या किसी ने कभी MSYS2 या विजुअल स्टूडियो 2017 ommunity एडिशन के साथ विंडो 64 के तहत निर्माण किया है? और चरणों को साझा कर सकते हैं?
जेम्स चांग

1
क्या यह पाइप पैकेज स्थानीय मशीन पर एक कोंडा पर्यावरण में स्थापित किया जा सकता है?
dgketchum

3
3+ घंटे के बाद (बीता हुआ समय: 11984.258) मुझे मिला FAILED: Build did NOT complete successfully। यह खुद को संकलित करना इतना आसान नहीं है।
imbrizi

मुझे भी। मेरा निर्माण विफल भी हुआ और फिर लॉग में मैं यह देख सकता हूं कि: cl: कमांड लाइन चेतावनी D9002: अज्ञात विकल्प '-mavx' cl को अनदेखा करना: कमांड लाइन चेतावनी D9002: अज्ञात विकल्प की अनदेखी '-mavx2' cl: कमांड लाइन चेतावनी d9002: अनदेखी अज्ञात विकल्प '-mfma' cl: कमांड लाइन चेतावनी D9002: अज्ञात विकल्प की अनदेखी '-mfpmath = दोनों' cl: कमांड लाइन चेतावनी D9002: अज्ञात विकल्प की अनदेखी '-msse4.2' cl: कमांड लाइन चेतावनी D9002: अज्ञात विकल्प की अनदेखी '- fno-सख्त- aliasing 'cl: कमांड लाइन चेतावनी D9002: अज्ञात विकल्प की अनदेखी' -fexception 'इसलिए ये विकल्प ज्ञात नहीं हैं
Shilan

53

मुझे पहले अपने तीसरे प्रश्न का उत्तर दें:

यदि आप एक cond-env के भीतर एक स्व-संकलित संस्करण चलाना चाहते हैं, तो आप कर सकते हैं। ये सामान्य निर्देश हैं जो मैं अपने सिस्टम पर अतिरिक्त निर्देशों के साथ स्थापित करने के लिए टेंसरफ़्लो प्राप्त करने के लिए दौड़ता हूं। नोट: यह बिल्ड एक AMD A10-7850 बिल्ड के लिए था (अपने सीपीयू की जांच करें कि कौन से निर्देश समर्थित हैं ... यह अलग हो सकता है) Ubuntu 16.04 LTS पर चल रहा है। मैं अपने कोंडा-एनवी के भीतर पायथन 3.5 का उपयोग करता हूं। क्रेडिट टेनसफ़्लो स्रोत इंस्टॉल पेज पर जाता है और ऊपर दिए गए उत्तर।

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.

अपने दूसरे प्रश्न के रूप में:

अनुकूलन के साथ एक स्व-संकलित संस्करण मेरी राय में प्रयास के लायक है। मेरे विशेष सेटअप पर, गणना जो पहले 560-600 सेकंड लेती थी अब केवल 300 सेकंड लगते हैं! यद्यपि सटीक संख्याएँ भिन्न होंगी, मुझे लगता है कि आप अपने विशेष सेटअप पर सामान्य रूप से 35-50% की गति वृद्धि की उम्मीद कर सकते हैं।

अंत में आपका पहला प्रश्न:

बहुत सारे जवाब पहले से ही ऊपर दिए गए हैं। संक्षेप में: AVX , SSE4.1, SSE4.2 , MFA, X86 CPU पर विभिन्न प्रकार के विस्तारित निर्देश सेट हैं। कई में प्रसंस्करण मैट्रिक्स या वेक्टर संचालन के लिए अनुकूलित निर्देश होते हैं।

मैं कुछ समय बचाने के लिए आपको अपनी गलतफहमी को उजागर करूँगा: ऐसा नहीं है कि SSE4.2 SSE4.1 को सुपरसीडिंग करने वाले निर्देशों का एक नया संस्करण है। SSE4 = SSE4.1 (47 निर्देशों का एक सेट) + SSE4.2 (7 निर्देशों का एक सेट)।

टेंसरफ़्लो संकलन के संदर्भ में, यदि आप कंप्यूटर AVX2 और AVX, और SSE4.1 और SSE4.2 का समर्थन करते हैं, तो आपको उन सभी को अनुकूलित करने वाले झंडे लगाने चाहिए। जैसा मैंने किया था वैसा न करें और बस SSE4.2 के साथ सोचें कि यह नया है और SSE4.1 को सुपरसीड करना चाहिए। यह स्पष्ट रूप से गलत है! मुझे उस वजह से फिर से जुटना पड़ा, जिसकी वजह से मुझे अच्छा 40 मिनट का समय लगा।


जहाँ .ll फ़ाइल संग्रहीत है coz मैं इसे खिड़कियों पर भी स्थापित करना चाहता हूं?
WiLL_K

इसे यहाँ संग्रहीत किया गया है: / tmp / tanorflow_pkg (आपके लिनक्स ड्राइव पर)
Thornhale

क्या आप बता सकते हैं कि इसमें कितना समय लगेगा। इसके बारे में 2 बजे और मेरा लैपटॉप जम गया। 4GB RAM और एक i5 प्रोसेसर के साथ इसका ububtu चल रहा है
WiLL_K

हम्म, टेंसोफ़्लो को संकलित करने में लंबा समय लगता है। 8 जीबी वाले मेरे लैपटॉप पर लगभग 1.5 घंटे लगते थे। हालाँकि, आपका स्थापित समय भिन्न हो सकता है और उपलब्ध राम से बहुत प्रभावित होगा। ये संकलन बहुत सी रैम लेने के लिए जाने जाते हैं। संसाधन आवश्यकताओं को कम करने और शायद फ्रीज़ को रोकने के लिए, आप "bazel build" के बाद निम्नलिखित ध्वज जोड़कर संकलन चला सकते हैं: --local_resources 2048, .5,1.0 यह अक्सर फ्रीज़ के साथ मदद करता है, लेकिन संकलन करने में लगने वाले समय को दोगुना कर देगा। उदाहरण के लिए: मेरे एक तेज सिस्टम पर, ध्वज के बिना संकलन में 2200 सेकंड लगे, ध्वज 4500 के साथ!
थोर्नहेल

1
सामान्य तौर पर, मैंने पाया कि खिड़कियों पर एमएल करना पीछे की ओर एक बड़ा दर्द है। आप काम करने के लिए चीजों को पाने के लिए बहुत समय बिताते हैं, जो कि अगर आप एक Linux वातावरण में काम करते हैं तो बस काम करते हैं। मेरा मानना ​​है कि प्रत्येक ओएस के लिए टेंसरफ्लो को संकलित करने की आवश्यकता है। इसके अलावा, यदि आप यहां जाते हैं: लिंक , तो आप देखेंगे कि टेंसरफ्लो आधिकारिक रूप से समर्थित नहीं है। विंडोज के लिए टेंसरफ़्लो को संकलित करने के तरीके के बारे में कुछ गाइड मौजूद है: लिंक । हालांकि मुझे स्वीकार करना होगा, मैंने ऐसा प्रयास नहीं किया है। मैं सिर्फ ubuntu का उपयोग कर रहा हूँ।
थोर्नहेल

25

ये SIMD वेक्टर प्रोसेसिंग इंस्ट्रक्शन सेट हैं

वेक्टर निर्देशों का उपयोग करना कई कार्यों के लिए तेज है; मशीन लर्निंग एक ऐसा काम है।

टेंसरफ़्लो इंस्टॉलेशन डॉक्स का हवाला देते हुए :

संभव के रूप में मशीनों की एक विस्तृत श्रृंखला के साथ संगत होने के लिए, केवल T86orFlow x86 मशीनों पर SSE4.1 SIMD निर्देशों का उपयोग करने के लिए चूक करता है। अधिकांश आधुनिक पीसी और मैक अधिक उन्नत निर्देशों का समर्थन करते हैं, इसलिए यदि आप एक बाइनरी का निर्माण कर रहे हैं जो आप केवल अपनी मशीन पर चला रहे हैं, तो आप --copt=-march=nativeअपने bazel बिल्ड कमांड में उपयोग करके इन्हें सक्षम कर सकते हैं ।


Tensorflow बाइनरी CPU डिस्पैचिंग का उपयोग क्यों नहीं करता है? क्या जीसीसी द्वारा खराब समर्थन किया गया है?
क्रिस पुशुबलेट

4
लिंक "टेंसरफ़्लो इंस्टॉलेशन डॉक्स" काम नहीं करता है। इसलिए मैं सोच रहा हूं कि क्या यह जवाब अभी भी मान्य है। कृपिया प्रतिकिर्या दे!
थोर्नहेल

@ChrisPushbullet आप GPU के लिए कई अलग-अलग गणना क्षमताओं का समर्थन करने के लिए Tensorflow को संकलित कर सकते हैं, लेकिन वे बाइनरी आकार को बहुत बढ़ाते हैं। मेरा अनुमान है कि सीपीयू के लिए भी यही है।
डेविड जुएल

22

इस सभी उत्तरों + कुछ परीक्षण और त्रुटियों के लिए धन्यवाद, मैं इसे मैक पर स्थापित करने में कामयाब रहा clang। तो बस मेरे समाधान को साझा करने के मामले में यह किसी के लिए उपयोगी है।

  1. प्रलेखन पर निर्देशों का पालन करें - सूत्रों से TensorFlow स्थापित करना

  2. जब इसके लिए प्रेरित किया गया

    कृपया संकलन के दौरान उपयोग करने के लिए अनुकूलन झंडे निर्दिष्ट करें जब bazel विकल्प "--config = opt" निर्दिष्ट किया गया हो

फिर इस स्ट्रिंग को कॉपी-पेस्ट करें:

-mavx -mavx2 -mfma -msse4.2

(डिफ़ॉल्ट विकल्प में त्रुटियां हुईं, इसलिए कुछ अन्य झंडे आए। मुझे उपरोक्त झंडे के साथ कोई त्रुटि नहीं मिली। BTW मैंने nअन्य सभी सवालों के जवाब दिए)

स्थापित करने के बाद, मैं एक ~ 2x से 2.5x स्पीडअप का सत्यापन करता हूं जब डीप व्हील्स के आधार पर एक अन्य इंस्टॉलेशन के संबंध में डीप मॉडल का प्रशिक्षण दिया जाता है - मैकओएस पर टेन्सरफ्लो स्थापित करना

आशा करता हूँ की ये काम करेगा


4
-march=nativeअगर आपका कंपाइलर इसे सही तरीके से सपोर्ट करता है तो और भी बेहतर होना चाहिए। यह -mtune=nativeआपके सीपीयू के लिए अच्छे निर्देश विकल्प बनाने के लिए भी तैयार है। हसवेल पर और बाद में, यह अक्षम करता है -mavx256-split-unaligned-storeऔर -mavx256-split-unaligned-load, जो कि डिफ़ॉल्ट रूप से -mtune=genericप्रदर्शन पर चोट करता है और जब डेटा को संरेखित करने के लिए नहीं जाना जाता है, लेकिन रन-टाइम पर निकलता है।
पीटर कॉर्डेस

1
धन्यवाद! मेरे मामले में -march=nativeएक त्रुटि हुई जबकि अन्य विकल्प नहीं थे। शायद यह विशिष्ट संकलक है। मैं इसे ठीक वैसे ही साझा कर रहा था जैसे दूसरों ने उसी अवरोध का अनुभव किया था।
जार

1
क्या त्रुटि? जब तक बिल्ड सिस्टम एक स्ट्रिंग में चोक नहीं करता है, तब तक =या आप उपयोग नहीं कर रहे हैं gccया clangइसे काम नहीं करना चाहिए। और -mtune=native -mavx2 -mfma आपके लिए काम करता है ? या -mtune=skylake? (या आपके पास जो भी सीपीयू है)। BTW, -mavx2तात्पर्य -mavxऔर -msse4.2। यह एक नुस्खा में उन सभी को शामिल करने के लिए चोट नहीं करता है , और मुझे लगता है कि लोगों को उनके सीपीयू का समर्थन नहीं करने वाले लोगों को छोड़ना आसान बनाता है।
पीटर कॉर्डेस

1
मैंने कुछ समय पहले इस प्रश्न पर शीर्ष उत्तर को संपादित किया है, लेकिन मैं खुद टेंसोफ़्लो का उपयोग नहीं करता हूं। अगर -march=nativeइसकी निर्माण प्रणाली में कुछ गड़बड़ है, तो मैं जानना चाहता हूं। (और या आपको इसे अपस्ट्रीम रिपोर्ट करना चाहिए ताकि वे अपनी बिल्ड स्क्रिप्ट को ठीक कर सकें)।
पीटर कॉर्डेस

1
सुझाव के लिए बहुत बहुत धन्यवाद। यह जाँचने के लिए, मैंने केवल .configure स्क्रिप्ट को फिर से चलाया है -march=nativeऔर यह त्रुटि है: / Users / jose / Documents / code / tmptensorflow / tanorflow / core / BUILD: 1442: 1: C ++ संकलन नियम '// टेन्सरफ़्लो / कोर: lib_internal_impl' विफल (बाहर निकलें 1)। टेंसरफ़्लो / कोर / प्लेटफ़ॉर्म / डेमनॉर्मल .cc: 37: /Library/Developer/CommandLineTools/usr/bin/..//lib/clang/7.0.2/include//mmmmintrin.h:28:2: त्रुटि से शामिल फ़ाइल में "SSE3 अनुदेश सेट सक्षम नहीं" #Error "SSE3 अनुदेश सेट सक्षम नहीं" का उपयोग कर एप्पल LLVM संस्करण 7.0.2 (बजना-700.1.81)
जार

7

मैंने हाल ही में इसे स्रोत से स्थापित किया है और उल्लिखित उपलब्ध निर्देशों के साथ इसे स्रोत से स्थापित करने के लिए आवश्यक सभी चरण हैं।

अन्य उत्तर पहले से ही वर्णन करते हैं कि उन संदेशों को क्यों दिखाया गया है। मेरा जवाब isnstall के बारे में एक कदम-दर-चरण देता है, जो लोगों को वास्तविक स्थापना पर संघर्ष करने में मदद कर सकता है जैसा मैंने किया था।

  1. Bazel स्थापित करें

इसे उनकी उपलब्ध रिलीज़ में से एक से डाउनलोड करें , उदाहरण के लिए 0.5.2 । इसे निकालें, निर्देशिका में जाएं और इसे कॉन्फ़िगर करें bash ./compile.sh:। निष्पादन योग्य कॉपी करें /usr/local/bin:sudo cp ./output/bazel /usr/local/bin

  1. Tensorflow स्थापित करें

क्लोन टेंसरफ़्लो: git clone https://github.com/tensorflow/tensorflow.git इसे कॉन्फ़िगर करने के लिए क्लोन निर्देशिका पर जाएं:./configure

यह आपको कई प्रश्नों से संकेत देगा, bellow मैंने आपको प्रत्येक प्रश्न की प्रतिक्रिया का सुझाव दिया है, आप निश्चित रूप से अपनी पसंद के अनुसार अपनी प्रतिक्रियाएं चुन सकते हैं:

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. पाइप पैकेज। इसे बनाने के लिए आपको यह वर्णन करना होगा कि आप कौन से निर्देश चाहते हैं (आप जानते हैं, उन टेंसरफ्लो ने सूचित किया कि आप गायब हैं)।

पाइप स्क्रिप्ट बनाएँ: 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

पाइप पैकेज बनाएँ: bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

आपके द्वारा अभी बनाया गया टेंसरफ्लो पाइप पैकेज स्थापित करें: sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl

अब अगली बार जब आप Tensorflow शुरू करेंगे तो यह अनुपस्थित निर्देशों के बारे में कोई शिकायत नहीं करेगा।


4
बस के साथ बिल्डिंग -c opt --copt=-march=nativeकम से कम जितना अच्छा होना चाहिए --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2। (दोनों चेतावनी को शांत कर देंगे, लेकिन -march=nativeसिस्टम पर सीपीयू के लिए विशेष रूप से ट्यूनिंग करके और भी तेज़ कोड बना सकते हैं)। यह भी ध्यान दें कि --copt=-mavx2 --copt=-mfmaपहले के सभी एवीएक्स और एसएसई विकल्पों का अर्थ है, इसलिए विकल्पों के इस लंबे तार को स्पष्ट रूप से किसी ऐसे व्यक्ति द्वारा लिखा गया था जो जीसीसी विकल्पों को नहीं समझता है।
पीटर कॉर्ड्स

1
@PeterCordes, इस मुद्दे पर एक नज़र डालें ( github.com/tensorflow/tensorflow/issues/7449 ), यहां तक ​​कि bazel अनुचर भी मुखर नहीं थे कि मार्च = देशी उम्मीद के मुताबिक काम नहीं किया। जैसा कि आपको लगता है कि "समझे विकल्प को समझें" तो आप शायद इसे ठीक करने में उनकी मदद कर सकते हैं, क्योंकि उन्होंने इस मुद्दे को "आवश्यक समर्थन" के रूप में चिह्नित किया है।
एडुआर्डो

धन्यवाद, मैं देख लूंगा ... हम्म, कुछ लोग कह रहे हैं कि --copt=-mavx2काम नहीं किया। यदि --copt=-mfma काम करता है, तो काम --copt=-march=nativeकरना चाहिए, जब तक कि =समस्या का पार्सिंग एक समस्या नहीं है। Gcc / clang / icc के लिए, आप निश्चित रूप से बिल्ड स्क्रिप्ट को अंततः -march=nativeकंपाइलर को पास करना चाहते हैं । बिल्ड स्क्रिप्ट के जरिए ऐसा करना ट्रिक बन जाता है।
पीटर कॉर्ड्स

7

यह सबसे सरल विधि है। केवल एक कदम।

यह गति पर महत्वपूर्ण प्रभाव डालता है। मेरे मामले में, एक प्रशिक्षण कदम के लिए समय लगभग आधा हो गया।

टेंसरफ़्लो के कस्टम बिल्ड का संदर्भ लें


2
विंडोज
AVX2

@SreeraghAR आपकी विधि ने मेरे टेंसोफ़्लो और कार्स को डाउनग्रेड कर दिया।
केपीएमजी

कृपया सुनिश्चित करें कि आपने अपने TensorFlow, Python संस्करणों और HW के अनुसार सही फ़ाइल स्थापित की है।
श्रीराघ एआर एआर

@SreeraghAR TensFlowसंस्करण 1.10.0 और उपयोग कर रहा है MacOS Sierra। फाइल खोजने में मेरी मदद करें।
केपीएमजी

हम्म .. आपके संस्करणों के अनुरूप एक नहीं मिल सकता है। कुछ को कस्टम व्हील का निर्माण करना है। github.com/yaroslavvb/tensorflow-community-wheels तत्काल समाधान Tensorflow 1.9.0
Sreeragh AR

5

मैंने सभी सीपीयू विशेषताओं को पुनः प्राप्त करने और उनमें से कुछ को टीएफ बनाने के लिए लागू करने के लिए मैक (आसानी से लिनक्स में पोर्ट किया जा सकता है) के लिए एक छोटी सी बैश स्क्रिप्ट संकलित की। टीएफ मास्टर पर इम और अक्सर थोड़े (एक महीने में दो बार) का उपयोग करें।

https://gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f


5

SSE4.2 और AVX के साथ TensorFlow संकलन करने के लिए, आप सीधे उपयोग कर सकते हैं

bazel build --config = mkl --config = "opt" --copt = "- मार्च = ब्रॉडवेल" --copt = "- O3" // टेंसरफ़्लो / उपकरण / pip_package: build_pip_package

स्रोत: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl


1
क्या हाल ही में कुछ बदल गया है? अंतिम बार मैंने जाँच की --copt="-march=native"कि क्या खा रहा था =। (और बीटीडब्ल्यू, उन दोहरे उद्धरण कुछ भी नहीं करते हैं; उन्हें bazelआपकी कमांड लाइन देखने से पहले शेल द्वारा हटा दिया जाएगा ।)
पीटर कॉर्ड्स

4

2.0 संगत समाधान:

टर्मिनल (Linux / MacOS) में या कमांड प्रॉम्प्ट (विंडोज) में नीचे दिए गए कमांड्स को Bazel का उपयोग करके Tensorflow 2.0 स्थापित करने के लिए निष्पादित करें :

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
इसका कौन सा भाग निर्दिष्ट करता है -march=native, या अन्य जीसीसी / क्लैंग विकल्प? मुझे इसमें AVX, FMA, या SSE4.2 का कोई उल्लेख नहीं दिख रहा है। (और Bazel या Tensorflow की निर्माण स्क्रिप्ट अभी भी इस तरह से टूटी हुई है कि केवल -mavxकाम जैसे विकल्प हैं , नहीं -march=native? यदि इस समस्या पर वास्तव में समस्या शीर्ष पर थी)
पीटर कॉर्डेस

tf संस्करण 2.1.0 के साथ CPU समर्थन के लिए, विकल्प --config = ऑप्ट मेरे लिए काम नहीं करता था, मैंने इसे --config = v2 के साथ हल किया। यह भी उल्लेख करना अच्छा है कि इसे बनाने के लिए सही bazel संस्करण 29.0 है।
तोलिक

2

स्रोत से TensorFlow का निर्माण करते समय, आप configureस्क्रिप्ट चलाएंगे । configureस्क्रिप्ट द्वारा पूछे जाने वाले प्रश्नों में से एक निम्नानुसार है:

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

configureस्क्रिप्ट ध्वज (रों) आप Bazel आदेश TensorFlow पिप पैकेज बनाता करने के लिए निर्दिष्ट जोड़ देती है। मोटे तौर पर, आप दो में से एक तरीके से इस प्रॉम्प्ट का जवाब दे सकते हैं:

  • यदि आप TensorFlow को उसी प्रकार के CPU प्रकार पर बना रहे हैं जिस पर आप TensorFlow चलाएंगे, तो आपको डिफ़ॉल्ट को स्वीकार करना चाहिए (-march=native ) । यह विकल्प आपकी मशीन के सीपीयू प्रकार के लिए उत्पन्न कोड का अनुकूलन करेगा।
  • यदि आप एक CPU प्रकार पर TensorFlow का निर्माण कर रहे हैं, लेकिन एक अलग CPU प्रकार पर TensorFlow चलाएगा, तो gcc प्रलेखन में वर्णित एक अधिक विशिष्ट अनुकूलन ध्वज की आपूर्ति करने पर विचार करें

पूर्ववर्ती बुलेटेड सूची में वर्णित के रूप में TensorFlow को कॉन्फ़िगर करने के बाद, आपको अपने द्वारा --config=optचलाए जा रहे किसी भी bazel कमांड में ध्वज को जोड़कर लक्ष्य CPU के लिए पूरी तरह से अनुकूलित TensorFlow का निर्माण करने में सक्षम होना चाहिए ।


-1

उन चेतावनियों को छिपाने के लिए, आप अपने वास्तविक कोड से पहले ऐसा कर सकते हैं।

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

5
चुपचाप अपने हार्डवेयर पर धीमी गति से चल रहा है एक बुरा विचार की तरह लगता है।
पीटर कॉर्ड्स

मैं सामान्य रूप से @Peter Cordes से सहमत हूं - लेकिन कभी-कभी यह चेतावनी को छिपाने और कार्य पर ध्यान केंद्रित करने के लिए (एक अनुशासित, विचारशील तरीके से) अच्छा है।
वेस्टसाइड

2
@westsider: हाँ, यह कुछ मामलों में उपयोगी हो सकता है, लेकिन यह एक अच्छा जवाब नहीं है जब तक कि यह निहितार्थ को इंगित नहीं करता है: यदि आप बस फिर से चेतावनी के बजाय चेतावनी छिपाते हैं तो वास्तविक प्रदर्शन खो जाता है। (सिवाय शायद अगर आप भारी उठाने के लिए GPU का उपयोग कर रहे हैं, यह अभी भी सीपीयू विकल्पों के बारे में चेतावनी दे सकता है?)
पीटर कॉर्ड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.