NPU와 GPU 그리고 인공지능 컴파일 최적화에 대한 고찰
포스트
취소

NPU와 GPU 그리고 인공지능 컴파일 최적화에 대한 고찰

개요

에트리 인턴을 다녀오면서 새로운 분야인 인공지능 컴파일러, 즉 인고지능 연산을 최적화를 하는 업무를 받아 연구(?) 및 공부를 하게 되었습니다. 이번 에트리 인턴에서 전혀 알지 못하였던 분야인 컴파일러란 분야와 인공지능 최적화란 분야를 연구하게 되었습니다. 학교를 급으로 나눠서는 안되겠지만, 확실한건 지방대와 높은 대학교의 차이는 확실히 존재한다는 것은 확실하게 알게 되었습니다. 특히 에트리에서는 학교나, 기업에서 하지 않는 연구를 주로하며 돈 보다는 기초 기술이나 원천 기술에 대해 초점을 두고 있었습니다. 그래서 NPU를 제작하거나, 인공지능을 최적화가 가능한 컴파일러를 제작하여 배포하는 것이였습니다.

저는 워낙 처음하는 분야나 미지의 분야를 정말로 너무나도 좋아해서 한번 빠지게 되면 몰두하는 성격이 있습니다. 그래서 인공지능을.. 컴파일러 이용하여 최적화 한다는것 자체가 이해가 되지 않아서 컴파일러가 어떻게 동작하는지, LLVM이 무엇이고 어떻게 프레임워크가 구성이 되어있는지 공부하였습니다. 그리고 PyTorch나 Tensorflow에서 딥 러닝 연산을 수행하고, 역전파, 추론 과정이 내부적으로 코드가 어떻게든 동작하겠지! 란 생각을 하고 있었지만 실제로 코드를 분석하고 어떻게 동작하는지 분석하면서 정말 대단한 기술이라는걸 알게 되었습니다.

딥 러닝은 무엇인가?

딥 러닝은 인공지능 기법 중, 머신 러닝 범주에 속하는 기술입니다. 특히 머신 러닝은 흔히들 기계 학습이라고 이야기하는데, 입력과 출력 정보를 기계한테 전달한 뒤에 새로운 입력값을 주었을 때 출력 값을 예측 하는 인공지능 입니다. 이때 기계 학습 종류에는 SVM 이나, 뉴런 네트워크, 하르 케스케이드와 같은 기법들이 존재합니다. 이런 내용들은 입력되는 데이터를 2차원 또는 다차원 벡터나 행렬 분류하는 기법입니다. 흔히 선형 분류(Linear Regression 이나 Classification)라 할 수 있습니다.

그 중에서 최근 2013년에 AlexNet이 발표되면서 딥 러닝의 효율성과, 우수성이 밝혀지면서 많은 연구가 진행이 되었습니다. 그래서 우수성과 뛰어남을 확인하였다면 많은 연구자들은 다양한 분야로 연구를 하기 시작하였습니다. 다양한 분야가 있겠지만 딥 러닝 연산을 “가속”이 가능한 장비, 수학적인 최적화 방법, 알고리즘 최적화, 메모리 최적화, 병렬 연산 등등 다양한 분야가 연구 되었습니다. 저는 그 중에서 딥 러닝 연산을 가속하는 장비와 라이브러리를 최적화를 컴파일러 통해 해결하는 곳으로 인턴 가게 되었습니다.

인공지능 컴파일이란?

딥 러닝은 주로 무언가를 예측하거나, 새로운 데이터를 정제할 때 많이 사용합니다. 이때 딥 러닝은 정말 많은 내부 연산이 이뤄지기 때문에 이를 최적화하는 연구가 많이 진행되고 있습니다. 특히 딥 러닝 연산의 70% 이상이 컨볼루션 커널 연산이 주를 이루기 때문에 컨볼루션 연산을 최적화하는 연구가 많이 진행되고 있습니다. 그래서 상황에 따라 쓰여지는 알고리즘이 다르고, CPU나 GPU 마다 사용 가능한 명령어 셋(ISA, Insturction Set Architecture)이 상이하기 때문에, 최적화가 필요한 것입니다.

가장 많이 쓰이는 예시로는 Intel의 nGraph나, Apache의 TVM, 제가 인턴했던 곳인 ETRI의 NEST-C가 존재 합니다(NEST C와 NEST OS 모두 오픈소스로 공개가 되어 있습니다.). Tensorflow를 이용할 때 model.compile(), model.fit()이란 명령어를 사용해 보셨을 겁니다. 이떄 model.compile() 은 진심으로 프로그램을 생성하고, 내부 파라미터를 최적화하는 과정을 거친 뒤에 프로그램을 재 구성하고 실행하는 정말로도 신기한 구조를 가지고 있습니다.

즉, 현재 실행하고자 하는 딥 러닝 레이어를 “입력(소스코드)”으로 보고 결과물을 “출력(실행파일)”로 나오는 것입니다. 이때 컴파일할 때 GPU, CPU, NPU와 같은 옵션을 함께 입력 받아서 처리를 한다면 정말로도 최고의 기능이 나오게 될 것입니다. 간단하게 설명을 하자면 모든 분기문과 딥러닝 정보를 메모리에 적재하는 과정이 모두 전처리문을 통하여 결정이 된 상태입니다. 이러한 상태를 가지므로 분기나, 함수 포인터, 가상 함수로 구성이 되어있는 코드가 모두 삭제가 된 상태이므로 근소하게 더 빠른 결과를 출력하게 됩니다.

정리

처음에 인공지능 최적화가 무엇인지 이해가 가지않았지만, 학교에서 운영체제 수업을 들으면서 명령어의 처리하는 구조가 스택보다 레지스터 구조가 더 빠르다. 라는 내용을 들으면서 아하! 스택 구조가 많이 쓰이는구나 하였지만, 구현하기 어렵지만 빠르다면 빠른걸 구현해야하는 연구소의 멋짐에 감탄하였습니다.

간단하게 사용하는 사람에겐 아직 친숙하지 않는 분야다 보니 많은 어려움이 있다고 아직은 생각하고 있습니다. 하지만 어떻게 보면 반드시 중요하고, 최적화가 중요한 임베디드 시스템에서는 적용한다면 10~20 %의 성능 향상을 볼 수 있으니, 알고 있다면 어떠한 분야로 가던지 컴파일러를 통한 문제를 해결하거나 C++의 어려움이 사라질것이라 생각 합니다.

모든 코드가 C++로 짜여져 있고, 파이토치나, 텐서플로우를 쓴다면 꼭 공부하시길 바랍니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

알파제로를 분석하며 배우는 인공지능을 읽고 나서

C#에서 GUI 개발 후 dotnet과 함께 배포하기