[LLM] LLM 모델의 평가 지표 (LogicKor, TTFT)

건희·2024년 11월 30일
0

서비스에 사용할 모델 선정 시에는 모델 간의 성능 수치를 비교를 진행하여, 높은 성능을 보이는 모델을 최종적으로 선정하게 된다.

작년, 학부 연구생이었을 때는 Vision 쪽 연구(Object Detection)를 쭉 진행했었는데, 이 분야에서는 mAP(mean Average Precision)라 불리는 평가 지표(객체를 얼마나 높은 정확도로 검출하는지, 또는 탐지율은 어느정도가 되는지)와, FPS(Frames Per Second)를 사용하곤 했다.

LLM 모델도 마찬가지로 어느정도의 정확도를 보이는지, 그리고 속도는 어떻게 되는지에 대한 평가 지표가 사용된다.

이 글에서는 LLM에 사용되는 평가지표에 대하여 다뤄보려 한다.

한국어 LLM모델에 사용되는 평가지표는 일반적으로 두가지이다.
1. LogicKor
2. TTFT

LogicKor

LogicKor 는 42가지의 예시 질문지를 토대로 LLM 모델로 LLM 모델을 평가하는 방식이다. 여기서 평가를 내리는 모델은 Open AI의 모델을 API키로 불러와 사용한다.

먼저, LogicKor 평가를 로컬에서 수행하기 위해서는 https://github.com/instructkr/LogicKor 를 다운받아 진행한다.

LogicKor을 사용해 모델 평가를 진행할 때, 사용되는 주요 파일은 다음과 같다.
1. questions.json
2. generator.py
3. evaluator.py

평가 순서는 간단하다.

1. questions 질문 세트에 대한 모델의 output 기록

{"id": 1, "category": "추론(Reasoning)", "
questions": ["각국의 법률에서는 정의라는 개념이 자주 등장하며, 
법령의 형성과 해석에 있어 매우 중요한 부분을 차지한다. 하지만 정의란 
명확히 규정할 수 없는 개념이기에 해석의 논란이 있을 수 있다. 
그렇다면 사회구성원의 대다수가 납득할 수 있는 보편적 정의를 입증하는 
방법은 무엇일지 생각해보아라.", "위 답변을 영어 문장 3개로 요약한 후. 
해당 문장에 있는 단어 3개를 선택하여 단어의 의미를 설명해라."], 
"references": [null, null]}

와 같은 질문을 모아놓은 questions.json 파일이 존재한다.
generator.py에서 questions.json 에서 질문을 읽어와 모델의 답변을 도출한 후, 새로운 결과 파일에 기록한다.

LogicKor에서는 모델을 어떻게 불러올까?
generator.py에서 사용하는 모델은 aphrodite프레임워크 또는 vllm 프레임워크의 LLM 클래스를 사용해 모델을 불러오게 된다.
나의 경우 LogicKor로 모델 평가를 진행할 때 파인튜닝한 모델을 평가하고 싶은데, qLoRA 4bit 양자화를 진행하여 파인튜닝을 진행한 Peft모델을 불러오기 위해서는 추가적인 코드 작업이 필요했다.

같은 상황의 독자라면, 아래의 VLLM 공식 문서를 참고하여 코드를 수정해 평가를 진행할 수 있다.

https://docs.vllm.ai/en/v0.5.5/models/lora.html

2. output 기록에 대해 OpenAI 모델로 평가 수행

evaluator.py 파일로 평가를 수행한다.

3. 최종 score 출력

score.py 파일로 최종 score를 출력한다.



TTFT

TTFT(Time To First Token) 평가지표는 모델의 input에 대한 ouput까지의 시간을 측정하는 것으로, 구현은 정말 간단하다.

import time
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_name = "gpt2"  # TTFT 측정 원하는 LLM 모델
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 입력
input_text = "What is the capital of France?"

# TTFT 측정을 위한 함수
def measure_ttft(input_text):
    inputs = tokenizer(input_text, return_tensors="pt")

    start_time = time.time() # 시간 측정 시작

    with torch.no_grad():
        outputs = model.generate(
            **inputs, 
            max_length=50,
            num_return_sequences=1
        )

    # 첫 번째 토큰이 생성된 시간 (TTFT 결과)
    ttft = time.time() - start_time
    return ttft, tokenizer.decode(outputs[0], skip_special_tokens=True)

# TTFT 측정
ttft, output_text = measure_ttft(input_text)

print(f"TTFT (Time to First Token): {ttft:.4f} seconds")
print(f"Generated Text: {output_text}")

위의 코드처럼 model의 입력으로 넣기 바로 전, 시간 측정을 시작한다.
그리고 모델의 Output이 나오고 측정을 종료한다.

여기서 중요한 점은 모델 간 TTFT를 측정하여 비교하는 경우, 모델의 Output max_length 를 동일하게 설정해주어야 같은 조건에서 평가를 진행할 수 있다는 것이다.

profile
💻 🍎

0개의 댓글