본문으로 건너뛰기
Stanford Online조회 13

CS336 언어 모델링 기초: 리소스 회계 및 효율성

LLM 학습에 필요한 연산량(FLOPs)과 메모리 요구사항을 수식으로 산정하고, 하드웨어 효율성을 극대화하기 위한 시스템적 최적화 기법을 다룹니다.

챕터별 상세

00:00

강의 개요 및 리소스 회계의 중요성

강의는 고정된 자원(컴퓨팅, 메모리) 내에서 최적의 모델을 학습시키기 위한 '리소스 회계(Resource Accounting)'의 필요성을 강조하며 시작한다. 학습 효율성을 극대화하기 위해서는 먼저 특정 계산에 소요되는 자원의 특성을 이해해야 한다. 발표자는 70B 파라미터 모델을 15T 토큰으로 학습시킬 때 필요한 시간이나 특정 하드웨어에서 학습 가능한 최대 모델 크기를 계산하는 실제적인 질문들을 던지며 정량적 분석의 중요성을 일깨운다.
04:45

텐서 기초와 메모리 저장 방식

딥러닝의 기본 단위인 텐서가 메모리에 어떻게 저장되는지 상세히 다룬다. 모든 파라미터, 그래디언트, 옵티마이저 상태 등은 텐서 형태로 저장되며, 데이터 타입에 따라 메모리 점유량이 결정된다. 표준인 Float32는 4바이트를 차지하지만, 딥러닝에서는 정밀도보다 연산 속도와 메모리 절약이 중요하므로 Float16이나 BFloat16(2바이트) 사용이 권장된다.

Float32는 부호 1비트, 지수 8비트, 가수 23비트로 구성되어 정밀도가 높지만 메모리 소모가 큽니다.

09:55

BFloat16과 수치적 안정성

Float16의 좁은 동적 범위 문제를 해결하기 위해 구글이 개발한 BFloat16의 구조를 분석한다. BFloat16은 Float32와 동일한 8비트 지수부를 가져 동적 범위는 유지하되 가수부를 줄여 2바이트로 압축한 형태이다. 이를 통해 학습 시 발생하는 언더플로우나 오버플로우 문제를 완화하면서도 메모리 사용량을 절반으로 줄일 수 있다. 최근에는 NVIDIA의 H100 등에서 지원하는 FP8이나 FP4 같은 더 낮은 정밀도의 데이터 타입도 연구되고 있다.

동적 범위(Dynamic Range)가 넓으면 아주 작은 값부터 아주 큰 값까지 표현 가능하여 학습 안정성이 높아집니다.

11:50

혼합 정밀도 학습(Mixed Precision Training)

메모리 효율과 수치 안정성을 동시에 잡기 위해 파라미터와 그래디언트는 BFloat16으로, 옵티마이저 상태는 Float32로 유지하는 혼합 정밀도 기법을 설명한다. PyTorch의 AMP(Automatic Mixed Precision) 라이브러리는 연산의 안전성을 판단하여 자동으로 캐스팅을 수행한다. 행렬 곱셈(Matmul)은 저정밀도에서도 안전하지만, 지수 연산 등은 고정밀도가 필요하다는 점을 명시한다.
17:00

GPU 메모리 이동 및 관리

기본적으로 CPU 메모리에 생성되는 텐서를 GPU의 병렬 연산 능력을 활용하기 위해 GPU 메모리(VRAM)로 이동시키는 과정을 다룬다. 하드웨어 아키텍처상 CPU와 GPU 사이의 데이터 전송은 병목 구간이 될 수 있으므로 최소화해야 한다. 실제 학습 시에는 텐서가 어느 장치에 위치하는지 명확히 관리하는 것이 성능 최적화의 첫걸음이다.
18:00

Einops를 활용한 직관적 텐서 조작

