IT

SSE4.2 및 AVX 명령어로 Tensorflow를 컴파일하는 방법은 무엇입니까?

lottoking 2020. 3. 31. 08:28
반응형

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. 두 라이브러리를 사용하여 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=bothclang이 아닌 gcc에서만 작동합니다. -mfpmath=sse아마 나쁘지 않더라도 아마 좋을 것이며 x86-64의 기본값입니다. 32 비트 빌드는 기본적으로 -mfpmath=387로 설정되므로 변경하면 32 비트에 도움이됩니다. 그러나 숫자 크 런칭에 고성능을 원한다면 64 비트 바이너리를 빌드해야합니다.

나는 무엇 TensorFlow의 기본 모르겠어요 -O2또는 -O3이다. gcc -O3자동 벡터화를 포함한 전체 최적화가 가능하지만 때로는 코드 속도가 느려질 수 있습니다.


이 기능 : --coptforbazel build 는 C 및 C ++ 파일을 컴파일하기 위해 옵션을 gcc로 직접 전달합니다 (그러나 링크하지는 않으므로 파일 간 링크 시간 최적화를위한 다른 옵션이 필요합니다).

x86-64 gcc는 기본적으로 SSE2 또는 이전 SIMD 명령어 만 사용하므로 모든 x86-64 시스템 에서 바이너리를 실행할 수 있습니다 . ( https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html 참조 ) 그것은 당신이 원하는 것이 아닙니다. 이 바이너리는 빌드 한 시스템에서만 실행되므로 CPU가 실행할 수있는 모든 명령어를 활용하는 바이너리를 만들려고합니다.

-march=nativeCPU가 지원하는 모든 옵션을 활성화하므로 -mavx512f -mavx2 -mavx -mfma -msse4.2중복됩니다. (또한, -mavx2이미 수 -mavx-msse4.2야로슬라프의 명령을 잘 했어야 있도록). 또한 FMA와 같은 이러한 옵션 중 하나를 지원하지 않는 CPU를 사용하는 경우 -mfma잘못된 명령으로 결함이있는 이진 파일을 만들 수 있습니다.

TensorFlow의 ./configure기본값은 enabled 로 설정-march=native 되므로 컴파일러 옵션을 수동으로 지정할 필요가 없습니다.

-march=native-mtune=native있도록, 그것은 당신의 CPU에 대한 최적화 AVX 명령어의 순서가 정렬되지 않은 부하에 가장 적합한 같은 것들에 대한.

이것은 모두 gcc, clang 또는 ICC에 적용됩니다. (ICC의 경우 -xHOST대신 사용할 수 있습니다 -march=native.)


먼저 이러한 경고가 표시 되는 이유에 대한 설명부터 시작하겠습니다 .


아마도 소스에서 TF를 설치하지 않았고 대신 TF를 사용했습니다 pip install tensorflow. 즉, 아키텍처에 최적화되지 않은 사전 빌드 된 (다른 사람이 만든) 바이너리를 설치했음을 의미합니다. 그리고이 경고들은 당신에게 정확히 이것을 알려줍니다 : 당신의 아키텍쳐에서 무언가가 가능하지만 바이너리가 컴파일되지 않았기 때문에 사용되지 않을 것입니다. 다음은 문서 의 일부입니다 .

TensorFlow는 시작시 CPU에서 사용 가능한 최적화로 컴파일되었는지 확인합니다. 최적화가 포함되지 않은 경우 TensorFlow는 경고 (예 : AVX, AVX2 및 FMA 명령어는 포함되지 않음)를 발생시킵니다.

좋은 점은 TF로 배우거나 실험하고 싶을 것이므로 모든 것이 제대로 작동하고 걱정하지 않아도됩니다.


SSE4.2 및 AVX 란 무엇입니까?

Wikipedia에는 SSE4.2AVX 에 대한 좋은 설명이 있습니다. 이 지식은 기계 학습에 능숙하지 않아도됩니다. 컴퓨터가 단일 명령어에 대해 여러 데이터 포인트를 사용하여 자연적으로 병렬화 될 수있는 작업 (예 : 두 개의 어레이 추가)을 수행 하기 위한 추가 명령어 세트로 생각할 수 있습니다.

