Orion 파인튜닝

nebchi·2024년 4월 18일
0

LLM

목록 보기
6/11
post-thumbnail

Orion 파인튜닝

  • 이번에 자기소개서 첨삭 프로젝트를 진행하게 되었는데, 최종적으로 Orion 모델을 채택하게 되어, 해당 모델 파인튜닝을 진행하였습니다.

모델 선정 이유

  • Orion 모델은 2.5T 토큰으로 한국어, 일본어, 중국어, 영어 등 다양한 언어들로 학습을 하였고, 한국어 토큰은 OpenSource기준, 가장 많은 토큰으로 학습을 하여 양질의 한국어를 생성합니다.
  • Flash_attention을 사용하여 유사한 쿼리는 클러스터링하고, 특수한 쿼리만 따로 처리하여 처리 성능면에서도 우수하여 채택하게 되었습니다.

데이터 세트 구성

  • 합격한 자기소개서를 웹 사이트를 통해 수집을 하였고, 다양한 출처의 데이터셋을 수집하다보니, 특수문자와 HTML 태그가 존재하였는데, 이는 정규표현식을 통해 제거를 하여 텍스트 정규화를 수행하였습니다.
# 의미없이 반복되는 텍스트 제거
def remove_duplicates(text):
    unique_tokens = set()
    filtered_text = []
    for token in text.split():
        if token not in unique_tokens:
            filtered_text.append(token)
            unique_tokens.add(token)
    return ' '.join(filtered_text)
    
 # 정규표현식을 통한 데이터 세트에 존재하는 특수문자 제거   
 def preprocessing(text):
 	text['답변'] = text['답변'].str.replace(r'\r\n|\r|\n','')
  • 그 후, 중복된 데이터셋이 존재할 수 있어, LLM은 중복된 쿼리에 대해 과도하게 최적화가 되면 오히려 일반화 성능이 저하되기 때문에, 이를 SimHash라는 알고리즘을 통해 제거를 수행하였습니다.
# Simhash를 이용한 중복 제거 방법
import pandas as pd
import re
import hashlib

def simhash(text):
    # 전처리: 소문자 변환, 구두점 제거, 공백 제거
    text = re.sub(r'[\W_]+', '', str(text).lower())

    # 해시 함수 선택 (sha-1 사용)
    hash_func = hashlib.sha1

    # 문자열을 해시 값으로 변환
    hashed_text = [hash_func(token.encode('utf-8')).hexdigest() for token in [text[i:i+4] for i in range(0, len(text), 4)]]

    # 이진 해시 값 생성
    hash_value = ''.join([bin(int(h, 16))[2:].zfill(32) for h in hashed_text])

    # SIMHASH 값 계산
    simhash_value = ''.join(['1' if hash_value.count('1', i, i+32) > 16 else '0' for i in range(0, len(hash_value), 32)])

    return int(simhash_value, 2)
  • 마지막으로, GPT-3.5를 이용하여 대화 형식으로, 최종 데이터셋 130건에 대해 구축을 하였습니다.

채팅 템플릿 구성

  • 우선 LLM을 파인튜닝하는데, 중요한 것 중 하나가, 바로 채팅 템플릿입니다.
  • LLM 모델은 사전 학습된 데이터셋을 기반으로 최적화가 되어 있기 때문에 모델의 입력이 이와 달라지게 되면 성능이 저하가 되기 때문에 채팅 템플릿이 중요합니다.
  • 그래서 Orion의 채팅 템플릿을 알아보고자, 여러 레퍼런스를 보았지만 초보 LLM 개발자가 찾기에는 매우 적어, 초기 LLAMA2 템플릿을 적용하여 학습을 하였지만 성능은 좋지 못했습니다.
  • 고민 중에 허깅페이스의 문서 중 apply_chat_template를 찾게 되었습니다. 해당 메서드는 tokenizer에서 쓰는데, LLM 모델의 기본 채팅 템플릿을 자동으로 적용해주는 메서드 였고, 이를 통해 Orion 모델에 적용할 수 있었습니다.
  • Orion의 채팅 템플릿 형식은
    Human:\n{input}
    Assistant:\n{output}" 입니다.
