한 권으로 끝내는 실전 LLM 파인튜닝 - 강다솔 지음/위키북스 |
03. 전체 파인튜닝
단일 GPU를 활용한 Gemma-2B-it 파인튜닝
이번 6일 차 스터디에서는 지난 5일 차 스터디에서 공부했던 Gemma 모델을 파인튜닝하는 실습을 진행했다. 먼저 런팟(https://www.runpod.io/)에서 엔비디아 H100 PCIe GPU를 선택해서 deploy 했다.
다른 부분은 기본 값 그대로 놔두고 Container Disk, Volume Disk 값만 200GB로 상향 조정했다. 그리고 주피터 랩 환경에 접속해서 터미널을 열고, 아래 저장소로부터 출판사에서 제공하는 실습 코드를 내려받았다.
https://github.com/wikibook/llm-finetuning
다음으로 chapter3/3.4 폴더로 이동한 뒤 pip install -r requirements.txt 명령을 실행해서 필요한 라이브러리들을 설치했다. 이제 허깅 페이스에 로그인하고, 아래 Gemma 모델 페이지로 이동해서 라이선스에 동의하는 작업까지 완료했다.
https://huggingface.co/google/gemma-2b-it
다시 노트북으로 돌아와서 코드 작업을 진행했다. 다음은 허깅페이스에 로그인하는 코드다.
from huggingface_hub import login
# Hugging Face API 토큰 입력
api_token = "Your_Huggingface_Token"
login(api_token)
이 뒤로는 주요 코드만 확인해 보겠다. 다음은 모델과 토크나이저를 불러오는 코드다.
model = AutoModelForCausalLM.from_pretrained(model_name,
use_cache=False,
device_map="auto",
torch_dtype=torch.bfloat16,
low_cpu_mem_usage=True,
attn_implementation="eager",
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
위 코드와 같이 device_map을 auto로 설정하면 모델이 실행되는 환경에 따라 어떤 장치(CPU or GPU)에서 실행될지 자동으로 결정된다. 책에는 Attn_implementation 값을 flash_attention_2로 설정한 것처럼 설명돼 있는데 저자 분께 물어보니 gemma는 코드와 같이 'eager'로 설정하라는 답변을 받았다. 참고로 flash_attention_2로 변경하면 최적화된 어텐션 알고리즘이 적용돼서 빠른 속도와 적은 메모리 사용량을 보장한다고 한다. 이제 데이터셋을 준비하는 단계로 넘어간다.
jaehy12라는 사용자가 올린 news3 데이터셋으로 실습을 진행한다. datasets 라이브러리를 사용해서 다운로드하고 확인 차 데이터를 하나만 뿌려봤다. original 항목에 뉴스 원문이 있고, summary 항목에 한두 문장으로 요약한 내용이 들어 있는 구조다. 이제 Gemma 모델의 '키워드 추출 능력'과 '문장 요약 능력'을 확인해 보겠다.
input_text = """다음 텍스트를 한국어로 간단히 요약해주세요:\n부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다.
유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다.
11일 부산진경찰서는 교통사고처리특례법(교통사고처리법)상 업무상 과실치사 혐의로 지난 3일 A(59)씨를 검찰에 불구속 송치했다고 밝혔다.
A씨는 교통사고처리법상 12대 중과실에 해당되는 '중앙선 침범'으로 역주행 교통사고를 일으킨 혐의를 받는다.
경찰에 따르면 스포츠유틸리티차량(SUV) 운전자 A씨는 5월 19일 밤 11시 50분쯤 부산진구 가야고가교 밑 도로에서 중앙선을 넘어 역주행으로 140m를 달려
반대편 차선의 오토바이 운전자 조모(16)군을 들이받았다. 조군은 원동기장치자전거 면허를 취득한 상태였고 헬멧도 쓰고 있었지만 크게 다쳤다.
사고 당일 수술을 받았으나 얼마 후 2차 뇌출혈로 뇌사 판정이 내려졌고, 사고 발생 약 한 달 만인 지난달 16일 끝내 사망했다.
사고를 낸 A씨는 술을 마시거나 약물을 복용한 상태에서 운전하지는 않은 것으로 조사됐다.
경찰 관계자는 'A씨가 자신이 정주행을 하고 오토바이가 역주행을 한 것으로 착각했다고 진술했다'고 설명했다."""
def change_inference_chat_format(input_text):
return [
{"role": "user", "content": f"{input_text}"},
{"role": "assistant", "content": """부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다.
유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다."""},
{"role": "user", "content": "중요한 키워드 5개를 뽑아주세요."},
{"role": "assistant", "content": ""}
]
prompt = change_inference_chat_format(input_text)
inputs = tokenizer.apply_chat_template(
prompt,
tokenize=True,
add_generation_prompt=True,
return_tensors="pt"
).to(model.device)
tokenizer.apply_chat_template 기능을 사용해서 데이터를 대화 형식으로 바꿔서 모델에 입력(뒷부분 코드는 과감히 생략)하면 아래와 같이 모델이 5개의 키워드를 성공적으로 추출하는 것을 확인할 수 있다.
user
중요한 키워드 5개를 뽑아주세요.
model
model
- 부산의 한 왕복 2차선 도로에서 역주행 사고
- 배달 오토바이 운전자
- 고등학생
- 유족
- 늑장 대응
def change_inference_chat_format(input_text):
return [
{"role": "user", "content": f"{input_text}"},
{"role": "assistant", "content": "한국어 요약:\n"}
]
기사를 요약해 달라는 내용으로 프롬프트를 변경하고 다시 실행하면 아래와 같이 결과물이 잘 나온다. gemma 모델이 글을 요약하는 능력도 갖추고 있다는 것을 알 수 있다.
// 생략..
model
한국어 요약:
model
부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다. 유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다. 경찰은 교통사고처리법상 업무상 과실치사 혐의로 지난 3일 A(59)씨를 검찰에 불구속 송치했다.
책에는 키워드를 추출하고 요약하는 작업을 동시에 수행하는 부분도 나와 있는데 원하는 대로 작동하지 않고 엉뚱한 결과를 생성한다. 이 부분은 따로 적지 않는다. 8일 차 스터디에서 이 부분을 파인튜닝한다고 한다. 7일 차는 여기까지.
'개발 > AI' 카테고리의 다른 글
[Day9] LLM 스터디 1기 - 단일 GPU Gemma 파인튜닝 3 (1) | 2025.01.19 |
---|---|
[Day8] LLM 스터디 1기 - 단일 GPU Gemma 파인튜닝 2 (1) | 2025.01.18 |
[Day6] LLM 스터디 1기 - GPU 병렬화 기법 (0) | 2025.01.16 |
[Day5] LLM 스터디 1기 - GPT, Gemma, Llama3 모델 특징 비교 (1) | 2025.01.15 |
[Day4] LLM 스터디 1기 - 파인튜닝 개념 (1) | 2025.01.11 |