Bagaimana cara mengkompilasi Tensorflow dengan instruksi SSE4.2 dan AVX?

289

Ini adalah pesan yang diterima dari menjalankan skrip untuk memeriksa apakah Tensorflow berfungsi:

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

Saya perhatikan bahwa telah disebutkan SSE4.2 dan AVX,

  1. Apa itu SSE4.2 dan AVX?
  2. Bagaimana SSE4.2 dan AVX ini meningkatkan komputasi CPU untuk tugas-tugas Tensorflow.
  3. Bagaimana cara membuat Tensorflow dikompilasi menggunakan dua perpustakaan?
GabrielChu
sumber
18
Saya suka membangun dengan flag-flag ini bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package On Xeon E5 v3 yang memberi saya peningkatan 3x dalam kecepatan CPU matmul 8k dibandingkan dengan rilis resmi (0.35 -> 1.05 T ops / dtk)
Yaroslav Bulatov
4
dan jangan lupa 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.dari sini tensorflow.org/install/install_sources
Ivan Kush
4
Saya memiliki beberapa binari yang dikompilasi untuk TF yang mendukung instruksi ini github.com/lakshayg/tensorflow-build . Anda mungkin menemukan ini membantu.
Lakshay Garg
1
@IvanKush telah menambahkan flag itu, saya masih belum berhasil mengimpor tensorflow (mengkompilasi dengan baik). Jika Anda berhasil dikompilasi dengan gcc 5, silakan lihat: stackoverflow.com/questions/45877158/…
anon01
1
Jika menggunakan Ubuntu 16.04, kami memiliki build untuk hampir semua varian yang mungkin Anda perlukan di github.com/mind/wheels
danqing

Jawaban:

160

Saya hanya mengalami masalah yang sama, sepertinya saran Yaroslav Bulatov tidak mencakup dukungan SSE4.2, menambahkan --copt=-msse4.2sudah cukup. Pada akhirnya, saya berhasil membangun

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

tanpa peringatan atau kesalahan apa pun.

Mungkin pilihan terbaik untuk sistem apa pun adalah:

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

( Pembaruan: skrip build mungkin sedang makan-march=native , mungkin karena mengandung= .)

-mfpmath=bothhanya bekerja dengan gcc, bukan dentang. -mfpmath=ssemungkin sama baiknya, jika tidak lebih baik, dan merupakan standar untuk x86-64. Build 32-bit menjadi default -mfpmath=387, jadi mengubah itu akan membantu untuk 32-bit. (Tetapi jika Anda ingin kinerja tinggi untuk angka-angka, Anda harus membangun biner 64-bit.)

Saya tidak yakin untuk apa TensorFlow default -O2atau -O3apa. gcc -O3memungkinkan pengoptimalan penuh termasuk auto-vektorisasi, tetapi kadang-kadang bisa membuat kode lebih lambat.


Kegunaannya: --coptforbazel build meneruskan opsi langsung ke gcc untuk mengkompilasi file C dan C ++ (tetapi tidak menautkan, jadi Anda memerlukan opsi lain untuk optimasi lintas-file-link-waktu-optimasi)

x86-64 gcc secara default hanya menggunakan SSE2 atau instruksi SIMD yang lebih lama, sehingga Anda dapat menjalankan binari pada sistem x86-64 apa pun . (Lihat https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html ). Bukan itu yang Anda inginkan. Anda ingin membuat biner yang memanfaatkan semua instruksi yang dapat dijalankan CPU Anda, karena Anda hanya menjalankan biner ini pada sistem tempat Anda membuatnya.

-march=nativememungkinkan semua opsi yang didukung CPU Anda, sehingga membuatnya -mavx512f -mavx2 -mavx -mfma -msse4.2berlebihan. (Juga, -mavx2sudah mengaktifkan -mavxdan -msse4.2, jadi perintah Yaroslav seharusnya baik-baik saja). Juga jika Anda menggunakan CPU yang tidak mendukung salah satu opsi ini (seperti FMA), menggunakan -mfmaakan membuat biner yang salah dengan instruksi ilegal.

