[Fine tuning - LoRA] 10분만에 로컬에서 파인튜닝하기 (Ubuntu)

2024. 8. 5. 19:32·인공지능 [AI]

준비물

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 데이터 사용. 
    • https://huggingface.co/datasets/lavita/medical-qa-shared-task-v1-toy
 

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  (1) 2024.08.02
[Llama3.1] Ollama 로 Fine tuning 하기  (0) 2024.08.02
'인공지능 [AI]' 카테고리의 다른 글
  • [Llama3.1] Windows 에서 Ubuntu로 AI 모델 사용하기 - Ubuntu 24.04
  • [Llama3.1] Ollama 로 Fine tuning 하기
coder_
coder_
어차피 할거 즐기자
  • coder_
    Good coder
    coder_
  • 전체
    오늘
    어제
    • 분류 전체보기 (41)
      • 인공지능 [AI] (3)
      • 모의해킹 (3)
      • Git (2)
      • Cloud (4)
      • 컴퓨터 과학 [CS] (3)
      • 데이터베이스 [DB] (2)
      • Nojde.js (4)
      • Javascript (3)
      • Django (4)
      • Code up (11)
        • 코드업 기초 100제 (9)
        • 단순 반복문 (2)
      • 백준 baek_joon (1)
        • 단계별 문제풀이 (1)
      • Web Scraping (1)
  • 블로그 메뉴

    • 글쓰기
    • 관리
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    php
    코드업
    Coding Test
    Linux
    node.js
    기초 100제
    code up
    ubuntu 24.04
    Bastion host
    nodejs
    ubuntu
    MariaDB
    모의해킹
    llama3.1
    Python
    hugging face
    파이썬
    기초100제
    Lightsail
    GCP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
coder_
[Fine tuning - LoRA] 10분만에 로컬에서 파인튜닝하기 (Ubuntu)
상단으로

티스토리툴바