학습 시간 및 리소스 질문

#1
by Se-Hun - opened

안녕하세요.
우선, 좋은 모델을 공유해주셔서 감사합니다. Q&A 관련해서는 상당히 좋은 모델인거 같습니다.

성능이 너무 좋아서 저도 모델을 재현해보고 싶은데, 학습 하시는데 있어서 어떤 장비를 사용하셨고 학습시간은 얼마나 걸리셨을까요?

안녕하세요 Se Hun님!

1.8B 모델은 16GB 정도라서 A40 48GB 4장에서 FSDP로도 충분히 수행이 됩니다.

2.Trainer를 이용한 학습에서는 max_seq_length를 512로 짧게 잡고 데이터셋을 재구성하여서 학습을 하면 되지만, instruction Q&A 데이터셋의 경우는 max_seq_length 가 중요해서 학습하시려는 데이터셋의 length 분포를 확인하시고, 점진적으로 접근하는 방법도 있습니다. 짧은건 짧은 것 대로 분류하고 긴 건 긴것대로 분류해서 파인튜닝 전략을 세우면 빨리 학습을 시킬 수 있습니다. 데이터셋 품질도 중요해서 너무 짧은 데이터들은 사실상 전부 삭제했습니다.

  1. 저는 Continued Fine tuning 방식으로 풀파인튜닝 전략으로 파라미터를 미세하게 조정하면서 파인튜닝을 했습니다. 1e-7부터요.

  2. 팁이라면 풀파인튜닝으로 시작하고, 마지막에 특정 데이터셋에 대해서는 rank 16 LoRA로 아주 강하게(?) 학습을 하여서 덮어씌었습니다. (LoRA를 지속적으로 많이 반복하면 모델에 대해서 손실이 커지거든요)

지나가다가 저도 궁금한게 생겨서 여쭤보게 되네요
LoRA는 풀파인튜닝되는 레이어를 전부 얼리고 작용하게될텐데, 공개해주신것은 풀파인튜닝에 대한 부분만 공개해주신거고, 개인적으로는 LoRA까지 활용한다는거로 이해하면 되는걸까요?
LoRA로 학습시키면 덮어씌워야 할 레이어는 사실상 다 얼어있을텐데... 어떤의민지 조금 더 알려주실 수 있나요?

This comment has been hidden

지나가다가 저도 궁금한게 생겨서 여쭤보게 되네요
LoRA는 풀파인튜닝되는 레이어를 전부 얼리고 작용하게될텐데, 공개해주신것은 풀파인튜닝에 대한 부분만 공개해주신거고, 개인적으로는 LoRA까지 활용한다는거로 이해하면 되는걸까요?
LoRA로 학습시키면 덮어씌워야 할 레이어는 사실상 다 얼어있을텐데... 어떤의민지 조금 더 알려주실 수 있나요?

안녕하세요 lllBrother님 :-)

Continued Fine tuning(풀 파인튜닝 기반) + LoRA 파인튜닝 1번으로 보시면 됩니다.

LoRA는 신규 파라미터로 학습하여서, 기존 레이어들에 합친다고 보시면 될 것 같아요. 그 후 adapter를 모델과 merge 하여 배포했기 때문에 당연히 다시 파인튜닝하실 수 있으세요.
제가 한 방식은 LoRA로만 계속 하면 손실이 크게 발생하므로 LoRA는 최종에 1번으로만 했습니다.

엇 그러면 올려주신 모델은 라마모델에 lora 웨이트가 붙어있는 형태의 모델인건가요?
뭔가 좀 멍청한 질문인거 같아서 죄송합니다 ㅠㅠ

안녕하세요. AI 초보 입니다.

파인튜닝하실 때, 프로프트 format 하고 추론할때 포멧을 알려 주실 수 있으신가요?
올려주신 모델 다운로드 받아서 알파카 포멧으로 튜닝 했는데, 추론할때도 알파카 포멧으로 추론 하니 오류가 나더라구요.

