최근 인공지능 분야에서 “초거대 언어 모델(LLM)”이 큰 화제가 되고 있습니다. GPT나 PaLM, Chinchilla, LLaMA 등 파라미터가 수천억~수조 단위에 달하는 모델들이 연이어 공개되면서, 이제는 누구나 “나도 초거대 모델 한번 만들어볼까?” 하는 생각을 하게 되었죠. 그런데 이 초거대 모델이라는 것이 결코 만만한 상대가 아닙니다. 왜냐하면 파라미터 수가 기하급수적으로 늘어날수록, 필요한 GPU 자원 또한 엄청나게 증가하기 때문입니다.
그래서 “1조(10^12) 파라미터짜리 모델을 32비트로 저장한다고 가정하면, RTX 3090이 대략 몇 개 필요할까?”라는 질문을 자주 받는데요. 얼핏 생각해 보면 1조 파라미터 * 4바이트(32비트) = 4TB 정도의 메모리가 필요합니다. 그리고 RTX 3090 한 장의 VRAM은 24GB. 이걸 단순히 나눠보면 4,000GB / 24GB = 약 166.7, 그러니까 대략 160~170장 정도 필요하다는 계산이 나오죠.
물론 “파라미터만 저장한다면” 이라는 극단적인 가정일 때 그렇습니다. 실제 훈련 과정에서는 옵티마이저(특히 Adam 같은 옵티마이저는 모멘트 정보를 따로 저장해야 해서 파라미터 용량의 23배 이상이 추가되곤 합니다), 중간 계산 그래프나 활성값(activations)을 역전파(backpropagation)를 위해 보관해야 하는 문제, 병렬화 과정에서 발생하는 추가 메모리 사용, 각종 오버헤드 등을 고려해야 합니다. 그래서 현실적으로는 1조 파라미터를 32비트로 꽉 채워서 ‘원활히’ 학습하기 위해서는 300500장 정도의 RTX 3090을 잡아야 한다는 결론에 도달합니다. 그리고 가격도 만만치 않죠. 한 장을 평균 200만 원으로 잡으면, 500장만 해도 10억 원입니다. 조금 비싸게 잡으면 500장에 11~12억 원까지도 올라갑니다.
만약 여기에 파라미터가 “10조(10^13) 개”라고 한다면 어떨까요? 단순 계산으로는 위 수치의 10배입니다. 파라미터만 놓고 봐도 40TB(1조일 때 4TB × 10)이 필요한 셈이니, 1조 파라미터 때 “160장”으로 계산하던 것이 10배가 되어 “1,600장”이 됩니다. 옵티마이저와 활성값 등을 고려하면 3,0005,000장까지도 넘어갈 수 있겠죠. 그렇게 되면 1,600장만 놓고 봐도 수십억 원, 3,0005,000장이면 수백억 원이라는 어마어마한 비용이 필요합니다. 물론 실제론 이런 방식으로 단순히 x10만 하면 안 된다는 걸 다들 알지만, 그래도 모델이 수십~수백 배 커질 때 요구되는 GPU 자원이 얼마나 가파르게 늘어나는지 체감하기엔 충분합니다.
이쯤 들으면 “그럼 도대체 초거대 모델들은 어떻게 이걸 다 학습시키는 거야?”라는 궁금증이 드실 텐데요. 그래서 필요한 게 최적화 기법입니다. 단순히 32비트 정밀도로 모든 파라미터를 “한 장의 GPU = 24GB VRAM”에 쑤셔넣으려고 하면 게임이 안 됩니다. 그래서 수많은 대규모 모델 연구진들이 찾고, 개발하고, 적용하는 여러 기법들이 있죠. 개인적으로는 이 부분이 정말 흥미롭습니다. 모델 한두 개로 끝나는 문제가 아니고, 앞으로도 인공지능이 발전하면서 이러한 최적화 기법들은 계속 중요해질 거니까요.
우선 가장 많이 알려진 것이 Mixed Precision Training입니다. FP16(반정밀도), BF16(Bfloat16) 등 16비트 연산을 적용해 파라미터 메모리를 줄이고 연산 속도도 높이는 방법이죠. 다만 FP16은 오버플로·언더플로 문제가 있으니 보통 Loss Scaling 같은 기법을 추가 적용합니다. BF16은 표현 범위가 FP32만큼이나 넓어서 훨씬 편하게 쓰는 편이고요. 최신 GPU(A100, H100, RTX 40 시리즈 등)는 이런 16비트 연산을 하드웨어 차원에서 잘 지원하니, 파라미터를 절반 이하로 뚝 줄이면서 속도를 크게 높일 수 있습니다. 제가 볼 땐 “초거대 모델 = BF16”이 거의 정석처럼 굳어질 것 같아요.
그다음으로 Activation Checkpointing(Gradient Checkpointing)이라는 방식도 있습니다. 이는 순전파(forward) 과정에서 모든 중간 활성값을 저장하지 않고, 중요한 지점만 남겨둔 채 역전파(backward) 때 다시 순전파를 ‘재계산’해 나가는 방법이에요. 메모리를 아낄 수 있는 대신 재계산 부담이 있기 때문에, 속도 vs 메모리 사이의 트레이드오프를 절묘하게 조절해야 하죠. 이걸 잘 쓰면 확실히 메모리 사용량이 줄어들어서, “GPU 장수를 더 늘려야 해!”라는 고민을 어느 정도 덜 수 있습니다.
그리고 **모델 병렬화(Model Parallelism)**도 빼놓을 수 없습니다. 흔히 텐서 병렬(Tensor Parallel)과 파이프라인 병렬(Pipeline Parallel)이 대표적이죠. 텐서 병렬은 예를 들어 큰 행렬 곱 연산을 여러 GPU에 나눠서 동시에 수행하게 만듭니다. Megatron-LM이 이러한 텐서 병렬화를 잘 구현한 예인데, 내부 구조를 살펴보면 정말 기막힐 정도로 영리하게 병렬화하는 모습을 볼 수 있어요. 파이프라인 병렬은 모델의 레이어를 쭉 나눠서, 일종의 ‘컨베이어 벨트’처럼 순차적으로 미니배치를 흘려보내면서 여러 GPU를 동시에 활용하는 방식입니다. 실제 초거대 모델 학습에서는 텐서 병렬과 파이프라인 병렬을 섞은 하이브리드 병렬을 써서 더 큰 효율을 내곤 합니다.
또 하나 강조하고 싶은 건 Optimizer Sharding이에요. ZeRO(Zero Redundancy Optimizer) 같은 아이디어인데, 옵티마이저 상태(모멘트 정보 등)를 모든 GPU가 중복해서 들고 있지 말고, 각각 일부씩 나눠서 보관하자는 것입니다. 파라미터나 그라디언트, 옵티마이저 상태들이 특정 노드에 몰려서 메모리를 잡아먹지 않도록 분산하는 거죠. 이런 방식으로 Adam 같은 최적화 알고리즘을 사용해도 훨씬 적은 메모리로 대규모 학습이 가능해집니다. DeepSpeed에서 제공하는 ZeRO-2, ZeRO-3, ZeRO-Infinity 등은 여기서 더 나아가 CPU나 NVMe SSD로 파라미터와 옵티마이저 상태를 일부 오프로딩(Offloading)하는 기능도 지원합니다. 물론 스토리지 I/O가 느려질수록 학습 속도가 떨어지니까, 높은 대역폭의 네트워크나 스토리지가 필수이긴 합니다만, “그래도 훈련이 돌아가는 것”이 중요한 상황에선 충분히 고려해볼 만하죠.
결국 이렇게 Mixed Precision, Activation Checkpointing, Model Parallelism, Optimizer Sharding, Offloading 등 다양한 최적화 기법을 총동원해야만, “1조 파라미터? 10조 파라미터?” 같은 초거대 모델을 실제로 학습시킬 수 있습니다. 단순히 돈만 퍼부어 GPU를 왕창 사도 되겠지만(물론 그것도 쉽지 않습니다), 최적화에 신경 쓰지 않으면 사용 가능한 GPU 메모리를 비효율적으로 허비하게 됩니다. 즉, 돈과 시간을 아끼고 모델도 더 크게 키우려면, 최적화 기법은 사실상 선택이 아니라 필수라고 봐야 합니다.
요즘은 PyTorch FSDP(Fully Sharded Data Parallel)나 Megatron-LM, DeepSpeed 같은 프레임워크들이 이런 기능들을 잘 정리해놓았어요. 예전에는 연구자가 직접 구현해야 했지만, 이제는 비교적 편하게 가져다 쓸 수 있죠. 다만, 실제로 적용해보면 매뉴얼과 삽질이 여전히 필요합니다. 예를 들어 어느 정도 배치 크기에 어떤 병렬화 전략을 섞어야 메모리가 최소화되는지, 또 속도 손해는 어느 정도인지 따져보면서 실험하는 과정이 필수거든요. 하지만 그 자체가 연구와 엔지니어링의 묘미라고 생각합니다.
정리하자면, 1조 파라미터를 32비트로 학습하려면 이론적으로 RTX 3090이 160~170장, 옵티마이저와 활성값 등 실제 훈련 과정을 고려하면 300~500장이 들어가고, 그 가격만 해도 대략 10억~12억 원 정도가 됩니다. 파라미터가 10조 개로 늘면 그 수치가 몇 배, 몇십 배 단위로 뛰어버리죠. 그래서 초거대 모델을 현실적으로 학습시키려면, 앞서 언급한 여러 최적화 기법들을 적극적으로 공부하고 사용해야 합니다. 그렇지 않으면 GPU가 부족하거나 비용이 감당이 안 되는 상황에 부딪힐 수밖에 없어요. 저 역시 이런 최적화 기법들을 더 깊이 있게 파고들고 있는데, 파보면 팔수록 엄청난 노하우와 시행착오가 축적되어 있더군요.
앞으로도 모델 크기는 더욱더 커져갈 텐데, 우리가 추구하는 건 단순히 “GPU 왕창 사고 그 안에 파라미터 다 집어넣는 것”이 아니라, “한정된 자원을 가지고 어떻게 최대 성능을 낼 것인가”가 아닐까 싶습니다. 그리고 그러기 위해서는 위에서 소개한 Mixed Precision, Activation Checkpointing, Model Parallelism, Optimizer Sharding 등을 잘 이해하고 적재적소에 쓸 줄 아는 역량이 필수겠죠. 여러분도 이 기회에 한번 공부해보시면 어떨까 싶습니다. 저는 개인적으로 이런 것들이 인공지능 엔지니어링의 재미라고 생각하고 있어요.
이상으로 1조10조 파라미터급 모델의 GPU 요구량과 그 비용, 그리고 효율적 훈련을 위한 최적화 기법들에 대한 제 생각을 정리해 보았습니다. 초거대 모델을 구현하고 싶은 분들께 조금이라도 도움이 되었길 바랍니다. 아무리 “초거대”라고 해도, 결국 잘만 쪼개고 나누고 최적화하면 우리 손으로도 다뤄볼 수 있게 되는 시대가 머지않았다고 믿습니다. 물론 당장 수억수십억 원 예산이 필요한 건 여전하겠지만요. 그래도 우리가 꿈꾸는 미래가 점점 현실에 가까워지고 있다는 사실은 틀림없다고 생각합니다.
감사합니다! 앞으로도 초거대 모델 관련 정보를 계속 파고들면서, 유용한 인사이트들을 나눠보도록 하겠습니다.
답글 남기기