TensorFlow secara ./configuredefault diaktifkan-march=native , jadi menggunakan itu harus menghindari keharusan menentukan opsi kompiler secara manual.

-march=nativememungkinkan -mtune=native, sehingga mengoptimalkan untuk CPU Anda untuk hal-hal seperti urutan instruksi AVX mana yang terbaik untuk beban yang tidak selaras.

Ini semua berlaku untuk gcc, dentang, atau ICC. (Untuk ICC, Anda dapat menggunakan -xHOSTsebagai ganti -march=native.)

Mike Chiu
sumber
6
Ini memang berfungsi> +1! Jadi sepertinya -march=nativetidak berfungsi. Selain itu, menjatuhkan --config=cuda(jika dukungan CUDA tidak diperlukan) dan -k(karena tidak ada kesalahan terjadi selama kompilasi) juga berfungsi.
Marc
4
Setelah menghapus dan menginstal ulang versi terkompilasi baru saya masih mendapatkan peringatan untuk AVX, AVX2 dan FMA.
Benedikt S. Vogler
5
Saya harus turun --copt=-mfpmath=bothuntuk membuatnya bekerja dengan clangdi macOS. Apakah itu mempengaruhi hasil biner?
gc5
2
Hanya untuk klarifikasi: ketika saya membuat file configure .... apakah saya menggunakan --copt = -march = asli Atau apakah saya memasukkan semua optimasi yang terlihat di posting asli di mana saya memiliki pilihan untuk dimasukkan ke dalam optimasi?
Thornhale
1
Saya mendapatkan pesan kesalahan yang mengatakan bahwa perintah 'build' hanya didukung dari ruang kerja? Apa yang harus dilakukan?
rendah hati
133

Mari kita mulai dengan penjelasan mengapa Anda melihat peringatan ini sejak awal .


Kemungkinan besar Anda belum menginstal TF dari sumber dan alih-alih menggunakan sesuatu seperti pip install tensorflow. Itu berarti Anda menginstal binari pra-dibangun (oleh orang lain) yang tidak dioptimalkan untuk arsitektur Anda. Dan peringatan ini memberi tahu Anda hal ini dengan tepat: sesuatu tersedia di arsitektur Anda, tetapi itu tidak akan digunakan karena biner tidak dikompilasi dengannya. Ini bagian dari dokumentasi .

TensorFlow memeriksa saat startup apakah telah dikompilasi dengan optimisasi yang tersedia pada CPU. Jika optimisasi tidak termasuk, TensorFlow akan memancarkan peringatan, misalnya AVX, AVX2, dan instruksi FMA tidak termasuk.

Hal yang baik adalah bahwa kemungkinan besar Anda hanya ingin belajar / bereksperimen dengan TF sehingga semuanya akan berfungsi dengan baik dan Anda tidak perlu khawatir


Apa itu SSE4.2 dan AVX?

Wikipedia memiliki penjelasan yang bagus tentang SSE4.2 dan AVX . Pengetahuan ini tidak dituntut untuk pandai dalam pembelajaran mesin. Anda dapat menganggapnya sebagai seperangkat instruksi tambahan bagi komputer untuk menggunakan beberapa titik data terhadap satu instruksi untuk melakukan operasi yang dapat diparalelkan secara alami (misalnya menambahkan dua array).

Baik SSE dan AVX adalah implementasi dari ide abstrak SIMD (Instruksi tunggal, beberapa data), yaitu

kelas komputer paralel dalam taksonomi Flynn. Ini menjelaskan komputer dengan beberapa elemen pemrosesan yang melakukan operasi yang sama pada beberapa titik data secara bersamaan. Dengan demikian, mesin tersebut mengeksploitasi paralelisme tingkat data, tetapi tidak konkurensi: ada perhitungan simultan (paralel), tetapi hanya proses tunggal (instruksi) pada saat tertentu

Ini cukup untuk menjawab pertanyaan Anda selanjutnya.