기존 PyTorch의 인덱스 기반 텐서 조작이 가진 가독성 문제를 해결하기 위해 Einops 라이브러리를 소개한다. 'batch seq hidden'과 같이 차원에 이름을 부여하여 선언적으로 조작함으로써 전치(Transpose)나 차원 축소 시 실수를 방지할 수 있다. 이는 특히 Transformer 아키텍처와 같이 다차원 텐서 연산이 빈번한 모델 구현에서 코드의 명확성을 획기적으로 높여준다.

Einsum(Einstein Summation) 표기법을 기반으로 하며, 차원의 의미를 텍스트로 명시하는 방식입니다.

27:20

연산량 측정 단위: FLOPs

모델의 연산 비용을 측정하는 기본 단위인 FLOP(Floating-point Operation)을 정의한다. 덧셈이나 곱셈 하나를 1 FLOP으로 간주하며, 하드웨어 성능은 초당 연산 횟수인 FLOPs(FLOP/s)로 측정한다. NVIDIA H100의 스펙 시트에 기재된 수치는 보통 희소성(Sparsity)을 가정한 수치이므로, 실제 밀집(Dense) 연산 시에는 그 절반을 기준으로 계산해야 한다는 실무적인 팁을 제공한다.

FLOP은 연산 횟수(단위), FLOPs는 연산 속도(단위/시간)를 의미합니다.

29:40

행렬 곱셈의 연산량 계산

선형 레이어의 행렬 곱셈(B×D와 D×K 행렬의 곱)에 필요한 연산량은 대략 2×B×D×K FLOP임을 유도한다. 각 원소를 계산하기 위해 D번의 곱셈과 D번의 덧셈이 필요하기 때문이다. 딥러닝 모델의 대부분은 행렬 곱셈으로 이루어져 있으므로, 다른 요소별(Element-wise) 연산은 전체 연산량 계산에서 무시할 수 있는 수준임을 확인한다.
python
z = einsum(x, y, "batch seq1 hidden, batch seq2 hidden -> batch seq1 seq2")

Einops 라이브러리를 사용하여 복잡한 텐서 차원 조작과 행렬 곱셈을 직관적으로 수행하는 예시

42:30

연산 밀도(Arithmetic Intensity) 분석

하드웨어 성능을 결정짓는 핵심 개념인 연산 밀도를 도입한다. 이는 메모리 이동량(Byte) 대비 연산량(FLOP)의 비율이다. ReLU와 같은 단순 연산은 데이터 이동량에 비해 연산량이 적어 'Memory-bound' 상태가 되며, 대규모 행렬 곱셈은 연산량이 압도적으로 많아 'Compute-bound' 상태가 된다. 하드웨어의 최대 성능을 끌어내기 위해서는 연산 밀도가 높은 작업을 수행해야 한다.

Roofline 모델은 연산 밀도에 따른 프로세서의 실제 성능 한계를 시각화한 그래프입니다.

61:10

모델 연산 활용도(MFU)의 이해

MFU(Model FLOPs Utilization)는 하드웨어의 이론적 최대 성능 대비 실제 학습에 사용된 유효 연산의 비율이다. 실제 환경에서는 데이터 전송, 커널 실행 오버헤드 등으로 인해 100% 도달이 불가능하며, 보통 0.5(50%) 정도면 우수한 성능으로 간주한다. MFU가 낮다면 연산 밀도가 낮거나 시스템 병목이 발생하고 있음을 의미하므로 최적화가 필요하다.
63:50

그래디언트 계산의 연산량(6ND 공식)

역전파(Backpropagation) 시 그래디언트 계산에 필요한 연산량을 분석한다. 순전파(Forward pass)에 필요한 연산량을 f라고 할 때, 역전파는 가중치에 대한 그래디언트와 입력에 대한 그래디언트 두 가지를 계산해야 하므로 대략 2f의 연산량이 소요된다. 따라서 전체 학습 한 스텝(순전파+역전파)은 순전파의 3배인 6×(파라미터 수)×(토큰 수) FLOP으로 근사할 수 있다.

이 공식은 Transformer 모델의 학습 시간을 예측하는 가장 표준적인 방법입니다.

64:50

