David Patterson의 인터뷰를 읽고
최근 David Patterson의 인터뷰를 읽고 그간 생각하던 바를 정리해본다. David Patterson은 RISC(Reduced Instruction Set Computer) 아키텍처 개발과 RAID(Redundant Array of Independent Disks)의 창시자이기도 한 아주 유명한 양반인데, 최근에 이제는 새로운 컴퓨터 아키텍처와 소프트웨어 언어가 필요하며, 이 분야에서 다양한 도전자들이 달려가고 있다는 인터뷰를 남겼다. 어째서 새로운 컴퓨터 아키텍처가 필요하다는 것일까? 나는 갈수록 분야별로 전문화되어야만 하는 상황이 되어 간다는 것을 이유로 들고 싶다.
내가 본격적으로 소프트웨어 개발을 시작한 것은 게임 프로그래밍이었다. 처음 WinAPI로 아주 간단한 게임을 만들어도 보고 본격적으로 DirectX를 공부하면서 게임을 만들기 시작한 것이 벌써 8년 전이라는 게 새삼스럽게 느껴진다. DirectX는 C++ 언어로 하드웨어 가속을 이용한 그래픽스 프로그래밍을 도와주는 SDK(Software Development Kit)이다. 처음 게임 개발을 공부할 때는 게임 엔진 없이 직접 그래픽스 라이브러리를 이용하여 게임을 개발했기 때문에 DirectX와 C++, 그래픽스에 대해 공부하기 바빴지만 Unity3D라는 게임 엔진을 이용해 게임을 개발하기 시작한 이후로는 C++으로 게임 개발을 하는 일은 거의 없어졌다.
C++은 너무 어려운 언어였던 것에 비해 Unity3D는 C#이라는 좀 더 다루기 쉬운(동의하지 않는 사람도 있겠지만) 언어로 개발할 수 있었고, 심지어 JavaScript로 개발을 할 수도 있었다. 하지만 지금도 주변에서 Unity3D로 게임을 개발하는 지인들이 말하는 불만 중 하나는 “메모리를 직접 다룰 수 없다”이다. C#에서는 Garbage Collect 방식으로 메모리가 해제되고, 직접 메모리를 해제할 수 없다. 문제는 그 Garbage Collect가 발생하는 순간에 성능이 하락하여 프레임 드롭 현상이 발생한다는 것이다. 게임은 1초에도 수십 번(보통 60번 이상) 화면이 그려져야 부드러운 연출이 가능한데, 한 번에 많은 메모리가 정리되는 순간에는 화면이 그려지지 못함으로 인해 프레임 드롭 현상이 일어나게 된다. 그럼에도 불구하고 Unity3D는 쉽게 게임 개발을 시작할 수 있게 해주는 게임 엔진으로써 큰 인기를 유지하고 있다.
그 와중에 그래픽스 분야에서는 또 다른 새로운 붐이 일었다. 바로 Vulkan, Metal의 등장이다. Windows에서는 DirectX가, 그 외 다른 플랫폼에서는 OpenGL이 하드웨어 가속을 이용하기 위해 주로 쓰이던 라이브러리였다. 데스크톱 게임 개발 분야에 있어 Windows 외의 OS는 중요하지 않았기 때문에 게임 개발자들에게 OpenGL을 학습하는 것의 중요성은 떨어졌으나 모바일 시대부터는 상황이 달라졌다. Android도, iOS도 OpenGL ES라는 OpenGL의 서브 시스템을 쓰기 때문이다. 그렇기 때문에 OpenGL의 차세대 버전인 Vulkan은 중요할 수밖에 없다. (Metal은 비슷하지만 Apple 생태계에서 쓰이는 그래픽스 라이브러리이다.) 그런데 이 Vulkan과 Metal이 공통적으로 내세우는 강점 중 하나는 더 저수준까지 다룰 수 있게 해준다는 것이다. 여기서 말하는 더 저수준까지 다룰 수 있게 해준다는 뜻은 더 하드웨어와 가까운 부분까지 프로그래머가 다룰 수 있게 함으로써 더 최적화를 할 수 있는 가능성을 열어준다는 뜻이다. 하지만 저수준까지 다루는 것은 보통 프로그래밍을 더 어렵게 만든다. 아까 Unity3D는 쉽게 게임 개발을 할 수 있게 해준다면서 Vulkan은 저수준까지 코딩할 수 있게 해서 더 어렵게 만든다니, 이게 무슨 모순일까?
불과 10년 전까지만 해도 모바일 환경에서 게임을 많이 한다는 것은 생각지도 못했다. 이제는 수많은 사람들이 손바닥보다도 작은 스마트폰으로 게임을 즐긴다. 처음에는 오목과 같은 간단한 그래픽 수준의 게임으로도 사람들에게 사랑받았으나 점점 더 고수준의 그래픽이 요구받게 됐다. 그러다 이제는 Full 3D 게임까지도 출시되고 있는 것이 현실이다.
문제는 그러한 고수준의 그래픽을 모바일 환경과 같이 저성능의 프로세서에서도 원한다는 것이다. 팔뚝만 한 크기의 하드웨어로 하던 것을 손가락보다도 작은 하드웨어로 하려니 어려울 수밖에 없다. 분명 프로세서들의 성능은 향상되고 있다. 하지만 사람들은 점점 더 휴대성 높은 환경에서도 기존과 비슷한 수준의 경험을 하고 싶어 한다. 게임이 아닌 다른 예를 생각해보자. 엑셀을 하는 것은 당연히 데스크톱 환경에서 하던 것이었고, 과거에는 스마트폰으로는 그 엑셀의 내용을 볼 수만 있어도 즐거웠다면 이제는 사용자들이 스마트폰에서 엑셀을 편집까지 할 수 있기를 원한다. 그러다 이제는 더 작은 스마트 워치에서도 스마트폰에서 이용할 수 있었던 다양한 기능들을 그대로 이용할 수 있기를 바라고 있다. 우스꽝스럽긴 하지만 스마트 워치로 전화 통화를 할 수 있게 하는 것이 그 사례 중 하나이다. 프로세서 성능이 갈수록 더 좋아짐에도 불구하고 성능을 더 추구할 수밖에 없는 이유이다.
휴대성에 의한 성능 요구 말고 다른 예도 있다. 바로 AR(Augmented Reality)과 VR(Virtual Reality)이다. 몇 년 전부터 AR과 VR에 대한 관심이 급증했는데, 문제는 이 두 분야 모두 생각보다 높은 수준의 계산 능력을 요구한다는 것이다. AR은 올바른 결과를 보여주기 위해 컴퓨터 비전 차원에서, VR은 일반적으로 기존의 한 화면에 대한 렌더링이 아닌 두 화면의 렌더링이 필요하기 때문에 많은 계산 능력을 요구한다고 알려져 있다. 그런 와중에 앞서 언급한 바와 같이 휴대성 또한 요구되기도 한다. 예를 들어, 스마트폰으로 AR을 가능하게 한다던가 아예 컴퓨터를 내장시키는 것이 있다. Microsoft의 Hololens와 같은 제품이 그 예이다. Hololens는 일반적인 HMD(Head Mounted Display)의 형태인데, 그 안에 컴퓨터가 내장되어 AR 프로그램을 구동할 수 있다. 하지만 이러한 형태로는 데스크톱 환경에 비해 프로세서의 성능이 떨어질 수밖에 없다. VR도 상황은 비슷하다. 기존에는 컴퓨터와 VR 기기를 유선으로 연결하여 쓸 수 있기만 해도 사람들이 만족했지만 유선의 불편함 때문에 무선 환경을 추구하고 있는데, 무선으로 렌더링 결과를 스트리밍 하는 게 생각보다 쉽지 않다. 이에 따라 Hololens와 같이 아예 VR 기기 내에 컴퓨터가 내장된 형태로 점차 나아가는 추세인데, 이에 따라 성능에 대한 목마름이 생길 수밖에 없어졌다. AR과 VR의 예는 기존에 흔히 쓰이던 것이 아닌 새로운 소프트웨어에 대한 요구가 커짐에 따라 더 높은 성능을 요구하게 된 예시라고 할 수 있다.
이와 같은 사례들을 통해 우리는 하드웨어의 성능이 나아지고 있음에도 불구하고 더 좋은 성능을 발휘할 수 있도록 하는 것에 계속 관심을 둘 수밖에 없다는 것을 알 수 있다.
게임이나 컴퓨터 비전, 컴퓨터 그래픽스가 아닌 다른 분야를 살펴보자. 먼저 떠올릴 수 있는 분야는 단연 머신 러닝일 것이다. 개인적으로 머신 러닝과 관련된 분야는 그야말로 자본력 싸움이라는 생각을 많이 한다. 요즘 대세인 머신 러닝 알고리즘들은 대체로 딥 러닝 기반인 경우가 많은데, 문제는 딥 러닝으로 좋은 학습 결과를 만들어내기 위해서는 엄청나게 많은 계산을 요구한다는 것이다. 더 나은 알고리즘을 개발하기 위해 이런저런 변경 사항들을 실험해볼 수 있어야 할 텐데 매번 다시 학습시킬 때마다 매우 긴 시간이 걸린다면 연구 개발 속도가 느려질 수밖에 없다. 그런데 구글과 같은 회사는 어마어마한 규모의 데이터 센터를 갖고 있기 때문에 일반적인 회사에서 며칠을 걸려 학습 결과를 만들어 실험해볼 수 있을 것을 구글에서는 몇 분, 몇 시간만에 할 수 있다. 그렇게 더 빨리 연구 개발하여 만들어낸 기술로 돈을 벌고, 그 돈으로 또다시 더 빨리 연구 개발을 할 수 있을 테니 말하자면 부익부 빈익빈이라고 할 수도 있을 것이다.
심지어 구글에서는 TPU(Tensor Processing Unit)이라는 ASIC(Application-Specific Integrated Circuit)을 개발하여 상용으로 쓰고 있다. ASIC은 특수한 목적에 특화된 하드웨어인데, TPU는 인공 신경망 알고리즘에 특화된 ASIC이다. 그리고 2018년 구글의 개발자 컨퍼런스인 I/O에서 듀플렉스라는 과거 구글 어시스턴트보다 비약적으로 발전된 인공지능을 선보였다. 데모로 보여준 것인 만큼 좋은 결과만을 선별하여 시연한 것일지 모르지만 확실한 것은 과거에 비해 비교도 안 될 만큼 발전된 모습을 보여줬다는 것이다. 아마 TPU와 같은 하드웨어로 머신 러닝 분야의 연구 개발을 할 수 있는 구글이 아닌 다른 회사에서는 듀플렉스와 같은 높은 수준의 인공 지능을 선보이기 쉽지 않을 것이다. 또한, 구글의 연구 개발 속도를 따라가기도 어려울 것이다.
이제 세상의 문제는 너무 복잡해져서 점점 일반적 목적의 컴퓨터(General Purpose Computer)로는 그 문제들을 경쟁자들보다 빠르게 해결할 수 없게 되어가고 있다. 즉, 남들보다 경쟁 우위를 점하기 위해서는 더 특화된 컴퓨터 또는 아키텍처가 필요하다. 말하자면 David Patterson이 말한 "새로운 컴퓨터 아키텍처"의 예시 중 하나가 TPU라고 볼 수도 있다. 비단 머신 러닝뿐일까? 효율적 전력 소모에 특화된 컴퓨터, I/O에 특화된 컴퓨터 등 앞으로 더 전문적 목적의 컴퓨터가 많이 생겨날 것이라 생각한다.
새로운 소프트웨어 언어도 시도는 계속 일어나고 있다. 인지도는 낮지만 Go나 Rust와 같이 성능을 목적으로 한 저수준 언어는 계속 개발되고 있다. 시간이 지나면 어셈블리만큼이나 저수준 언어이면서도 코딩하기는 더 수월한 언어가 개발될지도 모른다. 아마 Java나 C#, Javascript와 같은 고수준 언어는 고수준 언어대로, 저수준 언어는 저수준 언어대로 계속 쓰일 것이다. 그러나 문제에 따라 적합한 선택을 내릴 수 있어야 할 것이다.
초기 의학은 전문 분야가 특별히 없었지만 현대 의학은 다양한 전문 분야로 세분화되고 있다. 컴퓨터도 그와 비슷한 길을 걸어가고 있다고 생각된다. 지금처럼 프론트엔드 개발, 백엔드 개발과 같이 큰 범주의 전문 분야가 아닌 프론트엔드 개발에서는 DOM 전문 분야, User Interaction 전문 분야로 나뉘고 백엔드 개발에서는 네트워크 수준 전문 분야, OS나 메모리 수준 전문 분야 등으로 세분화가 진행될 것이고, 실제로 그렇게 되어가고 있다. 아마 지금 와 닿는 전문 분야보다 더 깊은 수준으로 전문 분야가 나뉘게 될 것이라 예상된다. 이렇게 바뀌어가는 컴퓨터 세상에서 우리는 어떻게 해야할까?