วิธีการรวบรวม Tensorflow ด้วยคำแนะนำ SSE4.2 และ AVX


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 เหล่านี้ปรับปรุงการคำนวณของ CPU สำหรับงาน Tensorflow อย่างไร
  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 ที่ให้ฉันดีขึ้น 3 เท่าในความเร็วซีพียู 8k matmul เมื่อเทียบกับรุ่นอย่างเป็นทางการ (0.35 -> 1.05 T ops / วินาที)
Yaroslav 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.จากที่นี่tensorflow.org/install/install_sources
Ivan Kush

4
ฉันมีไบนารีรวบรวมบางอย่างสำหรับ TF สนับสนุนคำแนะนำเหล่านี้github.com/lakshayg/tensorflow-build คุณอาจพบว่ามีประโยชน์
Lakshay Garg

1
@IvanKush เมื่อเพิ่มธงนั้นฉันยังคงไม่สามารถนำเข้าเทนเซอร์โฟลว์ได้ (คอมไพล์ดี) หากคุณรวบรวมเรียบร้อยแล้วด้วย gcc 5 โปรดดู: stackoverflow.com/questions/45877158/…
anon01

1
หากใช้ Ubuntu 16.04 เรามีการสร้างสำหรับตัวแปรเกือบทั้งหมดที่คุณอาจต้องการที่github.com/mind/wheels
danqing

คำตอบ:


160

ฉันเพิ่งพบปัญหาเดียวกันนี้ดูเหมือนว่าคำแนะนำของ Yaroslav Bulatov ไม่ครอบคลุมการสนับสนุน 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ใช้งานได้กับ gcc เท่านั้นไม่ใช่เสียงดังกราว -mfpmath=sseอาจเป็นสิ่งที่ดีถ้าไม่ดีขึ้นและเป็นค่าเริ่มต้นสำหรับ x86-64 สร้าง 32- บิตเป็นค่าเริ่มต้น-mfpmath=387ดังนั้นการเปลี่ยนแปลงที่จะช่วยสำหรับ 32- บิต (แต่ถ้าคุณต้องการประสิทธิภาพสูงสำหรับการ จำกัด จำนวนคุณควรสร้างไบนารี 64 บิต)

ฉันไม่แน่ใจว่า TensorFlow เป็นค่าเริ่มต้น-O2หรือ-O3เป็นอะไร gcc -O3เปิดใช้งานการเพิ่มประสิทธิภาพเต็มรูปแบบรวมถึง auto-vectorization แต่บางครั้งอาจทำให้โค้ดช้าลง


สิ่งนี้จะทำอย่างไร: --coptสำหรับการbazel buildส่งผ่านตัวเลือกไปยัง gcc โดยตรงสำหรับการรวบรวมไฟล์ C และ C ++ (แต่ไม่เชื่อมโยงดังนั้นคุณต้องมีตัวเลือกอื่นสำหรับการเชื่อมโยงข้ามไฟล์ - การปรับให้เหมาะสมเวลา)

