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 | cd tensorflow |
새로 빌드할 pip 패키지 옵션 선택하기
필요한 설정에 따라 Y 체크하시거나, 계속 엔터키를 누르면 됩니다.
1) 설치 시작 메시지
1 | WARNING: --batch mode is deprecated. Please instead explicitly shut down your Bazel server using the command "bazel shutdown". |
2) bazel로 패키지를 만들기 위한 옵션 지정하기
설치된 Python 가상환경이 기본 PATH로 지정되어 있다면 아래와 비슷한 메시지가 나옵니다.
1 | Please specify the location of python. [Default is /Users/wgtech/anaconda3/envs/mlvenv/bin/python]: |
설치된 Python library 경로를 묻습니다. 이상 없으면 엔터키를 눌러주세요
1 | Found possible Python library paths: |
3) pip 패키지로 빌드하기 위한, 알맞는 옵션을 선택합니다.
XLA JIT 옵션 선택입니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)
1 | Do you wish to build TensorFlow with XLA JIT support? [y/N]: |
OpenCL SYCL 옵션 선택입니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)
1 | Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: |
ROCm 옵션 선택입니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)
1 | Do you wish to build TensorFlow with ROCm support? [y/N]: |
CUDA 옵션 선택입니다. (CPU로 개발할 것이기 때문에 N/또는 엔터키를 입력하여 넘겼습니다.)
1 | Do you wish to build TensorFlow with CUDA support? [y/N]: |
새로운 버전의 clang을 설치할 지 묻습니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)
1 | Do you wish to download a fresh release of clang? (Experimental) [y/N]: |
MPI 옵션 선택입니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)
1 | Do you wish to build TensorFlow with MPI support? [y/N]: |
추후 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 | Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]: |
iOS, macOS, tvOS용 Tensorflow 애플리케이션을 만들지 묻습니다. (제 경우는 N/또는 엔터키를 입력하여 넘겼습니다.)
1 | Would you like to configure Bazel rules for building on Apple platforms? [y/N]: |
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 | 예시1 |
잘못 빌드했다면!!
1 | brew clean --expunge |
결과
bazel 빌드 시간
위와 같은 어려움(?)을 극복하여 빌드를 시도했습니다.
저 같은 경우는 약 3시간 19분정도 걸리더라구요..
기존보다 얼마나 빨라졌을까요?
정말! 놀랍게도 엄청 빨라졌습니다.
프로젝트와 관련된 사항이기도 하고 시도하는 코드에 따라 정확하게 말하기는 어렵습니다만,
제가 시도해보니 무려 6배가 빨라졌습니다. (1 epoch당 6시간 30분 소요 -> 1시간 30분 소요)
음~ 시도해볼만합니다!
그러나…
역시 GPU가 좋습니다..
맥북 고유의 비행기 이륙소리가 많이 들리고 발열도 장난아닙니다.
어떤 걸 시도하느냐에 따라 맥북이 죽어버리는 경우도 발생합니다.. ^.^;;;
아하!
CPU로도 머신러닝이 가능합니다
그러나, 계속 사용하면 후회할겁니다.. 수명이 줄어들거에요..
GPU 사세요..
효율적인 머신러닝이 가능합니다
옵션중에는 Android, iOS 환경에서도 사용할 지 묻는 옵션이 있었습니다.
원하는 환경(컴퓨터 CPU, GPU 또는 모바일)에서 자유롭게 최대한의 퍼포먼스를 끌어올리면서 Tensorflow를 활용할 수 있다는 것입니다.