일단 아래와 같이 해 보니 동작은 잘 하는거 같습니다만, 가능한 튜닝과 추론시에 포멧을 맞추는게 좋을거 같아서요..
물론 기존 파인튜닝 하신 포멧하고 맞추면 더 좋을거 같기도 하고요

튜닝시)
alpaca_prompt_org = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.

Instruction:

{}

Response:

{}"""

추론시)
instruction = "1차 세계대전에 대해 설명해 줘"

messages = [
{
"role": "system",
#"content": "당신은 훌륭한 AI 비서입니다. 답변 중 모르는 내용이면 모른다고 답해주세요. You are a great AI assistant. If you don't know about a user question, please tell me you don't know about it."
"content": "You are a great AI assistant. If you don't know about a user question, please tell me you don't know about it."
},
{
"role": "user",
"content": instruction
},
]

마지막으로 좋은 모델 올려 주셔서 감사합니다.

@kakarooky 그거는 llama3.1 기본 프롬프트일걸요? 그래서 풀파인튠할때, apply_chat_template 이용해서 하시면 알아서 맞춰줘요

엇 그러면 올려주신 모델은 라마모델에 lora 웨이트가 붙어있는 형태의 모델인건가요?
뭔가 좀 멍청한 질문인거 같아서 죄송합니다 ㅠㅠ

풀파인튜닝과 LoRA 파인튜닝의 차이

  • 풀파인튜닝: LLM 모델을 풀 파인튜닝을 하면 모델에 구성된 전체 레이어들이 가지고 있는 모든 weights를 조정한다고 보시면 됩니다. 이 경우는 이미 많은 토큰들(15조개)이 학습된 Llama 3.1에 매우 괜찮은 결과를 낼 수 있습니다. 대신 풀파인튜닝은 LoRA 파인튜닝과 달리 아주 민감한 부분이기 때문에 AI 엔지니어들이 조심스럽게 접근하는 영역입니다. 그래서 아주 작은 민감도의 learning rate로 시작을 해서 조정을 해야 합니다. 이것도 경험이 쌓이면 어떻게 접근하는지 아실 수 있으세요.

  • LoRa 파인튜닝 : Low-Rank Adaptation는 기존 모델의 특정 레이어를 저차원(rank) 행렬로 분해하여, 학습 과정에서 이 분해된 행렬에만 새로운 지식을 학습시키는 방법입니다. LoRA는 전체 레이어의 가중치를 대체하지 않고, 추가적인 학습 가능 파라미터로 작용합니다. LoRA(PEFT)의 장점은 모듈별로 접근할 수 있다는 엄청난 장점이 있습니다. query, key, value를 포함해서 lm_head나 embed layer 등 개별로 학습을 할 수 있습니다.
    LoRA 파인튜닝은 기존 모델은 그대로 두고 rank 분해를 통해 만들어진 레이어들(기존 모델 아님)에다가 학습을 합니다. 그래서 trainer.save를 하면 adapter 파일이 있다는 것이 보이실 것입니다. 학습 이후에는 이 adapter만 가지고 있다가 기존 모델에서 불러와서 합쳐서 추론을 할 수도 있지만, 보통 기존 모델에 병합(merge)를 하여서 배포를 합니다 :-) 그 이후에는 제가 배포한 것과 같은 버전업이 된 모델이 됩니다.

풀파인튜닝은 모델에 대한 전체 레이어를 training하는 것이기 때문에 trainer.save를 하면 새롭게 weigths가 적용된 모델 자체로 저장됩니다.

LoRA는 rank를 분해해서 특정 모듈에 대해서 파인튜닝을 할 수 있다는 장점과 새로운 도메인 지식을 넣는 것이 풀 파인튜닝보다 쉽습니다. 대신 LoRA 파인튜닝을 많이 할 경우 기존 지식들에 대해서 손실이 급격하게 발생하므로 저는 LoRA 파인튜닝에서 1e-4를 넘지 않도록 하여서 학습을 하여서 합칩니다.

안녕하세요. AI 초보 입니다.

파인튜닝하실 때, 프로프트 format 하고 추론할때 포멧을 알려 주실 수 있으신가요?
올려주신 모델 다운로드 받아서 알파카 포멧으로 튜닝 했는데, 추론할때도 알파카 포멧으로 추론 하니 오류가 나더라구요.

일단 아래와 같이 해 보니 동작은 잘 하는거 같습니다만, 가능한 튜닝과 추론시에 포멧을 맞추는게 좋을거 같아서요..
물론 기존 파인튜닝 하신 포멧하고 맞추면 더 좋을거 같기도 하고요

튜닝시)
alpaca_prompt_org = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.

Instruction:

{}

Response:

{}"""