x86-64 gcc ใช้ค่าเริ่มต้นเป็น SSE2 หรือคำสั่ง SIMD ที่เก่ากว่าเท่านั้นดังนั้นคุณสามารถเรียกใช้ไบนารีในระบบ x86-64 ใดก็ได้ (ดูhttps://gcc.gnu.org/onlinedocs/gcc/x86-Options.html ) นั่นไม่ใช่สิ่งที่คุณต้องการ คุณต้องการสร้างไบนารีที่ใช้ประโยชน์จากคำแนะนำทั้งหมดที่ CPU ของคุณสามารถทำงานได้เนื่องจากคุณใช้งานไบนารีนี้บนระบบที่คุณสร้างมันเท่านั้น

-march=nativeเปิดใช้งานตัวเลือกทั้งหมดที่ CPU ของคุณรองรับดังนั้นจึง-mavx512f -mavx2 -mavx -mfma -msse4.2ซ้ำซ้อน (นอกจากนี้ยัง-mavx2เปิดใช้งานแล้ว-mavxและ-msse4.2ดังนั้นคำสั่งของ Yaroslav ควรจะดี) นอกจากนี้หากคุณใช้ CPU ที่ไม่รองรับหนึ่งในตัวเลือกเหล่านี้ (เช่น FMA) การใช้-mfmaจะสร้างไบนารีที่ผิดพลาดพร้อมคำแนะนำที่ผิดกฎหมาย

./configureค่าเริ่มต้นของ TensorFlow สำหรับการเปิดใช้งาน-march=nativeดังนั้นการใช้ที่ควรหลีกเลี่ยงต้องระบุตัวเลือกคอมไพเลอร์ด้วยตนเอง

-march=nativeเปิดใช้-mtune=nativeงานดังนั้นจึงปรับให้เหมาะสมสำหรับ CPU ของคุณสำหรับสิ่งต่าง ๆ เช่นลำดับของคำแนะนำ AVX ที่ดีที่สุดสำหรับการโหลดที่ไม่ได้จัดแนว

ทั้งหมดนี้ใช้กับ gcc, clang หรือ ICC (สำหรับ ICC คุณสามารถใช้-xHOSTแทน-march=native)


6
ใช้งานได้จริง> +1! ดังนั้นดูเหมือนว่า-march=nativeจะไม่ทำงาน นอกจากนี้การปล่อย--config=cuda(ถ้าไม่ต้องการการสนับสนุน CUDA) และ-k(เนื่องจากไม่มีข้อผิดพลาดเกิดขึ้นในระหว่างการรวบรวม) ก็เช่นกัน
Marc

4
หลังจากถอนการติดตั้งและติดตั้งเวอร์ชันที่คอมไพล์ใหม่ฉันยังคงได้รับคำเตือนเกี่ยวกับ AVX, AVX2 และ FMA
Benedikt S. Vogler

5
ฉันต้องวาง--copt=-mfpmath=bothเพื่อให้ทำงานกับclangบน macOS มันส่งผลกระทบกับไบนารีที่เกิดขึ้นหรือไม่?
gc5

2
เพื่อความกระจ่าง: เมื่อฉันสร้างไฟล์กำหนดค่า .... ฉันจะใช้ --copt = -march = native หรือไม่? หรือฉันจะใส่ในการปรับให้เหมาะสมทั้งหมดที่เห็นในโพสต์ต้นฉบับที่ฉันมีตัวเลือกในการเพิ่มประสิทธิภาพหรือไม่
Thornhale

1
ฉันได้รับข้อผิดพลาดว่าคำสั่ง 'build' ได้รับการสนับสนุนจากพื้นที่ทำงานเท่านั้น จะทำอย่างไร?
อ่อนน้อมถ่อมตน

133

เริ่มต้น Let 's มีคำอธิบายของทำไมคุณเห็นคำเตือนเหล่านี้ในสถานที่แรก


ส่วนใหญ่อาจจะไม่ได้ติดตั้ง TF pip install tensorflowจากแหล่งที่มาและแทนจะใช้ในสิ่งที่ต้องการ ซึ่งหมายความว่าคุณติดตั้งไบนารีที่สร้างไว้ล่วงหน้า (โดยบุคคลอื่น) ซึ่งไม่ได้รับการปรับให้เหมาะกับสถาปัตยกรรมของคุณ และคำเตือนเหล่านี้บอกคุณอย่างชัดเจนว่ามีบางอย่างพร้อมใช้งานบนสถาปัตยกรรมของคุณ แต่จะไม่ถูกใช้เพราะไบนารีไม่ได้ถูกคอมไพล์ด้วย นี่คือส่วนหนึ่งจากเอกสาร

TensorFlow ตรวจสอบว่ามีการเริ่มต้นคอมไพล์ด้วยการปรับแต่งที่มีอยู่ใน CPU หรือไม่ หากไม่รวมการปรับให้เหมาะสม TensorFlow จะส่งคำเตือนเช่นคำแนะนำ AVX, AVX2 และ FMA

สิ่งที่ดีคือคุณอาจต้องการเรียนรู้ / ทดลองกับ TF เพื่อให้ทุกอย่างทำงานได้อย่างถูกต้องและคุณไม่ควรกังวล


SSE4.2 และ AVX คืออะไร

วิกิพีเดียมีคำอธิบายที่ดีเกี่ยวกับSSE4.2และAVX ความรู้นี้ไม่จำเป็นต้องดีในการเรียนรู้ของเครื่อง คุณอาจคิดถึงพวกเขาเป็นชุดเพิ่มเติมคำสั่งสำหรับคอมพิวเตอร์ที่ใช้จุดข้อมูลหลายจุดกับคำสั่งเดียวเพื่อดำเนินการซึ่งอาจเป็นแบบขนานตามธรรมชาติ (ตัวอย่างเช่นการเพิ่มสองอาร์เรย์)

ทั้ง SSE และ AVX เป็นการนำแนวคิดนามธรรมของSIMD มาใช้ (คำสั่งเดียว, ข้อมูลจำนวนมาก), ซึ่งก็คือ

ชั้นเรียนคอมพิวเตอร์แบบขนานในอนุกรมวิธานของฟลินน์ มันอธิบายคอมพิวเตอร์ที่มีองค์ประกอบการประมวลผลหลายอย่างที่ดำเนินการแบบเดียวกันกับจุดข้อมูลหลายจุดพร้อมกัน ดังนั้นเครื่องจักรดังกล่าวใช้ประโยชน์จากข้อมูลระดับขนาน แต่ไม่ใช่พร้อมกัน: มีการคำนวณพร้อมกัน (ขนาน) แต่มีเพียงกระบวนการเดียว (คำสั่ง) ในช่วงเวลาที่กำหนด

นี่เพียงพอที่จะตอบคำถามต่อไปของคุณ


SSE4.2 และ AVX เหล่านี้ปรับปรุงการคำนวณ CPU สำหรับงาน TF ได้อย่างไร

พวกเขาช่วยให้การคำนวณที่มีประสิทธิภาพมากขึ้นของการดำเนินงานเวกเตอร์ (เมทริกซ์ / เทนเซอร์) ต่างๆ คุณสามารถอ่านเพิ่มเติมได้ในสไลด์เหล่านี้


วิธีทำให้ Tensorflow คอมไพล์โดยใช้สองไลบรารี่?

คุณต้องมีเลขฐานสองซึ่งถูกรวบรวมเพื่อใช้ประโยชน์จากคำแนะนำเหล่านี้ วิธีที่ง่ายที่สุดคือการรวบรวมมันด้วยตัวคุณเอง ตามที่ Mike และ Yaroslav แนะนำคุณสามารถใช้คำสั่ง 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
ไม่มีใครสร้างภายใต้หน้าต่าง 64 บิตด้วย MSYS2 หรือ Visual Studio 2017 ommunity Edition หรือไม่ และสามารถแบ่งปันขั้นตอนได้หรือไม่
James Chang

1
แพคเกจ pip นี้สามารถติดตั้งในสภาพแวดล้อม conda บนเครื่องท้องถิ่นได้หรือไม่?
dgketchum

3
หลังจาก 3+ ชั่วโมง (เวลาที่ผ่านไป: 11984.258 วินาที) ฉันได้รับFAILED: Build did NOT complete successfullyแล้ว มันไม่ง่ายเลยที่จะรวบรวมมันด้วยตัวเอง
imbrizi

กันที่นี่ โครงสร้างของฉันล้มเหลวด้วยและในบันทึกฉันเห็นได้ว่า: cl: คำเตือนบรรทัดคำสั่ง D9002: ไม่สนใจตัวเลือกที่ไม่รู้จัก '-mavx' cl: คำเตือนบรรทัดคำสั่ง D9002: ละเว้นตัวเลือกที่ไม่รู้จัก '-mavx2': คำเตือนบรรทัดคำสั่ง D9002: ตัวเลือกที่ไม่รู้จัก '-mfma' cl: คำเตือนบรรทัดคำสั่ง D9002: ไม่สนใจตัวเลือกที่ไม่รู้จัก '-mfpmath = ทั้งสอง' cl: คำเตือนบรรทัดคำสั่ง D9002: ละเว้นตัวเลือกที่ไม่รู้จัก '-msse4.2' cl: คำเตือนบรรทัดคำสั่ง D9002: ไม่สนใจตัวเลือกที่ไม่รู้จัก '- fno-เคร่งครัด-aliasing 'cl: การเตือนบรรทัดคำสั่ง D9002: ไม่สนใจตัวเลือกที่ไม่รู้จัก' -fexceptions 'ดังนั้นตัวเลือกเหล่านี้จึงไม่เป็นที่รู้จัก
Shilan

53

ให้ฉันตอบคำถามที่ 3 ของคุณก่อน:

หากคุณต้องการรันเวอร์ชันที่คอมไพล์ด้วยตนเองภายใน conda-env คุณสามารถทำได้ เหล่านี้คือคำแนะนำทั่วไปที่ฉันเรียกใช้เพื่อรับเทนเซอร์เพื่อติดตั้งบนระบบของฉันพร้อมคำแนะนำเพิ่มเติม หมายเหตุ: บิลด์นี้มีไว้สำหรับบิลด์ AMD A10-7850 (ตรวจสอบซีพียูของคุณว่ามีคำแนะนำใดบ้างที่สนับสนุน ... อาจแตกต่างกัน) ที่ใช้ Ubuntu 16.04 LTS ฉันใช้ Python 3.5 ภายในเงื่อนไขของฉัน เครดิตไปที่หน้าการติดตั้งแหล่ง tenorflow และคำตอบที่ให้ไว้ข้างต้น

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.

ตามคำถามที่ 2 ของคุณ:

เวอร์ชันที่คอมไพล์ด้วยตนเองพร้อมการปรับให้เหมาะสมนั้นคุ้มค่ากับความพยายามในความคิดของฉัน ในการตั้งค่าเฉพาะของฉันการคำนวณที่เคยใช้เวลา 560-600 วินาทีตอนนี้ใช้เวลาประมาณ 300 วินาทีเท่านั้น! แม้ว่าจำนวนที่แน่นอนจะแตกต่างกันไปฉันคิดว่าคุณสามารถคาดหวังได้ว่าการเพิ่มความเร็วโดยทั่วไปจะเพิ่มขึ้น 35-50% ในการตั้งค่าเฉพาะของคุณ

สุดท้ายคำถามที่ 1 ของคุณ:

มีคำตอบมากมายให้ไว้ข้างต้นแล้ว ในการสรุป: AVX , SSE4.1, SSE4.2 , MFA เป็นชุดคำสั่งเพิ่มเติมชนิดต่าง ๆ บน X86 CPUs หลายคนมีคำแนะนำที่ดีที่สุดสำหรับการประมวลผลเมทริกซ์หรือการดำเนินการเวกเตอร์

ฉันจะเน้นความเข้าใจผิดของฉันเองเพื่อหวังว่าคุณจะประหยัดเวลา: ไม่ใช่ว่า SSE4.2 เป็นคำสั่งรุ่นใหม่ที่มาแทนที่ SSE4.1 SSE4 = SSE4.1 (ชุด 47 คำสั่ง) + SSE4.2 (ชุด 7 คำสั่ง)

ในบริบทของการรวมเทนเซอร์กระแสถ้าคอมพิวเตอร์ของคุณรองรับ AVX2 และ AVX และ SSE4.1 และ SSE4.2 คุณควรใส่แฟล็กการปรับให้เหมาะสมเหล่านั้นเข้าด้วยกัน อย่าทำอย่างที่ฉันทำและไปกับ SSE4.2 โดยคิดว่ามันใหม่กว่าและควรแทนที่ SSE4.1 เห็นได้ชัดว่าผิด! ฉันต้องคอมไพล์ใหม่เพราะสิ่งที่ทำให้ฉันเสียเวลา 40 นาที


ไฟล์. whl เก็บไว้ที่ไหนเพราะฉันต้องการติดตั้งบน windows ด้วย?
WiLL_K

มันถูกเก็บไว้ที่นี่: / tmp / tensorflow_pkg (บนไดรฟ์ linux ของคุณ)
Thornhale

คุณบอกฉันได้ไหมว่าต้องใช้เวลาเท่าไร ประมาณ 2 ชั่วโมงและแล็ปท็อปของฉันเย็นมาก ububtu ที่ใช้งานพร้อม RAM ขนาด 4GB และตัวประมวลผล i5
WiLL_K

อืมการรวบรวม tensorflow ใช้เวลานาน บนแล็ปท็อปของฉันที่มีขนาด 8 GB ใช้เวลาประมาณ 1.5 ชั่วโมง อย่างไรก็ตามเวลาติดตั้งของคุณอาจแตกต่างกันไปและจะได้รับอิทธิพลอย่างมากจาก RAM ที่มีอยู่ การรวบรวมเหล่านี้ทราบกันดีว่าใช้ RAM เป็นจำนวนมาก เพื่อลดความต้องการทรัพยากรและอาจป้องกันการค้างคุณสามารถเรียกใช้การรวบรวมได้โดยเพิ่มการตั้งค่าสถานะต่อไปนี้หลังจาก "bazel build": --local_resources 2048, .5,1.0 สิ่งนี้มักจะช่วยให้หยุดการทำงานได้ ตัวอย่างเช่น: หนึ่งในระบบที่เร็วกว่าของฉันการคอมไพล์โดยไม่มีค่าสถานะใช้เวลา 2200 วินาทีโดยมีค่าสถานะ 4500!
Thornhale

1
โดยทั่วไปแล้วฉันพบว่าการทำ ML บน windows เป็นความเจ็บปวดครั้งใหญ่ในเบื้องหลัง คุณเสียเวลาไปกับการพยายามทำสิ่งต่าง ๆ ให้ใช้งานได้หากคุณทำงานในระบบ linux ฉันเชื่อว่าต้องใช้เทนเซอร์โฟลว์สำหรับแต่ละระบบปฏิบัติการ ยิ่งไปกว่านั้นถ้าคุณไปที่นี่ลิงค์คุณจะเห็นว่าไม่สนับสนุนเทนเซอร์โฟลว์อย่างเป็นทางการ มีไม่อยู่แนะนำบางอย่างเกี่ยวกับวิธีการรวบรวม tensorflow สำหรับ Windows ที่นี่: การเชื่อมโยง แม้ว่าฉันต้องยอมรับฉันยังไม่ได้ลอง ฉันแค่ใช้อูบุนตู
Thornhale

25

เหล่านี้เป็นSIMD ชุดคำสั่งประมวลผลแบบเวกเตอร์

การใช้คำแนะนำแบบเวกเตอร์นั้นเร็วกว่าสำหรับงานหลายอย่าง การเรียนรู้ของเครื่องเป็นงานดังกล่าว

การอ้างถึงเอกสารการติดตั้ง tensorflow :

เพื่อให้สามารถใช้งานร่วมกับเครื่องจักรที่มีช่วงกว้างที่สุดเท่าที่จะเป็นไปได้ TensorFlow จะใช้ค่าเริ่มต้นเป็นคำสั่ง SSE4.1 SIMD บนเครื่อง x86 เท่านั้น พีซีและ Mac ที่ทันสมัยส่วนใหญ่สนับสนุนคำแนะนำขั้นสูงดังนั้นหากคุณกำลังสร้างไบนารีที่คุณจะทำงานในเครื่องของคุณเองคุณสามารถเปิดใช้งานได้โดยใช้--copt=-march=nativeในคำสั่ง bazel build


ทำไมไบนารี Tensorflow ไม่ใช้การส่งสัญญาณ CPU GCC ได้รับการสนับสนุนไม่ดีหรือไม่
Chris Pushbullet

4
ลิงก์ "เอกสารการติดตั้ง tensorflow" ไม่ทำงาน ดังนั้นฉันสงสัยว่าคำตอบนี้ยังใช้ได้หรือไม่ โปรดตอบกลับ!
Thornhale

@ChrisPushbullet คุณสามารถรวบรวม Tensorflow เพื่อรองรับความสามารถในการคำนวณที่แตกต่างกันสำหรับ GPU แต่จะเพิ่มขนาดไบนารีให้มากขึ้น ฉันเดาว่ามันเหมือนกันสำหรับซีพียู
Davidmh

22

ขอขอบคุณทุกการตอบนี้ + การทดลองและข้อผิดพลาดบางอย่างที่ฉันจัดการเพื่อติดตั้งบน Mac clangกับ ดังนั้นเพียงแบ่งปันโซลูชันของฉันในกรณีที่เป็นประโยชน์กับใครบางคน

  1. ทำตามคำแนะนำในเอกสาร - การติดตั้ง TensorFlow จากแหล่งข้อมูล

  2. เมื่อได้รับแจ้ง

    โปรดระบุแฟล็กการปรับให้เหมาะสมที่จะใช้ในระหว่างการรวบรวมเมื่อมีการระบุตัวเลือก bazel "--config = opt" [ค่าเริ่มต้นคือ -march = native]

จากนั้นคัดลอก - วางสตริงนี้:

-mavx -mavx2 -mfma -msse4.2

(ตัวเลือกเริ่มต้นทำให้เกิดข้อผิดพลาดดังนั้นบางส่วนของค่าสถานะอื่น ๆ ฉันไม่มีข้อผิดพลาดกับค่าสถานะด้านบน BTW ฉันตอบnคำถามอื่นทั้งหมด)

หลังจากการติดตั้งฉันจะตรวจสอบการเร่งความเร็ว ~ 2x ถึง 2.5x เมื่อฝึกอบรมรุ่นที่ลึกกว่าเกี่ยวกับการติดตั้งอื่นตามล้อเริ่มต้น - การติดตั้ง TensorFlow บน macOS

หวังว่ามันจะช่วย


4
-march=nativeควรจะดียิ่งขึ้นหากคอมไพเลอร์ของคุณรองรับอย่างถูกต้อง นอกจากนี้ยังตั้งค่า-mtune=nativeเพื่อให้ตัวเลือกการเรียนการสอนที่ดีสำหรับ CPU ของคุณ เช่นใน Haswell และใหม่กว่านั้นจะปิดใช้งาน-mavx256-split-unaligned-storeและ-mavx256-split-unaligned-loadซึ่งเป็นค่าเริ่มต้นสำหรับ-mtune=genericและทำร้ายประสิทธิภาพเมื่อข้อมูลไม่ได้รับการจัดแนว แต่กลับกลายเป็นเวลาทำงาน
Peter Cordes

1
ขอบคุณ! ในกรณีของฉัน-march=nativeทำให้เกิดข้อผิดพลาดในขณะที่ตัวเลือกอื่นไม่ได้ อาจจะเป็นผู้แปลเฉพาะ ฉันแบ่งปันสิ่งนี้อย่างแม่นยำในกรณีที่คนอื่นประสบกับสิ่งกีดขวางบนถนนเดียวกัน
JARS

1
ข้อผิดพลาดอะไร หากระบบการสร้าง=ไม่สามารถใช้งานได้กับสตริงที่มีหรือคุณไม่ได้ใช้งานgccหรือclangควรใช้งานได้ และมัน-mtune=native -mavx2 -mfma ใช้ได้ผลสำหรับคุณ หรือ-mtune=skylake? (หรือ CPU อะไรก็ตามที่คุณมี) BTW, -mavx2หมายถึงและ-mavx -msse4.2มันไม่เจ็บเลยที่จะรวมพวกมันไว้ในสูตรและฉันเดาว่ามันจะง่ายขึ้นสำหรับคนที่จะไม่ละทิ้ง CPU ที่ไม่สนับสนุน
Peter Cordes

1
ฉันได้แก้ไขคำตอบที่ดีที่สุดสำหรับคำถามนี้เมื่อไม่นานมานี้ แต่ฉันไม่ได้ใช้เมตริกซ์เอง หากมีสิ่งผิดปกติเกิดขึ้นกับ-march=nativeระบบการสร้างของมันฉันอยากรู้ (และ / หรือคุณควรรายงานต้นน้ำเพื่อให้สามารถแก้ไขสคริปต์สร้าง)
Peter Cordes

1
ขอบคุณมากสำหรับคำแนะนำ เพื่อตรวจสอบว่าฉันได้รันสคริปต์. config อีกครั้งด้วยเท่านั้น-march=nativeและนี่เป็นข้อผิดพลาด: / Users / jose / Documents / code / tmptensorflow / tensorflow / tensorflow / tensorflow / core / BUILD: 1442: 1: C ++ การรวบรวม กฎ '// tensorflow / core: lib_internal_impl' ล้มเหลว (ออก 1) ในไฟล์รวมจาก tensorflow / core / platform / denormal.cc: 37: /Library/Developer/CommandLineTools/usr/bin/../lib/clang/7.0.2/include/pmmintrin.h:28:2: ข้อผิดพลาด: "ชุดคำสั่ง SSE3 ไม่เปิดใช้งาน" #error "ชุดคำสั่ง SSE3 ไม่เปิดใช้งาน" โดยใช้ Apple LLVM เวอร์ชัน 7.0.2 (clang-700.1.81)
JARS

7

ฉันเพิ่งติดตั้งจากแหล่งที่มาและตะโกนเป็นขั้นตอนทั้งหมดที่จำเป็นในการติดตั้งจากแหล่งที่มาพร้อมกับคำแนะนำที่มีอยู่

คำตอบอื่น ๆ แล้วอธิบายว่าทำไมข้อความเหล่านั้นจะปรากฏ คำตอบของฉันให้ทีละขั้นตอนเกี่ยวกับวิธีการ isnstall ซึ่งอาจช่วยให้ผู้คนดิ้นรนในการติดตั้งจริงเหมือนที่ฉันทำ

  1. ติดตั้ง Bazel

ดาวน์โหลดได้จากหนึ่งในที่มีอยู่ของพวกเขาเผยแพร่เช่น0.5.2 bash ./compile.shสารสกัดจากว่าให้ไปลงในไดเรกทอรีและกำหนดค่า: คัดลอกไฟล์ที่เรียกใช้ไปยัง/usr/local/bin:sudo cp ./output/bazel /usr/local/bin

  1. ติดตั้ง Tensorflow

Clone tensorflow: git clone https://github.com/tensorflow/tensorflow.git ไปที่ไดเรกทอรีโคลนเพื่อกำหนดค่า:./configure

มันจะถามคุณด้วยคำถามหลายข้อร้องฉันได้แนะนำการตอบคำถามแต่ละข้อคุณสามารถแน่นอนเลือกคำตอบของคุณเองตามที่คุณต้องการ:

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. แพคเกจ pip เพื่อสร้างมันคุณจะต้องอธิบายว่าคุณต้องการคำแนะนำใด (คุณรู้ไหมว่า Tensorflow แจ้งว่าคุณหายไป)

สร้างสคริปต์จุดเล็ก ๆ : 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

สร้างแพ็คเกจ pip: bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

ติดตั้งแพคเกจ pip Tensorflow ที่คุณเพิ่งสร้างขึ้น: 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อาจสร้างรหัสที่เร็วยิ่งขึ้นโดยการปรับแต่งเฉพาะสำหรับ CPU ในระบบที่คุณกำลังสร้าง) นอกจากนี้โปรดทราบว่า--copt=-mavx2 --copt=-mfmaแสดงถึงตัวเลือก AVX และ SSE ก่อนหน้าทั้งหมดดังนั้นตัวเลือกสตริงที่ยาวนี้จึงถูกเขียนโดยคนที่ไม่เข้าใจตัวเลือก gcc อย่างชัดเจน
Peter Cordes

