Generative Models

Generative Models (생성 모델)

vLLM은 대부분의 LLM을 포함하는 생성 모델(generative model)에 대한 일급(first-class) 지원을 제공해요. 이 문서에서는 LLM 클래스를 통한 오프라인 추론(generate, beam_search, chat)과 온라인 서빙(OpenAI 호환 서버)에서 생성 모델을 사용하는 방법을 다뤄요.

출처: 문서

본문

vLLM에서 생성 모델은 VllmModelForTextGeneration 인터페이스를 구현해요. 입력의 최종 히든 스테이트(final hidden states)를 기반으로 생성할 토큰의 로그 확률을 출력하고, 이를 Sampler에 통과시켜 최종 텍스트를 얻어요.

설정

Model Runner (--runner)

--runner generate 옵션으로 생성 모드에서 모델을 실행할 수 있어요.

: vLLM이 --runner auto를 통해 사용할 모델 러너를 자동 감지할 수 있으므로 대부분의 경우 이 옵션을 설정할 필요가 없어요.

오프라인 추론

LLM 클래스는 오프라인 추론을 위한 다양한 메서드를 제공해요. 모델 초기화 시 옵션 목록은 configuration 문서를 확인하세요.

LLM.generate

generate 메서드는 vLLM의 모든 생성 모델에서 사용 가능해요. HF Transformers의 대응 메서드와 비슷하지만, 토큰화(tokenization)와 역토큰화(detokenization)도 자동으로 수행된다는 점이 달라요.

from vllm import LLM

llm = LLM(model="facebook/opt-125m")
outputs = llm.generate("Hello, my name is")

for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

SamplingParams를 전달해 언어 생성을 선택적으로 제어할 수 있어요. 예를 들어 temperature=0으로 greedy 샘플링을 사용할 수 있어요:

from vllm import LLM, SamplingParams

llm = LLM(model="facebook/opt-125m")
params = SamplingParams(temperature=0)
outputs = llm.generate("Hello, my name is", params)

for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

중요: 기본적으로 vLLM은 huggingface 모델 저장소에 generation_config.json이 있으면 모델 제작자가 권장하는 샘플링 파라미터를 적용해요. SamplingParams가 지정되지 않으면 대부분의 경우 이것이 최상의 결과를 제공해요. 다만 vLLM의 기본 샘플링 파라미터를 선호한다면 LLM 인스턴스를 만들 때 generation_config="vllm"을 전달하세요. 코드 예시: examples/basic/offline_inference/basic.py

LLM.beam_search

beam_search 메서드는 generate 위에 beam search를 구현해요. 5개 빔으로 검색하고 최대 50개 토큰을 출력하는 예시:

from vllm import LLM
from vllm.sampling_params import BeamSearchParams

llm = LLM(model="facebook/opt-125m")
params = BeamSearchParams(beam_width=5, max_tokens=50)
outputs = llm.beam_search([{"prompt": "Hello, my name is "}], params)

for output in outputs:
    generated_text = output.sequences[0].text
    print(f"Generated text: {generated_text!r}")

LLM.chat

chat 메서드는 generate 위에 채팅 기능을 구현해요. 특히 OpenAI Chat Completions API와 유사한 입력을 받아 모델의 채팅 템플릿을 자동 적용해 프롬프트를 포맷해요.

중요: 일반적으로 instruction-tuned 모델만 채팅 템플릿을 가져요. Base 모델은 채팅 대화에 응답하도록 학습되지 않아 성능이 좋지 않을 수 있어요.

from vllm import LLM

llm = LLM(model="meta-llama/Meta-Llama-3-8B-Instruct")

conversation = [
    {
        "role": "system",
        "content": "You are a helpful assistant",
    },
    {
        "role": "user",
        "content": "Hello",
    },
    {
        "role": "assistant",
        "content": "Hello! How can I assist you today?",
    },
    {
        "role": "user",
        "content": "Write an essay about the importance of higher education.",
    },
]

outputs = llm.chat(conversation)

for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

코드 예시: examples/basic/offline_inference/chat.py

모델에 채팅 템플릿이 없거나 다른 템플릿을 지정하려면 load_chat_template으로 명시적으로 템플릿을 전달할 수 있어요:

from vllm.entrypoints.chat_utils import load_chat_template

# You can find a list of existing chat templates under `examples/`
custom_template = load_chat_template(chat_template="<path_to_template>")
print("Loaded chat template:", custom_template)

outputs = llm.chat(conversation, chat_template=custom_template)

온라인 서빙

OpenAI 호환 서버는 오프라인 API에 대응하는 엔드포인트를 제공해요:

  • Completions API: LLM.generate와 비슷하지만 텍스트만 받아요.
  • Chat API: LLM.chat와 비슷하며, 채팅 템플릿이 있는 모델에 대해 텍스트와 멀티모달 입력을 모두 받아요.

더 알아보기 (Learn more)