GPU 용량이 부족한 게 아닙니다… 설정이 문제죠

BBetter Stack
Computing/SoftwareAdult EducationInternet Technology

Transcript

00:00:00이것은 마이크로소프트의 오픈 소스 라이브러리인 딥스피드(DeepSpeed)입니다. 파이토치에 바로 연결해 메모리 문제를 해결해주죠.
00:00:07보통은 바로 충돌이 날 법한 모델도 GPU 한 대에 과부하 없이 올릴 수 있게 해줍니다. 대형 모델이 실패하는 건 느려서가 아닙니다.
00:00:14옵티마이저 상태, 그래디언트, 파라미터가 VRAM을 가득 채우기 때문인데요. 딥스피드의 비결은 훈련 상태를 분산하는 ZeRO 기술입니다.
00:00:23모든 곳에 같은 데이터를 중복해서 저장하지 않는 방식이죠. 계속해서 영상이 올라올 예정이니 구독 잊지 마세요.
00:00:30이제 바로 시작해서 실행해 봅시다. 저는 맥북 M4 Pro를 사용 중이라 구글 코랩에서 실행할 예정입니다.
00:00:40엔비디아 GPU가 없어서 조금 까다롭긴 하지만, 코랩을 활용하면 충분히 가능합니다.
00:00:46먼저 GPU 상태를 빠르게 체크한 다음, 필요한 패키지들을 설치하겠습니다.
00:00:51파이토치, 허깅페이스, 딥스피드 등을 설치하고, DS 리포트를 실행해 CUDA와 컴파일러 설정이 제대로 됐는지 확인합니다.
00:00:59매끄러운 실행을 위해 몇 가지 설치를 더 진행해줍니다.
00:01:02그다음 딥스피드 설정을 위해 JSON 파일을 만들 겁니다. 이 설정 파일이 핵심입니다.
00:01:09우선 ZeRO 단계 2부터 시작하죠. 옵티마이저 상태와 그래디언트를 여러 GPU에 분산하여 메모리 사용량을 획기적으로 줄입니다.
00:01:14이때 모델 파라미터는 복제된 상태로 유지됩니다. 너무 복잡하게 생각하지 마세요, 저도 이것 때문에 꽤나 고생했거든요.
00:01:22공식 문서를 참고해 하나씩 차근차근 바꾸시고, 이것저것 무작정 추가하고 싶은 충동은 참으셔야 합니다.
00:01:28설정값은 허깅페이스나 딥스피드 공식 문서에서 모두 찾아볼 수 있습니다.
00:01:34저 역시 파이썬 스크립트 대부분을 이 문서들에서 가져왔습니다.
00:01:37다만 제 시스템, 특히 맥 환경에서 더 잘 돌아가도록 몇 가지 수정을 거쳤습니다.
00:01:42만약 이 단계에서 막힌다면 거기서 멈추세요. 대부분의 딥스피드 문제는 모델이 아니라 CUDA 버전 불일치 때문이니까요.
00:01:48이제 전부 실행해서 제대로 돌아가는지 확인해 보겠습니다.
00:01:51빠른 실행을 위해 이번 예제에서는 용량이 작은 데이터셋을 가져와 사용하겠습니다.
00:01:58몇 분 뒤 결과를 보면, 진행 단계와 최대 GPU 메모리 사용량을 확인할 수 있습니다.
00:02:03보시는 것처럼 이번 실행에서 훈련 손실(loss) 값이 크게 변하거나 떨어지지는 않았습니다.
00:02:08하지만 최적화를 거치거나 더 큰 데이터셋을 사용하면 손실 값을 개선할 수 있죠.
00:02:13사람들이 흔히 오해하는 부분이 있는데, 그러다가 결국 메모리 부족 오류를 겪곤 합니다.
00:02:16ZeRO에는 여러 단계가 있으며, 각 단계는 단 하나의 질문에 답합니다. “단일 GPU에 무엇을 저장하지 않아도 되는가?”
00:02:241단계는 옵티마이저 상태를 분산하고, 2단계는 거기에 그래디언트까지 분산합니다.
00:02:30이로써 메모리를 몰래 갉아먹는 요소들을 더 깊게 제거하게 되죠. 그리고 ZeRO 3단계가 있습니다.
00:02:36이게 가장 강력합니다. 옵티마이저 상태, 그래디언트, 그리고 파라미터까지 모두 분산합니다.
00:02:40메모리 절약 효과가 가장 크지만, 이것만으로 부족할 때도 있습니다.
00:02:45그래도 모델이 안 올라간다면, ZeRO-Infinity를 통해 CPU나 NVMe까지 데이터를 오프로드할 수 있습니다.
00:02:50속도를 희생해 규모를 얻는 셈이죠. 하지만 가끔은 모델을 일단 돌릴 수 있게 만드는 것 자체가 승리입니다.
00:02:56메모리만이 유일한 고민이 아니라고 생각하신다면 맞습니다. 딥스피드는 데이터, 파이프라인, 텐서 병렬 처리를 포함한 3D 병렬 처리를 지원합니다.
00:03:04또한 전문가 혼합(MoE) 모델을 기본으로 지원하죠.
00:03:09덕분에 희소(sparse) 모델도 연산 자원을 과하게 잡아먹지 않습니다.
00:03:12선택지가 정말 다양해졌죠. 딥스피드는 허깅페이스 및 Accelerate와 잘 통합됩니다.
00:03:19따라서 모든 것을 밑바닥부터 직접 만들 필요가 없습니다.
00:03:21기본적으로 필요한 것만 가져다 쓰고 나머지는 무시하면 됩니다. 벤치마크는 설정에 따라 천차만별입니다.
00:03:27그러니 너무 높은 수치들을 맹신하지는 마세요. 저도 몇 번 테스트를 해봤습니다.
00:03:30말씀드렸듯 M4 Pro를 사용 중이라, 이 기본 모델만으로는 더 이상의 최적화가 어려웠습니다.
00:03:36확언하긴 어렵지만, 다른 딥스피드 프로젝트들은 처리량 면에서 큰 이득을 보여주었습니다.
00:03:41특히 메모리가 한계였던 상황에서 윈도우나 리눅스 사용자라면 엄청난 효과를 볼 수 있을 겁니다.
00:03:46솔직히 가장 좋은 방법은 일단 해보는 겁니다. 공식 설정값을 사용하는 것부터 시작하세요.
00:03:51저도 그렇게 시작해 맥에 맞춰 조금 수정하고 CUDA 이슈를 해결했습니다.
00:03:56오프로드를 활성화한다면 CPU RAM을 잘 살피시고, 나중에 다중 GPU를 쓰게 된다면
00:04:01Accelerate가 큰 도움이 될 겁니다. 딥스피드는 한마디로 “오늘은 절대 메모리 부족 안 뜬다” 버튼과 같습니다.
00:04:07ZeRO와 오프로딩 원리만 이해하면, 한정된 하드웨어에서도 거대 모델을 실용적으로 다룰 수 있습니다.
00:04:14물론 처음에 세팅하는 과정은 분명 헷갈릴 수 있습니다.
00:04:17이 영상이 GPU 시간을 아껴주었거나 이런 개발 도구들을 좋아하신다면 구독해 주세요. 다음 영상에서 뵙겠습니다.

