알기 쉬운 GPU 그리고 머신러닝
안녕하세요, Sigmoid입니다.
예전엔 주로 받던 GPU관련 질문은, "무슨 게임을 하는데 안끊기는게 뭐냐" 였는데,
요즘들어 질문의 추세가 많이 바뀐것 같습니다.
요즘 주로 받는 질문은 아래와 같습니다.
- "어떤 연산을 하려는데 GPU가 빠르다더라, 그런데 GPU는 어떻게 쓰는것인가?
- "머신러닝을 하려고 하는데 GPU에서 문제가 자꾸 발생한다, 이게 무슨뜻이냐?"
질문이 워낙 자주 오거니와, GPU를 Graphic이 아닌 Compute로 사용하는데 있어 자료가 많지 않은것 같기도 해서, 답변용 참조 링크로 사용할 겸, 이 포스팅을 작성해 봅니다. 앞으로 몇번에 걸쳐서 글을 쓰게 될지 잘모르지만, 우선 첫번째 이야기를 시작해보겠습니다.
- 어렵지 않게 쓰는 GPU의 기본 정의
GPU는 그래픽 처리 장치입니다. 그래픽이라는건 점으로 표현된 물체를 면으로 바꿔서 보여주는 방법입니다. 아래 그림은 주어진 3개의 꼭지점을 면으로 바꾸는 것을 표현하고 있습니다. 3개의 점이 15개의 픽셀이 되어 면을 표현하게 되죠.
?
(그림출처: https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/rasterization-stage)>
여기서 우리는 한가지 사실만 알면됩니다. 초록색 픽셀들에 대해 동일한 연산이 일어난다!. 왜그런지는 다음문단에서 이해하실 수 있습니다.
- GPU의 간단 구조와 동작
- GPU는 Shader라는 내부 코어를 여러개 가집니다. 해당 코어에서 동작 가능한 코드를 shader 코드라고 하구요. 이 쉐이더 코드는 여러개의 내부 코어에서 동시에 실행됩니다. 따라서 GPU는 병렬처리를 하기에 아주 적합한 구조가 되는거죠.
윗 문단에서 동일한 코드가 여러픽셀에 대해 실행된다고 말씀 드린 이유도 여기에 있습니다. 동일한 shader코드가 각 픽셀에 대해 실행되면서 픽셀의 색깔을 결정한다고 생각하시면 됩니다. (빨간색 꼭지점 세개로 구성된 면이라면, 내부를 구성하는 모든 픽셀을 빨간색 점으로 만드는 코드가 실행됩니다.) - gpu는 본인이 알고있는 분리된 메모리에만 접근이 가능합니다. shader코드에서 사용하는 데이터는 모두 gpu가 아는 메모리 영역에 있어야 합니다. 따라서 GPU는 물리적으로 아예 분리된 메모리를 쓰는 구나라고 아예 생각해버리는 편이 편합니다. (실제로는 그럴수도/아닐수도 있습니다)
- GPU는 주로 꺼져있습니다. 여러분이 실행할 코드와 데이터를 주지 않는다면 꺼진상태입니다.
(그림출처: https://blogs.nvidia.com/blog/2009/12/16/whats-the-difference-between-a-cpu-and-a-gpu/)
그림상 초록 네모가 쉐이더 코어입니다. cpu는 동시에 두개의 코어가 동작하고, gpu는 수십개가 동작합니다
참고로 저 코어는 회사마다 설계가 다르고, 따라서 사용하는 어셈블리도 다릅니다. 그래서 공통적으로는 shader language로 코드를 작성하면, 각 회사별로 제공되는 컴파일러를 이용하여 사용하게 됩니다.
- GPGPU - gpu를 그래픽용이 아닌 다른 용도(주로 컴퓨팅)으로 사용하는 개념
이렇게 동일한 코드를 동시에 실행시킬수 있다는 점에 착안하여, 일반적인 용도(general purpose)로 gpu를 사용할순 없을까? 라는 생각을 가지고 많은 연구들이 진행되었습니다.
현재 가장 유명한 GPGPU라이브러리는 NVIDIA의 CUDA입니다. 그런데 CUDA는 Nvidia에서만 사용가능 합니다.
Nvidia GPU 이외의 다른 GPU에서는 주로 OpenCL이라는 표준을 사용하고 있고, 최근에는 VULKAN이나 OpenGL의ComputeShader에 대한 개발도 진행되고 있습니다.
여기서 우리가 알아야 할것은 NVIDIA는 쿠다, 그외의 GPU vendor에서는 OpenCL을 사용하면 여러분이 GPU를 연산용으로 사용할 수 있다 입니다.
- 머신러닝과 GPU
머신러닝의 대부분의 연산은 MAC(multiply and accumulation)입니다. MAC연산이 모이면
Matrix multiply를 구현할 수 있습니다. (GEMM혹은 tf.matmul 정도로 이해하시면 될것 같습니다). 그리고 GPU는 shader코드를 병렬로 실행할수 있습니다. 만약 shader 코드가 MAC을 구현한다면? GPU는 matmul을 구현하게 되는 것이죠. Dense layer의 경우 아래와 같이 표현되는거 아시죠?
머신러닝이 왜 matmul이냐라고 궁금해 하시는 분들을 위해 아래 링크를 추천합니다.
(그림출처 및 참조: https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/)
- 머신 러닝 프레임워크와 GPGPU
우리는 Caffe나 TensorFlow같은 다양한 머신 러닝 프레임워크를 사용하고 있습니다. 이 프레임워크 개발자들의 고민중 하나는 어떻게 하면 우리 플랫폼에서 빠른 결과를 볼수 있을까 였을 것입니다.
GPU 개발사는 어떻게 하면 우리가 만든 훌륭한 병렬처리 라이브러리를 많은 유저들에게 소개 할수 있을까 였겠죠.
이런 두 니즈가 만나, 대부분의 프레임워크들이 GPU 가속을 지원하게 됩니다.
여러분들이 사용하시는 TensorFlow-gpu는 Tensorflow에서 사용되는 여러가지 다양한 연산을 Cuda나 불칸을 통해 GPU에게 전달하는 형태로 구현이 되어 있습니다.
제가 정리해 드린 몇가지 배경지식을 이해하셨다면, 앞으로 조금은 편하게 문제를 풀어보실수 있지 않을까 생각합니다.
아래와 같은 네트워크를 텐서플로우로 구현했다고 가정해 봅니다.
Q: gpu를 언제 쓸수 있을까요?
A: pooling layer를 제외한 matmul로 표현되는 conv와 fully-connected 레이어에서 쓸수 있겠네요.
네트워크를 구성하고 훈련하는 부분은 gpu에겐 관심분야가 아닙니다. gpu는 오직 matmul을 병렬처리 하는데 목적이 있고, fully connected layer가 matmul이라고 이미 말씀드렸으니 결국, 레이어 별로 가속된다고 생각해도 무방합니다.
Q: 첫번째 conv레이어에서 gpu에게 어떻게 일을 주어야 할까요?
A: 먼저 conv를 처리하기 위한 matmul shader 코드와, 곱해질 모델의 weight값과 input을 주어야 합니다.
해당 코드들이 다 메모리에 올라가 있어야 한다는 뜻입니다.
Q: 메모리에 어떻게 코드랑 input/weight를 올리나요?
A: Cuda/OpenCL 함수들이 저업무를 합니다. 조금더 자세히 말씀드리면 특정함수 호출시 드라이버를 통해 명령이 gpu로 전달될텐데, 그과정에서 드라이버는 gpu 메모리에 필요한 데이터들을 준비하는 작업을 동시에 합니다.
Q: 배치값을 바꾸면 어떤 일이 일어나나요?
A: GPU메모리에 한번에 올려야하는 량이 변합니다.
Q: 몇개의 코어를 사용하게 될지는 어떻게 결정됩니까?
A: 드라이버가 input의 량을 보고 결정하게 됩니다. 최대한 병렬성을 해치지 않도록
Q: 쿠다 버전이 안맞는건 어떤 의미인가요?
A: GPU제품마다 지원하는 쿠다버전이 다른 이유는 하드웨어의 상태(지원하는 operation, 메모리 크기, 코어 갯수)등이 다르기 때문입니다. 해당 하드웨어 스펙에 따라 드라이버들이 다르게 동작합니다. 때로는 함수의 원형이 아예 변경되기도 하지요. 주로 문제가 발생하는 이유가 여기에 있습니다.
부족한 글 읽어주셔서 감사드리며, 혹시 문제가 되는 내용이나 틀린 내용이 있다면 언제든 피드백 부탁드립니다.
여러분의 up vote 가 큰 도움이 됩니다.
후원: 0x62467Ca1b449c854c4720395Dd9a7c6Ed5df47B7(ethereum)
Leave 알기 쉬운 GPU 그리고 머신러닝 to:
Read more #gpu posts
Best Posts From SigmoiD
We have not curated any of sigmoid's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.