준비물
AI 모델 - Hugging face 에서 아무 모델이나 다운받아서 설치해도 됨. (로컬 성능을 참고해서)
작업은 Gemma-2-2b-it 로 진행했음.
* 이전 게시물 참고
[Llama3.1] Windows 로컬 에서 AI 모델 사용하기 - Ubuntu 24.04
Llama3.1 모델을 처음 설치할때 Windows 에 설치 했다가 에러가 하도 많아서 그냥 Ubuntu 에서 실행하기로 했다.Ubuntu 설치는 이전에 올린 글 참조 24.04 버전 설치 https://bob-data.tistory.com/42 [Linux] Windows
bob-data.tistory.com
Dataset 준비
- Hugging face 에 있는 medical 데이터 사용.
lavita/medical-qa-shared-task-v1-toy · Datasets at Hugging Face
A 35-year-old woman presents to the ER with shortness of breath, cough, and severe lower limb enlargement. The dyspnea was of sudden onset, started a week ago, and increased with exercise but did not disappear with rest. Her cough was dry, persistent, and
huggingface.co
데이터 사용법
- https://huggingface.co/docs/hub/datasets-usage
- 아래 명령어 입력후 token 입력하라고 나오면 발급 받은 token 입력 (setting 의 token access에 있음)
huggingface-cli login
- 데이터 불러오기 (경로는 사용할 데이터 사용법을 보면 친절하게 알려줌)
- train, dev 데이터로 나눠준다.
from datasets import load_dataset, DatasetDict
dataset = DatasetDict({
"train": load_dataset("lavita/medical-qa-shared-task-v1-toy", split="train"),
"dev": load_dataset("lavita/medical-qa-shared-task-v1-toy", split="dev")
})
사용할 pip
from datasets import load_dataset, DatasetDict
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForSeq2Seq
from peft import LoraConfig, get_peft_model
import torch
모델 로드 및 LoRA 설정
- model 에서 gemma-2-2b-it 을 사용하는 경우 attn_implementation='eagert' 속성으로 사용해야함.
- 만약 target_modules 가 모델마다 다르기 때문에 꼭 확인 필요. 에러가 생긴다면
model_path = "/home/llama/fine_tunning/gemma-2-2b-it"
tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False)
model = AutoModelForCausalLM.from_pretrained(model_path, attn_implementation='eager')
# 모델 구조 확인 - target_modules 를 모를시 사용
# for name, module in model.named_modules():
# print(name)
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["self_attn.q_proj", "self_attn.k_proj", "self_attn.v_proj", "self_attn.o_proj"],
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM"
)
데이터 전처리
- 모델에 학습 시키기 전 데이터 구조에 맞게 전처리를 해준다.
- Data Collator는 데이터 로딩 중 배치를 생성할 때 필요한 전처리 작업을 해줌. 사용하는 이유는 정확성을 올려줌. 자세한 내용은 gpt에게 물어보는게 좋다.
def preprocess_function(examples):
inputs = examples['startphrase']
# 정답 레이블에 해당하는 ending을 선택합니다.
labels = [examples[f'ending{label}'][i] for i, label in enumerate(examples['label'])]
model_inputs = tokenizer(inputs, padding="max_length", truncation=True, max_length=512)
# labels를 토큰화합니다.
label_tokens = tokenizer(labels, padding="max_length", truncation=True, max_length=512)
# labels를 input_ids로 설정합니다.
model_inputs["labels"] = label_tokens["input_ids"]
# 패딩 토큰을 -100으로 대체합니다.
for i, label in enumerate(model_inputs["labels"]):
model_inputs["labels"][i] = [l if l != tokenizer.pad_token_id else -100 for l in label]
return model_inputs
tokenized_datasets = dataset.map(
preprocess_function,
batched=True,
remove_columns=dataset["train"].column_names
)
# Data Collator 설정
data_collator = DataCollatorForSeq2Seq(
tokenizer,
model=model,
padding=True,
label_pad_token_id=-100
)
학습 설정
- 학습된 데이터는 지정해준 폴더에 생성이됨.
- 데이터 학습 시키는데 대략 40분 정도 걸린듯함. (gpu - Nvidia 3070ti 8gb)
training_args = TrainingArguments(
output_dir="./results",
per_device_train_batch_size=2,
num_train_epochs=3,
logging_dir="./logs",
logging_steps=10,
evaluation_strategy="epoch",
save_strategy="epoch",
learning_rate=3e-5,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["dev"],
data_collator=data_collator,
)
trainer.train()
model.save_pretrained("./fine_tuned_model_medical")
tokenizer.save_pretrained("./fine_tuned_model_medical")
학습 결과
- 3번 학습을 시도 하였고 loss 가 줄기는 했지만 터무니 없는 수치이긴 하다. 학습이 잘 됐다고 보기는 어렵고 초기단계이기에 충분히 이런 수치가 나올만 하다.
모델 사용
- 간단하게 의사에게 질문하듯이 해봄
from transformers import AutoTokenizer, AutoModelForCausalLM
# 모델과 토크나이저 로드
model_path = "/home/llama/fine_tunning/fine_tuned_model_medical" # 실제 모델 파일 경로로 대체
tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False)
model = AutoModelForCausalLM.from_pretrained(model_path)
def get_medical_advice(patient_query):
# 프롬프트 설정
prompt = f"""
You are a medical doctor. Please provide a detailed response to the patient's query.
Patient: {patient_query}
Doctor:
"""
# 입력 토큰 생성
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=512)
# 모델을 통해 입력 토큰 전달하여 출력 생성
outputs = model.generate(
inputs["input_ids"],
attention_mask=inputs["attention_mask"],
max_length=1024, # 출력 길이를 늘림
num_beams=5,
temperature=0.7, # 다양성을 위해 temperature 추가
no_repeat_ngram_size=3, # n-gram 반복 방지
repetition_penalty=1.5,
early_stopping=True
)
# 출력 토큰을 문자열로 변환
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 프롬프트 제거 후 의사의 응답만 반환
doctor_response = result.split("Doctor:")[-1].strip()
return doctor_response
# 사용 예시
patient_query = "I have a cough and fever. They started last night. What's the problem?"
response = get_medical_advice(patient_query)
print("Doctor's response:")
print(response)
평가
우선 잘 모르는 데이터여서 질문을 어떻게 해야할지 잘 모르겠음. 다음번에는 익숙한 데이터로 학습을 시켜봐야겠음. 그리고 멕시코에 갔다는 말을 하는걸 보니 원래 모델에 그런 데이터가 있었는지 아니면 환각 증상일 수도 있겠다 생각이듬. 또한 질문을 주고 답을 생성하는데 시간이 너무 오래걸림 5-10분정도 걸리는 것 같음. 또한 개인 pc의 한계도 있어 구글 코랩을 사용하는 것도 고려해봐야겠음.
다음 번에는 그냥 올라마에 Fine tuning 시켜서 사용해보고 속도를 비교해 봐야겠음. 모델에 학습이 잘 동작하는 것 까지는 확인했지만 이것으로 유의미한 결과를 내기에는 문제가 있었던 것 같음.
'인공지능 [AI]' 카테고리의 다른 글
[Llama3.1] Windows 에서 Ubuntu로 AI 모델 사용하기 - Ubuntu 24.04 (0) | 2024.08.02 |
---|---|
[Llama3.1] Ollama 로 Fine tuning 하기 (0) | 2024.08.02 |