これは、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をコンパイルする方法
私はちょうどこの同じ問題に遭遇しました、それは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
を使用できます。)
なぜ、そもそもなぜこれらの警告が表示されるのですか の説明から始めましょう。
たぶんあなたはソースからTFをインストールしておらず、代わりにpip install tensorflow
のようなものを使っていました。それはあなたがあなたのアーキテクチャに最適化されていない(他の誰かによって)ビルドされたバイナリをインストールしたことを意味します。そして、これらの警告はまさにこれをあなたに告げます:あなたのアーキテクチャで何かが利用可能です、しかし、バイナリがそれでコンパイルされなかったので、それは使われません。これは documentation の一部です。
TensorFlowは、起動時に、CPUで利用可能な最適化でコンパイルされているかどうかを確認します。最適化が含まれていない場合、TensorFlowは警告を発します。 AVX、AVX2、およびFMA 命令は含まれていません。
良いことはたぶんあなたはTFを勉強したり実験したりしたいので、すべてが正しく機能するので心配しないでください
SSE4.2とAVXは何ですか?
ウィキペディアに SSE4.2 と AVX についての詳しい説明があります。この知識は、機械学習が得意である必要はありません。あなたはそれらが自然に並列化されるかもしれない操作を実行するために単一の命令に対して複数のデータポイントを使用するためのいくつかの追加の 命令 のセットとして考えるかもしれません(例えば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
最初に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分かかりました。
これらは _ simd _ベクトル処理命令セット です。
ベクトル命令を使用すると、多くのタスクが速くなります。機械学習はそのような作業です。
できるだけ広い範囲のマシンとの互換性を保つために、TensorFlowはデフォルトでx86マシンでSSE4.1 SIMD命令のみを使用します。最近のほとんどのPCやMacはより高度な命令をサポートしているので、自分のマシンでしか実行できないバイナリを構築している場合は、bazel buildコマンドで
--copt=-march=native
を使用してこれらを有効にできます。
このすべての返信といくつかの試行錯誤のおかげで、clang
を使用してMacにインストールできました。だから誰かに役立つ場合に備えて私のソリューションを共有するだけです。
ドキュメント-ソースからのTensorFlowのインストール の指示に従ってください
プロンプトが表示されたら
bazelオプション "--config = opt"が指定されている場合、コンパイル中に使用する最適化フラグを指定してください[デフォルトは-march = native]
次に、この文字列をコピーして貼り付けます。
-mavx -mavx2 -mfma -msse4.2
(デフォルトのオプションはエラーを引き起こしたので、他のフラグのいくつかもそうでした。上記のフラグでエラーはありませんでした。ところで、他のすべての質問にn
と答えました)
インストール後、デフォルトのホイールに基づいて別のインストールに関して深いモデルをトレーニングするときに、約2倍から2.5倍のスピードアップを確認します- macOSにTensorFlowをインストールする
それが役に立てば幸い
私は最近ソースからそれをインストールしました、そして、以下は利用可能な言及された指示でソースからそれをインストールするのに必要とされるすべてのステップです。
他の回答では、これらのメッセージが表示される理由についてすでに説明しています。私の答えはインストール方法を段階的に示しています。これは私がしたように実際のインストールに苦労している人々を助けるかもしれません。
入手可能な release のいずれかからダウンロードしてください、例えば 0.5.2 。解凍し、ディレクトリに移動して設定します。bash ./compile.sh
。 /usr/local/bin
:Sudo cp ./output/bazel /usr/local/bin
クローンテンソルフロー: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
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を起動したときに、指示がなくなっても文句を言うことはもうありません。
私はMac用の小さなBashスクリプト(簡単にLinuxに移植できる)をコンパイルして、すべてのCPU機能を取得し、それらの一部を適用してTFを構築しました。 TFのマスターにイムとちょっと頻繁に(月に数回)を使用してください。
https://Gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f
SSE4.2とAVXでTensorFlowをコンパイルするために、あなたは直接使うことができます
bazel build --config = mkl --config = "opt" --copt = " - march = broadwell" --copt = " - O3" // tensorflow/tools/pip_package:build_pip_package
ソースから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つでこのプロンプトに答えることができます:
-march=native
)を受け入れる必要があります。このオプションはあなたのマシンのCPUタイプに合わせて生成されたコードを最適化します。前述の箇条書きリストの説明に従ってTensorFlowを設定した後は、実行しているすべてのbazelコマンドに--config=opt
フラグを追加するだけで、ターゲットCPU用に最適化されたTensorFlowを構築できます。
これらの警告を隠すには、実際のコードの前にこれを行うことができます。
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf