Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

학습한 LLM 모델이 말을 끝내지 않고 계속 생성합니다. #106

Open
stimong opened this issue Nov 1, 2023 · 5 comments
Open

Comments

@stimong
Copy link

stimong commented Nov 1, 2023

안녕하세요.
학습한 LLM 모델이 말을 끝내지 않고 계속 생성합니다.

원하는 형식:
System: 질문의 주제를 판단하세요.
User: 나는 쇼핑을 하러 백화점에 갔습니다.
Assistant: 쇼핑

학습 결과:
System: 질문의 주제를 판단하세요.
User: 나는 쇼핑을 하러 백화점에 갔습니다.
Assistant: 쇼핑 쇼핑 쇼핑은 좋아 쇼핑쇼핑 쇼핑쇼

<|endoftext|>를 학습할 때 추가해도 new token 수만큼 계속 생성합니다.
학습이 부족한 것일 까요? 비슷한경험 있으신분들 조언 부탁드립니다.

@Beomi
Copy link
Owner

Beomi commented Nov 1, 2023

  1. Base Model은 어떤것을 사용하셨나요? (ex: beomi/llama-2-ko-7b, EleutherAI/polyglot-ko-5.8b 등)
  2. EOS token(ex: <|endoftext|>, </s> 등)를 어디에 추가하셨나요? 보통은 아래와 같이 추가해 학습을 진행합니다.
System: 질문의 주제를 판단하세요.
User: 나는 쇼핑을 하러 백화점에 갔습니다.
Assistant: 쇼핑<|endoftext|>
  1. Batch Size는 몇 정도 사용하셨나요? 작은 batch size(1~2)일수록 좀더 빠르게 Alignment가 됩니다.

@stimong
Copy link
Author

stimong commented Nov 1, 2023

  1. Base Model: 'beomi/KoAlpaca-Polyglot-12.8B' 을 사용했습니다.

  2. 학습 데이터에 샘플입니다.
    dataset 의 'text' 값을 아래와 같이 작성하고 토크나이즈했습니다.
    """<Your role>\n질문의 주제를 판단하세요.\n문장이 부정이면 1을 반환해라.\n문장이 긍정이면 0을 반환해라.\n<User>\n문장:오늘 날씨가 좋습니다.\n<Assistant>\n0,날씨가 좋다는 긍정입니다.<|endoftext|>"""

  3. 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),
)

@Beomi
Copy link
Owner

Beomi commented Nov 1, 2023

  1. 혹시 LoRA로 학습을 진행중이신가요? 그렇다면 Full finetune을 해보시는게 좋을 수 있습니다.
  2. 베이스 모델로, 이미 파인튜닝된 beomi/KoAlpaca-Polyglot-12.8B 대신 beomi/llama-2-koen-13b 혹은 EleutherAI/polyglot-ko-12.8b 모델와 같이 사전학습된 모델을 사용하시는걸 추천합니다. 현재 Prompt형식을 KoAlpaca와는 다른 형태로 사용하시는것 같아서, 이 부분에서 모델에 성능 저하가 발생할 여지가 있어보입니다.
  3. 만약 베이스 모델을 그대로 쓰신다면 아래와 같이 포맷을 변경해 학습해보세요.
f"### 질문: {x}\n\n### 맥락: {context}\n\n### 답변:" if context else f"### 질문: {x}\n\n### 답변:", 

@stimong
Copy link
Author

stimong commented Nov 1, 2023

  1. LoRA로 학습 중입니다. Full finetune에 대해 확인해 보겠습니다.
  2. 참고해서 모델 선정해보겠습니다.
  3. 이것도 참고해 보겠습니다.

조언 주신 내용 참고해서 학습하니 같은말을 반복하는 등의 문제는 사라졌는데 아래와 같이 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: 그것은 무엇을 할 수 있나요? <-- 이부분 부터는 생성하지 않길 원합니다.

@greenyLim
Copy link

혹시 해결하셨나요? 똑같은 문제가 발생해서 여쭤봅니다..

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants