본문 바로가기

이 게시물은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다

스타트업 투자/데이터 + 테크

패스트캠퍼스 환급챌린지 38일차 : 파인 튜닝 강의 후기

by Sungwook Choi 2025. 5. 8.

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

*_1. 학습 인증샷 4장 이상 포함
*_① 오늘자 날짜, 공부 시작 시각 포함 사진 1장

② 오늘자 날짜, 공부 종료 시각 포함 사진 1장

③ 1개 클립 수강 인증 사진 (강의장 목록 캡쳐, 강의 내용이 담긴 수강화면이 보이지 않도록) 1장

④ 학습 인증샷 1장 이상 (ex. 필기 촬영, 작업물, 등)

2. 학습 후기 700자 이상 (공백 제외)

  • 라마팩토리 설치
  • !git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory !pip install e ".[torch,metrics]" !pip3 install deepspeed datasets vllm scikit-learn import torch try: assert torch.cuda.is_available() is True except AssertionError: print("Please set up a GPU before using LLaMA Factory: https://medium.com/mlearning-ai/training-yolov4-on-google-colab-316f8fff99c6")
  • 데이터셋 로드
  • import json import os from datasets import load_dataset from sklearn.model_selection import train_test_split import IPython.display as display

데이터셋 로드

print("데이터셋 다운로드 중...")
dataset = load_dataset("iamjoon/finance_news_summarizer")
train_data = dataset["train"]

샘플 데이터 확인

print("\n첫 번째 샘플:")
display.display(train_data[0])


- 학습데이터와 테스트데이터 분리
~~~코드3
# Dataset을 리스트로 변환
train_data_list = list(train_data)
# 학습/테스트 데이터 분할 (8:2)
train_split, test_split = train_test_split(train_data_list, test_size=0.2, random_state=42)
  • 라마팩토리 특유의 형식으로 변환
    • 'system' : 시스템 프롬프트
    • 'instruction' : 유저 프롬프트
    • 'output' : 레이블
# LLaMA-Factory 형식으로 변환하는 함수
def convert_to_llama_factory_format(data_split):
    converted = []
    for item in data_split:
        if isinstance(item["assistant"], dict):
            assistant_text = json.dumps(item["assistant"], ensure_ascii=False)
        else:
            assistant_text = item["assistant"]

        preprocessed_item = {
            "instruction": item["user_prompt"],
            "input": "",
            "output": assistant_text,
            "system": item["system_prompt"]
        }
        converted.append(preprocessed_item)
    return converted

# 변환
print("\n학습/테스트 데이터셋 변환 중...")
llama_train = convert_to_llama_factory_format(train_split)
llama_test = convert_to_llama_factory_format(test_split)

# 샘플 데이터 확인
print("\n첫 번째 샘플:")
display.display(llama_train[0])

# output 부분은 반드시 문자열이어야 합니다.
type(llama_train[0]['output'])
  • 라마팩토리에서는 data 디렉토리 안에 json파일로 파일을 저장해야 함
    # 저장
    print("\nJSON 파일로 저장 중...")
    os.makedirs("data", exist_ok=True)
    

with open("data/finance_news_summarizer_train.json", "w", encoding="utf-8") as f:
json.dump(llama_train, f, ensure_ascii=False, indent=2)

with open("data/finance_news_summarizer_test.json", "w", encoding="utf-8") as f:
json.dump(llama_test, f, ensure_ascii=False, indent=2)

print("완료되었습니다.")



- 라마팩토리에서는 data 디렉토리 내에 데이터를 저장하고나서 반드시 dataset_info.json에 데이터를 등록해야 함
~~~코드6
# 데이터셋 정보 파일 업데이트
dataset_info_path = "data/dataset_info.json"

if os.path.exists(dataset_info_path):
    with open(dataset_info_path, "r", encoding="utf-8") as f:
        dataset_info = json.load(f)
else:
    dataset_info = {}

# finance_news_summarizer 데이터셋 정보 추가
dataset_info["finance_news_summarizer"] = {
    "file_name": "finance_news_summarizer_train.json",
    "columns": {
        "prompt": "instruction", # 유저 프롬프트
        "query": "input", # 실제 사용되지는 않지만 형식적으로 넣어준다.
        "response": "output", # 어시스턴트 답변
        "system": "system" # 시스템 프롬프트
    }
}

# 업데이트된 데이터셋 정보 저장
with open(dataset_info_path, "w", encoding="utf-8") as f:
    json.dump(dataset_info, f, ensure_ascii=False, indent=2)

print(f"데이터셋 정보가 {dataset_info_path}에 업데이트되었습니다.")
  • 학습 파라미터 설정
    • 라마팩토리에서는 학습 파라미터를 설정하고 설정값을 json파일로 저장해아 함
    • # 학습 구성 생성 args = dict( stage="sft", # 지도 학습 미세 조정 수행 do_train=True, model_name_or_path="NCSOFT/Llama-VARCO-8B-Instruct", # 한글 사용 가능한 라마 모델 dataset="finance_news_summarizer", # 변환한 데이터셋 사용 template="llama3", # llama3 프롬프트 템플릿 사용 finetuning_type="lora", # 메모리 절약을 위해 LoRA 어댑터 사용 lora_target="all", # 모든 선형 레이어에 LoRA 어댑터 연결 output_dir="llama3_finance_lora", # LoRA 어댑터 저장 경로 per_device_train_batch_size=2, # 마이크로 배치 크기 gradient_accumulation_steps=4, # 그래디언트 누적 단계 lr_scheduler_type="cosine", # 코사인 학습률 스케줄러 사용 learning_rate=1e-5, # 학습률 num_train_epochs=3.0, # 학습 에포크 수 bf16=True, # bfloat16 혼합 정밀도 학습 사용 report_to="none", # wandb 로깅 비활성화 # 멀티 GPU 및 DeepSpeed 설정 deepspeed="examples/deepspeed/ds_z3_config.json", # DeepSpeed ZeRO-3 설정 파일 경로 ddp_find_unused_parameters=False, # 멀티 GPU 학습을 위한 설정 ) # 학습 구성 저장 json.dump(args, open("/workspace/LLaMA-Factory/train_finance.json", "w", encoding="utf-8"), indent=2)

print("학습 구성이 저장되었습니다. 이제 학습을 시작합니다.")

~

url : https://abit.ly/lisbva

댓글