딥러닝 돌리기 위한 최적 노트북

강의 시작 1주일 정도를 남기고 흔히 받는 질문들이 있다.

  • 제 랩탑이 오래됐는데, 수업 듣는데 문제 없을까요?
  • 어느 정도 랩탑을 갖고가야 수업 듣는데 문제가 없을까요?
  • 머신러닝을 구현하는데 제일 좋은 랩탑은 어떤 랩탑일까요?

아래의 설명을 다 읽기 힘든 사람들을 위해서 짧게 요약한 대답을 드리면, 64비트 운영체제가 돌아가는 시스템이면 필자가 수업에 쓰는 패키지는 모두 돌릴 수 있다. 그리고 머신러닝 프로그래밍에서 가장 중요한 부분은 i5니 i7이니하는 CPU가 아니라, 비트코인 광산용 데스크탑처럼 고사양의 멀티 그래픽 카드 유무라고 봐야한다. 랩탑에 좋은 그래픽 카드가 들어가는 경우는 십중팔구 게임용 랩탑일 것이다. 그래서 제일 좋은 랩탑이 뭐냐는 질문에 “게임용 랩탑”이라고 대답하겠다.

한 줄 요약말고, 좀 구체적인 내용을 궁금해하시는 분들도 많을테니 아래에 좀 더 내공을 요하는 설명을 달아보자.

 

1. 계산 비용(Computational Cost)이란?

연구직에 있는 사람들이 제일 좋아하는 것은 간명한 수학 수식으로 결론이 나올 때다. 그 식에 맞춰서 데이터를 입력하면 최소의 자원을 들여 아주 빠른 속도로 계산할 수가 있으니까.

(Source: TQI Solutions-Modeling)

여기서 핵심 포인트는 “최소의 자원”과 “아주 빠른 속도”라는 부분이다. 이걸 계산 비용(Computational Cost)라고 부르는데, 보통은 CPU, RAM, 전력, 시간을 의미한다. 그다지 좋지 않은 CPU를 쓰고, RAM을 적게 쓰고, 전기를 적게 먹어도 되는 부분은 “최소의 자원”에 해당되고, 시간이 적게 드는 부분은 “아주 빠른 속도”에 해당된다.

수학 수식이 딱 떨어지면 (Analytic solution 이라고 한다), 어지간해서는 Computational Cost를 고민할 필요가 없다. 인간이 머리를 다 쥐어짜내서 완성된 결론을 만들어 냈고, 컴퓨터는 그냥 단순한 계산기로 쓰고 있기 때문이다. 이 때 유일하게 Computational Cost를 신경써야하는 경우는 데이터의 크기가 매우 클 때 밖에 없는 것 같다. 그렇다고 해도 RAM을 늘리거나, 아니면 순차적 계산 (Sequential calculation) 방법을 이용해서 Computational cost를 최대한 줄이는 방법이 이미 많이 나와있다. 통계 시간에 배우는 PCA도 같은 목적성을 띠고 있다.

문제는 인간이 수학 수식으로 최종 결론을 못 만들어 낼 때다. 수업 시간에 흔히 드는 예로, 공학 계산기에서 3차 이상 방정식의 근을 찾는 경우와 재무 계산기에서 IRR 찾는 계산이 있는데, 인간이 만들어낸 수학 수식이 한 번에 값을 찾아줄 수 있는 상황이 아니기 때문에, 계산기는 모든 실수 값을 다 적용해서 조건식에 대입한다. (Trial-and-error라고 부른다.) 당연하겠지만 식이 복잡해질수록 걸리는 시간이 기하급수적으로 늘어난다.

(Source: Dynamic Simulation Modeling)

필자가 시뮬레이션을 이용해서 논문을 쓰던 시절에도 같은 문제를 겪었다. 가공의 데이터를 생성해내고, 그 데이터로 가능성 있는 모든 경우의 수를 다 뒤져보려면 어지간한 슈퍼 컴퓨터로도 하루 이틀만에 계산이 안 되는 경우가 흔했다. 요즘 한창 유행인 머신러닝을 좀 쉽게 한 줄 요약하면, 딱 떨어지는 수학 수식을 찾는 대신 데이터만 우격다짐으로 많이 넣은다음, 알아서 수식을 찾아내달라는 방식의 계산이라고 할 수 있을텐데, 데이터를 잘 설명해내는 적절한 수식을 찾아내는 작업이니만큼 위와 같은 맥락에서 Computational Cost가 많이 든다.

 