1
@PeterCordes ลองดูปัญหานี้ ( github.com/tensorflow/tensorflow/issues/7449 ) ถึงแม้ผู้ดูแลระบบบาซาร์ก็ไม่กล้าแสดงเหตุผลว่าทำไมมีนาคม = native ไม่ทำงานอย่างที่คาดไว้ ในขณะที่คุณทำ "เข้าใจตัวเลือก gcc" คุณอาจจะสามารถช่วยแก้ไขได้เนื่องจากพวกเขาทำเครื่องหมายปัญหาว่าต้องการ "การสนับสนุนชุมชน"
Eduardo

ขอบคุณฉันจะดู ... อืมบางคนบอก--copt=-mavx2ว่าไม่ได้ผล หากการ --copt=-mfmaทำงาน--copt=-march=nativeควรทำงานยกเว้นว่าการแยกวิเคราะห์=เป็นปัญหา สำหรับ gcc / clang / icc แน่นอนว่าคุณต้องการให้สคริปต์บิลด์ส่งผ่าน-march=nativeไปยังคอมไพเลอร์ในที่สุด การทำให้สิ่งนั้นเกิดขึ้นผ่านสคริปต์การสร้างกลายเป็นกลอุบาย
Peter Cordes

7

นี่เป็นวิธีที่ง่ายที่สุด เพียงขั้นตอนเดียว

