종합설계과제를 마치며

1년간 정말 열심히 했던 종합설계과제가 끝이 나고, 뭔가 시원섭섭한 마음에 그간 어디에서도 할 수 없었던 이야기들을 남기려고 한다. 24개의 중간보고서, 12번의 지도교수 면담, 5번의 발표, 1번의 학회발표에는 담을 수 없었던 그런 얘기들…을 까먹기 전에 몇 자 적어보았다.


사건의 발단

종합설계를 3학년 2학기에 하게 된 것은 매우 우연찮은 일이었다. 내가 전자과 복전을 결정한 것이 2학년 2학기의 일이고, 3학년 1학기에는 공부하느라 바쁘다는 핑계로 미래의 일은 별로 생각을 안했다(하지만 3초에 20학점 들었으니까 바빴다고 해도 괜찮지 않을까!). 종합설계는 1년짜리이고, 기계과 설계도 해야 하니까 3학년 2학기에 기계과 설계를 하든 전자과 설계를 하든 무언가는 시작했어야 하는 상황이었으나 일단은 별 생각이 없었다. 그런데 3학년 1학기에 김지우와 청암에서 전자회로 공부를 같이 하고 기숙사로 돌아가던 중에 설계는 어떻게 할 거냐는 이야기를 나눴고, 그러다가 2학기에 설계를 같이 하자고 얘기가 되었다.

그렇게 수강신청을 했다.


전개

그런데 이놈의 종합설계는 요구하는 것이 너무 많았다. 제일 킹받는 점은 여름방학에 연구계획서를 쓰라고 하는 점이었다. 그럴거면 방학 때 수강신청을 시켜서 학점을 주든가! 연구실에 앉아 있었는데 김상우 교수님으로부터 메일이 한 통 왔다. 8월 중순까지 조편성을 완료하고 지도교수님을 정해 연락하라나 뭐라나… 그리고 8월 말일까지 연구계획서를 제출하라나 뭐라나… 주제 선정이 딱 봐도 선착순인 것 같으니까 그날 저녁에 바로 김지우를 만나서 학식 먹으면서 주제 이야기를 했다. 근데 듣자하니 본인이 지금 연참을 하고있는 강석형 교수님께서 설계과제 주제를 주셨다는 것이다. 사실 나는 당연히 로봇이나 제어 쪽으로 하고 싶었는데 갑자기 반도체 해야 할 것 같은 느낌이 와서 조금 불안했다. 근데 뭐,, 나는 반도체 하기 싫다 말하기도 그렇고 그때도 별 생각이 없었던 나는 알겠다고 했고, 그렇게 강석형 교수님과의 면담이 추진되었다.

강석형 교수님을 만나러 가는 길에는 비가 내렸다. 나는 그때 효자에서 자취를 하고 있었는데 비도 오고 늦은 거 같아서 택시를 타고 엘지동까지 갔던 기억이 난다. 그때 내가 레퍼런스를 읽고 갔었는지 안 읽고 갔었는지 기억은 잘 안나는데 그 자리에서 1시간 정도 교수님과 면담을 했다. RL-based chip placement automation. 이것이 우리에게 주어진 주제였다. 몇 개 선택할 수 있었는데 이게 제일 재미있어 보였다. 레퍼런스 논문은 A graph placement methodology for fast chip design | Nature이다.

사실 뭐랄까 강 교수님은 종합설계를 좀 가볍게 보시는거 같았다. 면담 할 때에도 이렇게 진행할 계획이다 말씀드리면 이거는 뭐 구현 정도만 하면 성공적이라 볼 수 있다 / 너무 어렵게 잡았다가 연구 주제를 바꾸는 팀도 간혹 있다 등 욕심부리지 말라는 식으로 말씀하셔서 기분이 좀 묘했다. 결론적으로는 일년동안 교수님 지도사항 중에서 방향성이나 범위에 관한 부분은 거의 안들었고, 테크니컬한 부분이나 데모 등에서 말씀해주신 부분만 수용한 것 같다.

연구계획서를 쓰기 위해서 공부를 좀 해야했다. 일단 반도체 및 설계 분야도 공부를 해야했고, 강화학습도 공부해야 했고 강화학습 기반 반도체 설계도 공부해야 했다. 어찌저찌 해서 연구계획서를 썼다.

웃긴 점은 개강 3주차에 주제를 엎었다는 것이다. 원래는 연구 목표를 두 가지로 잡았다. 첫째는 standard cell placement에 사용하는 standard cell placer에 따른 학습 성능 비교, 둘째는 보상함수 설정에 따른 학습 성능 비교였다. 그런데 연구계획서 쓰면서 생각을 열심히 하지 않은 것일까, standard cell placer와 보상함수가 연관이 있을 것이라는 생각이 불현듯 들었다. 예를 들어 method A와 B가 있는데, method A는 wirelength를 줄이는 대신 congestion이 좀 높고 B는 wirelength가 좀 큰 대신 congestion이 작으면 A로 학습을 할 때는 보상함수에서 congestion weight를 좀 높이고 B로 학습을 할 때는 congestion weight를 줄여야 하지 않을까… 라는 생각이 든 것이다. 그래서 좀 생각을 해보고 연구의 방향성을 바꾸게 되었다.