SSE와 AVX는 SIMD (단일 명령, 다중 데이터) 에 대한 추상적 인 아이디어를 구현 한 것입니다.

플린의 분류 체계에있는 병렬 컴퓨터 클래스. 여러 데이터 요소에 대해 동일한 작업을 동시에 수행하는 여러 처리 요소가있는 컴퓨터에 대해 설명합니다. 따라서 이러한 머신은 데이터 레벨 병렬 처리를 이용하지만 동시성은 아닙니다. 동시 (병렬) 계산이 있지만 주어진 순간에 단일 프로세스 (명령) 만 있습니다.

다음 질문에 대답하기에 충분합니다.


이러한 SSE4.2 및 AVX가 TF 작업에 대한 CPU 계산을 개선하는 방법

다양한 벡터 (매트릭스 / 텐서) 연산을보다 효율적으로 계산할 수 있습니다. 이 슬라이드 에서 더 많은 것을 읽을 수 있습니다


두 라이브러리를 사용하여 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


세 번째 질문에 먼저 대답하겠습니다.

conda-env 내에서 자체 컴파일 버전을 실행하려는 경우 가능합니다. 다음은 추가 지침과 함께 시스템에 tensorflow를 설치하기 위해 실행하는 일반적인 지침입니다. 참고 :이 빌드는 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.

두 번째 질문에 관해서 :

최적화 된 자체 컴파일 버전은 내 의견으로는 노력할 가치가 있습니다. 내 특정 설정에서 560-600 초가 걸리던 계산에는 이제 약 300 초가 걸립니다! 정확한 숫자는 다를 수 있지만 특정 설정에서 일반적으로 속도가 약 35-50 % 증가 할 것으로 생각합니다.

마지막으로 첫 번째 질문 :

많은 답변이 이미 위에 제공되었습니다. 요약하면 : AVX , SSE4.1, SSE4.2 , MFA는 X86 CPU에서 다른 종류의 확장 명령 세트입니다. 많은 행렬 또는 벡터 연산 처리를위한 최적화 된 명령이 포함되어 있습니다.

SSE4.2가 SSE4.1을 대체하는 최신 버전의 명령어가 아니라는 것은 아닙니다. SSE4 = SSE4.1 (47 명령어 세트) + SSE4.2 (7 명령어 세트).

tensorflow 컴파일 컨텍스트에서 컴퓨터가 AVX2 및 AVX, SSE4.1 및 SSE4.2를 지원하는 경우 최적화 플래그를 모두 배치해야합니다. 내가 한 것처럼하지 말고 SSE4.2와 함께 가기 때문에 SSE4.1이 더 최신이며 대체되어야한다고 생각합니다. 분명히 틀 렸습니다! 40 분의 비용이 소요되어 다시 컴파일해야했습니다.


이것들은 SIMD 벡터 처리 명령 세트 입니다.

많은 작업에서 벡터 명령을 사용하는 것이 더 빠릅니다. 기계 학습은 그러한 작업입니다.

tensorflow 설치 문서 인용 :

가능한 광범위한 기계와 호환되도록 TensorFlow는 기본적으로 x86 기계에서 SSE4.1 SIMD 명령 만 사용합니다. 대부분의 최신 PC 및 Mac은 고급 지침을 지원하므로 자신의 컴퓨터에서만 실행되는 바이너리를 빌드하는 경우 --copt=-march=nativebazel build 명령에서이를 사용하여 활성화 할 수 있습니다 .


이 모든 답글과 일부 시행 착오 덕분에와 함께 Mac에 설치했습니다 clang. 그래서 누군가에게 유용 할 경우를 대비하여 내 솔루션을 공유하십시오.

  1. 문서-소스에서 TensorFlow 설치 에 대한 지시 사항을 따르십시오.

  2. 메시지가 표시되면

    bazel 옵션 "--config = opt"가 지정된 경우 컴파일 중에 사용할 최적화 플래그를 지정하십시오. [기본값은 -march = native]

