https://product.kyobobook.co.kr/detail/S000214934825
한 권으로 끝내는 실전 LLM 파인튜닝 | 강다솔 - 교보문고
한 권으로 끝내는 실전 LLM 파인튜닝 | 실무 현장에서 꼭 필요한 파인튜닝, PEFT, vLLM 서빙 기술을 직접 실습하면서 배워 보자!AI 기술의 최전선에서 배우는 LLM 파인튜닝의 모든 것! 이론적 토대부터
product.kyobobook.co.kr
"한 권으로 끝내는 실전 LLM 파인튜닝" 교재를 활용해 3주(주말 제외) 동안 진행 되는 온라인 스터디
단일 GPU를 활용한 Gemma-2B-it 파인튜닝
Hugging Face를 통한 Gemma 모델 준비
1. 허깅페이스(Hugging Face)란?
- Hugging Face는 자연어 처리, 이미지 생성모델, 컴퓨터 비전모델 등 다양한 도구와 라이브러리를 오픈소스로 제공하는 플랫폼이다.
- Hugging Face의 API 서비스를 사용하면 다양한 사전 훈련된 인공지능 모델을 활용할 수 있으며, 이러한 모델은 대규모 데이터셋에서 사전에 학습된 상태로 제공된다.
- API를 통해 Hugging Face에서 제공하는 미리 학습된 AI 모델을 호출하고 사용할 수 있습니다.
예를 들면, 문장 분류, 감성 분석, 기계 번역, 질문-답변 등과 같은 작업을 수행할 수 있다. - API 요청을 보내면 입력 문장이나 데이터가 해당 모델로 전달되고, 그 결과로 예측값이나 분석 결과가 반환된다. 이렇게 API를 통해 미리 학습된 AI 모델을 활용하면 별도의 학습 과정 없이도 쉽게 자연어 처리 기능을 이용할 수 있다.
2. Huggin Face 접속 및 로그인
Hugging Face – The AI community building the future.
The Home of Machine Learning Create, discover and collaborate on ML better. We provide paid Compute and Enterprise solutions. We are building the foundation of ML tooling with the community.
huggingface.co
회원가입을 한 경우 바로 사이트를 이용할 수 있지만, API키를 활용한 서비스를 이용하기 위해서는 가입시 사용하였던 이메일로 인증이 필요하다.
3. Hugging Face API Key 발급
- 메인 홈페이지 오른쪽 상단 프로필
- Settings 클릭
- Settings 화면 내 왼쪽 바에 Access Tokens 클릭
- Create token(이미 존재시 Create new token) 클릭
옵션
- Repositories : 개인 저장소 접근 권한 부여 여부
- Webhooks : 웹훅 관련 부여 여부
- Discussions & Posts : 토론 및 게시물 관련 권한 부여 여부
- Inference : 추론 API 관련 권한 부여 여부
- Collections : 컬렉션 읽기 / 쓰기 권한 부여 여부
4. Hugging Face API Key 발급, 라이브러리 및 모델 로드
4.1 Hugging Face API Key 발급
Hugging Face 계정의 API 토큰을 활용
from huggingface_hub import login
# Hugging Face API 토큰을 입력합니다.
api_token = "Your_Huggingface_Token"
login(api_token)
4.2 라이브러리 및 모델 로드
Gemma-2B-it 모델은 Google에서 제공하는 자연어 처리 모델로, 특히 요약과 키워드 추출과 같은 작업에 강점을 보인다.
- AutoModelForCausalLM : 자연어 생성에 특화된 모델
- AutoTokenizer : 텍스트 데이터를 모델이 이해할 수 있도록 변환
import torch
import wandb
from sklearn.model_selection import train_test_split
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
TrainingArguments,
pipeline,
Trainer
)
from transformers.integrations import WandbCallback
from trl import DataCollatorForCompletionOnlyLM
import evaluate
# 모델과 토크나이저 불러오기
model_name = "google/gemma-2b-it"
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)
5. Gemma 모델 기능 확인
5.1 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)
# tokenizer 초기화 및 적용
inputs = tokenizer.apply_chat_template(
prompt,
tokenize=True,
add_generation_prompt=True,
return_tensors="pt"
).to(model.device)
outputs = model.generate(
input_ids=inputs.to(model.device),
max_new_tokens=256
)
print(tokenizer.decode(
outputs[0],
skip_special_tokens=True
))
"""
user
다음 텍스트를 한국어로 간단히 요약해주세요:
부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다.
유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다.
11일 부산진경찰서는 교통사고처리특례법(교통사고처리법)상 업무상 과실치사 혐의로 지난 3일 A(59)씨를 검찰에 불구속 송치했다고 밝혔다.
A씨는 교통사고처리법상 12대 중과실에 해당되는 '중앙선 침범'으로 역주행 교통사고를 일으킨 혐의를 받는다.
경찰에 따르면 스포츠유틸리티차량(SUV) 운전자 A씨는 5월 19일 밤 11시 50분쯤 부산진구 가야고가교 밑 도로에서 중앙선을 넘어 역주행으로 140m를 달려
반대편 차선의 오토바이 운전자 조모(16)군을 들이받았다. 조군은 원동기장치자전거 면허를 취득한 상태였고 헬멧도 쓰고 있었지만 크게 다쳤다.
사고 당일 수술을 받았으나 얼마 후 2차 뇌출혈로 뇌사 판정이 내려졌고, 사고 발생 약 한 달 만인 지난달 16일 끝내 사망했다.
사고를 낸 A씨는 술을 마시거나 약물을 복용한 상태에서 운전하지는 않은 것으로 조사됐다.
경찰 관계자는 'A씨가 자신이 정주행을 하고 오토바이가 역주행을 한 것으로 착각했다고 진술했다'고 설명했다.
model
부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다.
유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다.
user
중요한 키워드 5개를 뽑아주세요.
model
model
- 부산의 한 왕복 2차선 도로에서 역주행 사고
- 배달 오토바이 운전자
- 고등학생
- 유족
- 늑장 대응
"""
- 키워드를 생성하는 능력이 있다는 것을 확인
5.2 Gemma 요약 기능 확인
긴 글을 간결하게 요약해주는 기능
# Input_text : 위 정의된 기사와 동일
def change_inference_chat_format(input_text):
return [
{"role": "user", "content": f"{input_text}"},
{"role": "assistant", "content": "한국어 요약:\n"}
]
# chat template 적용
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)
outputs = model.generate(inputs, max_new_tokens=256, use_cache=True)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
"""
user
다음 텍스트를 한국어로 간단히 요약해주세요:
부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다.
유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다.
11일 부산진경찰서는 교통사고처리특례법(교통사고처리법)상 업무상 과실치사 혐의로 지난 3일 A(59)씨를 검찰에 불구속 송치했다고 밝혔다.
A씨는 교통사고처리법상 12대 중과실에 해당되는 '중앙선 침범'으로 역주행 교통사고를 일으킨 혐의를 받는다.
경찰에 따르면 스포츠유틸리티차량(SUV) 운전자 A씨는 5월 19일 밤 11시 50분쯤 부산진구 가야고가교 밑 도로에서 중앙선을 넘어 역주행으로 140m를 달려
반대편 차선의 오토바이 운전자 조모(16)군을 들이받았다. 조군은 원동기장치자전거 면허를 취득한 상태였고 헬멧도 쓰고 있었지만 크게 다쳤다.
사고 당일 수술을 받았으나 얼마 후 2차 뇌출혈로 뇌사 판정이 내려졌고, 사고 발생 약 한 달 만인 지난달 16일 끝내 사망했다.
사고를 낸 A씨는 술을 마시거나 약물을 복용한 상태에서 운전하지는 않은 것으로 조사됐다.
경찰 관계자는 'A씨가 자신이 정주행을 하고 오토바이가 역주행을 한 것으로 착각했다고 진술했다'고 설명했다.
model
한국어 요약:
model
부산 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다. 유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다. 경찰은 교통사고처리법상 업무상 과실치사 혐의로 지난 3일 A(59)씨를 검찰에 불구속 송치했다.
"""
- 문장을 요약하는 능력이 있다는 것을 확인
5.3 파인튜닝(Fine-tuning)이 필요한 이유 (Gemma 요약 및 키워드 결과 기반 설명)
input_text = """부산의 한 왕복 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"다음 텍스트를 한국어로 간단히 요약하고, 관련된 5개의 키워드를 추출해주세요:\n{input_text}"},
{"role": "assistant", "content": ""},
]
prompt = change_inference_chat_format(input_text)
# tokenizer 초기화 및 적용t\
inputs = tokenizer.apply_chat_template(prompt, tokenize=True, add_generation_prompt=True, return_tensors="pt").to(model.device)
outputs = model.generate(inputs, max_new_tokens=256, use_cache=True)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
"""
user
다음 텍스트를 한국어로 간단히 요약 및 관련 키워드를 추출해주세요:
부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다.
유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다.
11일 부산진경찰서는 교통사고처리특례법(교통사고처리법)상 업무상 과실치사 혐의로 지난 3일 A(59)씨를 검찰에 불구속 송치했다고 밝혔다.
A씨는 교통사고처리법상 12대 중과실에 해당되는 '중앙선 침범'으로 역주행 교통사고를 일으킨 혐의를 받는다.
경찰에 따르면 스포츠유틸리티차량(SUV) 운전자 A씨는 5월 19일 밤 11시 50분쯤 부산진구 가야고가교 밑 도로에서 중앙선을 넘어 역주행으로 140m를 달려
반대편 차선의 오토바이 운전자 조모(16)군을 들이받았다. 조군은 원동기장치자전거 면허를 취득한 상태였고 헬멧도 쓰고 있었지만 크게 다쳤다.
사고 당일 수술을 받았으나 얼마 후 2차 뇌출혈로 뇌사 판정이 내려졌고, 사고 발생 약 한 달 만인 지난달 16일 끝내 사망했다.
사고를 낸 A씨는 술을 마시거나 약물을 복용한 상태에서 운전하지는 않은 것으로 조사됐다.
경찰 관계자는 'A씨가 자신이 정주행을 하고 오토바이가 역주행을 한 것으로 착각했다고 진술했다'고 설명했다.
model
model
* 부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다.
* 유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다.
* A씨는 교통사고처리법상 12대 중과실에 해당되는 '중앙선 침범'으로 역주행 교통사고를 일으킨 혐의를 받는다.
* 사고 당일 수술을 받았으나 얼마 후 2차 뇌출혈로 뇌사 판정이 내려졌고, 사고 발생 약 한 달 만인 지난달 16일 끝내 사망했다.
"""
Gemma 모델의 요약 및 키워드 추출 결과를 통해 모델의 성능과 한계를 구체적으로 살펴보도록 하자.
모델 출력 (요약 및 키워드 추출 통합 실행 결과)
- 부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다.
- 유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다.
- A씨는 교통사고처리법상 12대 중과실에 해당되는 '중앙선 침범'으로 역주행 교통사고를 일으킨 혐의를 받는다.
- 사고 당일 수술을 받았으나 얼마 후 2차 뇌출혈로 뇌사 판정이 내려졌고, 사고 발생 약 한 달 만인 지난달 16일 끝내 사망했다.
문제점 분석
- Gemma 모델이 사용자의 의도를 제대로 이해하지 못하고 잘못된 결과를 생성하였다.
- 실제 사용자가 원하는 내용 :
- 주어진 글을 간단히 요약한 내용
- 5개의 핵심 키워드 추출
파인튜닝의 필요성
- 복잡한 지시 이해 능력 향상 :
요약과 키워드 추출을 동시에 요청하였을 때, 두 기능을 명확히 구분하고 올바르게 수행하도록 모델을 학습 - 정확한 요약 생성 :
불필요한 정보를 줄이고, 핵심 내용만 간결하게 요약하도록 모델을 학습 - 도메인 특화 데이터 학습 :
교통사고, 법률, 의료, 뉴스 등 특정 분야의 데이터를 활용하여, 핵심 정보 추출 능력을 강화
예를 들어, 법적 용어나 사고의 책임, 전문적인 지식에 대한 정보를 보다 정확히 추출하도록 모델을 학습