프로그래밍/LLM

[Day10] 한 권으로 LLM 온라인 스터디 1기 - 다중 GPU Llama3 파인튜닝

31weeks 2025. 1. 26. 17:15
728x90
반응형

3.5 다중 GPU를 활용한 Llama3.1-8B-instruct 파인 튜닝

 

3.5.1 런팟 환경 설정

  • H100XM x 41
  • Pytorch 2.2.0
  • Container Disk 400GB
  • Volume Disk 400GB

git clone https://github.com/wikibook/llm-finetuning

cd llm-finetuning/chapter3/3.5

pip install -r requirements.txt

 

 

3.5.2 Llama 3.1 학습 파라미터 설정

  • model_name : 사용할 모델 ID, 허깅페이스에 등록된 모델 이름
  • dataset_path : 학습에 사용할 데이터셋이 위치한 경로
  • max_seq_length : 모델이 처리할 수 있는 최대 시퀀스 길이 설정
  • output_dir : 학습과정에서 생성되는 학습된모델, 중간중간에 저장되는 체크포인트 파일들을 저장하는 경로  
  • report_to : 학습과정에서 발생하는 로그와 성능 지표를 기록할 플랫폼 지정
    - wandb, tensorboard, mlflow, azure_ml 등
  • learning_rate : 신경망의 가중치를 얼마나 크게 조정할지 결정하는 중요한 하이퍼파라미터
  • lr_scheduler_type : 학습 과정에서 학습률의 변화를 관리 (constant, linear, cosine, cosine_with_restarts 등)
  • num_train_epochs : 전체 데이터셋을 한 번 학습하는 주기
  • per_device_train_batch_size : 각 GPU 또는 CPU에서 한 번에 처리할 학습 데이터의 개수
  • per_device_eval_batch_size : 평가 시, 각 GPU 또는 CPU에서 처리할 데이터의 개수
  • gradient_accumulation_steps : 4 → 모델이 4번의 순전파와 역전파를 수행한 후, 한 번씩 가중치를 업데이트
    - 그레이디언트 누적 기법을 사용해 가상의 더 큰 배치 크기의 효과를 얻는 방법 
    - GPU 메모리 사용량을 줄이면서도 큰배치 크기의 효과를 얻을 수 있음 → 메모리 효율성이 높음
  • optim : 모델 학습에 사용할 최적화 알고리즘을 지정
    - adamw_torch_fused 사용 → 파이토치에서 제공하는 최적화된 AdamW 구현
  • logging_steps : 로그를 기록할 주기를 스텝 단위로 설정
  • save_strategy : 모델의 체크포인트를 저장하는 전략을 설정
    - epoch : 각 에폭이 끝날때마다 모델을 저장
    - steps : 특정 스텝마다 모델을 저장
    - no : 저장하지 않음
  • weight_decay : 과적합을 방지하고 모델의 일반화 성능을 향상시키는데 사용
  • max_grad_norm : 그레디언트 킬리핑(gradient clipping)의 임계값 지정
    - 그레디언트 킬리핑 : 학습 과정에서 그레이디언트 크기가 지나치게 커지는 것을 방지하는 기법
  • warmup_ratio : 전체 학습 스텝에서 웜업 괒엉의 비율 지정
    - 웜업 : 학습 초기에 학습률을 매우 작은 값에서 시작해 점진적으로 목표 학습률까지 증가시키는 방법
      → 학습 초기의 급격한 파라미터 변화를 방지, 불안정성을 줄여서 안정적으로 학습을 시작할 수 있게 함
  • bf16 : bfloat16(Brain Floating Point) 정밀도를 사용하도록 활성화
  • tf32 : NVIDIA의 TensorFloat-32(TF32) 형식을 활성화
  • gradient_checkpointing : 대규모 신경망 모델 학습 시, 메모리 사용을 최적화하는 고급 기술 
  • fsdp : Fully Sharded Data Parallel, 각 GPU가 전체 모델의 일부만을 저장하고 필요할 때 다른 GPU와 통신해서 데이터를 주고받는 방식으로 작동
    - full_shard : 모든 파라미터를 분산
    - auto_wrap : 자동으로 모델을 FSDP로 래핑
    - full_shard auto_wrap : Fully Sharded Data Parallel(FSDP)을 활성화서 모델을 여러 GPU에 분산시켜 메모리 효율을 높이는기술 적용
  • fsdp_config : 
    - backward_prefetch : 'backward_pre' 설정은 FSDP에서 역전파 과정을 최적화 하는 중요한 기능, 역전파 계산이 시작하기 직전에 필요한모델 파라미터를미리 가져오는 전략을 활성화  
    - forward_prefetch : false로 설정하면 순전파 과정 중, 추가적인 데이터 프리페치(미리 가져오기)를 비활성화함
    - use_orig_prams : false로 설정하면 원본 파라미터 대신 분할된 파라미터를 직접 사용해서 메모리 효율성을 극대화

 

 