그런 다음이 문자열을 복사하여 붙여 넣습니다.

-mavx -mavx2 -mfma -msse4.2

(기본 옵션은 오류를 일으켰으므로 다른 플래그 중 일부가 발생했습니다. 위 플래그에 오류가 없습니다. BTW n다른 모든 질문에 답했습니다)

설치 후 기본 휠을 기반으로 다른 설치와 관련하여 딥 모델을 훈련 할 때 ~ 2x ~ 2.5x 속도 향상을 확인합니다 -macOS에 TensorFlow 설치

그것이 도움이되기를 바랍니다.


이것이 가장 간단한 방법입니다. 한 걸음 만

속도에 큰 영향을 미칩니다. 제 경우에는 훈련 단계에 걸리는 시간이 거의 반으로 줄었습니다.

tensorflow의 사용자 정의 빌드 참조


최근에 소스에서 설치했으며 다음 지침에 따라 소스에서 설치하는 데 필요한 모든 단계가 아래에 나와 있습니다.

다른 답변은 이미 해당 메시지가 표시되는 이유를 설명합니다. 내 대답은 isnstall 방법에 대한 단계별 지침을 제공하므로 사람들이 실제 설치에 어려움을 겪을 수 있습니다.

  1. Bazel 설치

사용 가능한 릴리스 중 하나 ( 예 : 0.5.2) 에서 다운로드하십시오 . 압축을 풀고 디렉토리로 이동하여 구성하십시오 bash ./compile.sh.. 실행 파일을 /usr/local/bin다음 위치에 복사하십시오 .sudo cp ./output/bazel /usr/local/bin

  1. Tensorflow 설치

복제 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

방금 빌드 한 Tensorflow pip 패키지를 설치하십시오. sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl

다음에 Tensorflow를 시작할 때 누락 된 지침에 대해 더 이상 불평하지 않습니다.


모든 CPU 기능을 검색하고 일부를 적용하여 TF를 빌드하기 위해 Mac 용 작은 Bash 스크립트 (Linux로 쉽게 이식 가능)를 컴파일했습니다. TF 마스터에 임하고 좀 자주 사용하십시오 (한 달에 커플 시간).

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


SSE4.2 및 AVX로 TensorFlow를 컴파일하려면 직접 사용할 수 있습니다

bazel 빌드 --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


소스에서 TensorFlow를 빌드 할 때 configure스크립트를 실행합니다 . configure스크립트가 묻는 질문 중 하나는 다음과 같습니다.

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

configure스크립트는 플래그 (들) 당신이 TensorFlow 핍 패키지를 빌드 bazel 명령에 지정을 첨부합니다. 대체로 다음 두 가지 방법 중 하나로이 프롬프트에 응답 할 수 있습니다.

  • TensorFlow를 실행할 CPU 유형과 동일한 유형의 CPU 유형에 TensorFlow를 빌드하는 경우 기본값 ( -march=native)을 채택해야합니다 . 이 옵션은 머신의 CPU 유형에 맞게 생성 된 코드를 최적화합니다.
  • 한 CPU 유형에서 TensorFlow를 빌드하지만 다른 CPU 유형에서 TensorFlow를 실행하는 경우 gcc 문서에 설명 된대로보다 구체적인 최적화 플래그를 제공하는 것을 고려 하십시오 .

앞의 글 머리 기호 목록에 설명 된대로 TensorFlow를 구성한 후에 --config=opt는 실행중인 bazel 명령에 플래그를 추가하여 대상 CPU에 대해 완전히 최적화 된 TensorFlow를 빌드 할 수 있어야합니다 .


이러한 경고를 숨기려면 실제 코드보다 먼저 할 수 있습니다.

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

참고 URL : https://stackoverflow.com/questions/41293077/how-to-compile-tensorflow-with-sse4-2-and-avx-instructions

반응형