Bagaimana SSE4.2 dan AVX ini meningkatkan perhitungan CPU untuk tugas TF

Mereka memungkinkan perhitungan yang lebih efisien dari berbagai operasi vektor (matriks / tensor). Anda dapat membaca lebih lanjut di slide ini


Bagaimana cara membuat Tensorflow dikompilasi menggunakan dua perpustakaan?

Anda harus memiliki biner yang dikompilasi untuk mengambil keuntungan dari instruksi ini. Cara termudah adalah mengompilasinya sendiri . Seperti yang disarankan oleh Mike dan Yaroslav, Anda dapat menggunakan perintah bazel berikut

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

Salvador Dali
sumber
4
Apa artinya baris perintah ini? Dan haruskah saya menginstal bazeldalam hal ini?
YZ
1
Adakah yang pernah membangun di bawah jendela 64 bit dengan MSYS2 atau Visual Studio 2017 ommunity Edition? dan dapat berbagi langkah?
James Chang
1
Bisakah paket pip ini diinstal ke lingkungan conda pada mesin lokal?
dgketchum
3
Setelah 3+ jam (Waktu berlalu: 11984.258s) saya dapatkan FAILED: Build did NOT complete successfully. Tidak sesederhana itu untuk dikompilasi sendiri.
imbrizi
sama disini. Bangunan saya gagal juga dan kemudian di log saya dapat melihat bahwa: cl: Peringatan baris perintah D9002: mengabaikan opsi yang tidak diketahui '-mavx' cl: Peringatan baris perintah D9002: mengabaikan opsi yang tidak dikenal '-mavx2' cl: Peringatan baris perintah D9002: mengabaikan opsi tidak dikenal '-mfma' cl: Peringatan baris perintah D9002: mengabaikan opsi tidak dikenal '-mfpmath = keduanya' cl: Peringatan baris perintah D9002: mengabaikan opsi tidak dikenal '-msse4.2' cl: peringatan baris perintah D9002: mengabaikan opsi tidak dikenal '- fno-strict-aliasing 'cl: Peringatan command line D9002: mengabaikan opsi yang tidak diketahui' -feception 'sehingga opsi ini tidak diketahui
Shilan
53

Biarkan saya menjawab pertanyaan ke-3 Anda terlebih dahulu:

Jika Anda ingin menjalankan versi self-compiled di dalam conda-env, Anda bisa. Ini adalah instruksi umum yang saya jalankan untuk mendapatkan tensorflow untuk diinstal pada sistem saya dengan instruksi tambahan. Catatan: Build ini dibuat untuk AMD A10-7850 build (periksa CPU Anda untuk mengetahui instruksi apa yang didukung ... mungkin berbeda) yang menjalankan Ubuntu 16.04 LTS. Saya menggunakan Python 3.5 dalam conda-env saya. Kredit masuk ke halaman instal sumber tensorflow dan jawaban yang diberikan di atas.

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.

Mengenai pertanyaan kedua Anda:

Menurut pendapat saya, versi yang dikompilasi sendiri dengan optimisasi layak dilakukan. Pada pengaturan khusus saya, perhitungan yang digunakan untuk mengambil 560-600 detik sekarang hanya membutuhkan sekitar 300 detik! Meskipun angka pastinya bervariasi, saya pikir Anda dapat mengharapkan peningkatan kecepatan 35-50% secara umum pada pengaturan khusus Anda.

Terakhir pertanyaan pertama Anda:

Banyak jawaban sudah disediakan di atas. Untuk meringkas: AVX , SSE4.1, SSE4.2 , MFA adalah berbagai jenis set instruksi tambahan pada CPU X86. Banyak berisi instruksi yang dioptimalkan untuk memproses operasi matriks atau vektor.

Saya akan menyoroti kesalahpahaman saya sendiri untuk semoga menghemat waktu Anda: Bukan karena SSE4.2 adalah versi yang lebih baru dari instruksi menggantikan SSE4.1. SSE4 = SSE4.1 (satu set instruksi 47) + SSE4.2 (set instruksi 7).

