fp32) 대신 16비트 부동소수점(fp16)을 함께 사용하는 기술입니다.fp32 (단정밀도): 4바이트를 사용하며, 넓은 범위의 숫자를 높은 정밀도로 표현할 수 있어 안정적이지만 메모리 요구량이 큽니다.fp16 (반정밀도): 2바이트를 사용하여 메모리 사용량을 절반으로 줄일 수 있습니다. 하지만 표현할 수 있는 숫자의 범위와 정밀도가 낮다는 명확한 한계가 있습니다.

fp16의 문제점:
fp16의 언더플로우 문제를 해결하기 위한 기법으로, 다음과 같은 단계로 진행됩니다.fp32로 된 마스터 가중치(Master Weights)의 복사본을 유지합니다.fp16으로 수행하여 속도와 메모리 이점을 얻습니다.fp16의 표현 범위를 벗어나 0이 되는 것을 방지합니다.fp32로 변환한 후, 마스터 가중치를 업데이트하고 원래의 스케일링 팩터로 다시 나누어 줍니다.

**BFloat16 (BF16)**은 기울기 스케일링의 복잡함을 해결해주는 데이터 형식입니다.fp32와 동일한 동적 범위(Dynamic Range)를 가지면서 정밀도만 낮춘 형태입니다.BF16은 언더플로우 문제 없이 fp16의 장점을 누릴 수 있게 해줍니다.


**all-reduce** 연산을 통해 모든 GPU의 기울기들을 평균 내어 동기화하고, 모든 모델이 동일한 가중치 업데이트를 수행하도록 보장합니다.fp32로 저장하므로 메모리 부담이 큽니다.


DDP의 메모리 비효율 문제를 해결하기 위해 Microsoft에서 개발한 최적화 기법입니다. 중복을 제거하여 메모리를 절약하는 것이 핵심 아이디어입니다.
ZeRO 스테이지 1: 옵티마이저 상태(Optimizer States) 샤딩
**reduce-scatter** 연산을 통해 각 GPU는 자신이 담당하는 옵티마이저 상태에 해당하는 기울기만 받아서 가중치를 업데이트합니다.**all-gather** 연산을 통해 모든 GPU에 다시 동기화됩니다.


ZeRO 스테이지 2: 기울기(Gradients) 및 옵티마이저 상태 샤딩
**reduce** 연산으로 보내고 메모리에서 해제합니다.


ZeRO 스테이지 3 (FSDP): 모델 파라미터(Model Parameters)까지 모두 샤딩**all-gather**를 통해 해당 레이어의 전체 파라미터를 모든 GPU로 불러옵니다.












PEFT 기법 중 가장 널리 사용되고 효과적인 방법 중 하나입니다. "사전 훈련된 언어 모델의 가중치 업데이트는 낮은 내재적 차원(Low Intrinsic Rank)을 가진다"는 관찰에서 출발합니다.
핵심 아이디어: 기존의 사전 훈련된 가중치()는 고정(freeze)시키고, 모델의 각 레이어에 아주 작은 크기의 새로운 학습 가능한 행렬(Adapter)을 추가하여 이 행렬들만 학습시킵니다.
수학적 원리:
장점:
- 메모리 효율성: 수백억 파라미터 모델도 수십 MB의 어댑터 가중치만 추가로 저장하면 되므로 매우 효율적입니다.
- 추론 속도: 학습이 끝난 후, 학습된 를 기존 가중치 에 더하여 하나의 행렬로 만들 수 있습니다. 따라서 추론 시에는 어떠한 추가 계산이나 지연도 발생하지 않습니다.
- 빠른 전환: 여러 태스크에 대해 각각의 작은 LoRA 어댑터만 저장해두고 필요할 때마다 교체하며 사용할 수 있습니다.






BF16을, 아니라면 fp16과 기울기 스케일링을 사용하세요.ZeRO 스테이지 2를 적용하는 것이 가장 효율적입니다.ZeRO 스테이지 3 (FSDP)를 사용해야 합니다. 그래도 메모리가 부족하다면 기울기/활성화 체크포인팅을 추가로 적용합니다.LoRA**를 적용합니다.LoRA를 시작할 때 추천하는 하이퍼파라미터 설정은 다음과 같습니다.