0%

macOS로 CPU용 Tensorflow 직접 빌드해보기

Tensorflow 나도 해보자

저는 몇년전부터 주변에서 다들 텐서플로우 텐서플로우..하길래 궁금했고, Google I/O 세미나를 통해 접했습니다.
제대로 접해보는 기회가 딱히 없었고, 그 땐 머신 러닝이나 딥러닝에 크게 관심은 없었습니다.
그러다가, 최근에 장기간 교육을 받았는데 그 교육을 통해서 Tensorflow 에 대해 제대로 접해보기도 했었습니다.
그리고 그 교육을 통해서 Notebook 프로젝트도 완성했구요.

‘CPU’로 Tensorflow 돌리고 싶어요

머신러닝 라이브러리 돌릴 땐 GPU가 최고라고 하네요.
왜냐하면, CPU보다 GPU가 코어 수가 많아, 많은 연산을 병렬로 동시에 할 수 있기 때문이죠.
즉, 연산을 생각할 때 가성비(?)가 CPU 보다 크기 때문입니다.

그러나

저는 Macbook Pro 씁니다. 심지어 2015년 하반기 버전이죠..
이 맥북은 ThunderBolt 2 방식만 지원되서, 심지어 외장 그래픽카드 성능을 100% 다 뽑을 수도 없습니다.

그래서

‘Mac의 CPU’로 Tensorflow 돌릴겁니다..


그런데 너무 느린데요

일단 CPU보다 GPU가 훨씬 빠른 건 사실입니다… :(

GPU가 없어요. GPU 비싸요.

모델 학습을 시키는데,

1
... I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA

위와 같은 메시지가 뜨더군요.

이 메시지는 현재 설치된 Tensorflow 패키지는, CPU의 연산을 다 사용하여 더 좋은 연산 아키텍쳐에 대응하도록 빌드되지 않았다는 것입니다.

그러니까 pip로 설치하면, 호환성 또는 범용성이라는 명목하에 CPU 성능을 제대로 뽑아주지 못한다는 거죠.

사용하는 CPU에 최적화된 Tensorflow 패키지를 빌드하기

자 이제, Mac CPU 성능을 끌어올려, 기존 Tensorflow CPU 모드보다 더 빠른 성능을 얻도록 해봅시다.

다운로드

brew를 설치해주세요.

1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

bazel를 설치해주세요.

1
brew install bazel

Tensorflow git repo를 받으세요.

1
git clone https://github.com/tensorflow/tensorflow.git

설치

./configure 명령어를 입력해주세요

1
2
cd tensorflow
./configure

새로 빌드할 pip 패키지 옵션 선택하기

필요한 설정에 따라 Y 체크하시거나, 계속 엔터키를 누르면 됩니다.

1) 설치 시작 메시지

1
2
WARNING: --batch mode is deprecated. Please instead explicitly shut down your Bazel server using the command "bazel shutdown".
You have bazel 0.23.2-homebrew installed.

2) bazel로 패키지를 만들기 위한 옵션 지정하기

설치된 Python 가상환경이 기본 PATH로 지정되어 있다면 아래와 비슷한 메시지가 나옵니다.

1
Please specify the location of python. [Default is /Users/wgtech/anaconda3/envs/mlvenv/bin/python]:

설치된 Python library 경로를 묻습니다. 이상 없으면 엔터키를 눌러주세요

1
2
3
Found possible Python library paths:
/Users/wgtech/anaconda3/envs/mlvenv/lib/python3.6/site-packages
Please input the desired Python library path to use. Default is [/Users/wgtech/anaconda3/envs/mlvenv/lib/python3.6/site-packages]

3) pip 패키지로 빌드하기 위한, 알맞는 옵션을 선택합니다.

XLA JIT 옵션 선택입니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)

1
2
Do you wish to build TensorFlow with XLA JIT support? [y/N]:
No XLA JIT support will be enabled for TensorFlow.

OpenCL SYCL 옵션 선택입니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)

1
2
Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]:
No OpenCL SYCL support will be enabled for TensorFlow.

ROCm 옵션 선택입니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)

1
2
Do you wish to build TensorFlow with ROCm support? [y/N]:
No ROCm support will be enabled for TensorFlow.