Dalam konteks kompilasi tensorflow, jika komputer Anda mendukung AVX2 dan AVX, dan SSE4.1 dan SSE4.2, Anda harus meletakkan flag yang mengoptimalkan itu untuk semua. Jangan lakukan seperti yang saya lakukan dan hanya pergi dengan SSE4.2 berpikir bahwa itu lebih baru dan harus melampaui SSE4.1. Itu jelas SALAH! Saya harus mengkompilasi ulang karena itu menghabiskan 40 menit.

Thornhale
sumber
di mana file .whl disimpan karena saya ingin menginstalnya di windows juga?
WiLL_K
Itu disimpan di sini: / tmp / tensorflow_pkg (di drive linux Anda)
Thornhale
Bisakah Anda memberi tahu saya berapa banyak waktu yang diperlukan? Sekitar 2 jam dan laptop saya membeku. Ini menjalankan ububtu dengan 4gb ram dan prosesor i5
WiLL_K
Hmm, mengompilasi tensorflow memang butuh waktu lama. Di laptop saya dengan 8 gb butuh sekitar 1,5 jam. Namun, waktu pemasangan Anda dapat bervariasi dan akan sangat dipengaruhi oleh ram yang tersedia. Kompilasi ini diketahui membutuhkan banyak RAM. Untuk mengurangi persyaratan sumber daya dan mungkin mencegah pembekuan, Anda dapat menjalankan kompilasi dengan menambahkan tanda berikut setelah "bazel build": --local_resources 2048, .5,1.0 Ini sering membantu pembekuan tetapi mungkin akan menggandakan waktu yang diperlukan untuk kompilasi. Sebagai contoh: Pada salah satu sistem saya yang lebih cepat, kompilasi tanpa flag membutuhkan waktu 2200 detik, dengan flag 4500!
Thornhale
1
Secara umum, saya menemukan melakukan ML di windows adalah rasa sakit yang besar di belakang. Anda akhirnya menghabiskan banyak waktu untuk mendapatkan pekerjaan yang hanya berfungsi jika Anda bekerja di lingkungan linux. Saya percaya bahwa tensorflow perlu dikompilasi untuk setiap OS. Selanjutnya, jika Anda pergi di sini: tautan , Anda akan melihat bahwa tensorflow tidak didukung secara resmi. Memang ada beberapa panduan tentang cara mengompilasi tensorflow untuk Windows di sini: tautan . Meskipun saya harus mengakui, saya belum mencobanya. Saya hanya menggunakan ubuntu.
Thornhale
25

Ini adalah set instruksi pemrosesan vektor SIMD .

Menggunakan instruksi vektor lebih cepat untuk banyak tugas; pembelajaran mesin adalah tugas seperti itu.

Mengutip dokumen instalasi tensorflow :

Agar kompatibel dengan berbagai mesin selebar mungkin, TensorFlow secara default hanya menggunakan petunjuk SIME SSE4.1 pada mesin x86. Sebagian besar PC dan Mac modern mendukung instruksi yang lebih canggih, jadi jika Anda membuat biner yang hanya dapat dijalankan di komputer Anda sendiri, Anda dapat mengaktifkannya dengan menggunakan --copt=-march=nativeperintah bazel build.

Josh Bleecher Snyder
sumber
Mengapa biner Tensorflow tidak menggunakan pengiriman CPU? Apakah itu didukung oleh GCC?
Chris Pushbullet
4
Tautan "dokumen instalasi tensorflow" tidak berfungsi. Jadi saya bertanya-tanya apakah jawaban ini masih valid. Tolong merespon!
Thornhale
@ChrisPushbullet Anda dapat mengkompilasi Tensorflow untuk mendukung beberapa kemampuan komputasi yang berbeda untuk GPU, tetapi mereka meningkatkan ukuran biner banyak. Dugaan saya adalah bahwa hal yang sama berlaku untuk CPU.
Davidmh
22

