대회 후기

24 국립국어원 인공지능 말평 문맥 추론 과제 후기

주디언니 2024. 8. 26. 23:30
한국어 LLM을 경험해볼 수 있고 과제가 재밌었던 대회

1. 대회 개요

-Malpyeong-Leaderboard/Korean : 허깅페이스 리더보드

 

국립 국어원에서 주최하는 대회로 , 제가 듣기론 매년 진행한 것으로 알고 있습니다.

과제 유형은 매년 바뀌는 것 같습니다.

데이콘에서 진행하는 대회와 형식은 유사하며 하루 5회 리더보드 제출이 가능했습니다. 

한가지 특이한 조건이 

- 개발한 모델은 RTX 4090 24GB 1개에서 구동 가능하여야 한다.

였습니다. 

맥락 추론 과제

 

두가지 과제가 있는데 , 맥락 추론 과제(데이터 증강 불가)에 참여했습니다.

 

🔺 팀원 구성

팀장 : 비전공 학부생(이시지만 뛰어나셨던 ..)

팀원 : 관련 전공 학부생 3명

 

🔺 진행 기간 : 0724 ~ 0823 (약 한달) 

다른 대회에 집중하고나서 일정을 맞춰서 기간이 3주 줄어든걸 팀원끼리 많이 아쉬워하며 끝냈습니다.ㅠㅠ

Notion을 좋아하는 작성자

🔺 진행 방식 : Discord 매주 1~2회 비대면 미팅 , Notion에 Accuracy 리포팅

 


2. 진행

2.1. LLM 모델 선정

초반엔 팀원들끼리  GPU 여건상 12B 이하의 LLM 모델을 베이스라인 코드로 저희 데이터셋에 테스팅해서 성능 비교를 했습니다.

yanolja-eeve 10.8B , kogpt2, koalpaca 5.8B, gemma 등 각자의 기준대로 선정한 LLM 모델들이 있었습니다.

그러고 추후에는 최종 선정된 모델에 대해 경량화 되는 방안 / 성능 높이는 방안 을 토의하기로 했습니다.

 

저는 yanolja -eeve 모델( 업스테이지의 SOLAR-10.7B-v1.0 모델을 한국어 어휘로 학습한 모델 )을 선정했는데요 ,

🎁 선정 이유는 다음과 같습니다.

 

1️⃣. '올해의 한국어 LLM' 에 선정(24.04)된 pretrained model

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

위의 리더보드만 보면 벤치마크 데이터셋 선택부터 복잡해 보이는데,

출처 : AI HUB

해당 9가지 지표에서 우승한 것 같습니다. 

특히 , Instructed 모델은 명확한 지침에 따라 작업을 수행하도록 설계되어 있어, 원하는 결과를 더 잘 도출할 수 있습니다.

Instruction-tuned 모델  version이 있는 모델 중 가장 성능이 높았습니다.

 

Reference

- 논문

- 허깅페이스 모델 링크

- EEVE Korean 10.8B v1.0 모델

- EEVE Korean Instruct 10.8B v1.0 모델

 

2️⃣. 졸업 프로젝트 사용 경험

제 파트가 아니었지만 , LLM 파트 팀원이 로컬 llm으로 구동 가능한 모델들을 테스트하여 eeve가 최종적으로 선정되었고 

당시 ollama를 활용하여 gguf 파일 등이 google cloud storage에 탑재되어 있습니다. 

결론적으로 시스템 프롬프트를 수정하여 로컬로 구동할건 저희 task엔 아니었지만 , 어쨌든 익숙한것이 좋아 선택했습니다.

 

결론적으로  yanolja - EEVE Korean Instruct 10.8B  모델이 선정되어 앞으로의 성능 개선에 모델을 통일했습니다.

 

2.2. LLM 경량화

LLM 모델에 대한 첫 인상이 , ' 우선 너 이걸 잘 쓸 수 있겠니? ' 였습니다.

Notion eeve-2.8B 이슈 보고 모습

 

Colab Pro를 구매해서 A100으로 eeve-2.8B 학습에 성공해도

추론 구동시  GPU RAM이 24GB 를 넘을까 말까 아슬했습니다.

10.8B 를 어떻게 돌릴까 막막하던 찰나 , 교내에서 수강한 자연어처리 수업에서 배웠던 LoRA 가 생각났습니다.

LoRA 설명 ppt 출처 : “Towards a Unified View of Parameter-Efficient Transfer Learning”, ICLR 2021