มันมีผลกระทบอย่างมากต่อความเร็ว ในกรณีของฉันเวลาในการฝึกอบรมลดลงครึ่งหนึ่ง

อ้างอิง builds แบบกำหนดเองของ tensorflow


2
Windows สร้างรวมถึง AVX2 github.com/fo40225/tensorflow-windows-wheel
Chris Moschini

@SreeraghAR วิธีการของคุณลดระดับเทนเนอร์โฟลว์และ keras ของฉัน
KPMG

โปรดตรวจสอบให้แน่ใจว่าคุณติดตั้งไฟล์ที่ถูกต้องตาม TensorFlow, Python เวอร์ชั่นและ HW
Sreeragh AR

@SreeraghAR TensFlowรุ่น 1.10.0 MacOS Sierraและการใช้ ช่วยฉันในการค้นหาไฟล์
KPMG

อืม .. ไม่พบหนึ่งรุ่นที่ตรงกับรุ่นของคุณ บางคนต้องสร้างวงล้อที่กำหนดเอง github.com/yaroslavvb/tensorflow-community-wheels การ แก้ปัญหาทันทีสามารถใช้ Tensorflow 1.9.0
Sreeragh AR

5

ฉันรวบรวมสคริปต์ Bash ขนาดเล็กสำหรับ Mac (สามารถย้ายไปยัง Linux ได้อย่างง่ายดาย) เพื่อดึงคุณสมบัติ CPU ทั้งหมดและนำบางส่วนไปสร้าง TF ฉันใช้ต้นแบบ TF และใช้งานบ่อยๆ (สองครั้งต่อเดือน)

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