Berkat semua balasan ini + beberapa percobaan dan kesalahan, saya berhasil menginstalnya di Mac dengan clang. Jadi bagikan saja solusi saya jika bermanfaat bagi seseorang.

  1. Ikuti instruksi pada Dokumentasi - Menginstal TensorFlow dari Sumber

  2. Saat diminta

    Silakan tentukan flag optimasi untuk digunakan selama kompilasi ketika opsi bazel "--config = opt" ditentukan [Default is -march = native]

lalu salin-tempel string ini:

-mavx -mavx2 -mfma -msse4.2

(Opsi default menyebabkan kesalahan, begitu pula beberapa flag lainnya. Saya tidak mendapatkan kesalahan dengan flag di atas. BTW saya membalas nsemua pertanyaan lainnya)

Setelah menginstal, saya memverifikasi percepatan ~ 2x hingga 2.5x ketika melatih model dalam sehubungan dengan instalasi lain berdasarkan roda default - Menginstal TensorFlow pada macOS

Semoga ini bisa membantu

Stoples
sumber
4
-march=nativeseharusnya lebih baik jika kompiler Anda mendukungnya dengan benar. Ini juga diatur -mtune=nativeuntuk membuat pilihan instruksi yang baik untuk CPU Anda. misalnya pada Haswell dan kemudian, itu menonaktifkan -mavx256-split-unaligned-storedan -mavx256-split-unaligned-load, yang aktif secara default untuk -mtune=genericdan melukai kinerja ketika data tidak diketahui disejajarkan tetapi ternyata saat dijalankan.
Peter Cordes
1
Terima kasih! Dalam kasus saya -march=nativemenyebabkan kesalahan sedangkan opsi lain tidak. Mungkin itu adalah kompiler spesifik. Saya membagikan ini tepat kalau-kalau orang lain mengalami hambatan yang sama.
JARS
1
Kesalahan apa? Kecuali jika sistem build tersedak string dengan =di dalamnya, atau Anda tidak menggunakan gccatau clang, itu seharusnya bekerja. Dan apakah itu -mtune=native -mavx2 -mfma berhasil untuk Anda? Atau -mtune=skylake? (Atau CPU apa pun yang Anda miliki). BTW, -mavx2menyiratkan -mavxdan -msse4.2. Tidak ada salahnya untuk memasukkan mereka semua dalam resep, dan saya kira membuatnya lebih mudah bagi orang untuk meninggalkan yang tidak didukung CPU mereka.
Peter Cordes
1
Saya telah mengedit jawaban teratas pada pertanyaan ini beberapa waktu yang lalu, tetapi saya tidak menggunakan tensorflow sendiri. Jika ada yang salah dengan -march=nativesistem build-nya, saya ingin tahu. (Dan / atau Anda harus melaporkannya di hulu sehingga mereka dapat memperbaiki skrip build mereka).
Peter Cordes
1
Terima kasih banyak atas sarannya. Untuk memeriksa itu, saya telah menjalankan kembali skrip .configure dengan hanya -march=nativedan ini adalah kesalahan: / Pengguna / jose / Dokumen / kode / tmptensorflow / tensorflow / tensorflow / core / BUILD: 1442: 1: C ++ kompilasi dari aturan '// tensorflow / core: lib_internal_impl' gagal (Keluar 1). Dalam file termasuk dari tensorflow / core / platform / denormal.cc: 37: /Library/Developer/CommandLineTools/usr/bin/../lib/clang/7.0.2/include/pmmintrin.h:28:: error: "Set instruksi SSE3 tidak diaktifkan" #error "Set instruksi SSE3 tidak diaktifkan" menggunakan Apple LLVM versi 7.0.2 (clang-700.1.81)
JARS
7

Saya baru saja menginstalnya dari sumber dan di bawah ini adalah semua langkah yang diperlukan untuk menginstalnya dari sumber dengan instruksi yang disebutkan tersedia.

