전통적으로 AMD그래픽카드는 딥러닝을 학습하는데 있어 CUDA의 부재로 Tensorflow등의 라이브러리를 실행시키기 어려웠습니다. 이렇게 몇년이 흘러도, AMD에서는 이 시장은 큰 시장이 아니라고 판단했는지 Ryzen CPU 가 대히트를 치고 Intel의 점유율을 역전하는 역사를 세우고서도 별로 그들의 그래픽카드에 딥러닝 기능을 잘 심는것을 그다지 중요하게 생각하지 않은 것 같습니다.
다만 2019년에 들어서는 어느정도 개발이 된 모습을 알수있습니다.
그렇지만 AMD진영에서 제공하고 있는 아래의 사이트에 따르면 ROCm은 텐서플로우 1.14와 2.0을 지원하기 때문에 이에 따르면 충분히 맥북으로 돌아가는것이 예상이 됩니다.
https://rocm-documentation.readthedocs.io/en/latest/Deep_learning/Deep-learning.html
하지만 자세히 들여다보면 리눅스에 대한 지원이고, 맥에대한 지원은 아직 역부족인것을 알수있습니다. 깃허브에는 전세계의 수많은 맥빠(?)들이 딥러닝에 대한 미지원은 말이 안된다고 아우성입니다.
그렇지만, 방법은 있습니다.
기본적으로 2019년 09월까지 정식으로 애플에서 지원되는것은 없으며, 다만 PlaidML이라는 라이브러리를 통해 OpenCL이나 Metal로 Keras의 backend를 책임지게 할수 있습니다.
일단 실험에 참가할 맥북은 맥북 프로중에 제일 비싼 라인에 속하는 Mac book Pro 2018 2.6ghz i7이며, 장착한 그래픽카드는 AMD 560X 4G가 되기때문에 일단 CPU보다는 빠를것으로 생각됩니다.
https://medium.com/@danbrice.datascience/deep-learning-on-a-mac-with-amd-gpu-4be1f18944a
MacOS에서의 설치는 정말 간단합니다.
MacOS 라이브러리 설치
https://vertexai-plaidml.readthedocs-hosted.com/en/latest/installing.html
VirtualEnv를 이용할수도 있지만, 어차피 글로벌하게 이용할거라면 크게 중요하지는 않으므로 아래와 같이 설치를 한후,
pip install -U plaidml-keras
몇가지 세팅을 위해 아래와 같은 명령을 합니다.
plaidml-setup
그런후에는 아래와 같은 화면이 보이는데, 맥북의 경우에는 AMD그래픽카드와 더불어 인텔의 내장 그래픽카드도 존재합니다.
따라서 몇가지 옵션을 택할수 있는데 원래는 그래픽관련하여 OpenCL을 썼다면, 조금더 성능과 기능이 개선된 Metal을 이용하도록 해볼수도 있습니다. 이 방법이 제일 최신으로 보이기 때문에 아래와같이 6번을 택하고 진행합니다.
마지막에 Whew. That worked. 라고 쓰여져있는 문장을 보고 피식 웃게됩니다.
이렇게 해서 간단하게 설치가 끝나는데, 설명에는 벤치마크를 한번 더 돌려보라고 되어있기 때문에 충실히 이행해봅니다.
pip install plaidml-keras plaidbench plaidbench keras mobilenet
제공된 모바일넷으로 아래와같이 그래픽카드 사용율이 팍 튀면서 학습이 진행되는것을 알수있습니다. 내장그래픽은 사용하지 않음을 알수있습니다.
빠른시간안에 훈련을 하고 바로 추론을 할수있게 되는것을 알수 있습니다. 생각보다 CUDA와 CuDNN을 여기저기 설치하고 난리를 피는것보다 훨씬 간단하게 설치가 되는것을 알수있습니다.
주피터 노트북과 keras 이용
이제 실제로, 케라스를 이용해서 간단한 컨볼루션 네트워크를 만들어보고 실제 속도가 어떻게 달라지는지 확인해보도록 하겠습니다.
데이터는 fashionMNIST인데, 간단한 데이터기 때문에 CPU로도 학습이 가능합니다. tensorflow는 1.13.1버전으로 backend를 사용합니다. plaidML을 불러올때는 단순한 차이가 있는데, 아래의 두번째 블록에 import를 적당히 해주고 plaidml.keras.install_backend()를 호출하면 알아서 케라스의 백엔드 구조는 tensorflow가 아닌 plaidML로 바뀌는것을 알 수 있습니다.
장점은 keras의 기본적인 코드는 모두 동일하다는 것입니다. 원래는 theano, tensorflow, CNTK 세개만 사용이 가능한 부분이였는데, 이제는 plaidml.keras.backend가 추가된것을 볼수 있습니다.
속도와 결과 벤치마크
결과는 아래와 같습니다. 정확도는 80~90퍼센트정도가 나오는 데이터셋이며, 여기서는 별 쓰잘데기가 없으니 표현하지는 않겠습니다.
배치 | CPU (8코어 2.6 -> 4.3) | GPU (AMD 560X 4G) |
8 | 8초 | 72초 |
32 | 2.3초 | 7.1초 |
64 | 1.2초 | 4.3초 |
256 | 1.1초 | 1.2초 |
2048 | 0.7초 | 0.7초 |
적은 배치를 설정하는것은 CPU가 충분히 빠를수 있다고 인정가능하지만, 배치에 많은 수를 세팅했는데도 속도가 그렇게 차이가 나지 않는것은 상당히 의문입니다.
노트북에 달린 AMD GPU는 성능한계가 있고, 쓸만하지 않다.
희한하게 GPU를 사용했을때 분명히 점유율이 굉장히 높아지는데도 불구하고 상당히 적은 데이터셋이므로 그렇게 크게 차이는 없습니다. 또한 GPU는 학습시간이 편차가 굉장히 큰편이였습니다. 온도도 굉장히 뜨거운데 반해 CPU처럼 팬속도가 즉각적으로 반응을 하지않는 느낌도 있었습니다.
아직까지는 plaidML혹은 AMD Radeon Pro 560X이 성능이 기대했던것만큼 올라가지 않았습니다. 데이터셋이 상당히 작은 데이터셋이라 그런것일수도 있는데, 여튼 기록적인 성능을 내려면 아이맥급으로 가야하지 않나라는 생각은 듭니다.
추후 업데이트가 있으면 계속 공유드리겠습니다.