5

ในการรวบรวม TensorFlow ด้วย SSE4.2 และ AVX คุณสามารถใช้โดยตรง

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

ที่มา: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl


1
มีอะไรเปลี่ยนแปลงบ้างหรือไม่? ล่าสุดได้ตรวจสอบได้รับการกิน--copt="-march=native" =(และ BTW เครื่องหมายคำพูดคู่เหล่านั้นไม่ได้ทำอะไรเลยพวกมันจะถูกลบออกโดยเชลล์ก่อนที่จะbazelเห็นบรรทัดคำสั่งของคุณ)
Peter Cordes

4

โซลูชันที่เข้ากันได้ 2.0:

ดำเนินการคำสั่งด้านล่างใน Terminal (Linux / MacOS) หรือใน Command Prompt (Windows) เพื่อติดตั้ง Tensorflow 2.0 โดยใช้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
ส่วนไหนของสิ่งนี้ระบุ-march=nativeหรือตัวเลือก GCC / clang อื่น ๆ ฉันไม่เห็นพูดถึง AVX, FMA หรือ SSE4.2 ในเรื่องนี้ (และสคริปต์การสร้างของ Bazel หรือ Tensorflow ยังคงพังอยู่ในลักษณะที่มีเพียงตัวเลือกการ-mavxทำงานไม่ใช่-march=nativeหรือไม่ถ้านั่นเป็นปัญหาที่เกิดขึ้นจริงในคำตอบที่ดีที่สุดสำหรับคำถามนี้)
Peter Cordes

