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,
- Apa itu SSE4.2 dan AVX?
- Bagaimana SSE4.2 dan AVX ini meningkatkan komputasi CPU untuk tugas-tugas Tensorflow.
- Bagaimana cara membuat Tensorflow dikompilasi menggunakan dua perpustakaan?
tensorflow
x86
compiler-optimization
simd
compiler-options
GabrielChu
sumber
sumber
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)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_sourcesJawaban:
Saya hanya mengalami masalah yang sama, sepertinya saran Yaroslav Bulatov tidak mencakup dukungan SSE4.2, menambahkan
--copt=-msse4.2
sudah cukup. Pada akhirnya, saya berhasil membanguntanpa peringatan atau kesalahan apa pun.
Mungkin pilihan terbaik untuk sistem apa pun adalah:
( Pembaruan: skrip build mungkin sedang makan
-march=native
, mungkin karena mengandung=
.)-mfpmath=both
hanya bekerja dengan gcc, bukan dentang.-mfpmath=sse
mungkin 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
-O2
atau-O3
apa.gcc -O3
memungkinkan pengoptimalan penuh termasuk auto-vektorisasi, tetapi kadang-kadang bisa membuat kode lebih lambat.Kegunaannya:
--copt
forbazel 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=native
memungkinkan semua opsi yang didukung CPU Anda, sehingga membuatnya-mavx512f -mavx2 -mavx -mfma -msse4.2
berlebihan. (Juga,-mavx2
sudah mengaktifkan-mavx
dan-msse4.2
, jadi perintah Yaroslav seharusnya baik-baik saja). Juga jika Anda menggunakan CPU yang tidak mendukung salah satu opsi ini (seperti FMA), menggunakan-mfma
akan membuat biner yang salah dengan instruksi ilegal.TensorFlow secara
./configure
default diaktifkan-march=native
, jadi menggunakan itu harus menghindari keharusan menentukan opsi kompiler secara manual.-march=native
memungkinkan-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
-xHOST
sebagai ganti-march=native
.)sumber
-march=native
tidak berfungsi. Selain itu, menjatuhkan--config=cuda
(jika dukungan CUDA tidak diperlukan) dan-k
(karena tidak ada kesalahan terjadi selama kompilasi) juga berfungsi.--copt=-mfpmath=both
untuk membuatnya bekerja denganclang
di macOS. Apakah itu mempengaruhi hasil biner?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 .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
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
sumber
bazel
dalam hal ini?FAILED: Build did NOT complete successfully
. Tidak sesederhana itu untuk dikompilasi sendiri.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.
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.
sumber
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 :
sumber
Berkat semua balasan ini + beberapa percobaan dan kesalahan, saya berhasil menginstalnya di Mac dengan
clang
. Jadi bagikan saja solusi saya jika bermanfaat bagi seseorang.Ikuti instruksi pada Dokumentasi - Menginstal TensorFlow dari Sumber
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:
(Opsi default menyebabkan kesalahan, begitu pula beberapa flag lainnya. Saya tidak mendapatkan kesalahan dengan flag di atas. BTW saya membalas
n
semua 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
sumber
-march=native
seharusnya lebih baik jika kompiler Anda mendukungnya dengan benar. Ini juga diatur-mtune=native
untuk membuat pilihan instruksi yang baik untuk CPU Anda. misalnya pada Haswell dan kemudian, itu menonaktifkan-mavx256-split-unaligned-store
dan-mavx256-split-unaligned-load
, yang aktif secara default untuk-mtune=generic
dan melukai kinerja ketika data tidak diketahui disejajarkan tetapi ternyata saat dijalankan.-march=native
menyebabkan kesalahan sedangkan opsi lain tidak. Mungkin itu adalah kompiler spesifik. Saya membagikan ini tepat kalau-kalau orang lain mengalami hambatan yang sama.=
di dalamnya, atau Anda tidak menggunakangcc
atauclang
, itu seharusnya bekerja. Dan apakah itu-mtune=native -mavx2 -mfma
berhasil untuk Anda? Atau-mtune=skylake
? (Atau CPU apa pun yang Anda miliki). BTW,-mavx2
menyiratkan-mavx
dan-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.-march=native
sistem build-nya, saya ingin tahu. (Dan / atau Anda harus melaporkannya di hulu sehingga mereka dapat memperbaiki skrip build mereka).-march=native
dan 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)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.
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
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:
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.
sumber
-c opt --copt=-march=native
harus setidaknya sama baiknya--copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2
. (Keduanya akan membungkam peringatan, tetapi-march=native
mungkin membuat kode lebih cepat dengan menyetel khusus untuk CPU pada sistem yang sedang Anda bangun). Perhatikan juga bahwa--copt=-mavx2 --copt=-mfma
menyiratkan semua opsi AVX dan SSE sebelumnya, jadi string panjang opsi ini ditulis dengan jelas oleh seseorang yang tidak mengerti opsi gcc.--copt=-mavx2
tidak berhasil. Jika--copt=-mfma
berhasil,--copt=-march=native
harus bekerja, kecuali penguraian=
adalah masalah. Untuk gcc / clang / icc, Anda pasti ingin agar skrip build akhirnya lolos-march=native
ke kompiler. Membuat itu terjadi melalui skrip membangun menjadi trik.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
sumber
TensFlow
Versi @SereraghAR adalah 1.10.0 dan menggunakanMacOS Sierra
. Bantu saya menemukan file.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
sumber
Untuk mengkompilasi TensorFlow dengan SSE4.2 dan AVX, Anda dapat menggunakan secara langsung
Sumber: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl
sumber
--copt="-march=native"
sedang makan=
. (Dan BTW, tanda kutip ganda itu tidak melakukan apa-apa; mereka akan dihapus oleh shell sebelumbazel
melihat baris perintah Anda.)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 :
sumber
-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-mavx
pekerjaan, bukan-march=native
? Jika itu yang menjadi masalah dalam jawaban atas pertanyaan ini)Saat membangun TensorFlow dari sumber, Anda akan menjalankan
configure
skrip. Salah satu pertanyaan yang diajukanconfigure
skrip adalah sebagai berikut:The
configure
Script 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:-march=native
). Opsi ini akan mengoptimalkan kode yang dihasilkan untuk jenis CPU mesin Anda.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=opt
tanda pada perintah bazel yang Anda jalankan.sumber
Untuk menyembunyikan peringatan itu, Anda bisa melakukan ini sebelum kode Anda yang sebenarnya.
sumber