LoRA는 특정 가중치 행렬의 저차원 근사(Low-Rank Approximation)를 학습하는 방식으로, 전체 모델의 가중치를 변경하지 않고도 새로운 작업에 맞게 조정합니다. 학습 시 필요한 파라미터 수를 크게 줄일 수 있습니다.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("yanolja/EEVE-Korean-Instruct-10.8B-v1.0")

for name, module in model.named_modules():
    print(name)
    
# 출력 결과
model
model.embed_tokens
model.layers
model.layers.0
model.layers.0.self_attn
model.layers.0.self_attn.q_proj
model.layers.0.self_attn.k_proj
model.layers.0.self_attn.v_proj
model.layers.0.self_attn.o_proj
model.layers.0.self_attn.rotary_emb
model.layers.0.mlp
model.layers.0.mlp.gate_proj
model.layers.0.mlp.up_proj
model.layers.0.mlp.down_proj ... 생략

해당 명령어를 수행하면 LLM 모델의 모듈들을 볼 수 있습니다 .

저는 target_modules를 존재하는 모든 모듈에 적용하고 싶었습니다. ( 다른 글을 보니 pkv( projection key, value 즉 attention 메커니즘에 적용되는 곳)에 적용해도 미미하게 차이가 난다고 했습니다. ) 

lora_config = LoraConfig(
    r=4,
    lora_alpha=8,
    lora_dropout=0.05,
    target_modules=['q_proj', 'k_proj', 'v_proj', 'o_proj', 'gate_proj', 'up_proj', 'down_proj'],
    bias='none',
    task_type='CAUSAL_LM'
)

설정된 LoRA가 해당 모듈들에 모두 적용되도록 구성되어 있습니다.

nf4_config = BitsAndBytesConfig(
    load_in_4bit=True,  # 4비트 양자화 설정
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=torch.bfloat16
)
# 양자화된 모델을 학습하기 전, 전처리
model = prepare_model_for_kbit_training(model)
model = get_peft_model(model, lora_config)

또한 4비트 양자화를 설정하여 획기적으로 메모리 부담을 줄이고자 했습니다.

이로써 QLoRA 설정을 마쳤습니다.

 

🎁 EEVE-Korean-Instruct-10.8B-v1.0 + QLoRA 4비트 양자화 적용한 결과

학습 - 8GB 추론 - 22GB - L4 GPU

 

확실히 학습할때 vRAM이 더 여유로워진 모습을 볼 수 있습니다. 

 

해당 방법이 당시 제일 accuracy가 높은 방법이라 학습/ 테스트 코드를

팀원들에게 드려서 베이스라인 코드로 설정되어 실험을 진행했습니다. 

 

2.3. few-shot Prompting

1️⃣ 추론시 항상 동일한 one-shot - 나의 실험 (🔺1.5%)

2️⃣ train시 few-shot - 팀원의 실험 (🔺4.7%)

3️⃣ 추론시 유형별로 few-shot - 나의 실험 (🔺3.3%)

 

1️⃣  시스템 메시지를 yanloja-eeve에서 권장하는 메시지로 바꾸었습니다.

        PROMPT = '''
        A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions.

        Instructions:
        1. The assistant must understand the context of the user's question.
        2. The assistant should avoid ambiguous responses.
        3. The assistant should base its answer on the provided context and options.
        '''

 

또한 , one - shot 을 프롬프트 템플릿에 주었습니다.

 

 

2️⃣ 다음과 같이 data.py에서 현재 예제를 제외한 다른 예제를 만들어서 few-shot을 주었고 , 해당 방법이 제일 성능이 좋았습니다.

        def generate_few_shot_examples(current_example, all_examples):
            few_shots = []
            for i, example in enumerate(all_examples):
                if i >= self.num_few_shots:
                    break
                if example != current_example:  # 현재 예제는 제외
                    few_shots.append(make_chat(example["input"]))
                    target_answer = ""
                    if example["output"] == "inference_1":
                        target_answer = f"A. {example['input']['inference_1']}"
                        ... 생략

3️⃣ 5가지 유형에 대해 각각 shot을 만들어서 few-shot을 만들었습니다. 

 

과제마다 하나의 적절한 추론문과 두 개의 부적절한 추론문이 제시되며, 모델이 참고하는 추론문 유형은 원인’, ‘후행 사건’, ‘전제 조건’, ‘내적 동기’, ‘감정 반응 다섯 가지이다. 

 

