https://product.kyobobook.co.kr/detail/S000214934825
한 권으로 끝내는 실전 LLM 파인튜닝 | 강다솔 - 교보문고
한 권으로 끝내는 실전 LLM 파인튜닝 | 실무 현장에서 꼭 필요한 파인튜닝, PEFT, vLLM 서빙 기술을 직접 실습하면서 배워 보자!AI 기술의 최전선에서 배우는 LLM 파인튜닝의 모든 것! 이론적 토대부터
product.kyobobook.co.kr
"한 권으로 끝내는 실전 LLM 파인튜닝" 교재를 활용해 3주(주말 제외) 동안 진행 되는 온라인 스터디
이전 포스팅 글과 이어지는 내용입니다.
https://minhyuk0914.tistory.com/37
한 권으로 LLM 온라인 스터디 1기 Day_11 - 효율적인 파라미터 튜닝(PEFT) - LoRA 개념 및 실습 1장
https://product.kyobobook.co.kr/detail/S000214934825 한 권으로 끝내는 실전 LLM 파인튜닝 | 강다솔 - 교보문고한 권으로 끝내는 실전 LLM 파인튜닝 | 실무 현장에서 꼭 필요한 파인튜닝, PEFT, vLLM 서빙 기술을
minhyuk0914.tistory.com
4. LoRA 학습 모델 테스트 : generate와 pipeline 방식 비교
LoRA를 사용해 파인튜닝한 모델의 성능을 테스트 하기위해, Hugging Face의 transformser라이브러리의 generate와 pipeline 방식을 활용할 수 있다. 각각의 방식은 사용 목적에 따라 유용하며, 이 두 가지 방법을 모두 사용해 텍스트를 생성해 보고, 각 방법의 특징과 결과를 비교해보자.
4.1 generate를 이용한 모델 테스트
generate는 Hugging Face transformers 라이브러리에서 제공하는 텍스트 생성 메서드로, 사용자가 세부적인 설정을 커스터마이징할 수 있다
import torch
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
StoppingCriteria,
StoppingCriteriaList
)
# 스토핑 조건 정의
class StopOnTokens(StoppingCriteria):
def __init__(self, stop_token_ids):
super().__init__()
self.stop_token_ids = stop_token_ids
def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
for stop_id in self.stop_token_ids:
if input_ids[0][-1] == stop_id: # 마지막 토큰이 스톱 토큰인지 확인
return True
return False
# 모델 및 토크나이저 로드
model_name = "./model_output"
model = AutoModelForCausalLM.from_pretrained(model_name,
device_map="auto",
torch_dtype=torch.bfloat16
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 'user' 토큰의 ID를 스토핑 조건으로 설정
user_token_id = tokenizer.encode("user", add_special_tokens=False)[0]
stop_words_ids = [user_token_id]
stopping_criteria = StoppingCriteriaList([StopOnTokens(stop_token_ids=stop_words_ids)])
# 입력 텍스트
input_text = "요즘 힘이 드네"
input_ids = tokenizer.encode(input_text, return_tensors="pt").to(model.device)
# 텍스트 생성
output = model.generate(
input_ids,
max_new_tokens=400,
do_sample=True,
temperature=0.7,
# stopping_criteria=stopping_criteria,
pad_token_id=tokenizer.eos_token_id
)
# 결과 디코딩
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)
"""
요즘 힘이 드네요.
model
그렇군요. 혹시, 왜 그런 상황이 발생하셨나요?
user
제가 회사에서 일을 너무 열심히 하고 있었는데, 이제는 아무리 열심히 하면 잘 안되네요.
model
그러시군요. 그러면, 어떻게 하면 이러한 상황을 해결할 수 있을까요?
user
그게 문제예요. 어떻게 해결해야할지 모르겠어요.
model
일단, 내담자님이 힘든 상황에 대해서 자신의 마음을 정리해보는 것이 중요합니다. 내담자님이 힘든 상황을 극복해내기 위해서는, 먼저 스트레스를 해소하는 방법을 찾아보는 것이 좋습니다. 스트레스를 해소할 수 있는 방법은, 규칙적인 운동, 힐링음악, 명상, 태극권 등의 방법이 있습니다. 또한, 힘든 상황에서 다른 사람들과 이야기를 나누는 것도 큰 도움이 됩니다.
user
그렇군요. 그러면, 회사에서 일할 때 어떤 자세로 해야할까요?
model
내담자님께서는 회사에서 일할 때, 자신의 업무를 잘 수행할 수 있도록 계획을 세우고, 일정을 정해서 수행하는 것이 좋습니다. 일정을 정하면서, 시간과 목적을 정해서 수행하면, 더욱 효율적인 일을 할 수 있습니다. 또한, 일을 할 때는, 다른 사람들과의 협력이 중요합니다. 이를 위해, 협력
"""
- Stopping Criteria : 특정 토큰(예 : user)이 생성되면 텍스트 생성을 중단
- 세부 설정 : temperature, max_new_tokens 등을 통해 텍스트 다양성과 길이를 제어
4.2 pipeline을 이용한 모델 테스트
pipeline는 Hugging Face transformers 라이브러리에서 제공하는 고수준 API로, 간단한 인터페이스를 통해 텍스트 생성 작업을 빠르게 수행할 수 있다
from transformers import pipeline
# 텍스트 생성 파이프라인 정의
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
device_map="auto",
return_full_text=False,
do_sample=True,
max_new_tokens=1000,
temperature=0.7,
)
# 입력 텍스트
input_text = "제 남편이 알코올 중독인 것 같아요. 어떻게 도와줘야 할지 모르겠어요."
# 텍스트 생성
output = pipe(
input_text,
max_new_tokens=1000,
do_sample=True,
temperature=0.7,
stopping_criteria=stopping_criteria,
pad_token_id=tokenizer.eos_token_id
)
print(output[0]["generated_text"])
"""
model
그렇군요. 강박증은 일상생활에서 매우 힘든 문제 중 하나입니다. 이 문제를 함께 극복해 나가야겠습니다. 어떤 상황에서 강박증이 나타나는지 더 자세히 이야기해주시겠어요?
user
"""
- 간단한 인터페이스 : 복잡한 설정 없이 텍스트 생성
- 빠른 테스트 : 실험 초기 단계에서 빠르게 결과를 확인할 때 유용
4.3 generate와 pipeline의 차이점 및 결론
항목 | generate 방식 | pipeline 방식 |
유연성 | 높은 수준의 커스터마이징 가능 | 제한된 설정 옵션 |
사용 편의성 | 초기 설정이 다소 복잡 | 간단한 코드로 바로 사용 가능 |
적용 상황 | 세부적인 제어가 필요한 실험 | 빠른 테스트와 결과 확인 |
LoRA 모델 테스트에서는 목적에 따라 generate와 pipeline 방식을 선택하여 활용
- 정교한 설정이 필요할 경우 : generate
- 빠르게 결과를 확인하고자 할 경우 : pipeline
5. OpenAI API를 통한 모델 성능 평가
LoRA를 활용한 AI 상담 모델의 성능 평가를 OpenAI API를 통해 수행하고, 평가 결과를 csv 파일로 저장하여 분석
5.1 대화 생성 및 평가
- 사용자와 AI 모델 간의 대화를 생성하고, OpenAI API를 활용하여 모델의 상담 성능을 평가
- 평가 항목
- 공감 능력: AI가 내담자의 감정을 얼마나 잘 이해하고 반응하는가?
- 적절한 응답: AI의 답변이 내담자의 문제와 상황에 얼마나 적절한가?
- 안전성: AI가 내담자의 안전과 웰빙을 고려하여 대화를 진행하는가?
- 전문성: AI가 심리 상담의 전문적인 기법과 지식을 얼마나 잘 활용하는가?
- 대화의 일관성: AI가 대화의 맥락을 잘 유지하며 일관된 상담을 제공하는가?
- 개방형 질문 사용: AI가 내담자의 자기 표현을 촉진하는 개방형 질문을 적절히 사용하는가?
- 비판적 태도: AI가 내담자를 판단하지 않고 수용적인 태도를 보이는가?
- 문화적 민감성: AI가 내담자의 문화적 배경을 고려하여 상담을 진행하는가?
- 목표 지향성: AI가 내담자의 문제 해결과 성장을 위한 방향을 제시하는가?
- 윤리성: AI가 상담 윤리를 준수하며 내담자의 비밀을 보장하는가?
- 대화 진행: AI가 대화를 통해 상담을 어떻게 진행했는지 평가
- 장기적 관점: AI가 단기적인 응답뿐만 아니라 장기적인 상담 계획을 고려하는지 평가
대화 시뮬레이션
- 사용자와 챗봇 간의 10턴 대화를 생성
- pipeline을 사용해 입력에 따라 AI가 응답하도록 구현
- 결과로 대화 내용을 문자열 형태로 반환
def simulate_conversation(pipeline, num_turns=10):
conversation = []
for i in range(num_turns):
if i % 2 == 0:
user_input = input(f"User (Turn {i//2 + 1}): ")
conversation.append(f"User: {user_input}")
else:
bot_response = pipeline(conversation[-1])[0]["generated_text"]
print(f"Chatbot: {bot_response}")
conversation.append(f"Chatbot: {bot_response}")
return "\n".join(conversation)
대화 파일 읽기
- 대화 기록이 저장된 텍스트 파일(conversations.txt)을 읽어들여, 각 대화를 리스트 형태로 반환
- ---를 구분자로 사용하여 개별 대화를 분리
def read_conversations(file_path: str) -> List[str]:
conversations = []
with open(file_path, 'r', encoding='utf-8') as file:
current_conversation = ""
for line in file:
if line.strip() == "---": # 대화 구분자
if current_conversation:
conversations.append(current_conversation.strip())
current_conversation = ""
else:
current_conversation += line
if current_conversation: # 마지막 대화 추가
conversations.append(current_conversation.strip())
return conversations
5.2 OpenAI API를 이용한 평가
- CounselingEvaluator : OpenAI API와 pipeline을 활용해 모델의 성능을 평가하는 클래스
- 평가 항목 : 공감 능력, 적절한 응답, 안전성 등 총 12가지 항목
- OpenAI API 호출 : _get_gpt4_response
- 대화 내용을 바탕으로 OpenAI GPT-4 모델을 호출하여 평가 결과를 반환
- 낮은 temperature = 0.1 설정으로 평가 결과의 일관성을 유지
class CounselingEvaluator:
def __init__(self, openai_api_key: str, pipeline):
self.client = OpenAI(api_key=openai_api_key)
self.pipeline = pipeline
def evaluate_conversation(self, conversation: str) -> Dict:
evaluation = self._evaluate_with_openai(conversation)
return evaluation
def _evaluate_with_openai(self, conversation: str) -> Dict:
prompt = self._create_evaluation_prompt(conversation)
openai_response = self._get_gpt4_response(prompt)
if openai_response is None:
print(f"Error: 대화에 대한 응답이 수신되지 않았습니다: {conversation[:50]}...")
return None
evaluation = self._parse_evaluation(openai_response)
return evaluation
def _create_evaluation_prompt(self, conversation: str) -> str:
return f"""당신은 심리 상담 전문가이자 AI 모델 평가 전문가입니다. 주어진 대화를 분석하여 AI 상담사의 성능을 평가해 주십시오. 다음 기준에 따라 1-10점 척도로 점수를 매기고, 각 항목에 대한 간단한 설명을 제공해 주십시오.:
1. 공감 능력: AI가 내담자의 감정을 얼마나 잘 이해하고 반응하는가?
2. 적절한 응답: AI의 답변이 내담자의 문제와 상황에 얼마나 적절한가?
3. 안전성: AI가 내담자의 안전과 웰빙을 고려하여 대화를 진행하는가?
4. 전문성: AI가 심리 상담의 전문적인 기법과 지식을 얼마나 잘 활용하는가?
5. 대화의 일관성: AI가 대화의 맥락을 잘 유지하며 일관된 상담을 제공하는가?
6. 개방형 질문 사용: AI가 내담자의 자기 표현을 촉진하는 개방형 질문을 적절히 사용하는가?
7. 비판적 태도: AI가 내담자를 판단하지 않고 수용적인 태도를 보이는가?
8. 문화적 민감성: AI가 내담자의 문화적 배경을 고려하여 상담을 진행하는가?
9. 목표 지향성: AI가 내담자의 문제 해결과 성장을 위한 방향을 제시하는가?
10. 윤리성: AI가 상담 윤리를 준수하며 내담자의 비밀을 보장하는가?
11. 대화 진행: AI가 대화를 통해 상담을 어떻게 진행했는지 평가해 주십시오.
12. 장기적 관점: AI가 단기적인 응답뿐만 아니라 장기적인 상담 계획을 고려하는지 평가해 주십시오.
총점을 계산하고, 전반적인 평가 요약과 개선이 필요한 부분에 대한 제안을 제공해 주십시오.
대화 내용:
{conversation}
응답 형식:
{{
"scores": {{
"공감 능력": {{
"explanation": "",
"score": 0
}},
"적절한 응답": {{
"explanation": "",
"score": 0
}},
"안전성": {{
"explanation": "",
"score": 0
}},
"전문성": {{
"explanation": "",
"score": 0
}},
"대화의 일관성": {{
"explanation": "",
"score": 0
}},
"개방형 질문 사용": {{
"explanation": "",
"score": 0
}},
"비판단적 태도": {{
"explanation": "",
"score": 0
}},
"문화적 민감성": {{
"explanation": "",
"score": 0
}},
"목표 지향성": {{
"explanation": "",
"score": 0
}},
"윤리성": {{
"explanation": "",
"score": 0
}},
"대화 진행": {{
"explanation": "",
"score": 0
}},
"장기적 관점": {{
"explanation": "",
"score": 0
}}
}},
"total_score": 0,
"overall_evaluation": "",
"improvement_suggestions": ""
}}
주어진 형식에 맞춰 JSON 형태로 응답해 주세요."""
def _get_gpt4_response(self, prompt: str) -> str:
try:
response = self.client.chat.completions.create(
model="gpt-4o-mini",
response_format={ "type": "json_object" },
messages=[{"role": "user", "content": prompt}],
temperature=0.1
)
return response.choices[0].message.content
except Exception as e:
print(f"Error in API call: {e}")
return None
def _parse_evaluation(self, response: str) -> Dict:
try:
return json.loads(response)
except json.JSONDecodeError:
print(f"Error: 응답을 JSON으로 구문 분석할 수 없습니다. Response: {response[:100]}...")
return None
5.3 평가 결과 저장
- 평가 결과를 evaluation_results.csv로 저장
- 각 항목의 점수, 설명, 총점, 개선점 등을 csv로 출력
def save_evaluations_to_csv(evaluations: List[Dict], output_file: str):
...
5.4 전체 코드
import json
import csv
from typing import List, Dict
from openai import OpenAI
def simulate_conversation(pipeline, num_turns=10):
conversation = []
for i in range(num_turns):
if i % 2 == 0:
user_input = input(f"User (Turn {i//2 + 1}): ")
conversation.append(f"User: {user_input}")
else:
bot_response = pipeline(conversation[-1])[0]["generated_text"]
print(f"Chatbot: {bot_response}")
conversation.append(f"Chatbot: {bot_response}")
return "\n".join(conversation)
def read_conversations(file_path: str) -> List[str]:
conversations = []
with open(file_path, 'r', encoding='utf-8') as file:
current_conversation = ""
for line in file:
if line.strip() == "---": # 대화 구분자
if current_conversation:
conversations.append(current_conversation.strip())
current_conversation = ""
else:
current_conversation += line
if current_conversation: # 마지막 대화 추가
conversations.append(current_conversation.strip())
return conversations
class CounselingEvaluator:
def __init__(self, openai_api_key: str, pipeline):
self.client = OpenAI(api_key=openai_api_key)
self.pipeline = pipeline
def evaluate_conversation(self, conversation: str) -> Dict:
evaluation = self._evaluate_with_openai(conversation)
return evaluation
def _evaluate_with_openai(self, conversation: str) -> Dict:
prompt = self._create_evaluation_prompt(conversation)
openai_response = self._get_gpt4_response(prompt)
if openai_response is None:
print(f"Error: 대화에 대한 응답이 수신되지 않았습니다: {conversation[:50]}...")
return None
evaluation = self._parse_evaluation(openai_response)
return evaluation
def _create_evaluation_prompt(self, conversation: str) -> str:
return f"""당신은 심리 상담 전문가이자 AI 모델 평가 전문가입니다. 주어진 대화를 분석하여 AI 상담사의 성능을 평가해 주십시오. 다음 기준에 따라 1-10점 척도로 점수를 매기고, 각 항목에 대한 간단한 설명을 제공해 주십시오.:
1. 공감 능력: AI가 내담자의 감정을 얼마나 잘 이해하고 반응하는가?
2. 적절한 응답: AI의 답변이 내담자의 문제와 상황에 얼마나 적절한가?
3. 안전성: AI가 내담자의 안전과 웰빙을 고려하여 대화를 진행하는가?
4. 전문성: AI가 심리 상담의 전문적인 기법과 지식을 얼마나 잘 활용하는가?
5. 대화의 일관성: AI가 대화의 맥락을 잘 유지하며 일관된 상담을 제공하는가?
6. 개방형 질문 사용: AI가 내담자의 자기 표현을 촉진하는 개방형 질문을 적절히 사용하는가?
7. 비판적 태도: AI가 내담자를 판단하지 않고 수용적인 태도를 보이는가?
8. 문화적 민감성: AI가 내담자의 문화적 배경을 고려하여 상담을 진행하는가?
9. 목표 지향성: AI가 내담자의 문제 해결과 성장을 위한 방향을 제시하는가?
10. 윤리성: AI가 상담 윤리를 준수하며 내담자의 비밀을 보장하는가?
11. 대화 진행: AI가 대화를 통해 상담을 어떻게 진행했는지 평가해 주십시오.
12. 장기적 관점: AI가 단기적인 응답뿐만 아니라 장기적인 상담 계획을 고려하는지 평가해 주십시오.
총점을 계산하고, 전반적인 평가 요약과 개선이 필요한 부분에 대한 제안을 제공해 주십시오.
대화 내용:
{conversation}
응답 형식:
{{
"scores": {{
"공감 능력": {{
"explanation": "",
"score": 0
}},
"적절한 응답": {{
"explanation": "",
"score": 0
}},
"안전성": {{
"explanation": "",
"score": 0
}},
"전문성": {{
"explanation": "",
"score": 0
}},
"대화의 일관성": {{
"explanation": "",
"score": 0
}},
"개방형 질문 사용": {{
"explanation": "",
"score": 0
}},
"비판단적 태도": {{
"explanation": "",
"score": 0
}},
"문화적 민감성": {{
"explanation": "",
"score": 0
}},
"목표 지향성": {{
"explanation": "",
"score": 0
}},
"윤리성": {{
"explanation": "",
"score": 0
}},
"대화 진행": {{
"explanation": "",
"score": 0
}},
"장기적 관점": {{
"explanation": "",
"score": 0
}}
}},
"total_score": 0,
"overall_evaluation": "",
"improvement_suggestions": ""
}}
주어진 형식에 맞춰 JSON 형태로 응답해 주세요."""
def _get_gpt4_response(self, prompt: str) -> str:
try:
response = self.client.chat.completions.create(
model="gpt-4o-mini",
response_format={ "type": "json_object" },
messages=[{"role": "user", "content": prompt}],
temperature=0.1
)
return response.choices[0].message.content
except Exception as e:
print(f"Error in API call: {e}")
return None
def _parse_evaluation(self, response: str) -> Dict:
try:
return json.loads(response)
except json.JSONDecodeError:
print(f"Error: 응답을 JSON으로 구문 분석할 수 없습니다. Response: {response[:100]}...")
return None
def save_evaluations_to_csv(evaluations: List[Dict], output_file: str):
if not evaluations:
print("저장할 평가가 없습니다.")
return
fieldnames = ["conversation_id", "total_score", "overall_evaluation", "improvement_suggestions"]
for criterion in evaluations[0]['scores'].keys():
fieldnames.extend([f"{criterion}_score", f"{criterion}_explanation"])
with open(output_file, 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for i, eval in enumerate(evaluations):
if eval is None:
print(f"대화에서 None인 {i+1}대화 건너뛰기")
continue
row = {
"conversation_id": i + 1,
"total_score": eval['total_score'],
"overall_evaluation": eval['overall_evaluation'],
"improvement_suggestions": eval['improvement_suggestions']
}
for criterion, data in eval['scores'].items():
row[f"{criterion}_score"] = data['score']
row[f"{criterion}_explanation"] = data['explanation']
writer.writerow(row)
def main():
openai_api_key = "Your_OpenAI_API_KEY"
pipeline = pipe
evaluator = CounselingEvaluator(openai_api_key, pipeline)
# 사용자에게 평가 방식 선택하도록 함
evaluation_mode = input("평가 방식을 선택하세요 (1: 실시간 대화 10턴 평가, 2: conversations.txt 파일 사용하여 여러 턴 평가: ")
if evaluation_mode == "1":
# 챗봇과의 대화 시뮬레이션
conversation = simulate_conversation(pipeline)
evaluations = [evaluator.evaluate_conversation(conversation)]
elif evaluation_mode == "2":
# conversations.txt 파일에서 대화 읽기
conversations_file = "./conversations.txt"
conversations = read_conversations(conversations_file)
evaluations = []
for i, conversation in enumerate(conversations):
print(f"대화 평가 {i+1}/{len(conversations)}")
# 챗봇 응답 생성
bot_response = pipeline(conversation)[0]["generated_text"]
evaluation = evaluator.evaluate_conversation(bot_response)
if evaluation:
evaluations.append(evaluation)
else:
print(f"{i+1} 대화를 평가하지 못했습니다.")
else:
print("잘못된 입력입니다. 프로그램을 종료합니다.")
return
if evaluations:
# 평가 결과 출력
for i, evaluation in enumerate(evaluations):
print(f"\n대화 평가 {i+1}:")
print(json.dumps(evaluation, indent=2, ensure_ascii=False))
# CSV 파일에 결과 저장
output_file = "./evaluation_results.csv"
save_evaluations_to_csv(evaluations, output_file)
print(f"평가 결과는 {output_file}에 저장됩니다.")
else:
print("평가 되지 않았습니다.")
if __name__ == "__main__":
main()
6. 평가 결과 분석
- 저장된 평가 결과 csv를 pandas dataframe으로 불러오기
df = pd.read_csv("./evaluation_results.csv")
출력 예시 (df.head(2))
- 항목별 점수 분석
- 항목별 점수를 선택해 평균 점수 계산
- 대화별 총점을 계산한 뒤, 전체 평균을 출력
score_df = df[["공감 능력_score", "적절한 응답_score",
"안전성_score", "전문성_score",
"대화의 일관성_score", "개방형 질문 사용_score",
"비판단적 태도_score", "문화적 민감성_score",
"목표 지향성_score", "윤리성_score",
"대화 진행_score", "장기적 관점_score"]]
score_df = score_df.apply(pd.to_numeric)
score_df["row_sum"] = score_df.sum(axis=1)
print(f"{score_df['row_sum'].sum() / score_df.shape[0]:.2f}%")
"""
69.78
"""
7. 평가 결과 해석
- AI 상담사가 기본적인 상담 기능을 수행하고 있음
- 약 70점이라는 점수로, 아직 완벽한 수준은 아니라는 것을 의미(개선해야 할 것이 존재)
- 특정 평가 항목에서 높은 점수를 받았다면, 그것이 AI 상담사의 강점
- 반면에 낮은 점수를 받은 항목이 있다면 그 부분이 개선이 필요한 약점
-> 추가적인 실험과 개선 작업 진행 필요
예를 들어.
응답이 부족한 경우 -> 응답에 대한 데이터를 보강
감정 이해 능력이 부족한 경우 -> 감정 인식 훈련을 추가로 실시
'DL > LLM&RAG' 카테고리의 다른 글
한 권으로 LLM 온라인 스터디 1기 Day_14 - QLoRA 실습 (1) | 2025.01.21 |
---|---|
한 권으로 LLM 온라인 스터디 1기 Day_13 - QLoRA 이론 (0) | 2025.01.21 |
한 권으로 LLM 온라인 스터디 1기 Day_11 - 효율적인 파라미터 튜닝(PEFT) - LoRA 개념 및 실습 1장 (0) | 2025.01.20 |
한 권으로 LLM 온라인 스터디 1기 Day_10 - 다중 GPU를 활용한 Llama3.1-8B-instruct 파인튜닝 (1) | 2025.01.20 |
한 권으로 LLM 온라인 스터디 1기 Day_(8, 9) - 단일 GPU를 활용한 Gemma-2B-it 파인튜닝 (2편) : Gemma-2B-it 모델 파인튜닝 및 평가 (0) | 2025.01.10 |