Key Takeaway

딥스피드의 ZeRO 기술과 오프로딩 설정을 활용하면 한정된 GPU 자원에서도 메모리 부족 오류 없이 대형 언어 모델을 효율적으로 구동할 수 있습니다.

Highlights

마이크로소프트의 오픈 소스 라이브러리인 딥스피드(DeepSpeed)의 핵심 기능과 역할

GPU 메모리 부족 문제를 해결하는 ZeRO(Zero Redundancy Optimizer) 기술의 단계별 원리

Mac 환경(M4 Pro)에서의 한계를 극복하기 위해 구글 코랩과 CUDA를 활용하는 방법

JSON 설정 파일을 통한 ZeRO 2단계 및 3단계 최적화 적용 가이드

메모리 부족 시 CPU 및 NVMe로 데이터를 넘기는 ZeRO-Infinity 오프로딩 기법

허깅페이스 및 Accelerate와의 통합을 통한 효율적인 대형 모델 훈련 전략

Timeline

딥스피드 소개 및 메모리 부족의 원인

딥스피드는 파이토치와 연결하여 모델 훈련 시 발생하는 메모리 문제를 해결해주는 마이크로소프트의 라이브러리입니다. 대형 모델 훈련이 실패하는 주된 이유는 모델이 느려서가 아니라 옵티마이저 상태, 그래디언트, 파라미터가 VRAM을 가득 채우기 때문입니다. 이를 해결하기 위해 딥스피드는 ZeRO(Zero Redundancy Optimizer) 기술을 사용하여 데이터를 중복 저장하지 않고 분산합니다. 영상은 구독 권장과 함께 딥스피드가 단일 GPU에서도 과부하 없이 모델을 올릴 수 있게 해준다는 점을 강조합니다. 사용자는 이 기술을 통해 하드웨어의 한계를 극복할 수 있는 실마리를 얻게 됩니다.