이후로는 실험 계획을 세웠다. 실험 환경만 잘 구성하면 실험은 일사천리로 진행될 것 같았다. 일단 실험 진행은 standard cell placer를 여러 개 구현한 다음, 각 방법에 대해서 congestion weight를 바꿔가며 모델 성능을 측정하고 분석을 하는 것이었다. 이것을 하기 위해서는 학습을 진행할 수 있고 standard cell placer를 마음대로 바꿀 수 있는 환경을 구축해야 했다. 조사를 하다가 구글에서 코드를 공개한 것을 발견했다. 나는 코드를 발견하고 너무 기뻤다. 이 코드를 잘 쓰면 속전속결로 진행할 수 있을 것 같았다. 하지만 코드는 문제가 많았다. 코드가 문제인건지 내가 문제인건지는 잘 모르겠지만, reproduction이 잘 안됐다. 그래서 어쩔 수 없이 직접 구현해야 한다는 결론에 도달했다.


위기

구현은 만만치 않았다(않아 보였다). Chip placement 환경을 구성해야 했고, 강화학습을 구현해야 했다. Chip placement 환경은 먼저 lefdef 파일을 파싱해서 회로를 재구성하는 과정이 필요했고, 이후 placement 과정에서 macro placement와 standard cell placement를 각각 구현해야 했다. 강화학습의 경우 tf-agent나 stable baselines 같은 라이브러리를 사용하려고 했는데, 순탄치가 않았다. Macro placement를 할 때 state에 따라 가능한 action이 달라진다. 가장자리에 배치하면 안되고, 소자 겹침이 존재하는 위치에 배치하면 안되고, 밀도가 너무 높게 배치하면 안된다. 이것을 배제하고 학습 및 inference를 진행하는 것을 라이브러리를 통해서는 구현할 수가 없었다. 그래서 어쩔 수 없이 강화학습 부분도 직접 구현해야만 했다. 사실 이때까지도 강화학습에 대해 잘 몰랐기 때문에 깃헙에 떠돌아다니는 코드를 복붙해서 사용했다.

어찌저찌해서 코드를 완성하고, 학습을 했다. 이때가 2학기 중간고사 기간이었는데 지금 돌아보면 정말 난장판이었지만 그때는 뭔가 된다는 사실만으로 되게 기뻤던 것 같다. 2학기 나머지 기간에는 구현을 보완하는 것에 힘썼다. 일단 테스트케이스를 더 간단한 것을 썼고, 그 다음으로는 standard cell placer를 구현하려고 했다. Standard cell placer로 뭘 쓸까 고민하다가 Aplace를 골랐다. Aplace가 좀 오래된 방법이긴 하지만 쓸만해보였다. 그런데 이걸 한달동안 구현을 못해서 결국 빈 공간에 좌상단부터 채워넣는 greedy placement를 채택한게 너무 슬프다.

겨울방학에는 KCS에 가서 발표를 했는데, 이때도 정말 우당탕탕이었다. 학회 등록은 했는데 잘 곳이 없어서 다른 애들 방에 낑겨서 같이 자고, 포스터는 전날에 개판으로 만들어서 선배들한테 한번 깨진 후 밤새서 만들어서 당일 인쇄해서 가져가고… 좀 힘들긴 했지만 좋은 경험을 했다고 생각한다.

