2024. 3. 14. 21:21ㆍCS/Lumine 개발기
드디어... 제가 작년 12월부터 진행하기 시작한 프로젝트 관련해서 이야기를 할 수 있게 되었네요.
예전에 Pyodide 관련된 글을 올리면서 친한 동생이랑 프로젝트를 시작했다고 한 적이 있습니다. 그때는 뭔가 보여줄 수 있는게 아무것도 없었기도 했어서 어떤 프로젝트인지는 설명을 하지 않았습니다.
하지만, 3월에 들어가면서 1차 목표를 달성하고 github 페이지까지 생성해서 사람들이 볼 수 있게 되어 이제 글을 써보고자 합니다. 모델 아키텍쳐 도식을 PyTorch 코드로 실제화 시켜주는 프로젝트 'Lumine'을 소개합니다! 저는 이 프로젝트에서 알고리즘 + 파싱 로직을 주로 맡았습니다.
어떻게 이 프로젝트를 시작하게 되었는가?
이 프로젝트는 작년 8월 쯤부터 저 혼자서 구상하고 있었던 프로젝트였습니다. 당시에 저는 PS를 열심히 하면서 그래프 알고리즘에 재미를 느끼고 있었는데요. 그러면서 제가 졸업반인 만큼 "휴학하면서 하고있는 PS 공부가 코딩테스트/대회 결과 등이 아닌 실제 아웃풋으로도 이어질 수 있을까?" 이러한 의문이 들었습니다.
그러면서 저는 그래프 알고리즘이 여러 분야에 적용하기 매우 좋다고 판단해서 이를 실생활 어디에 접목을 할 수 있는지를 생각해보았습니다. 그러다가 예전에 제가 학부연구생 시절이 기억이 났습니다.
저는 학부연구생 시절에 인공지능 관련해서 교수님 밑에서 프로젝트도 하면서 공부했었습니다. AI 관련 프로젝트를 하다보니 논문은 필연적으로 읽게되는데, 저는 AI 분야에선 모델 아키텍쳐는 주로 그래프 형태로 도식화를 해서 표현하는 걸 배웠습니다. 다만 제가 공부했을 당시에는 (Tensorflow 한정으로)코드를 기반으로 그래프를 그려주는 기술은 존재했지만, 역으로 그래프를 그리면 모델 아키텍쳐 코드로 옮겨주는 기술이나 프로그램은 찾을 수 없었습니다. 그래서 프로젝트를 진행했을 때에는 모델 아키텍쳐 코드를 따로 짜고, 나중에 논문을 작성할 때에는 해당 코드를 그래프 형태로 시각화하는 과정을 번거롭게 거쳐야 했었습니다.
그런데, 생각을 해보니 모델 아키텍쳐 그래프가 주어지면 이를 파싱하여 PyTorch 코드로 옮기는 작업은 그래프 알고리즘으로도 충분히 해결될 수 있을 것 같았습니다. 생각을 해보면, 아무리 모델 아키텍쳐 내에서 recursive 구조를 갖는 부분이 있다고 하더라도, 전부 펴보면 모델 아키텍쳐는 일종의 DAG(Directed Acyclic Graph)로 표현이 됩니다. 그래서 모델내에 변수를 forward 하는 순서는 그냥 Topological sort를 돌리는 순서대로 진행하면 될 것 같았습니다. Constructor 메소드 내에는 아키텍쳐에서 언급된 노드들을 전부 기록하면 될 것 같았습니다.
그런데 왜 이렇게 늦어졌는가?
이러한 사고 과정을 통해서 그래프 알고리즘을 활용한 프로젝트 아이디어와 제일 중요한 핵심 로직 구현 방법은 어느 정도 생각해두었습니다. 그렇지만 문제가 있었습니다. 바로... 제가 웹에 대해서 하나도 모른다는 점이었습니다.
아무리 생각을 해도 결국에는 서로 모델 그래프를 공유하고 이를 코드로 바꾸는 서비스는 웹 환경에서 제공하는게 제일 깔끔하다는 결론이 나왔습니다. 그렇다면 아무래도 프론트와 백도 구현을 해야한다고 생각을 했었는데, 저는 프론트 / 백 둘다 할 줄 몰라서 혼자서 프로젝트를 할려면 혼자서 둘 다 공부를 해야하는 상황이었습니다.
설상가상으로 8~10월에는 삼성 DX 알고리즘 특강도 있었고, 제 2회 보라매컵 예선 및 본선 문제 출제도 해야했어서 웹을 공부할 수 있는 시간이 안 났었습니다. 그래서 저는 일단 프로젝트 개요와 단계별 목표만 어느정도 짜두고, 프로젝트 내의 핵심 로직을 파이썬으로 구현해서 로직이 통하긴 하는가를 테스트 해보았습니다.
우선 1단계 목표로 생각해둔 범위 내에서는 핵심 로직이 BFS 만으로도 가능하기에 BFS로 구현했고, 어떤 부분들을 노드로써 기록하고 노드 내에는 어느 정보가 담길 것인지는 대충 생각해서 노드를 구성하였습니다. 그러더니 핵심 로직 함수가 정상적으로 PyTorch 아키텍쳐 코드를 뱉어냈습니다. 실제로 Google Colab에 제 함수가 그래프 구조를 파싱하여 생성한 코드를 복붙하고 input을 넣어보니 정상적으로 output까지 뱉어내는 걸 확인하였습니다.
핵심 로직 코드가 돌아가는 것을 확인했으니... 이제 1단계 목표를 저 혼자 달성하기 위해서는 웹을 공부해야했습니다. 그래서 대강 Vue + Django로 프론트와 백을 정하고 공부할려 했는데 모르는게 너무 많고 공부할 양도 너무 많아 계속 미뤄두었습니다. 그러다가 12월에 이 프로젝트를 같이 하고 있는 동생으로부터 갑자기 연락이 왔습니다. 그래서 카톡을 하던 도중에 그 친구가 웹을 하는 것을 기억해서 "이러한 프로젝트가 있는데~ 웹 부분으로 너가 참여할래?" 이런 톡을 보냈고, 그 친구도 관심이 있다는 표현을 하였습니다. 그래서 12월 말에 디코로 만나서 첫 미팅을 가지기로 하였습니다.