สำหรับการรองรับซีพียูด้วย tf รุ่น 2.1.0 ตัวเลือก --config = opt ไม่ทำงานสำหรับฉันฉันแก้ไขด้วย --config = v2 นอกจากนี้ยังเป็นการดีที่จะพูดถึงว่ารุ่น bazel ที่เหมาะสมในการสร้างคือ 29.0
Tolik

2

เมื่อสร้าง TensorFlow จากซอร์สคุณจะเรียกใช้configureสคริปต์ หนึ่งในคำถามที่configureสคริปต์ถามมีดังนี้:

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

configureสคริปต์จะแนบธง (s) ที่คุณระบุคำสั่ง Bazel ที่สร้างแพคเกจ pip TensorFlow ในวงกว้างคุณสามารถตอบสนองต่อพรอมต์นี้ได้สองวิธี:

  • หากคุณกำลังสร้าง TensorFlow ในประเภท CPU ประเภทเดียวกันกับที่คุณใช้ TensorFlow คุณควรยอมรับค่าเริ่มต้น (-march=native ) ตัวเลือกนี้จะปรับรหัสที่สร้างให้เหมาะสมสำหรับประเภท CPU ของเครื่องของคุณ
  • หากคุณกำลังสร้าง TensorFlow กับชนิดของ CPU แต่จะทำงาน TensorFlow ในประเภทของ CPU ที่แตกต่างกันแล้วพิจารณาการจัดหาธงเพิ่มประสิทธิภาพเฉพาะเจาะจงมากขึ้นตามที่อธิบายไว้ในเอกสารจีซี

