본문 바로가기
AI/LLM

[LLM] Ko-LLM 리뷰, LLaMA2 기반 한국어 파인튜닝 모델 인퍼런스

by didi0di 2023. 10. 25.
728x90

Ko-LLM

 

GPT3부터 Llama2에 이르기까지 대규모 언어모델(LLM)의 놀라운 발전은 모든 이의 이목을 끌고 있습니다.

 

[이전글] : [LLM] 거대언어모델, LLM(Large Language Model) 이란?

 

[LLM] 거대언어모델, LLM(Large Language Model) 이란?

거대언어모델, LLM 이란? 거대언어모델 (Large Language Model, LLM) 이란 쉽게 말해 대용량 언어 모델을 말한다. 대규모 데이터셋으로 학습되었으며 대규모 파라미터를 가진 언어 모델 기존의 PLM들을 대

didi-universe.tistory.com

 

 

그러나 대규모 말뭉치를 사전학습하는 LLM의 특성상 학습 데이터 중 대다수는 영어로 구정되며, 한국어는 매우 적은 비율을 차지합니다.

 

  • GPT3의 사전학습 데이터 중 한국어 비율: 0.01697%
  • Llama2 모델의 사전학습 데이터 중 한국어 비율: 0.06%

 

이 비율은 전세계 인구(7.888 billion) 중 한국어 화자(81.7M) 비율(1.035%)과 비교해도 크게 낮은 수치이며,

결과적으로 한국어 사용자가 LLM의 풍부한 능력을 경험하는 것을 매우 제한하고 있습니다.

 

특히 메타가 상업적 이용이 가능한 오픈소스 LLM인 LLaMA2 를 공개함에 따라

다양한 파인튜닝 모델들이 쏟아져 나오고 있는데, 한국어 성능이 잘 나오지 않는다는 이슈가 있습니다.

 

한국어기반 LLM 사전학습

 

가장 좋은 해결책 중 하나는 한국어 데이터로 사전학습한 자체 언어모델을 만드는 것입니다. 이러한 시도는 자본력을 갖춘 대기업의 주도로 진행되고 있습니다.

 

이러한 접근법은 LLM의 한국어 능력 부족을 가장 확실하게 해결할 수 있습니다.

 

다만 문제는 LLM의 변화속도가 너무 빠르다는 데 있습니다. LLaMA 모델이 공개된 후 Llama2 모델이 공개되기까지 고작 5개월 밖에 걸리지 않았습니다. 매주 새로운 기술이 발표되는 현 상황에서 미래 발전 방향을 정확히 예측하거나, 매번 새로운 변화에 맞춰 대규모 언어모델을 학습하는 것은 불가능합니다.

 

따라서 우리는 자체 언어모델을 학습하는 것과 병행할 수 있는 더 가볍고 빠른 방법이 필요합니다.

 

외국어기반 LLM 미세조정

 

외국어기반 LLM을 한국어로 미세조정하는 것은 이 문제에 대한 좋은 해결 책입니다.

LLaMa 모델을 기반으로 KoAlpaca, KoVicuna, KULLM, KORani와 같은 시도들이 있었습니다.

 

 

 Open Ko-LLM Leaderboard

 

한국어 LLM 들의 성능 평가를 위해, 업스테이지와 NIA가 공동으로 호스팅하고 있는 Open Ko-LLM Leaderboard에서

현재 리더보드에 상위를 차지하고 있는 Ko LLM들을 실시간으로 확인할 수 있으며, 허깅페이스 레포에서 이를 다운로드 받을 수 있습니다. 

 

https://huggingface.co/spaces/upstage/open-ko-llm-leaderboard

 

Open Ko-LLM Leaderboard - a Hugging Face Space by upstage

 

huggingface.co

 

현재 (23.10.25) 기준, Ko-LLM 리더보드에서 1위인 모델을 다운로드해서  inference 해봤습니다.

 

 

KoR-Orca-Platypus-13B

 

ko-en-llama2-13b 모델에 OpenOrca-KO데이터셋과 KOpen-platypus 데이터셋을 추가해서 파인튜닝한 모델입니다. 

 

- Base Model : hyunseoki/ko-en-llama2-13b

- Training Dataset
Version of combined dataset: kyujinpy/KOR-OpenOrca-Platypus

I combined OpenOrca-KO and kyujinpy/KOpen-platypus. I use A100 GPU 40GB and COLAB, when trianing.

 

 

라이브러리 설치

우선 필요한 라이브러리들을 설치해줍니다.

LLaMA를 사용하기 위해서 허깅페이스에서 최신 트랜스포머를 받아옵니다.

 

pip install torch
pip install git+https://github.com/huggingface/transformers # 최신 transformers 설치
pip install accelerate

 

모델 다운로드

 

대용량 파일이기 때문에 git lfs를 먼저 해줘야 합니다.

