본문 바로가기
daily./연구실 TIL

우당탕탕 연구실 생활 - 4월/5월 회고

by 브라이티_ 2024. 7. 3.
반응형

4월 회고를 작성해야지... 해야지... 하다가 어느덧 5월이 끝나버렸다. 글 한 편 작성하는 시간을 내는 것조차 버거운 나날들이다. 이렇게 된 김에 4월과 5월을 합쳐, 회고글을 작성하기로 마음먹었다. 크게 바라보면, 4월은 중간고사와 두 연구실의 일, 그리고 대학원 원서접수가 겹쳐 체력적으로 많이 힘들었던 한달, 5월은 파이토치 라이트닝 기반의 코드 리팩토링에 열중했던 한달로 요약해볼 수 있을 것 같다.

 

너무나 정신없이 한 학기를 보낸 나머지, 벌써 종강을 맞이하고 7월 3일이 되었다. 우선 4월달의 기억을 되짚어 보면, 두가지 사건이 강렬하게 뇌리에 스친다. 그 중 1) 첫번째는 연구실에 들어와 처음으로 모델 학습 띄우기를 성공한 사건이고, 2) 두번째는 연구실 메인 서버에 사고를 친 사건이다. 

 

첫번째 사건과 관련해, 나는 한창 베이스라인 논문의 Reproduce 작업을 진행하고 있었다. 그런데 그 코드가 너무 복잡하게 되어 있어, 작업이 쉽지 않았다. Multi Node (Server) - Multi GPU 를 전제로 작성된 코드라 NCCL Backend 와 관련된 env 변수들도 공부해야했고, 그밖에 Torchdata.datapipe 라는 다소 낯선 (토치 데이터는 구글링 해도 자료가 공식 깃허브레포를 제외하고는 하나도 안나온다 ... 정말 막막했었다.) 라이브러리로 학습 데이터를 처리해야했으며, Deepspeed 라이브러리가 기존 Torch 버전과 호환이 되지 않아 환경 만드는데도 며칠씩 걸렸다. 정말 고생했다, 3월 한달 간 고생한 끝에 드디어 처음으로 모델 '훈련' 이라는 것을 해볼 수 있게 되었다. 그때의 그 감격은 정말 잊을 수 없다. 그 전까지 사실 너무 스트레스 받고, 잠도 설친 적이 많았었다. 

 

그러나 그 뒤로도 사실 수많은 난관을 겪긴 했다. Omegaconf 라는 라이브러리를 사용하여, 데이터가 Omegadict 였나, 그런 특별한 데이터타입으로 Config 값이 들어오는 바람에 체크포인트 저장의 순간에 오류가 발생하기도 했다. 이는 직접 패키지 코드를 수정해주는 방식으로 해결해야 했다. 근데 이도, 자료가 너무 안나와서 혼자 열심히 지피티를 동원해가며 수정하느라 참 애썼다. 그밖에 데이터가 갑자기 안읽힌다든가, NCCL Backend 상의 timeout 문제로 학습이 중단된다든가 ... 너무나 많은 어려움억까이 있었다. 

 

그러나 첫번째 Run 은 체크포인트 저장 이슈로 중단되었다. 늘 되새긴다, 체크포인트 저장 Sanity Check 은 사전에 필수 !

 

env 설정에 NCCL_BLOCKING_WAIT = 0 을 걸어뒀었는데 그 때문이었을 것으로 추정된다. 잘 알지도 못하는 환경변수는 함부로 걸지 말자.

 

 

 

사실 옛날이라 기억이 희미해지려 하지만, 이러한 우여곡절 끝에 제대로 된 첫 학습을 돌리고 (4월 2주차 경) 너무 기뻤다. 그리고 연구 특성 상 한번 모델이 학습되는데 2-3일 이상씩 소요되기 때문에 하루 이틀 정도는 맘놓고 잘 수 있게되어 그게 제일 감사했다. 

 

 

다음으로 두번째 사건과 관련해, 4월달에 메인 서버에 사고를 쳤다. 4월 2일에서 3일 넘어가는 새벽, 한창 모델을 계속 GPU 에 올렸다 내렸다 하며 디버깅을 하고 있었는데 갑자기, 메인 서버가 사라졌다. nvidia-smi 를 쳤는데, 터미널에 아무것도 뜨지않는 그 오싹함이란 .... 다신 생각하고 싶지도 않다.

 

딱 이상태였다.

https://zorang2.tistory.com/104

 

[Ubuntu] Unable to determine the device handle for GPU0000:06:00.0: Unknown Error 해결방법

상황 서버 컴으로 학습시키다가 (3~4epoch을 지나고 있었음, 코드 레벨에서 Error 없을 것으로 예상) RuntimeError: CUDA error: the launch timed out and was terminated 라는 에러 메시지와 함께 갑자기 학습을 멈췄

zorang2.tistory.com

 

별의별 생각이 다들었다. 급하게 자정 늦은 시간에, 같은 랩실의 서버 관리자 학생분께 연락을 드렸다. 서버 리부팅을 진행했는데도 해결이 되지 않아 결국 다음날 전문 기사님이 오셨다 갔다. 원인은 서버의 온도가 너무 높아져서 그런것 같다고 하셨다. A100 10대가 달려있던 서버라, 정말 쫄았다. 난 아직 대학원 입학도 안했는데, 입학 전에 몇 억 빚부터 생기는건가 ... 하고 진짜 눈물이 핑돌던 새벽이었다. 가뜩이나 연구도 잘 못하고 뜻대로 안되는데 이런 일까지 발생하니 서러워서 울었다. 그리고 서버 관리자 학생 분께도 너무 죄송했다.

 

연구실 긴급 슬랙 메세지

 

결론적으로는 다행히 서버에 있는 데이터들도 날라가지 않고, 장치도 훼손되지 않았지만, 이때 이후로 트라우마가 생겨 서버에 실험을 올릴때 늘 조심조심하게 되었다. 서버 사고는 진짜 아찔하다. 

 

5월달에는, 오피셜 코드를 직접 PL 기반으로 구현한, 다른 연구실 분께서 짜두셨던 코드를 리팩토링하는 작업에 몰두하였다. 그 PL 코드를 한 분이서 작업하셨어서 그런지, 정말 코드가 깔끔하지 않고 보기 어려웠다. 그리고 Pretraining 코드만 있고, 내가 맡은 SFT 코드는 없었다. 학습 코드는 물론 데이터로더 코드도 마찬가지였다. 그래서 맘먹고 처음부터 새로 짰다. 학업이랑 병행하다 보니 장장 한 달이 걸린 것 같다. 

 

7월 지금 시점에서는, 그래도 그때 짜놓은 리팩토링 코드 뼈대에 살을 붙이고 붙여 어느정도 안정적으로 돌아가는 훈련 코드를 가질 수 있게 되었다. 물론 아직 발전시킬 점이 많지만, 그래도 이때 Pytorch Lightning 공부도 많이 할 수 있게 되어 유익했다. 한편 이때 데이터로더 코드 짜는게 정말 골치 아팠는데(왜냐하면, 나는 멀티 이미지와 멀티 텍스트를 스트림으로 받는 Iterable Dataset 을 구현해야했는데 이것이 잘 뜻대로 되지 않았다.), 이는 다른 글에서 제대로 다뤄보도록 하자. 역사가 정말 길다.

 

아마 6월 회고는 별도로 작성하지 않고, 나의 상반기 회고록을 한 번에 작성하게 될 것 같다. 이 또한 제때 작성은 할 수 있을련지 ... 벌써 7월이라니 시간이 참 빠르다.

 

 

반응형