추론시)
instruction = "1차 세계대전에 대해 설명해 줘"

messages = [
{
"role": "system",
#"content": "당신은 훌륭한 AI 비서입니다. 답변 중 모르는 내용이면 모른다고 답해주세요. You are a great AI assistant. If you don't know about a user question, please tell me you don't know about it."
"content": "You are a great AI assistant. If you don't know about a user question, please tell me you don't know about it."
},
{
"role": "user",
"content": instruction
},
]

마지막으로 좋은 모델 올려 주셔서 감사합니다.

안녕하세요. 작년까지는 알파카 프롬프트 포멧을 많이 썼을 것입니다. 아마도 올해 구글 gemma가 나오면서 자체 프롬프트 포멧으로 구현하는 것을 각 모델별로 권고하게 되었습니다.
만약 카카루키님 말씀처럼 자체 프롬프트 포멧으로 구현하실 생각이시면 풀파인튜닝 전략으로 접근해서 자체 데이터들을 밀어넣어서 학습을 하시면 추론하실 때 잘 되세요. 대신 기존에 학습된 지식들이 손실은 감수할 수 밖에 없어요.

최근에는 많은 LLM 개발자분들은 직접 템플릿을 만드는 모험보다는 보통 해당 모델에서 제공하는 프롬프트 포멧으로 학습을 합니다.

Llama 3 모델의 프롬프트 포멧은 아래 참고하시면 되는데, 아래는 추론을 할 때에 대한 설명입니다.

https://llama.meta.com/docs/model-cards-and-prompt-formats/meta-llama-3

만약 저처럼 Instruct 모델(Q&A 모델)을 파인튜닝시 데이터셋 프롬프트 포멧은 다음과 같이 <|eot_id|>를 끝에 붙여주셔야 해요. end of token을 의미하므로 데이터셋의 크기가 max_seq_length 이내로 들어와야 합니다.
아래는 비씨카드 금융데이터셋을 통해서 파인튜닝용 데이터셋을 구성하는 방법입니다.

dataset = load_dataset('BCCard/BCCard-Finance-Kor-QnA', split='train')
dataset = dataset.shuffle()

def convert_prompts(example):
    return {
        "text": f"""<|begin_of_text|><|start_header_id|>user<|end_header_id|>\n\n{example['instruction']}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n{example['output']}<|eot_id|>"""
    }

train_dataset = dataset.map(
    convert_prompts,
    remove_columns=['instruction','output']
)

그리고 추론할 때는 vllm 써보세요. 매우 편리합니다.

@sh2orc
우선, 친절하게 답변 주셔서 감사합니다. (recomment가 늦어서 죄송합니다.)
제가 사실 궁금했던 점은 maywell/ko_wikidata_QA와 같은 데이터셋이 13.8만개라 리소스가 충분하지 않으면 학습하시는데 있어서 너무 많은 시간이 소요되지 않았을까 하는 의문이었습니다.
즉, 말씀하신 데이터 길이에 따른 분류 및 필터링 기법을 통해 학습을 여러번 이어 나가시면서 필터링된 데이터를 제외한 학습셋 대부분을 사용하신걸까요?
어리석은 질문일 수도 있지만... 최종적으로 모델을 만드시는 데 있어서 얼마나 많은 소요시간이 걸리셨는지 궁금합니다!

sh2orc changed discussion status to closed

Sign up or log in to comment