https://product.kyobobook.co.kr/detail/S000214934825
한 권으로 끝내는 실전 LLM 파인튜닝 | 강다솔 - 교보문고
한 권으로 끝내는 실전 LLM 파인튜닝 | 실무 현장에서 꼭 필요한 파인튜닝, PEFT, vLLM 서빙 기술을 직접 실습하면서 배워 보자!AI 기술의 최전선에서 배우는 LLM 파인튜닝의 모든 것! 이론적 토대부터
product.kyobobook.co.kr
"한 권으로 끝내는 실전 LLM 파인튜닝" 교재를 활용해 3주(주말 제외) 동안 진행 되는 온라인 스터디
이전 포스팅 글과 이어지는 내용입니다.
https://minhyuk0914.tistory.com/34
한 권으로 LLM 온라인 스터디 1기 Day_7 - 단일 GPU를 활용한 Gemma-2B-it 파인튜닝 (1편) : Gemma-2B-it 모델
https://product.kyobobook.co.kr/detail/S000214934825 한 권으로 끝내는 실전 LLM 파인튜닝 | 강다솔 - 교보문고한 권으로 끝내는 실전 LLM 파인튜닝 | 실무 현장에서 꼭 필요한 파인튜닝, PEFT, vLLM 서빙 기술을
minhyuk0914.tistory.com
단일 GPU를 활용한 Gemma-2B-it 파인튜닝
Gemma 모델의 요약 및 키워드 추출 결과를 통해 모델의 성능과 한계를 구체적으로 살펴보도록 하자.
모델 출력 (요약 및 키워드 추출 통합 실행 결과)
- 부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다.
- 유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다.
- A씨는 교통사고처리법상 12대 중과실에 해당되는 '중앙선 침범'으로 역주행 교통사고를 일으킨 혐의를 받는다.
- 사고 당일 수술을 받았으나 얼마 후 2차 뇌출혈로 뇌사 판정이 내려졌고, 사고 발생 약 한 달 만인 지난달 16일 끝내 사망했다.
문제점 분석
- Gemma 모델이 사용자의 의도를 제대로 이해하지 못하고 잘못된 결과를 생성하였다.
- 실제 사용자가 원하는 내용 :
- 주어진 글을 간단히 요약한 내용
- 5개의 핵심 키워드 추출
파인튜닝의 필요성
- 복잡한 지시 이해 능력 향상 :
요약과 키워드 추출을 동시에 요청하였을 때, 두 기능을 명확히 구분하고 올바르게 수행하도록 모델을 학습- 정확한 요약 생성 :
불필요한 정보를 줄이고, 핵심 내용만 간결하게 요약하도록 모델을 학습- 도메인 특화 데이터 학습 :
교통사고, 법률, 의료, 뉴스 등 특정 분야의 데이터를 활용하여, 핵심 정보 추출 능력을 강화
예를 들어, 법적 용어나 사고의 책임, 전문적인 지식에 대한 정보를 보다 정확히 추출하도록 모델을 학습
이전 포스팅 글의 마지막 내용인 파인튜닝의 필요성을 느끼고, 사용자의 의도에 맞는 결과를 생성해내기 위하여, 파인튜닝을 진행해보자.
6. 데이터셋 전처리 및 학습 준비
6.1 데이터셋 로드
import datasets
dataset = datasets.load_dataset("jaehy12/news3")
6.2 키워드 데이터 생성
원본 텍스트와 요약본을 활용해 키워드 추출 프롬프트를 구성하고, 모델로부터 키워드를 생성하여 데이터셋에 추가
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device_map="auto")
def key_word_prompt(input_text, summary_text):
return [
{"role": "user", "content": f"{input_text}"},
{"role": "assistant", "content": f"{summary_text}"},
{"role": "user", "content": "중요한 키워드 5개를 뽑아주세요."},
{"role": "assistant", "content": ""}
]
def extract_keywords_batch(batch):
prompts = [key_word_prompt(original, summary) for original, summary in zip(batch["original"], batch["summary"])]
generated_texts = pipe(prompts, max_new_tokens=150, return_full_text=False)
keywords = [gen_text[0]["generated_text"] for gen_text in generated_texts]
batch["keywords"] = keywords
return batch
sample_dataset = dataset["train"].shuffle(seed=42).select(range(1000))
sample_dataset = sample_dataset.map(extract_keywords_batch, batched=True, batch_size=20)
sample_dataset[0]
"""
{'original': '전두환 정권을 흔들었던 \'큰 손\' 장영자의 네 번째 유죄가 확정됐다.\n 혐의는 사기, 징역은 4년이다.\n 대법원 2부(주심 박상옥 대법관)는 9일 무죄를 주장한 장씨의 상고를 기각했다.\n 장씨는 지인들에게서 세 차례에 걸쳐 6억여원을 가로채고 이들에게 위조 수표로 수억원을 요구한 혐의를 받는다.\n 올해로 76세를 맞은 장씨는 이미 복역을 마친 29년을 포함해 인생의 절반가량인 33년을 감옥에서 보내게됐다.\n 우수한 인재에게만 허락된다는 숙명여대 \'5월의 여왕(메이퀸)\' 출신인 장영자의 노년이 씁쓸하다.\n 장씨는 전두환 전 대통령의 처삼촌인 고(故) 이규광씨의 처제이자, 중앙정보부 차장이었던 고(故) 이철희씨의 아내였다.\n 전두환 정권 흔든 장영자의 삶장씨의 앞선 범행과 비교해 네 번째 사기 액수는 그 규모가 상당히 줄어든 편이다.\n 장씨는 1980년대 전두환 전 대통령과 남편을 내세워 자금 압박에 시달리던 기업에 자금을 빌려준 뒤 몇 배에 달하는 어음을 할인 유통하며 이득을 챙겼다.\n 그 규모가 총 7111억원에 달했다.\n 장씨는 이중 6404억원의 어음을 할인해 사용했다.\n 실체가 없던 어음은 부도가 났고 기업들은 도산했다.\n 장씨는 이 첫 번째 사기로 15년형을 선고받았다.\n 10년만인 1992년에 가석방됐다.\n 전두환 전 대통령의 부인 이순자씨는 자서전 『당신은 외롭지 않다』에서 이를 "조금씩 민심도 안정되고 경제도 생기를 되찾아 (남편이) 자신감을 얻던 시점에 날벼락같이 찾아온 횡액과도 같은 사건"이라 회고했다.\n 장씨가 당시 법정에서 아직 시중에 유통중인 어음이 있다며 "경제는 유통""나는 권력투쟁의 희생양이라"이라 했던 말은 유행어가 됐다.\n \'장영자 어음할인 사건\' 수사 축소 의혹으로 두 명의 법무부 장관이 경질됐다.\n "누나 성질 급하다" 70대 장영자의 돈 요구장씨는 출소한지 2년만인 1994년에 140억원대 차용 사기를 저질렀다.\n 두 번째 사기로 징역 4년을 받았다.\n 장씨는 1998년 광복절 특사로 풀려났다.\n 하지만 2년만인 2000년 220억원대 구권화폐 사기로 또다시 구속돼 15년형을 받았다.\n 그게 세 번째 사기다.\n 이날 확정이 된 장씨의 네 번째 사기는 2015년 1월 출소하고 7개월 만에 저지른 범행이다.\n 장씨에게 유죄를 선고한 1·2심 재판장은 "장씨가 동종범죄로 처벌받은 전력이 있고 누범기간 중에 범죄를 저질렀다"고 지적했다.\n ',
'summary': "전두환 정권을 흔들었던 '큰 손' 장영자의 네 번째 유죄가 확정됐다. 장씨는 지인들에게서 세 차례에 걸쳐 6억여원을 가로채고 이들에게 위조 수표로 수억원을 요구한 혐의를 받는다. 올해로 76세를 맞은 장씨는 이미 복역을 마친 29년을 포함해 인생의 절반가량인 33년을 감옥에서 보내게됐다.",
'keywords': "1. '큰 손' 장영자\n2. 전두환 정권\n3. 사기\n4. 징역\n5. 6억여원"}
"""
6.3 데이터셋 포맷 및 토큰화
요약과 키워드 정보를 포함한 데이터를 모델 입력 형식에 맞게 토큰화하여 학습 준비
def chat_keyword_summary_format(example):
return [
{"role": "user", "content": f"다음 텍스트를 한국어로 간단히 요약 및 관련 키워드를 추출해주세요:\n{example['original']}"},
{"role": "assistant", "content": f"한국어 요약:{example['summary']}\n키워드:{example['keywords']}"}
]
EOS_TOKEN = tokenizer.eos_token
def tokenize(element):
formatted = tokenizer.apply_chat_template(chat_keyword_summary_format(element), tokenize=False) + EOS_TOKEN
outputs = tokenizer(formatted)
return {
"input_ids": outputs["input_ids"],
"attention_mask": outputs["attention_mask"],
}
tokenized_sample_dataset = sample_dataset.map(tokenize)
tokenized_sample_dataset = tokenized_sample_dataset.train_test_split(test_size=0.1, seed=42)
6.4 데이터셋 분리 및 콜레이터 설정
- 준비된 데이터셋을 학습용과 평가용으로 분리 :
train_test_split 함수를 사용하여 전체 데이터셋의 10%를 테스트 데이터로 할당하고, 나머지 90%를 학습 데이터로 사용 - 콜레이터는 모델이 입력을 처리할 수 있도록 필요한 형식으로 데이터를 변환 :
DataCollatorForCompletionOnlyLM을 설정하여 모델의 입력 형식에 맞게 배치 데이터를 준비
tokenized_sample_dataset = tokenized_sample_dataset.train_test_split(
test_size=0.1,
seed=42
)
tokenized_sample_dataset
"""
DatasetDict({
train: Dataset({
features: ['original', 'summary', 'keywords', 'input_ids', 'attention_mask'],
num_rows: 900
})
test: Dataset({
features: ['original', 'summary', 'keywords', 'input_ids', 'attention_mask'],
num_rows: 100
})
})
"""
response_template_ids = tokenizer.encode(
"<start_of_turn>model\n",
add_special_tokens=False
)
collator = DataCollatorForCompletionOnlyLM(
response_template_ids, tokenizer=tokenizer
)
7. Wandb 학습 파라미터 설정
Wandb(Weights and Biases)는 모델 학습 과정을 모니터링하고 시각화하는 데 유용한 도구이다.
- wandb.init을 통해 프로젝트를 초기화
- TrainingArguments를 설정하여 학습에 필요한 다양한 하이퍼파라미터를 정의
wandb.init(project="gemma-2B-it-Full-Fine-Tuning", entity="Your_ID")
training_args = TrainingArguments(
output_dir="./keywords_gemma_results",
# num_train_epochs=1, # 1epoch에 250step정도 진행함
max_steps=800,
per_device_train_batch_size=4,
per_device_eval_batch_size=8,
warmup_steps=0,
weight_decay=0.01,
learning_rate=2e-4,
logging_dir="./logs",
logging_steps=100,
report_to="wandb",
)
8. 평가 메트릭 정의
모델의 성능을 평가하기 위해 BLEU 점수와 정확도를 측정하는 메트릭을 정의
- preprocess_logits_for_metrics : 함수는 모델의 출력(logits)을 후처리하여 예측 결과 반환
- compute_metrics : 예측 결과와 실제 레이블을 비교하여 BLEU 점수와 정확도를 계산
BLEU 점수는 생성된 텍스트의 품질을 평가하는 데 사용되며, 정확도는 모델의 예측이 얼마나 정확한지 평가
BLEU 스코어란?
기계 번역의 품질을 평가하기 위해 널리 사용되는 자동화된 평가지표이다. n-그램(n-gram) 기반으로 작동하며, 번역의 정확성과 유창성을 평가에 도움을 준다.
- N-Gram :
- N-Gram은 N개의 연속된 단어의 시퀀스를 의미한다.
예를 들어.
"I am free today"라는 문장에서 1-Gram은 "I", "am", "free", "today"이고, 2-Gram은 "I am", "am free", "free today" 이다.
- N-Gram은 N개의 연속된 단어의 시퀀스를 의미한다.
- N-Gram에 대한 정밀도(Precision) :
- 정밀도(Precision) : True라고 분류한 것 중에서 실제 True인 것의 비율이다.
Precision = TP / TP + FP이다. 간단히 말하면, Positive 정답률(PPV)라고도 말한다.
예를 들어,
[1, 0, 1, 1] 이 실제 값이고, [1, 1, 1, 1]로 예측 값일 때,
TP(True Positives) : 예측이 1이고, 실제 값도 1인 경우 = 3
FP(False Positives) : 예측이 1이고, 실제값이 0인 경우 = 1
따라서, Precision = 3 / (3 + 1) = 3 / 4 = 0.75가 된다. - N-Gram에서의 정밀도 : 번역과 일치하는 N-Gram의 개수를 해당 N-Gram의 총 개수로 나눈 값이다.
예를 들어,
기계 번역 결과(실제) : "I am free today"
참조 번역 결과(예측) : "I am busy today"
2-gram precision은 1/3이 된다. (2개의 시퀀스로 나누었을때, 1개만 정답)
"I am" 은 일치하지만, "am busy", "free today" 가 일치하지 않기 때문이다.
그렇다면, 참조 번역 결과(예측)이 "free today" 로 된 경우를 확인해보자.
2-gram precision은 1이 된다. (2개의 시퀀스로 나누었을때 전체 정답)
이것은 올바른 결과인가? 이를 보정하기 위해 brevity penalty를 도입하였다. - Brevity penalty : 기계 번역 결과의 길이를 참조 번역의 길이로 나눈 값의 지수 함수로 계산
기계 번역 결과(실제)가 참조 번역(예측)보다 짧을 수록 패널티가 커진다.
- 정밀도(Precision) : True라고 분류한 것 중에서 실제 True인 것의 비율이다.
- 최종 BLEU 스코어 : N-Gram Precision의 기하평균에 brevity penalty를 곱하여 계산
bleu = evaluate.load("bleu")
acc = evaluate.load("accuracy")
def preprocess_logits_for_metrics(logits, labels):
if isinstance(logits, tuple):
# 모델과 설정에 따라 logits에는 추가적인 텐서들이 포함될 수 있습니다.
# 예를 들어, past_key_values 같은 것들이 있을 수 있지만,
# logits는 항상 첫 번째 요소입니다.
logits = logits[0]
# 토큰 ID를 얻기 위해 argmax를 수행합니다.
return logits.argmax(dim=-1)
def compute_metrics(eval_preds):
preds, labels = eval_preds
# preds는 labels와 같은 형태를 갖습니다.
# preprocess_logits_for_metrics에서 argmax(-1)가 계산된 후입니다.
# 하지만 우리는 labels를 한 칸 이동시켜야 합니다.
labels = labels[:, 1:]
preds = preds[:, :-1]
# -100은 DataCollatorForCompletionOnlyLM에서 사용되는
# ignore_index의 기본값입니다.
mask = labels == -100
# -100을 토크나이저가 디코드할 수 있는 값으로 대체합니다.
labels[mask] = tokenizer.pad_token_id
preds[mask] = tokenizer.pad_token_id
# BLEU 점수는 텍스트를 입력으로 받기 때문에,
# 토큰 ID에서 텍스트로 변환해야 합니다.
decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)
decoded_preds = tokenizer.batch_decode(preds, skip_special_tokens=True)
bleu_score = bleu.compute(predictions=decoded_preds, references=decoded_labels)
# accuracy는 정수 리스트를 입력으로 받습니다.
# 우리는 -100이 아닌 부분만 평가하고 싶기 때문에,
# 마스크의 부정(~)을 사용합니다.
accuracy = acc.compute(predictions=preds[~mask], references=labels[~mask])
return {**bleu_score, **accuracy}
9. 모델 학습 및 평가
Trainer 클래스를 사용하여 모델을 학습하고 평가
- trainer.train() : 모델 학습
- trainer.evaluate() : 테스트 데이터셋에 대한 모델 성능을 평가
trainer = Trainer(
args=training_args,
model=model,
tokenizer=tokenizer,
data_collator=collator,
train_dataset=tokenized_sample_dataset["train"],
eval_dataset=tokenized_sample_dataset["test"],
preprocess_logits_for_metrics=preprocess_logits_for_metrics,
compute_metrics=compute_metrics,
callbacks=[WandbCallback()]
)
trainer.train()
trainer.evaluate()
"""
{'eval_loss': 0.9304771423339844,
'eval_bleu': 0.5572014773043237,
'eval_precisions': [0.7583783783783784,
0.621651376146789,
0.5123364485981309,
0.43733333333333335],
'eval_brevity_penalty': 0.9773769446405759,
'eval_length_ratio': 0.9776290294169455,
'eval_translation_length': 5550,
'eval_reference_length': 5677,
'eval_accuracy': 0.8690894073921124,
'eval_runtime': 3.7681,
'eval_samples_per_second': 26.539,
'eval_steps_per_second': 3.45,
'epoch': 3.5555555555555554}
"""
10. 파인튜닝한 모델 테스트
이전 포스팅 글의 요약 및 관련 키워드 추출에 대한 결과보다 사용자의 의도에 더 적합한 결과를 생성해낸 결과를 확인할 수 있다.
input_text = "부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다. 유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다.\n11일 부산진경찰서는 교통사고처리특례법(교통사고처리법)상 업무상 과실치사 혐의로 지난 3일 A(59)씨를 검찰에 불구속 송치했다고 밝혔다. A씨는 교통사고처리법상 12대 중과실에 해당되는 '중앙선 침범'으로 역주행 교통사고를 일으킨 혐의를 받는다.\n경찰에 따르면 스포츠유틸리티차량(SUV) 운전자 A씨는 5월 19일 밤 11시 50분쯤 부산진구 가야고가교 밑 도로에서 중앙선을 넘어 역주행으로 140m를 달려 반대편 차선의 오토바이 운전자 조모(16)군을 들이받았다. 조군은 원동기장치자전거 면허를 취득한 상태였고 헬멧도 쓰고 있었지만 크게 다쳤다. 사고 당일 수술을 받았으나 얼마 후 2차 뇌출혈로 뇌사 판정이 내려졌고, 사고 발생 약 한 달 만인 지난달 16일 끝내 사망했다. 사고를 낸 A씨는 술을 마시거나 약물을 복용한 상태에서 운전하지는 않은 것으로 조사됐다. 경찰 관계자는 'A씨가 자신이 정주행을 하고 오토바이가 역주행을 한 것으로 착각했다고 진술했다'고 설명했다."
def get_chat_format(input_text):
return [
{"role": "user", "content": f"다음 텍스트를 한국어로 간단히 요약 및 관련 키워드를 추출해주세요:\n{input_text}"},
{"role": "assistant", "content": "한국어 요약:\n키워드:"}
]
def change_inference_chat_format(input_text):
return [
{"role": "user", "content": f"{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("cuda")
outputs = model.generate(inputs, max_new_tokens=512, 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
한국어 요약:유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다. 11일 부산진경찰서는 교통사고처리특례법(교통사고처리법)상 업무상 과실치사 혐의로 지난 3일 A(59)씨를 검찰에 불구속 송치했다고 밝혔다.
키워드:1. 가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다
2. 고등학생
3. 유족
4. 2차선
5. 농장 대응
"""
모델 출력 결과 분석 및 해결 방안
- 키워드의 1번이 문장으로 생성된 결과를 확인하였을 때, 모델이 학습이 부족하여 키워드의 정확한 의미를 아직 제대로 파악하지 못하였을 가능성이 있습니다.
해결 방안 : 에포크수를 더 늘려 추가로 학습 진행 및 더 많은 데이터 활용 - 키워드 5번의 결과인 "농장 대응" 이라는 결과를 확인하였을 때, "늑장 대응"을 잘못 생성하였다고 파악이 된다.
문제점 분석 : "늑장 대응" 이라는 키워드가 올바르게 생성이 되지 않은 것으로 보아, "늑장"이라는 단어가 희소한 단어라고 생각한다. 데이터 셋은 많은 양의 기사 및 뉴스로 구성되어 있으며, "대응"이라는 단어는 많이 포함되어 있을테지만, "늑장"은 적은 데이터로 인하여, 비슷한 단어인 "농장"이라는 결과를 내보내었을 것이다.
해결 방안 : "늑장" 과 같은 단어를 올바르게 생성해 낼 수 있도록 도메인 특화 데이터만 활용하거나, 모델이 입력 문장내에서만 키워드를 올바르게 추출하도록 성능을 개선해야 한다.
11. 간단한 프롬프트 튜닝을 통한 테스트
11.1 프롬프트 튜닝(Prompt Tuning)
프롬프트 튜닝(Prompt Tuning)이란 모델에 입력되는 프롬프트(명령이나 요청 등의 텍스트)를 조정하여, 모델이 원하는 방식으로 응답하는 방법이다. (LLM이 특정 작업을 수행하도록 유도하는 텍스트나 명령을 의미)
11.2 장단점
장점
- 데이터 효율성이 높다
- 빠르게 적용할 수 있다
단점
- 맞춤화가 제한적이다
- 프롬프트 설계가 어렵다
import torch
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
TrainingArguments,
pipeline,
Trainer
)
# 모델과 토크나이저 불러오기
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)
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
다음 텍스트를 한국어로 간단히 요약해주세요. 그리고 중요한 5개의 키워드를 추출해주세요:
부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다.
유족은 '가해자가 사고 후 곧바로 신고하지 않고 늑장 대응해 피해를 키웠다'고 주장하고 있다.
11일 부산진경찰서는 교통사고처리특례법(교통사고처리법)상 업무상 과실치사 혐의로 지난 3일 A(59)씨를 검찰에 불구속 송치했다고 밝혔다.
A씨는 교통사고처리법상 12대 중과실에 해당되는 '중앙선 침범'으로 역주행 교통사고를 일으킨 혐의를 받는다.
경찰에 따르면 스포츠유틸리티차량(SUV) 운전자 A씨는 5월 19일 밤 11시 50분쯤 부산진구 가야고가교 밑 도로에서 중앙선을 넘어 역주행으로 140m를 달려
반대편 차선의 오토바이 운전자 조모(16)군을 들이받았다. 조군은 원동기장치자전거 면허를 취득한 상태였고 헬멧도 쓰고 있었지만 크게 다쳤다.
사고 당일 수술을 받았으나 얼마 후 2차 뇌출혈로 뇌사 판정이 내려졌고, 사고 발생 약 한 달 만인 지난달 16일 끝내 사망했다.
사고를 낸 A씨는 술을 마시거나 약물을 복용한 상태에서 운전하지는 않은 것으로 조사됐다.
경찰 관계자는 'A씨가 자신이 정주행을 하고 오토바이가 역주행을 한 것으로 착각했다고 진술했다'고 설명했다.
model
model
**요약:**
* 부산의 한 왕복 2차선 도로에서 역주행 사고로 배달 오토바이 운전자인 고등학생이 숨지는 사고가 발생했다.
**키워드:**
1. 역주행 사고
2. 배달 오토바이
3. 교통사고처리법
4. 중앙선 침범
5. 뇌출혈
"""
사용자의 의도에 맞게, 입력된 문장을 요약한 내용을 먼저 보여주고, 키워드 5개를 추출해낸 결과를 손쉽게 얻을 수 있었다.
11.3 어떤 경우에 어떤 기법을 선택해야하는가?
특성 | 파인튜닝(Fine-Tuning) | 프롬프트 튜닝(Prompt Tuning) |
학습 방식 | 모델의 파라미터를 업데이트 | 모델의 파라미터는 그대로 두고, 입력 프롬프트만 최적화 |
리소스 소모 | 높은 연산 자원과 시간이 필요 | 상대적으로 적은 자원과 시간 소모 |
성능 향상 가능성 | 높은 성능 향상 가능 | 성능 향상의 범위가 제한적 |
적용 범위 | 특정 작업에 맞춰 최적화 가능 | 다양한 태스크에서 빠르게 적용 가능 |
실험 속도 | 상대적으로 느림 | 실험이 빠르고 효율적 |
파인 튜닝(Fine-Tuning)
- 모델을 특정 작업에 최적화해야 할 때 사용
- 도메인 특화에 유리(의료, 법률 등..)
파인 튜닝(Fine-Tuning)
- 빠르게 실험을 통해 다양한 작업을 해결하고자 할 때 유용
- 제한된 리소스를 가지고 실험을 할 경우
결론 (Fine-Tuning과 Prompt-Tuning의 융합)
파인튜닝과 프롬프트 튜닝은 각기 다른 장단점을 가지며, 상황에 따라 적합한 방법을 선택해야 한다.
그렇지만 이들 각각의 장점을 결합하여 더욱 강력한 모델을 만들 수 있다.
파인튜닝(Fine-Tuning)을 통해 모델을 새로운 작업 및 도메인에 맞게 학습시킨 후, 프롬프트 튜닝(Prompt-Tuning)을 사용하여 모델의 출력을 더욱 세밀하게 제어할 수 있다. 이러한 융합은 모델의 예측 성능을 향상하고, 원하는 출력을 보다 정확하게 조절할 수 있는 장점을 제공한다.