프로젝트 개요
AI에 대해서는 예전부터 관심이 있었고 C++과 rust같은 로우레벨 프로그래밍 언어도 개인적으로 좋아합니다.
그래서 이번 프로젝트는 C++와 CUDA를 활용해 외부 라이브러리 없이 테트리스 게임을 직접 구현하고, 이 게임을 스스로 플레이하며 최고 점수를 노리는 강화학습 에이전트를 처음부터 만들어보는 과정을 기록하는 것을 목표로 할 것입니다.
로우레벨 언어와 인공지능, 그리고 GPU 프로그래밍에 관심이 많은 학부생으로서, 이미 잘 만들어진 라이브러리나 프레임워크에 의존하지 않고 처음부터 모든 것을 직접 설계하고 구현해보는 경험을 통해, 진짜로 시스템이 어떻게 돌아가는지 깊이 이해하고 싶습니다.
또한, GPU의 병렬 연산 능력을 실제로 활용해보며, 이론으로만 배웠던 개념들이 실제 코드와 하드웨어에서 어떻게 동작하는지 체험하고자 합니다.
이 프로젝트를 통해 배우고자 하는 가장 큰 목표는, 강화학습의 핵심 원리와 GPU 프로그래밍의 실전 기술을 내 손으로 직접 구현하며 익히는 것입니다.
테트리스라는 익숙한 게임을 스스로 만들고, 그 위에서 동작하는 에이전트를 설계하면서, 상태 공간과 행동 집합, 보상 함수 설계의 중요성을 느낄 것입니다.
또한, CUDA를 활용해 대량의 시뮬레이션을 병렬로 처리하는 과정에서, GPU 메모리 관리나 커널 최적화와 같은 실전적인 문제들을 직접 해결해보고자 합니다.
라이브러리 없이 신경망이나 알고리즘을 처음부터 구현하는 과정에서, 평소에는 잘 느끼지 못했던 컴퓨팅 자원의 한계나, 병렬 연산의 어려움도 경험할 수 있을 것이라 기대하고 있습니다.
어려움도 많겠지만 이런 난관들을 직접 부딪히고 해결해가는 과정에서, 단순히 결과만 얻는 것이 아니라, 문제를 분석하고 해결책을 찾아가는 과정 자체가 큰 성장의 기회가 될 것이라고 생각합니다.
오늘 한 것
텐서 클래스 구현 마무리
회고 및 앞으로 할 일
텐서 클래스를 제작하면서 템플릿을 이용했는데 이 템플릿과 CUDA를 이용하면서 모든 자료형에 대해 잘 인스턴스화 되도록 설계를 함과 동시에 선언과 구현을 분리하고 싶어 방법을 찾아 많이 헤맸습니다. 헤더 파일 끝에 포함해보기도 하고 CMake 설정을 바꿔보기도 하였지만 결과는 많은 오류만 맞이하였습니다. 그래도 계속 해결책을 찾다가 결국에는 어차피 AI에서 텐서는 문자 자료형이나 사용자 자료형은 안받으니 기본 숫자 자료형에 대해서만 인스턴스화시켜 구현하기로 하였습니다.
이 과정에서 CUDA파일과 cpp파일이 섞이고 컴파일러가 구분하지 못해 어려움을 겪었지만 #ifdef도 해보면서 어떤 원리로 구분하는지 알게 되었습니다. 고치는 과정에서 테스트라는걸 처음 도입해서 시도해봤는데 매우 편리해서 앞으로도 자주 사용할 것 같습니다.
테스트를 여러번 시도해보며 행렬 합과 스칼라 배를 GPU로 매우 큰 크기의 3차원 배열로 까지 구현하는데 성공했습니다.
추가로 과제 시간 제약때문에 cudnn이라는 라이브러리 정도는 사용하려하는데 이 라이브러리에 맞춰서 개발해야겠습니다.