3.5.3 데이터셋 준비

https://huggingface.co/datasets/beomi/KoAlpaca-v1.1a

 

beomi/KoAlpaca-v1.1a · Datasets at Hugging Face

주사를 맞는 경우 주로 대퇴부(엉덩이)에 맞는 것이 일반적이지만, 혈관 주사가 있을 경우 혈관을 제대로 못찍거나 자극으로 인해 멍이 생길 수 있습니다. 일단 멍을 만들어낸 원인이 되는 부분

huggingface.co

 

 

3.5.4 Llama 3.1 모델 파라미터  설정

  • dataset_path : 데이터셋 파일의 경로, 기본값 None → 코드 유연성과 재사용성 높이기 위함
  • model_name : 사용할 모델의 이름, 기본값 None → 코드 유연성과 재사용성 높이기 위함
  • max_seq_length : 모델이 처리할 수 있는 입력 텍스트의 최대 길이

 

 

3.5.5 Llama 3.1 모델 학습 코드 살펴보기

  • training_args.main_process_first() : 분산 학습 환경에서 특정 작업을 조율하는데 사용되는 기능
    - main_process_first() : 여러 프로세스 중, 메인 프로세스를 지정하여 메인 프로세스가 특정작업(이 경우레는 샘플 로깅)을 먼저 수행하고 메인 프로세스가 작업을 마칠 때까지 다른프로세스들을 대기시킨다. 작업이 끝나면 모든 프로세스가 다시 동기화되어 다음 작업을 계속함
  • full_fine_tuning_config,yaml : 주어진 모델 이름의 모델을 불러오고 필요한 파라미터들을 설정
  • gradient_checkpointing : 모델의 중간 활성화 값들을 모두 저장하지 않고 필요할 때마다 다시 계산해서 메모리 사용량을 크게 줄일 수 있음. True로 설정돼 있을 때만 이 기능이 활성화 됨
    - model.gradient_checkpointing_enable() : 실제로 모델에이 기능을 적용하는 역할을 한 
  • SFTTrainer : SFT는 Supervised Fine-Tuning(지도 학습 방식의 파인튜닝), 대규모 언어 모델을 특정 작업이나 도메인에 맞게 파인튜닝하는 데 사용되는 도구
  • trainer.train() : 실제 학습을 시작하는 부분
  • training_args.resume_from_checkpoint : 이전에 중단된 학습을 이어서 진행할 수 있음
  • set_seed() : 시드 설정으로 재현성 보장
  •  training_function() : 실제 학습 시작

 

 

3.5.6 Llama 3.1 모델 학습 실행

  • 터미널 학습 명령
    - ACCELERATE_USE_FSDP=1 : 허깅페이스의 Accelerate 라이브러리에서 FSDP(Fully Sharded Data Parallel)를 사용하겠다는 명령어(FSDP는 대규모 모델을 여러 GPU에 효율적으로 분산시키는 기술)
    - FSDP_CPU_RAM_EFFICIENT_LOADING=1 : FSDP를 사용할 때 CPU RAM을 효율적으로 사용해서 모델을 로딩하도록 설정
    - torchrun --nproc_per_node=4 : torchrun은 Pytorch의 분산 학습을 위한 실행 도구. 각 노드(컴퓨터)에서 4개의 프로세스를 실행하라는 의미 → 일반적으로 4개의GPU를 사용한다는 뜻  
    - ./1_train_full_fine_tuning.py : 실행할 파이썬 스크립트의 경로
    - --config full_fine_tuning_config.yaml : 파인튜닝에 사용할 설정 파일(.yaml)을 지정

 

Llama 3.1 모델 학습 실행

 

 

 

3.5.7 Wandb 설정과 사용

  • train/loss : 학습 과정에서 손실 함수 값. 감소하는 추세 → 성능이 향상
  • train/grad_norm : 값이 안정적으로 유지되면 학습이 안정적으로 진행되는
  • train/global_step : 전체 학습 과정 동안의 스텝 수 
  • train/epoch : 에폭 수. 에폭은 전체 데이터셋을 한 번 학습하는 주기
  • train/learning_rate : 학습률

 

Wandb 설정과 사용

 

 

 

3.5.8 학습한 Llama 3.1 모델 테스트

학습한 Llama 3.1 모델 테스트 1

 

학습한 Llama 3.1 모델 테스트 2

 

 

 

3.5.9 생성된 텍스트 데이터 OpenAI로 평가하기

생성된 텍스트 데이터 OpenAI로 평가하기

 

 

 

3.5.10 채점 점수 구하기

채점 점수 구하기

 

728x90
반응형