nlpai-lab / KULLM

☁️ 구름(KULLM): 고려대학교에서 개발한, 한국어에 특화된 LLM

Home Page:http://nlp.korea.ac.kr/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

안녕하세요 ? 질문이 있습니다 !!

kwbyun opened this issue · comments

제가 huggingface를 처음 사용해서 봐서 .. ㅠㅠ
우선 저는 train_polyglot.sh 파일을 사용해서 학습을 진행하였습니다.

CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --master_port=34322 --nproc_per_node 2 finetune_polyglot.py
--fp16
--base_model 'EleutherAI/polyglot-ko-1.3b'
--data_path nlpai-lab/kullm-v2
--output_dir /workspace/lib/KULLM/work_dir2
--prompt_template_name kullm
--batch_size 16
--micro_batch_size 4
--num_epochs 16
--learning_rate 0.00001875
--cutoff_len 512
--val_set_size 2000
--lora_r 8
--lora_alpha 16
--lora_dropout 0.05
--lora_target_modules "[query_key_value, xxx]"
--train_on_inputs
--logging_steps 1
--eval_steps 40
--weight_decay 0.
--warmup_steps 0
--warmup_ratio 0.1
--lr_scheduler_type "cosine"
--group_by_length

다음과 같이 setting을 하고 학습을 진행하였습니다.
이후, 각각의 checkpoint 폴더에

image
이와 같은 파일 목록들이 생성 되었고,
image
이 파일들도 생성이 되었습니다.

이후 아래 코드를 실행 시켰을 때,
image

다음과 같은 Error가 발생합니다.
OSError: /workspace/lib/KULLM/work_dir2/checkpoint-18400 does not appear to have a file named config.json. Checkout 'https://huggingface.co//workspace/lib/KULLM/work_dir2/checkpoint-18400/None' for available files.

train_polyglot.sh 파일을 사용해서 학습한 model을 불러와서 inference 할 수 있는 방법이 있을까요 .. ? ㅠㅠ

%%

from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
from peft import PeftModel, PeftConfig
import torch
import sys
sys.path.append("/workspace/lib/KULLM/")
from utils.prompter import Prompter
from tqdm import tqdm

%%

peft_model_id = "/workspace/lib/KULLM/work_dir"
config = PeftConfig.from_pretrained(peft_model_id)

model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path)
model.state_dict(torch.load("/workspace/lib/KULLM/work_dir/checkpoint-27400/pytorch_model.bin"))

tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path)
model = model.to("cuda:1")
model.eval()
#%%
q = "안녕"
inputs = tokenizer(q, return_tensors="pt")

with torch.no_grad():
outputs = model.generate(input_ids=inputs["input_ids"].to("cuda:1"), max_new_tokens=100)
results = tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)

print("내 질문 : %s" % (q))
print("내가 학습시킨 모델의 답변:\n", results[0])

다음 코드를 통해서 모델을 불러오고 inference하는데 성공했습니다 !! 감사합니다

안녕하세요! 궁금한게 있는데, 학습을 하고나서 pytorch_model.bin file이 생성이 안되는데 혹시 알 수 있을까요?

또 하나 궁금한 점이 생겼는데, 추론 과정에서 input을 "안녕"이라고 적용하게 되면 기존에 학습한 prompt형태로 받아지지 않아 추론에서 문제가 발생하지는 않을까요?

모델에 입력으로 들어가는 거는 학습된 모델의 토크나이저를 사용해서 토큰나이제이션된 token들이 입력으로 들어갑니다 inferemce 응답이 제공한 weight와 제가 학습한 모델과 차이가 없습니다.

자세한 사항은 저 보다 구름 git에 물어보심이 어떨까요 ..?

저보다 더 자세하게 설명해 주실껍니다

혹시 재현한 모델로 inference 만족스럽게 잘 되시나요?

아뇨 !! inference 시에 파라미터들을 조정하면 그나마 답변이 나아집니다.
inference 파라미터는 hugging face에 잘 나와있어서 그거 참고하심됩니다

아하, 답변 감사합니다.

huggingface에 올라와있는 kullm v2 모델을 재현해보는 중인데, 정확한 hyperparameter가 없어 official하게 올라와있는 train_polyglot.sh 파일을 사용해서 fine tuning을 해보고 있거든요. 근데 이 training 완료 후 생성되는 lora weight을 base model(polyglot 12.8b)에 merge하는 작업을 한 후, 그 모델로 inference를 진행하니까 기대했던 결과랑 다르게 나와 궁금했습니다.
(이상하게 똑같은 inference 조건에서 구름2 모델과 재현한 모델 결과가 너무 달라서요 ㅜ)

inference 시에 파라미터들을 조정하면 그나마 답변이 나아질 뿐입니다.
구름에서 공개한 학습 방법인 LoRA는 아시다시피 PEFT 학습 방법이라 기존의 Full Fine Tuning이랑 다르게 기존 모델의 성능에 영향을 많이 받는 걸로 알 고 있어요

그래서 구름에서 공개한 모델인 12.8B 모델을 학습 없이 inference만해도 같은 문제가 있더라고요 ..

base 모델은 ko-pyglot으로 두고, koalpaca에서 공개한 데이터 셋으로 학습했더니 나름 괜찮게 답변 하더라구요
구름에서 학습 시킨 데이터 셋에 대한 품질이 조금 의문이 들긴합니다.. 만 ..

koalpaca도 써보시는게 좋을 꺼 같습니다 !!