web-dev-qa-db-ja.com

SSE4.2とAVX命令でTensorflowをコンパイルする方法

これは、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)2つのライブラリを使ってTensorflowをコンパイルする方法

250
GabrielChu

私はちょうどこの同じ問題に遭遇しました、それは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でのみ機能し、clangでは機能しません。 -mfpmath=sseは、おそらくそれほど良くはないにしても同じくらい良く、x86-64のデフォルトです。 32ビットビルドはデフォルトで-mfpmath=387になるので、これを変更すると32ビットに役立ちます。 (ただし、数値計算に高性能を望む場合は、64ビットバイナリを構築する必要があります。)

-O2または-O3に対するTensorFlowのデフォルトが何であるかわかりません。 gcc -O3は自動ベクトル化を含む完全な最適化を可能にします、しかしそれは時々コードを遅くすることができます。


これは何をするものですか? --copt for bazel build CおよびC++ファイルをコンパイルするためにgccに直接オプションを渡します(ただしリンクはしません。ファイル間リンク時最適化には別のオプションが必要です)

x86-64 gccはデフォルトでSSE2以前のSIMD命令のみを使用するので、バイナリをany 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のコマンドは問題ないはずです)。また、FMAのようにこれらのオプションの1つをサポートしていないCPUを使用している場合は、-mfmaを使用するとバイナリが不正な命令でエラーになる可能性があります。

TensorFlowの./configureはデフォルトで-march=native を有効にするため、これを使用するとコンパイラオプションを手動で指定する必要がなくなります。

-march=native-mtune=nativeを有効にします、それで それはあなたのCPUのために最適化します どのAVX命令のシーケンスが整列されていないロードのために最も良いかのようなもののために。

これはすべてgcc、clang、またはICCに適用されます。 (ICCの場合、-xHOSTの代わりに-march=nativeを使用できます。)

141
Mike Chiu

なぜ、そもそもなぜこれらの警告が表示されるのですか の説明から始めましょう。 


たぶんあなたはソースからTFをインストールしておらず、代わりにpip install tensorflowのようなものを使っていました。それはあなたがあなたのアーキテクチャに最適化されていない(他の誰かによって)ビルドされたバイナリをインストールしたことを意味します。そして、これらの警告はまさにこれをあなたに告げます:あなたのアーキテクチャで何かが利用可能です、しかし、バイナリがそれでコンパイルされなかったので、それは使われません。これは documentation の一部です。

TensorFlowは、起動時に、CPUで利用可能な最適化でコンパイルされているかどうかを確認します。最適化が含まれていない場合、TensorFlowは警告を発します。 AVX、AVX2、およびFMA 命令は含まれていません。

良いことはたぶんあなたはTFを勉強したり実験したりしたいので、すべてが正しく機能するので心配しないでください


SSE4.2とAVXは何ですか?

ウィキペディアに SSE4.2AVX についての詳しい説明があります。この知識は、機械学習が得意である必要はありません。あなたはそれらが自然に並列化されるかもしれない操作を実行するために単一の命令に対して複数のデータポイントを使用するためのいくつかの追加の 命令 のセットとして考えるかもしれません(例えば2つの配列を加える)。 

SSEとAVXはどちらも SIMD (単一命令、複数データ)の抽象概念の実装です。

flynnの分類法におけるあるクラスの並列コンピュータ。それは、同時に複数のデータポイントに対して同じ操作を実行する複数の処理要素を有するコンピュータについて説明している。したがって、そのようなマシンはデータレベルの並列性を利用するが、並行性は利用しない:同時(並列)計算はあるが、所与の瞬間には単一のプロセス[…]](命令)しかない。

あなたの次の質問に答えるのにこれで十分です。


これらのSSE4.2とAVXはTFタスクのCPU計算をどのように改善しますか

それらは様々なベクトル(行列/テンソル)演算のより効率的な計算を可能にする。 これらのスライドでもっと読むことができます


2つのライブラリを使って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

119
Salvador Dali

最初に3番目の質問に答えましょう:

Conda-env内で自己コンパイル版を実行したい場合は、そうすることができます。これらは、追加の指示と共にテンソルフローを私のシステムにインストールするために私が実行する一般的な指示です。注:このビルドは、Ubuntu 16.04 LTSを実行しているAMD A10-7850ビルド(サポートされている手順についてはCPUを確認してください...は異なる場合があります)用です。私はconda-env内でPython 3.5を使用しています。クレジットはtensorflowソースインストールページと上記の回答に行きます。

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%の速度向上が期待できます。