2. 하드웨어 진화의 패러다임 변화 – 멀티 코어 (Multi-core)

컴퓨터 판매 광고에 듀얼 코어, 쿼드 코어, 헥사 코어 같은 표현을 본 일이 있을 것이다. 예전에는 CPU 하나에 코어(Core) 하나가 들어갔다. 그 코어가 계산을 하는데, 당연하겠지만 코어가 여러개가 되면 (이론적으로는) 여러개의 계산을 동시에 진행할 수 있으니 속도가 빨라졌다고 느낄 수 있게 된다. CPU 발달 초기에는 코어 1개의 성능을 높이는데만 주력했으나, 코어 성능을 높이는데 점점 한계에 부딪히면서 하나의 모듈 안에 2개 이상의 코어를 넣는 방식으로 CPU 개발 방식이 바뀌었다. 메모리 관련 기사에서 가끔 볼 수 있는 22nm (나노미터), 14nm, 10nm 같은 단어들이 점점 작은 공정으로 CPU 및 메모리를 만들 수 있게 되었다는 것을 의미하고, 덕분에 하나의 모듈 안에 작아진 CPU를 여러개 넣을 수 있게 되었다.

모듈 안에 작은 코어를 여러 개 넣어서 듀얼 코어, 쿼드 코어 같은 멀티 코어 제품을 만들어내면서 동시에 전력 및 발열에서도 큰 이득을 보게 되었다. 모듈이 작아지니 필요한 전력도 줄어들었고, 전력 소모가 적다보니 발열도 현격하게 줄었다. 발열이 줄면 데스크탑에 들어가는 CPU보다 노트북에 들어간 CPU의 성능을 낮춰야 할 이유가 줄어든다. 1990년대와 2018년의 데스크탑 vs. 노트북 성능 비교를 보면 노트북의 성능이 훨씬 더 빠르게 증가했음을 알 수 있다. 같은 맥락으로 데스크탑을 좀 고사양으로 맞추면 저가형 서버에 밀리지 않는 성능을 갖출 수 있게 된 것이다.

위에서 언급한 Computational Cost 기준으로 볼 때, 나노 공정의 발달로 멀티 코어를 쓰면서 계산 시간도 줄었고, 필요 CPU나 전력이 크게 감소했다는 것을 알 수 있다.

 

3. 하드웨어 진화의 패러다임 변화 – 멀티 쓰레드 (Multi-thread)

나노 공정으로 모듈 당 계산 코어의 집적 비율을 높이는 것과 더불어 계산 코어 자체의 성능을 더 “착취”하는 기술도 발전되었다. 1 코어당 2개의 가상 쓰레드를 만들어서 마치 2개의 코어가 있는 것처럼 작동하게 만들었다. Intel 기준 2011년에 나온 샌디 브릿지 (Sandy Bridge) 모델부터 지난 2016년까지 나온 카비 레이크 (Kaby Lake) 모델까지 i5, i7 같은 i 시리즈 CPU들은 기본적으로 멀티 쓰레딩 방식을 채용했다. 많은 유저들이 활용하는 저전력 CPU가 달린 노트북을 기준으로 보면, 코어가 1개 or 2개 있고, 윈도우 장치 관리자의 CPU 부분을 보면 알겠지만 코어가 마치 2개 or 4개 있는 것처럼 시스템이 인식하고 있다는 것을 알 수 있을 것이다.

2017년 모델 (인텔 기준 8세대 CPU)부터는 저전력 모델에도 코어 4개 (쓰레드 8개)를 집어넣어서 이전 세대의 표준전력 CPU에 버금가는 성능을 뽑아낼 수 있게 되었다. 

