LinkedIn : devyulbae
Email : devyulbae@gmail.com
안녕하세요, 오늘은 LLM의 추론에 대해서 이야기해보겠습니다.
3부작으로 나누어서 진행할 생각이며, 1부는 개론, 2부는 주요 방법론, 3부는 모니터링과 테스트에 관한 이야기입니다.
목차
1. 추론
1-1. 추론(inference) 그리고 학습(training)
1-2. 추론과 학습의 차이2. LLM 추론 속도가 왜 중요한가
1. 추론

서비스에서 ML이 맡는 역할은 마치 식당에서 주방의 역할과 비슷합니다.
요구(주문)에 맞는 결과물(음식)을 생산해내는 것이 주 업무이기 때문이죠.
추론은 이미 학습이 완료된 모델이 주어진 입력에 대해 가장 적합한 예측이나 답변을 만들어내는 과정입니다. 마치 주방에서 주문에 따라 음식을 준비하는 것처럼, 추론에서는 사용자가 요청한 정보에 맞춰 모델이 결과를 신속하게 생성합니다.
특히 LLM(Large Language Model)에서의 추론은 질문에 대한 답변을 구성하는 과정을 의미합니다. 사용자가 질문을 입력하면, LLM은 문맥과 질문의 의도에 따라 가능성 높은 단어나 문장을 선택해 답변을 만들어냅니다. 이 과정은 입력된 텍스트의 의미를 분석하여, 가장 적절한 응답을 생성하기 위해 여러 단어의 조합을 순차적으로 생성하는 방식으로 진행됩니다. 또한, 추론 속도는 사용자 경험과 밀접하게 연결되어 있어, 응답의 신속성과 정확성 모두가 중요합니다.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
input_text = "What is the capital of France?"
input_ids = tokenizer(input_text, return_tensors="pt")["input_ids"]
print("Tokenized Input:", input_ids)
추론 과정의 첫 단계는 모델이 이해할 수 있는 형태로 입력을 변환하는 과정입니다. 예를 들어, 텍스트 입력을 모델이 읽을 수 있도록 토큰화하여 수치형 데이터로 변환합니다. 이때 언어 모델은 단어나 문장 구조를 파악하기 위해 사전 학습된 어휘집을 사용해 텍스트를 수치화된 벡터로 변환합니다.
from transformers import AutoModelForSequenceClassification
import torch
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
with torch.no_grad():
outputs = model(input_ids)
logits = outputs.logits
predicted_class = torch.argmax(logits, dim=-1).item()
print("Predicted Class:", predicted_class)
변환된 입력 벡터가 모델로 전달되면, 모델의 각 층을 통과하면서 패턴과 문맥을 분석하게 됩니다. LLM의 경우, 트랜스포머 구조를 통해 입력된 문장의 문맥과 연관성을 계산하고, 각 단어의 의미를 파악하여 다음에 나올 단어 또는 문장을 예측하는 데 필요한 확률을 계산합니다.
이때, LLM은 입력의 모든 단어와 토큰을 기반으로 문맥을 분석하며, 최종 출력까지 전달될 각 단계마다 주어진 확률을 기반으로 가장 적합한 응답을 생성합니다.
labels = ["Non-Fact", "Fact"]
response = labels[predicted_class]
print("Response:", response)
모델이 생성한 예측 벡터는 다시 사람이 이해할 수 있는 텍스트 형태로 변환됩니다. 이 후처리 단계에서는 추론 결과로 나온 각 토큰을 조합해 문장 형태의 응답을 만듭니다.
특정 응용에서는 결과 응답을 다듬거나 필요 없는 문구를 제거하여, 보다 일관된 문장으로 사용자에게 전달하는 작업이 포함됩니다.
def provide_response(response):
print("Answer:", response)
provide_response(response)
최종적으로 후처리된 응답이 사용자에게 전달되며, 사용자는 질문에 대한 답변을 얻게 됩니다. 이 과정은 실제 애플리케이션에서 빠르게 진행될 필요가 있으며, 특히 실시간 인터페이스에서는 추론 속도를 최적화해 사용자 경험을 개선하는 것이 중요합니다.
학습은 모델이 방대한 데이터로부터 의미 있는 패턴과 지식을 축적하는 과정입니다. 마치 요리사가 다양한 재료와 레시피를 연습하면서 요리 실력을 키워 나가는 것과 유사합니다. 학습 단계에서는 모델이 다양한 입력과 그에 따른 올바른 출력을 학습하면서, 주어진 문제에 대해 더 나은 예측을 할 수 있도록 모델의 가중치와 편향을 조정해 나갑니다.
import pandas as pd
# 가상의 데이터 수집 및 전처리
data = {"question": ["What is the capital of France?", "Who is the president of the USA?"],
"label": [1, 1]} # 1: Fact
df = pd.DataFrame(data)
df["input_ids"] = df["question"].apply(lambda x: tokenizer(x, return_tensors="pt")["input_ids"])
print("Preprocessed Data:\n", df.head())
모델 학습에 필요한 데이터를 수집하고 정제하여, 학습에 알맞은 형태로 가공합니다. 예를 들어, 텍스트 데이터에서는 불필요한 기호나 중복 단어를 제거하는 작업을 수행합니다.
from transformers import Trainer, TrainingArguments
# 훈련 설정
training_args = TrainingArguments(output_dir="./results", num_train_epochs=1)
trainer = Trainer(model=model, args=training_args, train_dataset=df)
# 모델 학습
trainer.train()
모델에 입력 데이터를 제공하고, 그에 따른 예상 출력과 실제 출력 간의 차이를 줄이기 위해 모델의 파라미터를 조정합니다. 이 과정에서 경사하강법이나 역전파(backpropagation)와 같은 알고리즘이 사용되며, 이를 반복적으로 수행하여 예측의 정확도를 높입니다.
# 검증 데이터셋을 이용해 평가
eval_result = trainer.evaluate()
print("Evaluation Result:", eval_result)
학습이 끝난 모델의 성능을 평가하고, 새로운 데이터에 대해 일반화할 수 있는지 검증합니다. 평가 지표를 기반으로 모델의 성능을 확인하고, 필요한 경우 모델을 다시 조정하거나 하이퍼파라미터를 튜닝합니다.
| 구분 | 학습 (Training) | 추론 (Inference) |
|---|---|---|
| 목적 | 모델 성능 향상 | 사용자 요청에 대한 응답 |
| 주된 작업 | 데이터로부터 패턴 학습 | 학습된 패턴을 사용해 예측 |
| 빈도 | 초기 구축 및 정기적 업데이트 | 실시간 요청에 대한 응답 |
| 사용 데이터 | 전체 데이터셋 | 개별 입력에 대한 예측 |
학습과 추론은 AI 모델의 성능과 실용성을 뒷받침하는 두 축으로, 서로 다른 역할을 수행하지만 상호 보완적인 관계를 갖고 있습니다. 학습은 모델이 데이터를 통해 지식과 패턴을 쌓아가는 과정으로, 이후 다양한 상황에 대응할 수 있는 기반을 마련해 줍니다. 반면, 추론은 이렇게 학습된 모델이 실제 서비스에서 사용자 요청에 즉각적으로 응답하는 단계로, 사용자가 체감하는 AI의 기능과 성능이 직결됩니다.
따라서, 학습은 모델의 ‘뇌’를 훈련시키는 과정이라면, 추론은 그 뇌가 실제 문제를 해결하는 순간입니다.
2. LLM 추론 속도가 왜 중요한가
구글 검색 엔진은 세계에서 가장 빠르고 효율적인 정보 검색 시스템 중 하나로, 사용자에게 몇 초 이내에 수많은 웹 페이지 중에서 가장 적합한 결과를 제공합니다. 구글의 속도와 효율성은 단순히 기술적 성과를 넘어, 사용자가 신뢰하고 자주 이용하게 만드는 핵심 요소입니다. LLM에서도 이와 유사하게, 빠른 추론 속도는 사용자에게 즉각적이고 신뢰성 높은 응답을 제공하는 중요한 요소로 작용합니다. 사용자는 빠르고 정확한 정보를 원하며, 추론 속도가 느릴 경우 사용 경험이 저하될 수 있습니다.
HCI(Human-Computer Interaction)에서 빠른 응답은 중요한 역할을 합니다. 응답의 지연은 사용자에게 답답함과 대화가 끊기는 듯한 느낌을 줍니다. 따라서 빠른 응답은 대화형 기능을 제공하는 LLM에서 필수적이라고 할 수 있습니다.
빠르고 정확한 응답은 사용자에게 신뢰를 줍니다. 예를 들어, AI가 사용자의 요청에 빠르게 응답할수록 사용자에게 ‘이 AI는 나의 요구를 잘 이해하고 신속하게 처리한다’는 인식을 심어줄 수 있습니다. 이는 사용자들이 AI를 더 자주 사용하게 만드는 중요한 요소입니다.
특히 고객 지원 챗봇이나 실시간 정보를 제공하는 대화형 인터페이스에서는 추론 속도가 몰입도에 큰 영향을 미칩니다. 느린 응답은 사용자가 대화에서 이탈하게 만들 수 있지만, 신속한 응답은 사용자의 몰입도를 높여 더 오랜 시간 AI와 상호작용하도록 유도합니다.
LLM은 추론 과정에서 많은 컴퓨팅 리소스를 소모합니다. 추론 속도가 느리면 동일한 요청 수를 처리하기 위해 더 많은 인프라가 필요하며, 이는 곧 비용 증가로 이어집니다. 반면, 추론 속도가 최적화되면 서버와 GPU 자원을 효율적으로 사용하여 배포 비용을 절감할 수 있습니다.
빠른 추론 속도는 동일한 시간 동안 더 많은 요청을 처리할 수 있게 해주므로, 비용 대비 효율성이 크게 향상됩니다. 이는 클라우드 기반 AI 서비스 제공자에게 매우 중요한 요소이며, 효율적 리소스 사용을 통해 더 많은 사용자 요청을 수용할 수 있게 합니다.
LLM 기반의 대규모 서비스에서 추론 속도는 확장성과 직결됩니다. 만약 추론 속도가 최적화되지 않으면 트래픽 증가 시 성능이 저하되거나 비용이 급증할 위험이 있습니다. 따라서 추론 속도를 최적화함으로써 대규모 환경에서도 안정적인 서비스를 유지할 수 있으며, 서비스의 유연한 확장이 가능합니다.
요약하자면, LLM 추론 속도는 사용자 경험과 배포 효율성 측면에서 매우 중요한 요소입니다. 빠른 응답은 사용자에게 신뢰감과 몰입도를 제공하고, 배포자에게는 리소스 최적화와 비용 절감의 기회를 줍니다.
다음 글에서는 LLM 추론 속도를 높이기 위한 주요 최적화 방법에 대해 다뤄보겠습니다.