실습 환경 준비 및 필수 패키지 설치

발표자는 현재 맥북 M4 Pro를 사용 중이지만, 엔비디아 GPU 환경이 필요한 딥스피드 실행을 위해 구글 코랩을 활용하기로 합니다. 가장 먼저 GPU 상태를 체크한 뒤 파이토치, 허깅페이스, 딥스피드와 같은 필수 패키지들을 설치하는 과정을 거칩니다. 설치 후에는 DS 리포트를 실행하여 CUDA와 컴파일러 설정이 정상적으로 이루어졌는지 꼼꼼하게 확인해야 합니다. 맥 환경에서의 제약 사항을 우회하며 실습을 준비하는 모습은 사용자들에게 유연한 개발 환경 구축의 중요성을 보여줍니다. 매끄러운 실행을 위해 추가적인 컴파일 관련 설치 작업도 함께 진행됩니다.

핵심 설정 파일 작성과 ZeRO 2단계 적용

딥스피드 운영의 핵심인 JSON 설정 파일을 만드는 과정이 소개되며, 여기서는 ZeRO 2단계 설정을 먼저 다룹니다. ZeRO 2단계는 옵티마이저 상태와 그래디언트를 여러 GPU에 분산하여 메모리 사용량을 획기적으로 줄여주는 방식입니다. 발표자는 공식 문서를 참고하여 설정을 하나씩 수정할 것을 권장하며 무분별한 옵션 추가는 지양하라고 조언합니다. 특히 대부분의 오류는 모델 자체보다 CUDA 버전 불일치에서 발생하므로 이 지점에서 막힌다면 환경 설정을 다시 점검해야 합니다. 허깅페이스 문서를 참고하여 자신의 시스템에 맞춰 코드를 수정하는 노하우도 함께 공유됩니다.

모델 실행 결과 분석 및 ZeRO 단계별 차이점

실제 훈련 스크립트를 실행하여 GPU 메모리 사용량과 손실(loss) 값을 확인하는 과정이 진행됩니다. 이번 예제는 빠른 확인을 위해 작은 데이터셋을 사용했으므로 손실 값이 크게 떨어지지는 않았지만, 최적화 가능성을 충분히 보여줍니다. 이어지는 설명에서는 ZeRO의 1, 2, 3단계를 비교하며 각 단계가 어떤 데이터를 분산하여 메모리를 절약하는지 구체적으로 설명합니다. 특히 가장 강력한 ZeRO 3단계는 파라미터까지 분산하여 메모리 절약 효과를 극대화한다는 점이 핵심입니다. "단일 GPU에 무엇을 저장하지 않아도 되는가?"라는 질문이 ZeRO 설계의 본질임을 강조합니다.

고급 최적화 기술 및 데이터 병렬 처리

GPU 메모리가 극도로 부족할 때는 ZeRO-Infinity를 통해 CPU RAM이나 NVMe 저장소로 데이터를 오프로드하는 극단적인 해결책을 제시합니다. 이는 속도를 일부 희생하더라도 대규모 모델을 일단 구동할 수 있게 만드는 전략으로, 모델 실행 자체가 승리라는 관점을 보여줍니다. 또한 딥스피드는 3D 병렬 처리와 전문가 혼합(MoE) 모델을 지원하여 복잡한 연산 자원을 효율적으로 관리할 수 있게 돕습니다. 허깅페이스나 Accelerate와의 높은 통합성 덕분에 사용자는 밑바닥부터 모든 것을 구현할 필요 없이 필요한 기능만 가져다 쓸 수 있습니다. 마지막으로 입문자들에게 공식 설정값부터 시작해 점진적으로 환경을 맞춰나갈 것을 제안하며 영상이 마무리됩니다.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video