Jawaban lain sudah menjelaskan mengapa pesan-pesan itu ditampilkan. Jawaban saya memberikan langkah-demi-langkah tentang cara menginstal, yang dapat membantu orang berjuang pada instalasi yang sebenarnya seperti yang saya lakukan.

  1. Instal Bazel

Unduh dari salah satu rilis yang tersedia , misalnya 0.5.2 . Ekstrak, masuk ke direktori dan mengkonfigurasinya: bash ./compile.sh. Salin yang dapat dieksekusi ke /usr/local/bin:sudo cp ./output/bazel /usr/local/bin

  1. Instal Tensorflow

Klon tensorflow: git clone https://github.com/tensorflow/tensorflow.git Buka direktori yang dikloning untuk mengkonfigurasinya:./configure

Ini akan memberi Anda beberapa pertanyaan, di bawah ini saya telah menyarankan tanggapan untuk setiap pertanyaan, Anda tentu saja dapat memilih tanggapan Anda sendiri sesuai keinginan:

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. Paket pip. Untuk membangunnya, Anda harus menjelaskan instruksi mana yang Anda inginkan (Anda tahu, Tensorflow yang memberi tahu Anda tidak ada).

Buat skrip 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

Bangun paket pip: bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

Instal paket pip Tensorflow yang baru saja Anda buat: sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl

Sekarang lain kali Anda memulai Tensorflow itu tidak akan mengeluh lagi tentang instruksi yang hilang.

Eduardo
sumber
4
Bangunan dengan hanya -c opt --copt=-march=nativeharus setidaknya sama baiknya --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2. (Keduanya akan membungkam peringatan, tetapi -march=nativemungkin membuat kode lebih cepat dengan menyetel khusus untuk CPU pada sistem yang sedang Anda bangun). Perhatikan juga bahwa --copt=-mavx2 --copt=-mfmamenyiratkan semua opsi AVX dan SSE sebelumnya, jadi string panjang opsi ini ditulis dengan jelas oleh seseorang yang tidak mengerti opsi gcc.
Peter Cordes
1
@PeterCordes, lihat masalah ini ( github.com/tensorflow/tensorflow/issues/7449 ), bahkan pengelola bazel tidak tegas mengapa pawai = asli tidak berfungsi seperti yang diharapkan. Ketika Anda tampaknya "memahami opsi gcc" maka Anda mungkin dapat membantu mereka untuk memperbaikinya, karena mereka telah menandai masalah sebagai membutuhkan "dukungan komunitas".
Eduardo
Terima kasih, saya akan melihat ... Hmm, beberapa orang mengatakan itu --copt=-mavx2tidak berhasil. Jika --copt=-mfma berhasil, --copt=-march=nativeharus bekerja, kecuali penguraian =adalah masalah. Untuk gcc / clang / icc, Anda pasti ingin agar skrip build akhirnya lolos -march=nativeke kompiler. Membuat itu terjadi melalui skrip membangun menjadi trik.
Peter Cordes
7

Ini adalah metode paling sederhana. Hanya satu langkah.

Ini berdampak signifikan pada kecepatan. Dalam kasus saya, waktu yang dibutuhkan untuk langkah pelatihan hampir setengahnya.

Lihat build kustom dari tensorflow

Sreeragh AR
sumber
2
Pembuatan
Chris Moschini
@ SreeraghAR Metode Anda menurunkan tensorflow dan keras saya.
KPMG
Pastikan Anda menginstal file yang benar sesuai dengan TensorFlow, versi Python, dan HW Anda.
Sreeragh AR
TensFlowVersi @SereraghAR adalah 1.10.0 dan menggunakan MacOS Sierra. Bantu saya menemukan file.
KPMG
Hmm .. Tidak dapat menemukan yang sesuai dengan versi Anda. Seseorang harus membuat roda khusus. github.com/yaroslavvb/tensorflow-community-wheels Solusi langsung bisa menggunakan Tensorflow 1.9.0
Sreeragh AR
5

Saya mengkompilasi skrip Bash kecil untuk Mac (dapat dengan mudah porting ke Linux) untuk mengambil semua fitur CPU dan menerapkan beberapa dari mereka untuk membangun TF. Saya di TF master dan menggunakan agak sering (beberapa kali dalam sebulan).

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