물론 더 많은 시스템 자원을 활용하기 때문에 전력 소모와 발열 이슈가 함께 따라오고 있고, 더 안타까운 사실은 멀티 코어 – 멀티 쓰레드를 쓸 수 있도록 프로그램을 짜는 일이 쉽지 않다는 것이다. 대부분의 프로그램들은 1 코어 – 1 쓰레드만 활용한다. 비싼 시스템을 들여놓고 정작 그 성능을 제대로 쓰질 못하는 것이다. 수업 시간에 옛날 노트북 갖고 가도 괜찮냐고 물으시는 분들께 2008년 이후 모델이면 어지간해서는 큰 상관없다고 말씀드리는 이유도 여기에 있다.

 

4. 계산 패러다임의 변화

컴퓨터를 이용한 계산 패러다임의 변화를 간단하게 정리하면,

인간이 만들어낸 수학 수식 -> CPU를 “학대”하는 단순 반복 계산 -> 그래픽 카드(GPU)를 이용한 3차 이상 행렬 계산

앞의 두 단계는 위에 언급한 공학용 계산기와 재무 계산기에서 흔히 볼 수 있는 사례였다면, 마지막 단계는 3D 그래픽 처리를 많이하는 게임에서 흔히 찾아볼 수 있다.

3차원 공간에서 1:1 격투기를 진행하는 게임이 있다고 해 보자. 이 때 캐릭터의 위치는 3차원 행렬로 구성된다. 머리, 몸통, 팔, 손, 다리 등의 위치를 각각 <가로, 세로, 높이>로 구성된 행렬로 구성할 수 있고, 이 캐릭터가 움직이는 방향과 속력을 추가로 더하면, 신체 부위마다 움직임을 지정하기 위해서 <가로, 세로, 높이, 방향, 속력> 이라는 5차원의 행렬이 만들어진다. 유닛에 RGB 로 색상을 입히면? 바로 8차원으로 행렬이 늘어난다. 실시간으로 움직이는 유닛이 즉각 반응하도록 하려면 당연히 3D 그래픽 처리 속도가 빨라야하고, 좀 더 실제 인간과 비슷한 3D 그래픽을 만들어내려면 사소한 디테일이 모두 포함되어야하니 유닛 하나를 구현하기 위한 데이터의 크기가 기하급수적으로 증가한다. 요즘 나오는 3D 그래픽 기반 게임들이 엄청난 고사양을 요구하는 가장 큰 이유다.

저런 계산이 게임에만 쓰이는 줄 알았는데, 지난 몇 년 동안 비트코인 광산에 들어간 컴퓨터 한 대마다 고사양 그래픽 카드가 하나도 아니고 6개씩 셋트로 들어갔다는 사실에서 알 수 있듯이, 복잡한 수학 계산에도 행렬 방식의 계산이 있었다는 것을 알 수 있다. 비트코인 하나를 얻기 위해 풀어야하는 문제를 인간이 수학 수식으로 풀어내는 대신 컴퓨터가 Trial-and-error를 하는 방식으로 접근했기 때문이고, 계산해야하는 변수가 계산기처럼 한 개가 아니라, 여러개 변수를 동시에 계산해야하기 때문에 대용량 행렬 데이터를 처리할 수 있는 그래픽 카드를 활용했던 것이다.

 

4.1. CPU vs. GPU

GPU도 계산을 하는 모듈이 들어있으면 굳이 왜 CPU와 GPU를 나누냐는 의문이 들 것이다.

보통 CPU는 페라리에, GPU는 덤프트럭에 비유한다. 페라리는 운전수를 포함해 2명의 승객이 매우 빠른 속도로 이동할 수 있도록 만든 차량이다. 반면 덤프트럭은 대용량의 물건을 상대적으로 느린 속도로 운반한다. CPU가 빠르면 일상적인 업무 (인터넷 브라우징, 메일 확인, 서류 작성 등등)에서 불편함을 겪는 일이 적을 것이고, GPU가 용량이 크고 빠르면 행렬 계산이 많이 들어간 게임, 비트코인 계산 등에서 속도로 큰 이득을 볼 것이다. 당연하겠지만 두 모듈이 쓰는 캐쉬 (뒷 트렁크라고 생각하자)도 압도적으로 차이가 난다. CPU는 1980년대 쓰던 플로피 디스크 정도 용량의 캐쉬를 갖고 있고, 요즘 나오는 GPU는 대용량 USB 스틱에 맞먹는 캐쉬(or 램)을 갖고 있다. 처리해야하는 데이터의 크기가 다르기 때문이다. (대신 두 캐쉬의 속도는 플로피 디스크 사이즈가 USB 사이즈 보다 압도적으로 빠르다.)