หลังจากกำหนดค่า TensorFlow ตามที่อธิบายไว้ในรายการหัวข้อย่อยก่อนหน้าคุณควรสามารถสร้าง TensorFlow ที่ปรับให้เหมาะสมที่สุดสำหรับ CPU เป้าหมายเพียงแค่เพิ่มการ--config=optตั้งค่าสถานะในคำสั่ง bazel ใด ๆ ที่คุณกำลังเรียกใช้


-1

หากต้องการซ่อนคำเตือนเหล่านี้คุณสามารถทำได้ก่อนรหัสจริงของคุณ

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

5
การรันช้าลงอย่างเงียบ ๆ บนฮาร์ดแวร์ของคุณดูเหมือนจะเป็นความคิดที่ไม่ดี
Peter Cordes

ฉันเห็นด้วยกับ @Peter Cordes โดยทั่วไป - แต่บางครั้งมันก็ดี (ในลักษณะที่เป็นระเบียบและมีสติ) เพื่อซ่อนคำเตือนและมุ่งเน้นไปที่งาน
westsider

2
@westsider: ใช่มันอาจมีประโยชน์ในบางกรณี แต่นี่ไม่ใช่คำตอบที่ดีเว้นแต่มันจะชี้ให้เห็นถึงความหมาย: มีประสิทธิภาพที่แท้จริงหายไปหากคุณเพียงแค่ซ่อนคำเตือนแทนที่จะคอมไพล์ใหม่ (ยกเว้นบางทีถ้าคุณใช้ GPU เพื่อการยกที่หนักหน่วงมันอาจจะยังคงเตือนเกี่ยวกับตัวเลือกของ CPU อยู่ใช่ไหม)
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.