train에 적용도 해봤지만 과적합이 일어났는지 추론할때 만든게 더 좋았습니다.

 

 

2.4. 기타 나의 시도 - GPU 분산처리 DeepSpeed

🎁 목적 : 모델의 파라미터를 GPU 간에 분산하여, 더 큰 모델을 훈련하거나 추론할 수 있도록 돕습니다.

이를 위해 GCP에서 개발을 시작했고 , GPU를 2개로 늘려주었습니다.

 

GCP 개발

2024.08.26 - [AI 프로젝트] - Google Cloud Platform 에서 GPU 세팅하기

 

Google Cloud Platform 에서 GPU 세팅하기

1. 코랩 개발로는 딥러닝 개발에 한계가 있을때2. 채용 조건에 AWS , GCP 클라우드 서비스 경험 우대더보기Reference1. GCP GPU 설정부터 드라이버 설치까지 2. VScode SSH 설정3. miniconda 설치4. GCS에서 compute

beluga-coding.tistory.com

 

다양한 라이브러리를 조사하여, 그 중에서 커뮤니티도 크고 config만 잘 만들면 적용할 수 있는  DeepSpeed (MS) 를 선정하여 테스트해봤습니다. config 는 다음과 같이 구성했습니다. 

    "zero_optimization": {
      "stage": 2,
      "offload_optimizer": {
        "device": "none",
        "pin_memory": true
      },

 

메모리 사용량을 실시간으로 볼 수 있는 명령어를 수행하면 , 다음과 같이 GPU 0과 1에 차례대로 분산되다가 펑 터져버리고 맙니다. 나중에 공식 문서를 보니 Stage 3는 모델의 파라미터 자체를 분할하여 메모리 사용을 더욱 최적화 시켜준다고 했습니다 . 다만 시간 부족으로 stage 3로 다시 시도하진 않았습니다.

 


 

3. 결과 

EEVE-Korean-Instruct-2.8B-v1.0 74.38
EEVE-Korean-Instruct-10.8B-v1.0 + PEFT 89.09
EEVE-Korean-Instruct-10.8B-v1.0 + PEFT + few-shot 93.71

 

리더보드 (23등/62팀)

 

아쉽긴 합니다 ..ㅠ 시간도 부족했어서 팀원들끼리 더 아쉬워했지만 배우는게 많다고 했어서(저 또한) 뿌듯했습니다. 

 


4. 아쉬웠던 점 + 개선할 점

이 대회가 전국민 대상인지라 얼핏 듣기로는 다양한 연구실의 석박사님들도 참여하는것 같습니다. 

 

다음에 더욱 많은 팀원들과 비슷한 llm 대회에 참여할 수 있다면 초반 GCP GPU 세팅 +  실험 계획 세우기 / 변인통제에 더욱 신경쓸것 같습니다.

구체적으로 다음을 더 개선해볼것 같습니다.

 

1. peft 의 다양화

adapter , prefix-tuning 등 다양한 방법이 있습니다. 

또한 모듈에 QloRA 적용하는 방식도 여러가지였습니다 .

 

2. 모델 선정 

LLM 실험이 처음인 분들이 많기도 하고 시간부족으로 어쩌다보니 야놀자-eeve 모델이 선정된 감도 있습니다.

다음에는 벤치마크 데이터셋별로 실험한 결과를 보면서 대회에 맞는 모델을 다 같이 5개정도 토의해보면서 선정해보고 싶습니다.

3. 실험 결과 분석

23년도 AI 말평 대회에서 2등하신 분의 글입니다.https://arca.live/b/alpaca/89695084?mode=best

logit 분석

저는 저번 음성 대회에서도 느꼈는데 , 검증 데이터셋으로 실험한 결과 데이터를 분석해보는게 매우매우 중요한것 같습니다. 우승자 후기를 보면 많이 배웁니다.

 

4. 기타 - 과적합 방지, 실험 리포트, 파라미터 바꾸기

 

 


이렇게 짧지만 ko-LLM 체험기를 마칩니다 ! 역시 NLP는 데이터셋 보는게 재밌어요 !  ☺️ 

그리고 LLM 성능 올리기는 예전 NLP랑 느낌이 다른것 같습니다 !!  기회가 된다면 LLM 대회 또 참여하고 싶습니다 :-) 

재밌었어요 팀원들 ~~