CUDA 옵션 선택입니다. (CPU로 개발할 것이기 때문에 N/또는 엔터키를 입력하여 넘겼습니다.)

1
2
Do you wish to build TensorFlow with CUDA support? [y/N]:
No CUDA support will be enabled for TensorFlow.

새로운 버전의 clang을 설치할 지 묻습니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)

1
2
Do you wish to download a fresh release of clang? (Experimental) [y/N]:
Clang will not be downloaded.

MPI 옵션 선택입니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)

1
2
Do you wish to build TensorFlow with MPI support? [y/N]:
No MPI support will be enabled for TensorFlow.

추후 bazel 명령어를 통해 입력할 config 파라미터를 정할 수 있습니다. (제 경우는 엔터키를 입력하여 넘겼습니다.)

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

Android용 Tensorflow 애플리케이션을 만들지 묻습니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)

1
2
Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]:
Not configuring the WORKSPACE for Android builds.

iOS, macOS, tvOS용 Tensorflow 애플리케이션을 만들지 묻습니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)

1
2
Would you like to configure Bazel rules for building on Apple platforms? [y/N]:
Not configuring Bazel rules for Apple platforms.

bazel로 패키지를 빌드하기

선택 1 : CPU 자원을 제대로 활용하여 Tensorflow 사용하고 싶다면…

저는 아래와 같은 명령어를 입력하여 패키지 빌드했습니다

1
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.2 //tensorflow/tools/pip_package:build_pip_package

선택 2 : pip에 배포된 패키지와 동일하게 진행할 것이라면…
bazel build –config=opt //tensorflow/tools/pip_package:build_pip_package

선택 3 : GPU로 Tensorflow를 사용하고 싶다면…
(위에 반드시 CUDA 옵션 선택 메시지에서 Y를 눌러야합니다. 그리고 아래와 같은 명령어를 입력하세요.)
bazel build –config=opt –config=cuda //tensorflow/tools/pip_package:build_pip_package


위 선택지 중 하나를 택해 build 과정을 거치고 나서 아래 명령어를 입력해주세요.
(wheel 파일 이름을 입력하라고 나올겁니다)

1
./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

bazel로 패키지 빌드시 유의할 점

  • –copt부분은 cpu가 지원되는 것에 따라 약간씩 다를 수 있습니다.
  • 위에서도 언급했지만, Nvidia GPU의 CUDA 연산을 활용하려면 –config=cuda 추가해주세요.

bazel로 pip 패키지를 빌드했다면…

1
2
3
4
5
# 예시1
pip install /tmp/tensorflow_pkg/tensorflow-버전태그.whl

# 예시2
pip install /tmp/tensorflow_pkg/tensorflow-1.1.0-cp36-cp36m-macosx_10_6_intel.whl

잘못 빌드했다면!!

1
brew clean --expunge

결과

bazel 빌드 시간

위와 같은 어려움(?)을 극복하여 빌드를 시도했습니다.
저 같은 경우는 약 3시간 19분정도 걸리더라구요..

기존보다 얼마나 빨라졌을까요?

정말! 놀랍게도 엄청 빨라졌습니다.
프로젝트와 관련된 사항이기도 하고 시도하는 코드에 따라 정확하게 말하기는 어렵습니다만,
제가 시도해보니 무려 6배가 빨라졌습니다. (1 epoch당 6시간 30분 소요 -> 1시간 30분 소요)
음~ 시도해볼만합니다!

그러나…

역시 GPU가 좋습니다..
맥북 고유의 비행기 이륙소리가 많이 들리고 발열도 장난아닙니다.
어떤 걸 시도하느냐에 따라 맥북이 죽어버리는 경우도 발생합니다.. ^.^;;;


아하!

CPU로도 머신러닝이 가능합니다

그러나, 계속 사용하면 후회할겁니다.. 수명이 줄어들거에요..
GPU 사세요..

효율적인 머신러닝이 가능합니다

옵션중에는 Android, iOS 환경에서도 사용할 지 묻는 옵션이 있었습니다.
원하는 환경(컴퓨터 CPU, GPU 또는 모바일)에서 자유롭게 최대한의 퍼포먼스를 끌어올리면서 Tensorflow를 활용할 수 있다는 것입니다.