데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      실험으로 알아보는 LLM 파인튜닝 최적화 가이드 Part 1.

      alankim 25.02.03
      14,346 15 7
      DEVOTEE 요약
      본 블로그는 파인튜닝 최적화를 다루며, 학습 파라미터 설정 및 최적화 요소를 설명합니다. 파인튜닝 작업에서 중요한 배치 크기, 스텝, 에폭의 차이와 각각의 영향을 설명하고, 배치 크기와 시퀀스 길이 조정 등 학습의 효율성을 높이기 위한 방법들을 제시합니다. 또한, 메모리 최적화 기법인 Gradient Accumulation과 Gradient Checkpoint를 통해 메모리 제약을 극복하고 더 큰 배치 크기의 효과를 낼 수 있도록 안내합니다.
      DEVOTEE 추천 블로그

      들어가며

      오랜만에 새로운 포스팅을 시작합니다. 2025년 새해 복 많이 받으세요!


      이번 글에서는 파인튜닝 최적화를 주제로, 학습에 관련된 파라메터 설정과 최적화 요소에 대한 내용을 다루려고 합니다.

      사실 학습 파라미터 설정에 관한 문서는 많지만, 설정값에 따라 어떤 결과가 나오는지 구체적으로 다룬 사례는 드문 편입니다.

      그래서 현업에서는 여러 번의 실험과 시행 착오를 거쳐 최적의 값을 찾아내는 경우가 많죠.

      LLM 파인튜닝처럼 비용이 많이 드는 작업에서는 이러한 시행착오의 비용이 큰 부담으로 작용할 수 밖에 없습니다.

      이번 포스팅에서는 다양한 설정이 결과에 미치는 영향을 직접 실험을 통해 살펴보며, 이를 통해 파인튜닝 최적화에 대한 이해를 좀 더 해보고자 합니다.


      내용이 많아서 두 편으로 나눠 정리했습니다. 첫번째 글에서는 다음과 같은 주제를 다루고 있습니다.

      • Epoch, Batch, Step의 차이와 이해

      • Batch 크기에 따른 영향

      • Sequence length 조정

      • 메모리 최적화 기법


      사전 안내 사항

      • 이번 포스팅에서 사용된 코드는 아래 GitHub 링크에서 다운로드할 수 있습니다.

      • 모델 학습에는 HuggingFace Transformers 라이브러리를 활용했으며, 관련 Training Arguments에 대한 내용을 본문의 각 세션에 표기 했습니다.

      • 실험 환경은 별도 언급이 없는 경우, 다음과 같은 환경에서 진행되었습니다.

        • Base 모델: Gemma-2b-it, Llama-3.2-3B-Instruct, Qwen2.5-3B-Instruct

        • 파인튜닝 방식: LoRA

        • Dataset : beomi/KoAlpaca-v1.1a (21,200 샘플)

        • GPU: NVIDIA A100 80G (단일)


      1. Batch, Step, Epoch

      Batch, Step 그리고 Epoch은 LLM 학습 과정에서 데이터 처리를 정의 하는 단위로, 학습 효율성과 성능에 직접적인 영향을 미칩니다.

      또한 학습 과정을 효과적으로 모니터링하려면 어떤 지표를 중심으로 관찰 할지 명확히 이해 하는 것도 중요합니다.

      이 섹션에서는 이러한 기본 개념들을 다시 한번 정리해보겠습니다.

      HF Training Arguments

      per_device_train_batch_size=8,
      per_device_eval_batch_size=8,
      logging_steps=2,
      evaluation_strategy='steps',
      eval_steps=100,
      save_steps=1000,
      num_train_epochs=3,


      그림 1. Batch, Step, Epoch


      1.1 Batch

      Batch 크기는 한 번의 학습 단계(Training Step)에서 사용하는 데이터 샘플의 개수를 의미합니다.

      그림1에서 데이터셋에서 학습에 사용하기 위해 선택된 데이터 묶음이 Batch를 나타냅니다.

      예를 들어, Batch 크기가 10이라면, 한 번의 Training Step에서 모델은 데이터셋의 10개 샘플을 사용해 모델의 파라미터를 업데이트합니다.

      Batch 크기는 학습의 속도와 메모리 사용량에 큰 영향을 미칩니다. 특히 크기에 따라 학습 과정의 특성이 달라지는데요,

      Batch 크기가 학습 성능에 미치는 구체적인 영향은 다음 섹션에서 자세히 알아보겠습니다.


      1.2 Step

      흔히 Step이라고 줄여서 부르는 Training Step은 모델의 파라미터가 한 번 업데이트되는 과정을 말합니다.

      그림1에서 보면 Batch 만큼의 학습 데이터셋을 GPU에 로드해서 학습을 하고 모델의 파라미터를 업데이트하는 과정입니다.

      • 예를 들어, 데이터셋의 크기가 10,000개이고 Batch 크기가 10이라면

      Training Step 수 = 전체 샘플 수 / Batch 크기 = 10,000 / 10 = 1,000

      따라서, 데이터셋 전체를 한 번 학습하기 위해 1,000번의 Training Step이 필요합니다.


      1.3 Epoch

      Epoch은 학습 데이터셋의 모든 샘플을 한 번씩 모델에 보여주는 과정을 의미합니다.

      쉽게 말해, 데이터셋 전체를 한 번 학습한 상태를 1 Epoch 이라 합니다.


      1.4 LLM 학습에서 Training Step vs Epoch

      LLM 학습에서는 일반적으로 Training Step을 기준으로 학습 지표를 설정합니다.

      이는 LLM 학습의 특성과 효율적인 학습 관리를 고려 했을 때 Step 단위의 관리가 더 적합하기 때문입니다.

      1.4.1 Step을 기준으로 해야 하는 이유

      • 모델 파라미터 업데이트의 기본 단위

        • LLM 학습은 모델의 파라미터를 업데이트하는 과정을 중심으로 이루어지며, 이 과정은 Training Step 단위로 실행됩니다.

      • 학습률 조정 및 스케줄링

        • 학습률 조정(Warm-up 및 Decay)과 같은 주요 메커니즘은 일반적으로 Step 단위를 기준으로 설정합니다.

        • Gradient Accumulation 또한 Step 단위로 관리되며, 이를 통해 학습의 안정성과 효율성을 높일 수 있습니다.

      • Early Stopping 및 모델 모니터링

        • 목표 성능에 도달하거나 더 이상의 개선이 없을 경우 학습을 중단하는 Early Stopping은 보통 Training Step을 기준으로 작동합니다.

      1.4.2 Epoch을 기준으로 하는 경우

      • 소규모 데이터셋 기반의 파인튜닝

        • 소규모 데이터셋을 사용하는 경우, 모델이 데이터셋 전체를 몇 번 학습했는지 (Epoch 수)가 성능 개선의 중요한 지표가 됩니다.

      • 과적합(Overfitting) 방지

        • Epoch 단위로 학습 곡선을 관찰함으로써 과적합 징후(예: Validation Loss의 급격한 증가)를 사전에 파악할 수 있습니다.


      2. Batch

      딥러닝 모델, 특히 LLM의 학습 과정에서 배치 크기(Batch Size)는 가장 중요한 하이퍼파라미터 중 하나입니다.

      이전 섹션에서 살펴본 것 처럼 배치 크기는 한 번의 학습 단계(Training Step)에서 처리되는 데이터 샘플의 수를 의미하며, 모델의 학습과 성능에 직접적인 영향을 미치는 요소입니다.

      HF Training Arguments
      per_device_train_batch_size=8,
      per_device_eval_batch_size=8,


      2.1 작은 배치 vs 큰 배치

      일반적으로 배치 크기에 따라 학습 과정에서 다음과 같은 특성을 가집니다.

      작은 배치 크기
      • 학습 과정이 불안정해질 수 있지만, 일반화 성능은 더 좋아지는 경향이 있습니다.

      • 메모리 사용량이 적어 제한된 자원으로도 학습 가능하지만, 전체 학습 시간이 길어질 수 있습니다.

      큰 배치 크기
      • 학습이 안정적이지만, 세부적인 특징을 놓쳐 과적합(Overfitting)의 위험이 있습니다.

      • 더 많은 메모리가 필요하지만 학습 시간이 더 단축 시킬 수 있습니다.

      과연 그러한지, 실제 배치 크기가 학습에 미치는 영향을 알아보기 위해 gemma-2-2b-it 모델에 대해 배치 크기를 1 부터 16까지 늘려가며 학습을 진행보았습니다.


      그림 2. 배치 크기에 따른 학습


      결과를 한번 살펴볼까요?

      그림2의 그래프는 Train Loss와 Eval Loss를 나타내며, 배치 크기에 따라 색상(파랑(1), 녹색(2), 노링(4), 주황(8), 빨강(16))으로 구분됩니다

      • 1개나 2개와 같은 작은 배치의 경우 Loss 곡선의 변동성이 두드러집니다.

        이는 학습이 불안정 하다는 의미이며, 배치 크기가 작을 수록 학습에 사용되는 데이터 샘플 수가 줄어들어서 개별 데이터의 샘플링 노이즈 에 더 크게 영향을 받기 때문입니다.

      • 반면에 8개나 16개등의 큰 배치에서는 상대적으로 변동성이 작아지는데 이는 많은 데이터를 한번에 처리하므로 샘플 노이즈의 영향이 평균화 되어 학습 곡선이 더 안정적이 되기 때문입니다.

      이번에는 학습시간과 자원 사용을 확인해보죠.

      Batch

      Runtime(min)

      GPU Mem Max Allocated (%)

      GPU Avg Util (%)

      1

      299

      63

      64

      2

      197

      68

      64

      4

      101

      76

      69

      8

      61

      87

      81

      16

      49

      98

      98

      [표1]

      표1에서 볼 수 있듯이, 배치 크기가 증가할수록 학습 속도가 빨라지고 GPU 활용도가 높아지는 경향을 보입니다.

      특히 배치가 작아질 수 록 GPU 자원을 효율적으로 사용하지 못하는 것을 확인할 수 있습니다.


      2.2 배치 크기 설정 시 키 포인트

      실험 결과를 통해 배치 크기에 따른 학습 안정성과 시간에 대해 확인을 해봤는데, 그와 더불어 배치 사이즈를 정할 때 아래와 같은 요소들을 고려하는 것이 좋습니다.

      ✔ 모델과 자원 제약
      • 사용 중인 Base 모델의 크기와 GPU 메모리를 확인해야 합니다.

      • 모델이 커서 GPU 메모리에 올라간 후 여유 공간이 많지 않다면 배치를 늘리기 위해 추가 GPU를 통한 분산 학습을 고려해야 합니다.

      ✔ 학습 안정성 vs. 일반화 성능
      • 메모리가 허용한다면 큰 배치 크기를 사용하는 것이 효율적입니다.

      • 다만, 큰 배치를 통해 과적합의 징후가 나타난 다면 배치를 줄여 일반화 성능을 높이는 것도 방법입니다.

      ✔ 메모리 제약 해결
      • GPU 메모리가 부족해 배치 크기를 늘리기 어렵다면, 이후 섹션에서 설명될 메모리 최적화 인 Gradient Accumulation이나 Gradient Checkpointing을 적용해봅니다.


      과적합 (Overfitting) 이란

      과적합은 모델이 학습 데이터에는 매우 잘 맞지만, 새로운 데이터에서는 성능이 떨어지는 현상을 말합니다.

      예를 들어, 파인튜닝 학습을 수행하다 보면 학습 데이터의 Loss는 계속 낮아지지만, 평가 데이터의 Loss가 오히려 증가하는 경우가 발생하는 경우가 있는데,

      이는 모델이 학습 데이터에 지나치게 최적화된 나머지, 학습 중 보지 못한 데이터 즉 평가 데이터에 대한 일반화 능력이 떨어졌음을 보여줍니다.

      과적합이 발생하는 원인은 다양하지만, 큰 배치 크기와 지나친 반복 학습도 주요한 요인 중 하나입니다.

      특히, 학습 데이터셋이 작은 경우 큰 배치를 사용하면 데이터의 세부적인 특징을 놓칠 가능성이 있습니다. 따라서 배치 크기를 늘릴 때는 학습할 데이터가 충분한지를 먼저 고려해야 합니다.

      흥미로운 점은, 도메인 특화 모델을 만들고자 할 때는 일부러 과적합을 유도하기도 한다는 것입니다.

      이런 경우에는 특정 도메인 데이터에 최적화된 모델을 만들기 위해, 모델이 도메인 데이터의 특성을 더욱 세밀하게 학습하도록 유도하는 방식으로 접근합니다.


      3. Sequence Length

      LLM은 입력으로 받을 수 있는 최대 토큰 길이(시퀀스 길이)가 기본적으로 정해져 있습니다.

      일반적으로 512 에서 8,192 사이지만, 최근에는 상대적 위치 인코딩(Relative Positional Encoding) 기법을 활용 통해 128,000개 이상의 토큰도 입력 받을 수 있게 되었습니다.

      HF Training Arguments
      max_seq_length=1024


      3.1 시퀀스 길이와 배치 크기의 관계

      시퀀스 길이는 배치 처리에 직접적인 영향을 미칩니다. 예를 들어, 최대 시퀀스 길이가 8,192 토큰인 모델에서 배치 크기를 8로 설정했다고 가정해 봅시다.

      • 시퀀스 길이를 512로 설정하면 한 번의 입력에 512 * 8 = 4,096 토큰이 들어갑니다.

      • 시퀀스 길이를 8192로 설정하면 한번의 입력에 8192 * 8 = 65,536 토큰이 입력으로 처리됩니다.

      이처럼 시퀀스 길이가 증가하면 모델이 처리해야 할 토큰 수가 크게 늘어나며, 이에 따라 GPU 메모리 사용량도 급격히 증가하게 됩니다.

      당연히 우리가 가진 GPU가 이 입력을 받아 만큼 충분한 메모리 용량을 가지고 있지 않다면 OOM이 나면서 학습이 중단되겠죠.


      3.2 작업 유형에 따른 시퀀스 길이

      LLM 작업의 유형과 데이터셋 특성에 따라 적합한 시퀀스 길이가 달라질 수 있습니다.

      일반적인 파인튜닝 작업에서는 많은 경우 4,096 이하의 시퀀스 길이로 처리 가능합니다.

      이는 대화형 AI, 텍스트 요약, 질문 응답(Q/A)과 같은 언어 생성 작업이 한정된 맥락 내에서 동작하기 때문에 긴 시퀀스가 크게 필요하지 않은 경우가 많기 때문입니다.

      반면, RAG(Retrieval-Augmented Generation)와 같은 작업에서는 긴 문서나 복잡한 텍스트를 처리해야 하므로 8,192 이상의 시퀀스 길이를 고려하는 것이 유리합니다.

      RAG 작업은 검색된 정보와 이를 기반으로 한 생성 결과를 연결하는 과정에서 긴 문맥을 유지해야 검색된 정보의 정확성과 응답 품질을 높일 수 있습니다.


      3.3 LLM이 입력데이터를 처리하는 방식

      LLM은 한 번에 처리되는 배치(batch) 내 모든 샘플의 길이가 동일해야만 병렬 연산이 가능하므로, 입력 데이터를 맞추기 위해 패딩(padding)과 잘림(truncation)이라는 두 가지 기법을 활용합니다.

      아래 그림3은 이러한 과정을 시각적으로 나타낸 예시입니다.


      그림 3. Padding & Truncation

      3.3.1 패딩(Padding)

      패딩은 짧은 샘플의 길이를 배치 내 가장 긴 샘플에 맞추기 위해 특수 토큰(PAD)을 추가하는 과정입니다.

      예를 들어, 그림3에서 각 샘플의 시퀀스 길이를 10로 고정하기 위해, 길이가 부족한 샘플의 끝에 [pad] 토큰이 추가되었습니다.

      패딩의 위치는 그림에서 보이듯 오른쪽에 배치했지만, 모델 설정에 따라 시퀀스의 시작(왼쪽), 끝(오른쪽), 또는 양쪽에 적용될 수 있습니다.

      이 과정을 통해 모든 샘플은 동일한 시퀀스 길이를 가지며, LLM은 이를 한 번에 입력받아 병렬 처리할 수 있게 됩니다.

      3.3.2 잘림(Truncation)

      잘림은 모델의 시퀀스 길이 제한을 초과하는 샘플에서 초과된 부분을 제거하는 과정입니다.

      예를 들어, 그림3의 세 번째 샘플에서는 시퀀스 길이를 10로 제한하기 위해 초과된 토큰이 잘려나갔습니다.

      잘림은 주로 시퀀스의 끝(오른쪽)에 적용되지만, 작업의 특성에 따라 시퀀스의 시작(왼쪽) 잘림이 이루어질 수도 있습니다.

      그런데 그림의 예시와 같이 잘림 과정에서 답변의 주요 정보인 "24 시간" 이라는 중요한 내용이 제거되면, 모델 성능에 부정적인 영향을 줄 수 있습니다.

      따라서, 데이터셋을 직접 보고 적절한 시퀀스 길이와 배치 크기를 선택하는 것이 중요 합니다.


      3.4 시퀀스 길이 설정 시 키 포인트

      ✔ 데이터셋 분포 분석
      • 데이터셋에 긴 문장이 많으면 시퀀스 길이를 늘리고, 짧은 문장이 대부분이라면 줄이는 것이 효율적입니다.

      • 예: 데이터셋의 95%가 1,024 토큰 이하라면, 시퀀스 길이를 1,024로 설정해 리소스를 최적화할 수 있습니다.

      ✔ 잘림된 데이터 확인
      • 잘림으로 인해 손실되는 데이터의 내용을 확인해야 합니다.

      • 만약 잘린 부분이 학습에 중요한 정보를 포함하고 있다면, 해당 내용이 학습에 반영될 수 있도록 시퀀스 길이를 늘리는 것이 좋습니다.

      ✔ 시퀀스와 배치 크기의 균형
      • 긴 시퀀스는 모델 성능을 향상시킬 수 있지만, GPU 메모리 사용량이 늘어나 배치 크기를 줄여야 할 수 있습니다.

      • 따라서 데이터셋의 특성을 보고 시퀀스 길이를 적절히 조절하고 배치를 늘려야 효과적인 학습이 될 수 있습니다.


      Padding은 왼쪽? 오른쪽?

      모델과 작업에 따라 패딩을 오른쪽이나 왼쪽에 두는 것은 모델의 특성과 효율성 때문입니다.

      GPT와 같은 Autoregressive 모델은 이전 입력을 바탕으로 다음 출력을 생성합니다. 즉, 입력 시퀀스가 의미 있는 정보로 구성되어야 모델이 다음 토큰도 적절히 생성할 가능성이 높습니다.

      PAD 토큰은 데이터의 빈자리를 메우기 위한 의미 없는 토큰입니다. 하지만 모델이 PAD 토큰을 입력으로 처리할 경우, 유효한 컨텍스트의 흐름이 깨질 수 있습니다.

      그래서 학습과 추론 시 PAD 토큰은 Attention Mask를 통해 무시되도록 합니다.

      PAD를 왼쪽에 두는 경우는 유효한 입력이 시퀀스의 오른쪽에 정렬되므로, 모델이 자연스럽게 의미 있는 데이터를 기반으로 다음 토큰을 생성할 수 있습니다.

      반면, PAD를 오른쪽에 배치하면 여러개의 입력 배치를 정렬하기 용이하며, GPU 에서 병렬 연산을 수행하는 데 더 효율적입니다.

      특히 Instruction SFT에서는 데이터셋이 Instruction과 Output의 쌍으로 구성되고, Output의 끝에 EOS 토큰을 추가하여 학습합니다.

      이 경우, 오른쪽 패딩을 사용해도 EOS 토큰이 명시적으로 포함되기 때문에 모델이 적절한 위치에서 출력을 종료하려고 하며, PAD 토큰이 결과에 영향을 주지 않게 됩니다.


      4.메모리 최적화 기법

      앞에서 살펴본 배치 크기나 시퀀스 길이를 조정하는 것은 모두 한정된 메모리 때문입니다.

      이러한 메모리 제약을 완화할 수 있는 Gradient Accumulation과 Gradient Checkpoint 기법에 대해 살펴보겠습니다.


      4.1 Gradient Accumulation

      Gradient Accumulation은 GPU 메모리 제한으로 인해 한 번에 큰 배치를 처리할 수 없는 상황에서 사용되는 기술입니다.

      이 기법은 작은 배치(mini-batch)를 처리할 때마다 그래디언트를 누적(accumulate)하고, 지정된 횟수에 도달하면 한번에 파라미터를 업데이트합니다.

      이를 통해 메모리 제약을 극복하면서도 큰 배치 크기와 유사한 효과를 낼 수 있습니다.

      Training Arguments
      per_device_train_batch_size=8,
      gradient_accumulation_steps=4,

      4.1.1 Gradient Accumulation의 원리

      LLM 모델의 학습 과정을 다시 한번 상기해보죠.

      1. Forward Pass: 배치를 모델에 입력하여 손실(loss)을 계산

      2. Backward Pass: 손실에 대한 그래디언트를 계산

      3. Optimizer Update: 계산된 그래디언트를 바탕으로 모델 파라미터를 업데이트


      그림 4. Gradient Accumulation


      하지만 Gradient Accumulation을 적용하면 이 과정이 조금 달라집니다. 그림4을 참조하면

      1. 배치를 여러 개의 작은 mini-batch(그림4에서 배치 1,2,3)로 나누어 각각 Forward와 Backward Pass를 수행합니다.

      2. 각 mini-batch에서 계산된 그래디언트(그림4에서 Gradient 1, 2, 3)를 누적(accumulate)합니다.

      3. 지정된 Accumulation Step 횟수만큼 그래디언트를 누적한 뒤, Optimizer가 한 번에 파라미터를 업데이트합니다.


      4.1.2 Gradient Accumulation의 장점

      4.1.2.1 GPU 메모리 제한 극복

      큰 배치를 한 번에 처리하기 위해선 많은 메모리가 필요합니다.

      하지만 Gradient Accumulation을 사용하면 메모리 사용량을 줄이면서 큰 배치 크기의 효과를 얻을 수 있습니다.

      예를 들어, 메모리 제약으로 인해 한 번에 배치 크기 1 이상을 처리할 수 없는 경우에도 Gradient Accumulation 스텝을 8로 설정하면,

      실제로 배치 크기 8로 학습한 것과 동일한 결과를 얻을 수 있습니다.

      • Batch Size 4 * Gradient Accumulation 2 = Effective Batch Size 8

      • Batch Size 1 * Gradient Accumulation 8 = Effective Batch Size 8


      4.1.2.2 학습 안정성과 속도

      배치 크기의 실험에서 확인하였듯이 배치 크기가 클 수록 학습이 안정적이고 수렴 속도가 빨라집니다. Gradient Accumulation은 이를 작은 배치에서도 가능하게 만들어줍니다.

      아래 실험은 아래는 다양한 배치 크기와 Accumulation Step을 조합한 실험 결과입니다


      그림 5. Gradient Accumulation Step에 따른 학습


      결과를 보면 Batch 크기만 조절해서 실험 했던 그림1의 결과와 다르게 Batch 크기가 작을 때도 안정적으로 학습이 진행됨을 확인 할 수 있습니다.

      하지만 Gradient Accumulation을 사용하더라도 작은 배치 크기로 학습할 경우, 물리적 배치 크기가 작아 Forward와 Backward Pass를 여러 번 수행해야 하므로 학습 시간이 증가할 수 있습니다.

      또한, GPU의 자원이 충분히 활용되지 못해 비효율적인 학습이 될 수 있습니다. 아래 실험 결과는 이러한 한계를 잘 보여줍니다.

      Batch

      GA

      Runtime (min)

      GPU Mem Max Allocated (%)

      GPU Avg Util (%)

      2

      16

      93

      56

      36

      4

      8

      51

      43

      65

      8

      4

      39

      84

      95

      16

      2

      42

      99

      98

      [표2]


      작은 배치 크기와 높은 Gradient Accumulation 값을 조합하면 학습 시간이 늘어나고, GPU 사용률이 낮아지는 문제가 발생합니다.


      4.1.3 Gradient Accumulation 키 포인트

      ✔ Batch 크기와 Gradient Accumulation Step 설정
      • 목표 배치 크기를 설정하고 메모리 한계에 따라 mini batch를 정하고 gradient accumulation step을 조합하는 형식입니다.

      • 이를테면 배치 크기를 32로 하려고 하고, 메모리에 물리적으로 mini batch가 8개만 들어 갈 수 있는 상황이라면

        gradient accumulation step을 4로 지정해서 전체 배치 크기를 32로 맞춥니다.

      ✔ 적절한 Accumulation Step
      • 이론적으로 동일한 Effective Batch 크기를 유지하면 결과가 같아야 하지만, 실제로는 Gradient Accumulation이 큰 경우 학습 손실이 더 높게 나타나는 경우가 있습니다.

        이는 계산 과정에서 발생하는 정규화 문제나 수치적 불안정성 때문입니다

      • 따라서 너무 높은 Gradient Accumulation Step를 사용하지 않도록 합니다.(정확한 답은 없지만 관례적으로 32 이하를 많이 사용하는 것 같습니다.)

      ✔ 분산 학습 시 오버헤드
      • Gradient Accumulation은 분산 학습 환경에서 추가적인 오버헤드를 발생시킬 수 있습니다.

      • 여러 GPU에서 계산된 그래디언트를 누적하고 동기화하는 과정에서 성능 저하가 발생할 수 있으므로, 효율적인 분산 학습을 위해 적절하게 조정이 필요 합니다.


      4.2 Gradient Checkpointing

      Gradient Checkpointing은 딥러닝 모델 학습 시 필요한 메모리 사용량을 줄이기 위한 기법으로, 특히 Transformer와 같이 레이어가 많고 파라미터가 방대한 모델을 학습할 때 유용합니다.

      이 기법은 순전파(forward pass) 과정에 생성되는 activation 값을 모두 메모리에 저장하지 말고 일부만 저장해서 필요할 때 역전파(backward pass) 과정에서 다시 계산하는 방식을 사용합니다.

      따라서 일부 activation 값에 대한 저장 공간을 줄임으로써 메모리 절감 효과를 가져옵니다.

      Training Arguments
      gradient_checkpointing=True

      4.2.1 Gradient Checkpointing의 원리

      4.2.1.1 연산 후 메모리 제거

      순전파 단계에서 모든 activation 값을 저장한 뒤, 역전파 과정이 시작되고 끝나는 대로 메모리에서 해제합니다.

      역전파 연산이 끝나면 메모리를 해제한다는 간단한 방법이지만, 메모리 절감 효과는 크지 않습니다.

      역전파가 시작되기전까지는 여전히 순전파 단계에서 생성된 activation을 모두 저장하고 있어야 하기 때문이죠

      그림6

      그림6


      4.2.1.2 Forward를 다시 계산

      모든 activation 값을 저장하는 대신, 맨 마지막 activation 값만 저장하고 역전파 시 필요할 때마다 순전파를 다시 수행해 필요한 값을 계산합니다.

      이 방법은 메모리를 크게 절약하지만, 역전파 단계 마다 이전의 순전파 단계를 다시 수행해야 하므로 연산량 증가와 학습 시간 증가로 역시 효율적인 방법이 아닙니다.


      그림7

      그림7


      4.2.1.3 효율적인 절충안 Gradient Checkpointing

      Gradient Checkpointing은 위 두 방법의 단점을 보완하기 위해 고안되었습니다. 핵심 아이디어는 일정 간격으로 activation 값을 저장하는 것입니다.

      그림7 과 같이 중간 중간에 체크포인트를 지정하고, 해당 시점의 activation 값만 저장합니다.

      그리고 역전파 과정에서 필요한 activation 값을 체크포인트 이후의 단계부터 다시 계산합니다.

      이를 통해 메모리 사용량을 줄이는 동시에, 불필요한 재계산을 줄여서 연산 효율을 개선할 수 있습니다.

      그림8

      그림8


      아래는 Gradient Checkpoint를 적용했을 때와 하지 않았을때의 메모리 사용량과 학습 시간 비교 결과입니다.

      GC

      Memory(GB)

      Time(sec)

      Ture

      58.37

      2329

      False

      70.13

      1804

      [표3]


      실험 결과에서 확인할 수 있듯이, Gradient Checkpointing 활성화 시 메모리 사용량이 70.13GB에서 58.37GB로 감소하여 약 12GB의 메모리 절감 효과가 있었습니다.

      반면, 학습 시간은 1804초에서 2328초로 증가하여 약 29%의 시간적 오버헤드가 발생했습니다.

      비록 학습 시간이 늘어나는 단점이 있지만, 추가로 확보된 메모리를 활용할 수 있다는 점에서 효과적인 방법입니다.


      4.2.2 Gradient Checkpointing 키 포인트

      ✔ 메모리 절감 효과와 활용성
      • Gradient Checkpointing은 추가로 확보된 메모리를 활용해 배치 크기나 시퀀스 길이를 늘릴 수 있어 매우 효과적입니다.

      • 특히 자원 제약이 있는 환경에서 파인튜닝을 진행할때는 적용을 적극 고려해야 합니다.

      ✔ 적합성 평가
      • Gradient Checkpointing은 Layer가 깊은 모델, 즉 대형 모델일 수록 더 효과적입니다.

      • 따라서 학습을 시작하기 전에 간단한 검증 과정을 통해 Gradient Checkpointing을 통해 얼마나 메모리를 효율적으로 사용할 수 있을지 체크합니다.

        절감효과는 적은데 연산량만 많아진다면 오히려 학습효율이 낮아 질 수도 있습니다.


      마무리

      이번 포스팅에서는 실습 코드보다는 이론적인 내용을 중심으로 정리해봤는데, 어떠셨나요?

      LLM 파인튜닝 과정에서 중요한 요소인 Batch, Step, Epoch의 차이와 배치 크기, 시퀀스 길이,

      그리고 메모리 최적화 기법 등 학습 효율과 성능에 직접적으로 영향을 미치는 부분들을 실험 결과와 함께 분석해보았습니다.

      다만, 이번에 다룬 내용은 비교적 일반화된 가이드에 가까우며, 모델 학습의 목적, 학습 환경, 데이터셋의 특성에 따라 결과가 달라질 수 있습니다.

      그래서 무엇보다 자신의 환경에 맞는 최적의 설정을 찾기 위해 직접 실험해보고 분석하는 과정이 중요합니다.


      다음 편에서는 배치 크기와 더불어 학습에 가장 큰 영향을 미치는 learning rate를 비롯해 학습 스케줄러, Optimizer 등의 주제를 다룰 예정입니다.

      다음 포스팅에서 뵙겠습니다!

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      alankim 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기