옵티마이저 상태와 메모리 오버헤드

Adam 옵티마이저를 사용할 때 발생하는 막대한 메모리 오버헤드를 설명한다. Adam은 각 파라미터마다 1차 모멘트와 2차 모멘트를 저장해야 하며, 수치 안정성을 위해 이를 Float32로 유지한다. 결과적으로 파라미터 자체보다 옵티마이저 상태가 훨씬 더 많은 메모리를 차지하게 되어, 모델 크기를 제한하는 주요 원인이 된다.

Adam 옵티마이저는 파라미터당 추가로 8바이트(4+4)의 메모리를 소모합니다.

72:10

그래디언트 누적(Gradient Accumulation)

메모리 한계로 인해 큰 배치 사이즈를 사용할 수 없을 때 사용하는 그래디언트 누적 기법을 소개한다. 작은 마이크로 배치(Micro-batch)로 나누어 순차적으로 그래디언트를 계산하고 이를 합산한 뒤, 일정 주기에만 파라미터를 업데이트한다. 이를 통해 실제 하드웨어 메모리보다 훨씬 큰 유효 배치 사이즈를 구현하여 학습 안정성을 높일 수 있다.
74:50

활성화 체크포인팅(Activation Checkpointing)

역전파를 위해 순전파 시의 모든 활성화 값을 저장하는 대신, 일부만 저장하고 나머지는 역전파 시점에 다시 계산하는 기법이다. 이는 연산량(FLOPs)을 약 33% 정도 증가시키지만, 메모리 사용량을 획기적으로 줄여 더 큰 모델이나 긴 문맥 길이를 다룰 수 있게 해준다. 메모리 부족(OOM) 문제를 해결하는 강력한 트레이드오프 수단이다.

메모리 사용량은 층 수(L)에 비례하던 것에서 루트 L(√L) 수준으로 줄어듭니다.

77:10

강의 요약 및 결론

강의는 모든 딥러닝 연산이 결국 텐서 조작임을 재확인하며 마무리된다. 6ND 공식을 통한 연산량 예측, 연산 밀도 분석을 통한 병목 진단, 그리고 메모리 최적화 기법들은 대규모 언어 모델 학습의 핵심 도구이다. 다음 강의에서는 이러한 기초를 바탕으로 구체적인 모델 아키텍처를 다룰 것임을 예고한다.
python
def forward(self, x):
    for layer in self.layers:
        x = torch.utils.checkpoint.checkpoint(layer, x)
    return x

PyTorch의 checkpoint 기능을 사용하여 메모리 효율적인 순전파를 구현하는 예시

용어 해설

부동소수점 연산 수(FLOPs)
컴퓨터가 수행한 총 연산량을 나타내는 지표로, 모델의 크기와 학습 데이터 토큰 수에 비례하여 계산됩니다. 모델의 학습 비용과 필요한 하드웨어 자원을 산정하는 핵심 기준이 됩니다.
모델 연산 활용도(MFU)
하드웨어가 이론적으로 제공하는 최대 연산 성능 대비 실제 모델 학습에 유효하게 사용된 연산의 비율입니다. 데이터 이동 병목이나 통신 오버헤드로 인해 보통 0.5 내외의 값을 가집니다.
연산 밀도(Arithmetic Intensity)
메모리에서 읽어온 데이터 1바이트당 수행하는 연산의 횟수입니다. 이 수치가 낮으면 메모리 대역폭에 제한을 받는 Memory-bound 상태가 되고, 높으면 프로세서 성능에 제한을 받는 Compute-bound 상태가 됩니다.
활성화 체크포인팅(Activation Checkpointing)
학습 시 역전파를 위해 모든 층의 활성화 값을 저장하는 대신, 일부만 저장하고 나머지는 필요할 때 다시 계산하여 메모리 사용량을 줄이는 기법입니다. 메모리와 연산 시간 사이의 트레이드오프를 활용합니다.

언급된 리소스

AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 04. 15.수집 2026. 04. 15.출처 타입 YOUTUBE

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.