1학기에는 구현을 좀 제대로 해보려고 노력했다. 사실 지금도 뭔가 되는거 같아 보이기는 했지만 내가 짠 코드이기에 나는 알고 있었다. 코드가 정말 개판이라는 것을. 피처 추출도 제대로 안했고, standard cell placer도 이상하고, PPO 코드도 뭔가 어정쩡해 보이고… 고칠 부분이 많았다. 하나씩 차례대로 해보기로 했다. 일단 피처 추출은 PyTorch geometric을 써보려고 했는데, 뭔가 문제가 많이 생겼다. 통합하는 과정에서 문제가 생겨서 pytorch geometric을 쓸 수가 없었다. GNN에 특화된 라이브러리라고 해서 기대를 했는데 아쉬웠다. Standard cell placer의 경우 김지우가 구현을 했다. eplace를 잘 변형해서 force-directed method를 만들었는데, 생각보다 잘 만들어서 좀 놀랐다. 잘 동작해서 너무 다행이었다. 그리고 마지막으로 stable baselines3의 PPO 코드를 도입했다. 이건 불가능할 줄 알았는데 됐다. 사실 이걸 하면서 내가 레퍼런스 조사가 부족했나 싶기도 하면서 레퍼런스 조사의 중요성을 깨닫게 되었다. MaskablePPO라고 불가능한 action을 제외하고 training 및 inference를 하는 알고리즘이 2022년 10월 정도에 발표되었던 것이다. 그리고 언제인지는 모르겠지만 stable baselines3 bleeding edge 버전에 MaskablePPO가 구현이 되어있었다. 그래서 이걸 쓰기로 결정했고, 구현했던 코드를 stable baselines3에 맞추어 수정하는 작업에 돌입했다. Sb3는 pytorch 기반 라이브러리이다. 예전에 tf-agent를 써볼까 생각하면서 tf format에 맞춰 작업할 때가 있었는데, tf보다 pytorch 생태계에 맞추는게 좀 더 쉬웠다. 이래서 다들 pytorch로 넘어오는 건가 싶었다. Environment 포맷 맞추고 나서는 neural network를 수정했다. Feature extractor도 GNN 써서 만들고, policynet이랑 valuenet도 sb3 포맷 맞춰서 다시 만들었다. Feature extractor 만들면서 공부를 진짜 많이 했다. GNN, attention 등 최신 신경망을 많이 공부했는데, 이 과정에서 딥러닝에 대한 이해도 좀 는 것 같고 코딩 실력도 좀 는 것 같다. 원래도 코딩을 못한다고 생각하지는 않았는데, 예전에 하던 코딩은 그냥 내가 생각한 것을 어떻게든 내 스타일로 만들어내는 코딩이고 이번에 한 코딩은 제공되는 라이브러리를 분석하고 그거에 맞추어서 새로운 코드를 짜는 코딩이었다. 이런 식의 코딩은 거의 처음 해보는데, 꽤 재미있었고 많은 것을 배운 느낌이다. 아무튼 그래서 결국에는 됐다.


결말

되긴 됐는데, 문제는 거기서 멈췄다는 것이다. 12주차인가 13주차 이후로 최종발표 때까지 우리는 아무것도 안했다. 못한건지 안한건지는 모르겠는데 일단 나는 그때 너무 바빴다. 최종발표회 날에 시험이 있었으니 말 다했지… 실험하는 데에도 시간이 그렇게 많이 걸릴 줄은 몰랐는데, 학습 한번 하는데 하룻밤을 꼬박 새야 할 줄은 몰랐다. 서버에서 돌려도 gpu로 가속할 수 있는 부분은 학습 과정이지, environment에서 시간이 많이 드는 것은 가속을 할 수가 없었다. 그래서 포스터에는 원래 계획했던 피겨 및 내용보다 적게 들어가서 너무 아쉬웠다.

포스터 발표는 그럭저럭 했는데, 김상우 교수님의 코멘트를 듣고 아 했다. 너희가 찾은 이 30이란 값이 좋다는 것을 어떻게 보일거냐? 나는 레퍼런스에서 domain adaptation이 잘 된다길래 그런갑다 하고 살았는데 그걸 확인해볼 생각을 못했다. 포스터 발표 이후 최종보고서 제출까지 일주일의 기한이 있었기에, 그동안에 실험을 더 돌렸다. 원래 ispd18test3에서 학습을 해서 실험을 했는데, test8에서도 학습을 해보고 test3에서 학습한 모델을 test8에 적용도 해봤다. 실험을 돌려놓고 김지우와 의견차가 있었다. 결과를 예측하면서, 김지우는 엣지 개수가 optimal weight에 영향을 줄 것이라고 생각했는데 내가 생각하기에는 아니었다. Wirelength와 congestion이 모두 edge 개수에 비례하기 때문에 edge 개수가 많아지면 W와 C가 모두 증가하고, edge가 적어지면 W와 C 모두 감소하니까 결국 그것들의 비율인 weight lambda는 scale이 일정하게 유지될 것이었다. 실험 결과도 내 예상과 같았다. 많은 벤치에서 lambda=30이 좋은 값이었다. 사실 이때 정말 다행이라고 생각했다.

사실 종설2는 꾸준히 하지를 못해서 성적을 기대하지는 않았는데 에이플을 받아서 정말 기뻤다. 나는 예전부터 졸업과제가 정말 중요하다고 생각해왔다. 한 사람의 대학생활을 평가하는 지표로 성적을 볼 수도 있지만, 졸업과제는 이 사람이 해당 전공에 대한 얼마나 깊은 이해를 하는지를 반영하는 것이기에 졸업과제를 잘 해내는 것 또한 정말 중요하다고 생각한다. 그런만큼 종합설계과제1,2에서 모두 A+를 받아낸 것이 너무 자랑스럽고 뿌듯하다. 단지 종합설계과제를 잘 끝낸 것 뿐만 아니라 그 과정에서 많은 것을 배울 수 있었기에 결과가 더욱 값진 것 같다.

쓰다보니 정말 주저리주저리 쓰게 되었는데, 나중에 이 글에 다시 돌아왔을 때 어떤 기분이 들지 정말 궁금하다.

2023년 6월 19일 새벽 1시, 마침.