最後にあなたの最初の質問:

多くの答えがすでに上で提供されています。要約すると、 _ 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.1に取って代わるべきであるとSSE4.2と一緒に行くだけです。それは明らかに間違っています!そのため、再コンパイルしなければならず、40分かかりました。

50
Thornhale

これらは _ simd _ベクトル処理命令セット です。 

ベクトル命令を使用すると、多くのタスクが速くなります。機械学習はそのような作業です。

tensorflowインストールドキュメントを引用する

できるだけ広い範囲のマシンとの互換性を保つために、TensorFlowはデフォルトでx86マシンでSSE4.1 SIMD命令のみを使用します。最近のほとんどのPCやMacはより高度な命令をサポートしているので、自分のマシンでしか実行できないバイナリを構築している場合は、bazel buildコマンドで--copt=-march=nativeを使用してこれらを有効にできます。

25

このすべての返信といくつかの試行錯誤のおかげで、clangを使用してMacにインストールできました。だから誰かに役立つ場合に備えて私のソリューションを共有するだけです。

  1. ドキュメント-ソースからのTensorFlowのインストール の指示に従ってください

  2. プロンプトが表示されたら

    bazelオプション "--config = opt"が指定されている場合、コンパイル中に使用する最適化フラグを指定してください[デフォルトは-march = native]

次に、この文字列をコピーして貼り付けます。

-mavx -mavx2 -mfma -msse4.2

(デフォルトのオプションはエラーを引き起こしたので、他のフラグのいくつかもそうでした。上記のフラグでエラーはありませんでした。ところで、他のすべての質問にnと答えました)

インストール後、デフォルトのホイールに基づいて別のインストールに関して深いモデルをトレーニングするときに、約2倍から2.5倍のスピードアップを確認します- macOSにTensorFlowをインストールする

それが役に立てば幸い

17
JARS

私は最近ソースからそれをインストールしました、そして、以下は利用可能な言及された指示でソースからそれをインストールするのに必要とされるすべてのステップです。

他の回答では、これらのメッセージが表示される理由についてすでに説明しています。私の答えはインストール方法を段階的に示しています。これは私がしたように実際のインストールに苦労している人々を助けるかもしれません。

  1. Bazelをインストールする

入手可能な release のいずれかからダウンロードしてください、例えば 0.5.2 。解凍し、ディレクトリに移動して設定します。bash ./compile.sh/usr/local/binSudo cp ./output/bazel /usr/local/bin

  1. 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はあなたが行方不明であることを知らせました)。

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

Pipパッケージをビルドします。bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

今作成したTensorflow pipパッケージをインストールします。Sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl

次回Tensorflowを起動したときに、指示がなくなっても文句を言うことはもうありません。

6
Eduardo

これが最も簡単な方法です。一歩だけ。

速度に大きな影響を与えます。私の場合、トレーニングステップにかかる時間はほぼ半分になりました。

テンソルフローのカスタムビルドを参照

6
Sreeragh A R

私はMac用の小さなBashスクリプト(簡単にLinuxに移植できる)をコンパイルして、すべてのCPU機能を取得し、それらの一部を適用してTFを構築しました。 TFのマスターにイムとちょっと頻繁に(月に数回)を使用してください。

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

4
Alex Nikiforov

SSE4.2とAVXでTensorFlowをコンパイルするために、あなたは直接使うことができます

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

3
supercheval

ソースからTensorFlowを構築するときは、configureスクリプトを実行します。 configureスクリプトが尋ねる質問の1つは次のとおりです。

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

configureスクリプトは、TensorFlow pipパッケージをビルドするbazelコマンドに指定したフラグを添付します。大まかに言って、あなたは2つの方法のうちの1つでこのプロンプトに答えることができます:

  • TensorFlowを実行するのと同じタイプのCPUタイプでTensorFlowを構築している場合は、デフォルト(-march=native)を受け入れる必要があります。このオプションはあなたのマシンのCPUタイプに合わせて生成されたコードを最適化します。
  • あるCPUタイプでTensorFlowを構築しているが、異なるCPUタイプでTensorFlowを実行する場合は、 gcc のドキュメント で説明されているように、より具体的な最適化フラグを指定してください。

前述の箇条書きリストの説明に従ってTensorFlowを設定した後は、実行しているすべてのbazelコマンドに--config=optフラグを追加するだけで、ターゲットCPU用に最適化されたTensorFlowを構築できます。

2
Barry Rosenberg

これらの警告を隠すには、実際のコードの前にこれを行うことができます。

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