지난해 회사를 옮기고 난 후 필요에 의해 스터디도 많이 하고 논문도 원없이 보고 있는거 같다.
처음엔 도대체 이게 뭔가 싶었는데, 논문들을 계속 보다보니 왠지 이젠 스크래치로 구현도 가능할 것 같아서 실현을 해보기 위해 지난 2월 데스크탑을 업그레이드 했다.
그 결과물들은 요기:
원래 쓰던 데스크탑은 결혼하면서 맞췄던 i7-3770이었는데, 최근들어 멜트다운 등등 intel cpu 버그가 빵빵 터지면서 소프트웨어 워크어라운드로 인한 성능 저하가 보고되고 있는 관계로 요번에는 오랫만에 라이젠으로 넘어가보기로 했다.
아래는 내가 선택한 제품들이고,
- CPU: Ryzen7 3700x
- Mainboard: ASUS Prime x570-PRO/CSM
- GPU: MSI Geforce RTX 2080 Super 8GB * 2
- Memory: Micron Crucial DDR4 16GB PC4-25600 * 2
- SSD: Samsung 860 EVO 250GB
- Power: SuperFlower SF-1000F14MP Platinum
메인보드는 그래픽카드를 두개 꼽아 사용할 생각이었기 때문에 PCI-E 8x+8x 구성이 가능한 제품을 찾다보니 가격이 많이 뛰어버렸다. SSD는 직접 테스트해봤을때 860 EVO나 860 PRO나 차이가 없길래 저렴한 EVO 모델을 선택했다.
아무래도 집에서 쓸 목적이었기 때문에 전기세 걱정도 있고 해서 GPU는 파워 소모가 좀 덜한 2080 모델로 선택을 했다.
덕분에 2월에서 4월 정도까지 재밌게 코딩하고 테스트하고 하면서 놀았던거 같다. 실제 개인용으로 학습용 데스크탑을 구성하고 써보니 아래와 같이 몇가지 아쉬운 점들이 있는거 같다.
- 전기세 문제
- GPU 발열/소음 문제
- GPU 메모리 문제
우선 전기세 문제를 보면, 2~4월 전기 사용량이 각각 평소보다 120kW, 350kW, 190kW 정도 더 나온것 같다. 추가로 나간 전기세를 보면 2.5만원, 8만원, 4.5만원 정도였던 듯.
(써놓고 나서 보니 술한번 안먹음 되는 돈이네…, 하지만 지금 시기에 에어컨도 구동하면서 이걸 같이 했다고 생각하면…)
다음으로 발열/소음 문제를 보면 전에 쓰던 GTX 1080의 경우엔 하나만 연결해뒀을때 케이스를 닫아두고쓰면 크게 신경쓰지 않아도 될 정도의 소음이었는데, RTX 2080의 경우는 하나만 연결해서 써도 소음이 무시하지 못할 수준이다.
거기다가 거의 pci 슬롯 세개를 차지하기 때문에 그래픽카드를 두개 연결할 경우 두 카드가 거의 붙어서 설치가 되기 때문에 발열 문제가 더 심각해지는것 같다. 그래도 춥던 시절이라 방문을 닫고 창문을 살짝 열어둔다거나 하는 식으로 좀 완화할 순 있었는데, 지금 날씨면 발열 및 소음 문제는 더 심각할 것 같다.
그리고 GPU 메모리 문제…
시스템 메모리의 경우 가상 메모리나 스왑 등으로 메모리가 모자란 경우에도 어떻게든 돌아는 가지만 GPU 의 경우는 거의 피지컬하게 메모리를 못잡으면 죽어버리는데, …
대부분 논문 작성자들이 좋은 컴퓨터로 학습을 진행해서인지 8GB 메모리로 논문에 있는 조건을 재현하지 못하게 되는 경우들이 종종 발생하게 된다. 물론 data parallel 등의 모듈을 이용하면 multi gpu로 batch를 분산시키므로 메모리가 2배인 것처럼 동작시킬 수 있기는 하지만…
PyTorch의 경우 loss module들은 기본적으로 multi gpu를 지원하지 못하는 문제가 있고,
batch normalization의 경우 forward path에서 batch 단위 mean/variance를 계산하고 이를 통해 업데이트된 running_mean/varariance를 이용하여 해당 레이어의 출력을 만들어내는데, data parallel을 사용하면 각각의 gpu에서 절반씩의 batch만을 이용해서 mean/variance를 만들게 되므로 학습은 batch 단위인데, batch normalization layer 는 mini batch 단위로 별개 업데이트되는 문제도 있다.
물론 SyncedBatchNorm 같은 것을 통해 극복할 순 있으나 사용하기 위해 해야하는 작업들이 적지 않아서 뭔가 모기 잡는데 총을 쓰는것 같은 느낌을 피할 수가 없었다. (사실 머신 러닝도 비슷한 느낌이긴 하지만…)
그래서 결론인데…
Geforce 3090이 발표된걸 보니 기존 모델 대비 발열도 줄고, cuda unit도 두배로 늘고, 메모리 24GB를 탑재한 모델도 있던데, 이걸 사면 위에서 얘기했던 발열 문제나 메모리 문제가 다 해결될 수 있을거 같고, cuda unit도 두배니까 gpu 두개 쓸때보다 오히려 더 빠를 거 같다.
10월 말에 구입이 가능하던데, 부담없이 구입할 수 있도록 코스피가 얼른 힘을내줬음 좋겠다.
ddp 가 만능은 아니였군요..! 말씀하신대로 synced batchnorm을 따로 적용해줘야겠군요 ㅠㅠ
머리로 이해하려고 하는걸 포기한게, batchnorm을 gpu 마다 따로 가져간다고 학습이 잘 안되지도 않더라구요.
속도는 포기하기 싫고, ddp에서 batchnorm을 따로 가져가는게 영 거슬린다면 momentum을 조정해서 (torch 기준 0.01 정도로 내리고, tf 기준 0.99 정도로 올려서) 그 편차를 줄이는 것도 방법일 거 같아요.
참고로 ESRGAN 같은 논문을 보면, gan loss로 학습된 weight와 perceptual loss로 학습된 weight를 interpolate하는 실험을 하고 있는데요. 재밌는건 weight를 weighted sum하면 실제 결과물도 두가지 특성의 중간적 특성을 보이는 결과물이 나오더라구요. non-synced batchnorm 의 경우도 비슷하게 평균적 특성을 뽑아내는게 아닌가 싶어요.