그 뒤, git clone을 이용해서 모델 관련 파일들을 다운받았습니다.

 

git lfs install
git clone https://huggingface.co/kyujinpy/KoR-Orca-Platypus-13B

 

 

모델 다운로드 관련해서 더 자세한 사항을 확인하고 싶다면 아래 포스팅을 참조하세요.

[이전글] : [LLM] LLM 모델 로컬 경로에 저장하기 + git LFS

 

 

[LLM] LLM 모델 로컬 경로에 저장하기 + git LFS

KoR-Orca-Platypus-13B 현재 Ko LLM 리더보드에서 1위중인 KoR-Orca-Platypus-13B 모델 OpenOrca-KO dataset을 활용하여 LLaMa2를 fine-tunning한 모델이라고 한다. - huggingface : https://huggingface.co/kyujinpy/KoR-Orca-Platypus-13B - git

didi-universe.tistory.com

 

토크나이저 및 모델 불러오기

 

참고로 저는 폐쇄망 환경에 모델을 반입해야 하기 때문에,

특정 경로에 관련 파일들을 다운받아서 다시 불러오는 형태로 코드를 작성했습니다.

 

### KO-Platypus
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
import torch
import accelerate


# 0. device 확인
if torch.cuda.is_available():
	device = "cuda"
else : 
	device = "cpu"
    
# 1. 경로 설정
#repo = "kyujinpy/KoR-Orca-Platypus-13B"
repo = "KoR-Orca-Platypus-13B" # 모델 파일 저장한 로컬 경로

# 2. 토크나이저 임포트
OpenOrca_tokenizer = AutoTokenizer.from_pretrained(repo) 

# 3. 모델 임포트
OpenOrca = AutoModelForCausalLM.from_pretrained(
        repo,
        return_dict=True,
        torch_dtype=torch.float16,
        device_map='auto',
        #offload_folder="offload" # CPU에서 코드 동작 테스트 시 해당 옵션 사용, GPU에서는 사용안함
)

 

모델 인퍼런스

 

인퍼런스 코드는 pipeline을 이용해서 아래와 같이 작성했습니다.

 

pipe = pipeline(
    'text-generation', 
    model=OpenOrca,
    tokenizer=OpenOrca_tokenizer,
    #device=device # GPU 이용시 해당 옵션은 사용하지 않음
)

def ask(x, context='', is_input_full=False):
    ans = pipe(
        f"### 질문: {x}\n\n### 맥락: {context}\n\n### 답변:" if context else f"### 질문: {x}\n\n### 답변:", 
        do_sample=True, 
        max_new_tokens=512, # 답변 생성 길이 파라미터로 조절
        temperature=0.7,
        top_p=0.9,
        eos_token_id=2,
    )
    print(ans[0]['generated_text'])

ask("사랑이 뭐야?")

>> ### 질문 : 사랑이 뭐야?
>> ### 답변 : 사랑은 관심, 친절, 배려, 이해, 헌신, 존중, 친절, 그리고 많은 것을 나누는 것입니다.

 

사랑에 관해 질문했더니 다음과 같이 답변해주는군요. 제법입니다 ㅎㅎ

 

 

이상으로 LLaMA2 한국어 파인튜닝 모델을 불러오고, 인퍼런스 해봤습니다.

다음은 자체 데이터셋을 가지고 파인튜닝을 진행해 볼 예정입니다.

 

[다음글] : [LLM] 오픈소스 LLM 파인튜닝 - 자체 데이터셋으로 LLaMA2 기반 한국어 LLM 파인튜닝하기 (feat. LoRA)

 

[LLM] 오픈소스 LLM 파인튜닝 - 자체 데이터셋으로 LLaMA2 기반 한국어 LLM 파인튜닝하기 (feat. LoRA)

자체 데이터셋으로 LLaMA2 파인튜닝하기 지난 포스팅에서 LLaMA2를 한국어 데이터셋으로 파인튜닝한 한국어 LLM 모델 (Kor-Orca-Platypus-13B)을 다운받아서 inference 해보고, 성능을 평가해봤습니다. [이전

didi-universe.tistory.com

 

 

 

참고

 

한국어 LLM 프로젝트

 

psymon/KoLlama2-7b · Hugging Face

For the LLaMA model, Korean was excluded from the pre-training data, so no method, including Full-Finetuning, LoRA, and QLoRA, could produce satisfactory Korean performance.

huggingface.co

https://github.com/Beomi/KoAlpaca

 

GitHub - Beomi/KoAlpaca: KoAlpaca: 한국어 명령어를 이해하는 오픈소스 언어모델

KoAlpaca: 한국어 명령어를 이해하는 오픈소스 언어모델. Contribute to Beomi/KoAlpaca development by creating an account on GitHub.

github.com

https://github.com/facebookresearch/llama-recipes/blob/main/docs/inference.md

 

 

 

728x90

댓글