# 사용 방법입니다.
def generate_prompt(example):
    output_texts = []
    for i in range(len(example['instruction'])):
        messages = [
            {"role": "user",
             "content": "{}".format(example['instruction'][i])},
            {"role": "assistant",
             "content": "{}".format(example['response'][i])}
        ]
        chat_message = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=False)
        output_texts.append(chat_message)

    return output_texts

파인튜닝

1) QLoRA

  • 지금 데이터 세트는 Instruction 데이터 셋으로 구성이 되어 있어, SFT 방식으로 파인튜닝을 진행하였습니다.
  • 모델의 추론 속도를 향상화하기 위해 양자화도 진행하였는데, 양자화 방식으로는 Bitsandbytes와 GPTQ가 있었는데, LoRA와 양자화를 동시에 진행할 수 있는 QLoRA 방식을 허깅페이스에 지원을 해주어 Bitsandbytes 양자화 방식을 채택하게 진행하였습니다.
  • LoRA 파라미터에는 lora_r과 lora_alpha가 존재하는데, 대체로 각 16,32일 때 가장 높은 성능을 발휘하여 lora_r은 16, lora_alpha는 32로 값을 설정하였고, 과적합을 방지하기 위해 lora_dropout도 설정을 해주었습니다.
  • Bitsandbytes의 파라미터로, 4비트 양자화와 비선형 양자화인 nf4를 채택하였습니다. 비선형 양자화를 채택한 이유로는 비선형 양자화는 가중치 분포의 비대칭성을 고려하여 가중치하기 때문입니다.

2) Unsloth

  • 위와 같이 파인튜닝을 하게 될 시, GPU 메모리로 약 50GB 정도 사용을 하는데, 서버 자원이 넉넉하지 않은 경우, 14B 파인튜닝을 하는데 큰 애로사항이 존재합니다.
  • 그래서 이러한 문제를 해결한 라이브러리는 Unsloth입니다.
  • 최근에 생성된 이 라이브러리는 역전파 단계를 수동으로 유도하여 필요한 메모리만 사용하게 하고, triton 커널을 사용하여 병렬연산을 사용하여 메모리 사용량을 최대 74% 줄이고, 정확도 손실은 0%가 되어 해당 방법론을 사용해보았습니다.
  • 자세한 내용은 https://huggingface.co/blog/Andyrasika/finetune-unsloth-qlora 해당 페이지 참고해주세요

파인튜닝 결과

git clone https://github.com/Beomi/ko-lm-evaluation-harness
cd ko-lm-evaluation-harness
pip install -r requirements.txt
./run_all.sh 모델이름 'GPU번호들'
# ex) ./run_all.sh beomi/llama-2-ko-7b '0,1' # 이렇게 하면 GPU0,1번에 'beomi/llama-2-ko-7b' 모델을 쪼개서 올리고 평가한다.
모델 명칭Average
n=0  n=5
HellaSwag
n=0  n=5
COPA
n=0  n=5
BooIQ
n=0  n=5
KoGPT58.2    63.755.9    58.373.5    72.945.1    59.8
Polyglot-ko-13B62.4    68.259.5    63.179.4    81.148.2    60.4
LLaMA 2-13B45.2    60.541.3    44.059.3    63.834.9    73.8
Baichuan 2-13B52.7    53.939.2    39.660.6    60.658.4    61.5
QWEN-14B47.8    66.445.3    46.864.9    68.933.4    83.5
Orion-14B-Chat68.8    73.247.0    49.677.7    79.481.6    90.7
kor-resume-Orion69.7    74.648.2    51.277.9    81.383.1    91.2
  • 파인튜닝 모델 평가는 https://github.com/Beomi/ko-lm-evaluation-harness 해당 깃허브를 이용하여 평가를 진행하였습니다.
  • 지표에 대해 설명하자면 HellaSwag는 상황에 대한 추론능력으로 LLM의 상황 이해 능력, COPA는 질문에 대하여 원인과 결과를 출력하도록 하여 LLM의 인과 관계 능력을 BoolQ는 LLM에 질문에 대하여 True, False로 출력하게 하여 평가하는 지표입니다.
  • 파인튜닝 결과 기본 모델보다 약간의 성능 향상이 존재하였습니다.
  • 처음 진행해보는 파인튜닝이였는데, 성능 향상 결과도 볼 수 있어 좋았고, 다음번에는 좀 더 다양하게 Gemma, Solar, Llama2 파인튜닝을 진행해보도록 하겠습니다.
profile
NLP Developer

0개의 댓글