최신 GPU들은 멀티 코어를 구성하고, 코어들의 계산 속도도 업그레이드해서 엄청난 용량의 데이터를 순식간에 처리하는 걸 볼 수 있다. 게임 마니아들이 더 고해상도 화면에서 부드럽게 게임을 돌리기 위해 GPU가 업그레이드 될 때마다 갈아치우는 것도 같은 이유다. (필자는 일절 게임을 안 하기 때문에 더 이상의 자세한 설명은 생략한다.)

 

5. 머신러닝 – 멀티 코어와 GPU

[embedyt] https://www.youtube.com/watch?v=KRAMtvwlgmM[/embedyt]

필자가 처음 시뮬레이션을 공부하던 시절이나 머신러닝 테크닉들을 데이터 마이닝 수업에서 들을 때만해도 사실 GPU는 관심 밖에 있었다. 더 정확하게는 시장 자체에서 GPU를 써서 계산하겠다는 생각 자체를 안 했다. 그러다가 Neural network 모델 계산이 사실상 행렬 계산의 반복*이라는 사실을 깨닫게 되면서 행렬 계산에 적합한 GPU를 활용하려는 움직임이 생겼고, GPU 시장의 선두 주자인 NVidia에서 관련 프로그램 개발에 다방면의 지원을 쏟아붓기 시작했다.

요즘 딥러닝용 패키지라고 불리는 TensorFlow나 MXNet, H2O 같은 명령어 셋을 뒤져보면, CPU와 GPU의 멀티 코어를 활용할 수 있는 프로그래밍 기반에 행렬 데이터를 처리할 때 GPU를 활용할 수 있도록 시스템 자원 분배를 재설정 해 놓았다는 것을 알 수 있다.

이미지 인식, 언어 처리 등의 많은 계산들에 Neural Network를 활용하게 되면서, 행렬 계산에 대한 수요가 급격하게 증가했고, 그 때 GPU를 활용하면 CPU를 활용하는 것보다 훨씬 더 빠르게 행렬 계산을 할 수 있다 (정확하게는 역행렬을 빠르게 구하는 작업이다).

*사실상 행렬 계산의 반복이라는 부분은 Neural Network 를 직접 구성하는 코드를 확인해주기 바란다.

 

나가며

어차피 수업 시간에는 맛보기 정도로만 보여주기 때문에 CPU 만 멀쩡하게 잘 돌아가면 별로 걱정할 필요가 없다. 굳이 2008년 이전 모델만 아니면 된다고 이야기하는 것은, 그 이전 모델들은 32비트 운영체제가 깔린 경우가 많은데, 아무래도 64비트 기준으로 만들어진 패키지들과 (특히 최신 고급 패키지들과) 충돌이 일어나는 경우가 가끔 있기 때문이다.

수업 후반부에 멀티 코어와 GPU를 활용하는 패키지들을 돌릴 때도 GPU가 아주 좋은 경우가 아니면 수업 시간에 필자와 같은 속도로 코드의 결과값을 보기는 힘들다. (수업 진행을 위해서 필자는 그래픽 카드가 좋은 랩탑을 쓴다.) 그 부분 코드 복습을 하려면 비싼 노트북을 사느니 가성비 좋은 데스크탑을 사서 집에서 차근차근 실습을 해 보는 편을 추천한다.

끝으로, 꼭 랩탑으로 Neural network를 돌려보고 싶고, “머신러닝을 돌리기 위한 최적 노트북”이 필요하다면, 괜히 CPU의 업그레이드에 관심을 갖기 보다는, GPU가 속도 빠르고 캐쉬(램) 용량 많은 모델로 고르시는 걸 추천한다. (보통 전문가용 워크스테이션 랩탑이 아니면 게임용 랩탑들이 이런 조건을 충족한다.)

이어지는 글에는 GPU에 관한 정리를 해 보겠다.

 


그렇다고 게임용 랩탑을 들고 고객사 미팅을 찾아가지는 말자 ㅋㅋㅋ

Similar Posts