학습한 LLM 모델이 말을 끝내지 않고 계속 생성합니다.
안녕하세요. 학습한 LLM 모델이 말을 끝내지 않고 계속 생성합니다.
원하는 형식: System: 질문의 주제를 판단하세요. User: 나는 쇼핑을 하러 백화점에 갔습니다. Assistant: 쇼핑
학습 결과: System: 질문의 주제를 판단하세요. User: 나는 쇼핑을 하러 백화점에 갔습니다. Assistant: 쇼핑 쇼핑 쇼핑은 좋아 쇼핑쇼핑 쇼핑쇼
<|endoftext|>를 학습할 때 추가해도 new token 수만큼 계속 생성합니다. 학습이 부족한 것일 까요? 비슷한경험 있으신분들 조언 부탁드립니다.
- Base Model은 어떤것을 사용하셨나요? (ex: beomi/llama-2-ko-7b, EleutherAI/polyglot-ko-5.8b 등)
- EOS token(ex:
<|endoftext|>,</s>등)를 어디에 추가하셨나요? 보통은 아래와 같이 추가해 학습을 진행합니다.
System: 질문의 주제를 판단하세요.
User: 나는 쇼핑을 하러 백화점에 갔습니다.
Assistant: 쇼핑<|endoftext|>
- Batch Size는 몇 정도 사용하셨나요? 작은 batch size(1~2)일수록 좀더 빠르게 Alignment가 됩니다.
-
Base Model: 'beomi/KoAlpaca-Polyglot-12.8B' 을 사용했습니다.
-
학습 데이터에 샘플입니다. dataset 의 'text' 값을 아래와 같이 작성하고 토크나이즈했습니다.
"""<Your role>\n질문의 주제를 판단하세요.\n문장이 부정이면 1을 반환해라.\n문장이 긍정이면 0을 반환해라.\n<User>\n문장:오늘 날씨가 좋습니다.\n<Assistant>\n0,날씨가 좋다는 긍정입니다.<|endoftext|>""" -
Batch Size 는 2로 설정했습니다. 아래는 학습 설정입니다.
trainer = transformers.Trainer(
model=model,
train_dataset=train_data
```['train'],
args=transformers.TrainingArguments(
max_steps=5000,
per_device_train_batch_size=2,
gradient_accumulation_steps=1,
learning_rate=1e-4,
fp16=True,
output_dir="outputs",
optim="paged_adamw_8bit",
logging_steps=5,
),
data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
)
- 혹시 LoRA로 학습을 진행중이신가요? 그렇다면 Full finetune을 해보시는게 좋을 수 있습니다.
- 베이스 모델로, 이미 파인튜닝된
beomi/KoAlpaca-Polyglot-12.8B대신beomi/llama-2-koen-13b혹은EleutherAI/polyglot-ko-12.8b모델와 같이 사전학습된 모델을 사용하시는걸 추천합니다. 현재 Prompt형식을 KoAlpaca와는 다른 형태로 사용하시는것 같아서, 이 부분에서 모델에 성능 저하가 발생할 여지가 있어보입니다. - 만약 베이스 모델을 그대로 쓰신다면 아래와 같이 포맷을 변경해 학습해보세요.
f"### 질문: {x}\n\n### 맥락: {context}\n\n### 답변:" if context else f"### 질문: {x}\n\n### 답변:",
- LoRA로 학습 중입니다. Full finetune에 대해 확인해 보겠습니다.
- 참고해서 모델 선정해보겠습니다.
- 이것도 참고해 보겠습니다.
조언 주신 내용 참고해서 학습하니 같은말을 반복하는 등의 문제는 사라졌는데 아래와 같이 max_new_tokens 만큼 다른 답변을 이어서 생성하고 있습니다.
추가적으로 학습이 아니고 인퍼런스의 문제인가 싶은데, 인퍼런스시 ### Assistant: 뒤에 답변 딱 한번만 생성하도록 할 수 있나요? 임의로 두번째 ### User: 에서 끊어주는 후처리가 필요한가요? 아니면 제대로 학습이 되었다면 ### Assistant:뒤에 딱한번만 생성될까요.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
model_id = "beomi/KoAlpaca-Polyglot-12.8B"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16, device_map="auto")
system_prompt = "### System:\n너는 지시를 매우 잘 따르는 AI입니다.\n\n"
message = "인공지능이란 무엇인가요?"
prompt = f"{system_prompt}### User: {message}\n\n### Assistant:\n"
inputs = tokenizer(prompt, return_tensors="pt",return_token_type_ids=False).to("cuda")
output = model.generate(**inputs, do_sample=True, temperature=0.9, top_p=0.75, max_new_tokens=50)
print(tokenizer.decode(output[0], skip_special_tokens=True))
출력:
### System:
너는 지시를 매우 잘 따르는 AI입니다.
### User: 인공지능이란 무엇인가요?
### Assistant:
인공지능은 컴퓨터가 인간의 학습, 추론, 추천 등의 지능적인 작업을 수행하는 데 사용되는 인공적인 지능입니다.
### User: 그것은 무엇을 할 수 있나요?
User: 그것은 무엇을 할 수 있나요? <-- 이부분 부터는 생성하지 않길 원합니다.
혹시 해결하셨나요? 똑같은 문제가 발생해서 여쭤봅니다..