Alex Nikiforov
sumber
5

Untuk mengkompilasi TensorFlow dengan SSE4.2 dan AVX, Anda dapat menggunakan secara langsung

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

Sumber: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl

supercheval
sumber
1
Apakah ada perubahan baru-baru ini? Terakhir saya periksa --copt="-march=native"sedang makan =. (Dan BTW, tanda kutip ganda itu tidak melakukan apa-apa; mereka akan dihapus oleh shell sebelum bazelmelihat baris perintah Anda.)
Peter Cordes
4

2.0 SOLUSI YANG KOMPATIBEL:

Jalankan perintah di bawah ini di Terminal (Linux / MacOS) atau di Command Prompt (Windows) untuk menginstal Tensorflow 2.0 menggunakan 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
Dukungan Tensorflow
sumber
2
Bagian mana dari ini yang menentukan -march=native, atau opsi GCC / dentang lainnya? Saya tidak melihat penyebutan AVX, FMA, atau SSE4.2 dalam hal ini. (Dan apakah skrip pembuatan Bazel atau Tensorflow masih terputus dengan cara yang hanya disukai oleh -mavxpekerjaan, bukan -march=native? Jika itu yang menjadi masalah dalam jawaban atas pertanyaan ini)
Peter Cordes
untuk dukungan CPU dengan versi 2.1.0, opsi --config = opt tidak berfungsi untuk saya, saya menyelesaikannya dengan --config = v2. Juga baik untuk menyebutkan bahwa versi bazel yang tepat untuk membuatnya adalah 29.0.
Tolik
2

Saat membangun TensorFlow dari sumber, Anda akan menjalankan configureskrip. Salah satu pertanyaan yang diajukan configureskrip adalah sebagai berikut:

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

The configureScript akan melampirkan bendera (s) yang Anda tentukan dengan perintah bazel yang membangun paket TensorFlow pip. Secara umum, Anda dapat merespons permintaan ini dengan salah satu dari dua cara:

  • Jika Anda membangun TensorFlow pada jenis CPU yang sama dengan yang Anda gunakan untuk menjalankan TensorFlow, maka Anda harus menerima default ( -march=native). Opsi ini akan mengoptimalkan kode yang dihasilkan untuk jenis CPU mesin Anda.
  • Jika Anda membangun TensorFlow pada satu jenis CPU tetapi akan menjalankan TensorFlow pada jenis CPU yang berbeda, maka pertimbangkan untuk memasok bendera pengoptimalan yang lebih spesifik seperti yang dijelaskan dalam dokumentasi gcc .

Setelah mengkonfigurasi TensorFlow seperti yang dijelaskan dalam daftar berpoin sebelumnya, Anda harus dapat membangun TensorFlow yang sepenuhnya dioptimalkan untuk CPU target hanya dengan menambahkan --config=opttanda pada perintah bazel yang Anda jalankan.

Barry Rosenberg
sumber
-1

Untuk menyembunyikan peringatan itu, Anda bisa melakukan ini sebelum kode Anda yang sebenarnya.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
javac
sumber
5
Diam-diam berjalan lebih lambat daripada yang bisa terjadi pada perangkat keras Anda sepertinya ide yang buruk.
Peter Cordes
Saya setuju dengan @Peter Cordes secara umum - tetapi terkadang menyenangkan (dengan cara yang disiplin dan penuh perhatian) untuk menyembunyikan peringatan dan fokus pada tugas.
westsider
2
@westsider: ya, ini bisa berguna dalam beberapa kasus, tapi ini bukan jawaban yang baik kecuali itu menunjukkan implikasi: ada kinerja nyata yang hilang jika Anda hanya menyembunyikan peringatan alih-alih mengkompilasi ulang. (Kecuali mungkin jika Anda menggunakan GPU untuk pengangkatan berat, mungkin masih memperingatkan tentang opsi CPU?)
Peter Cordes