본문 바로가기
  • 머킹이의 머신로그
AI/코드 실습하기

vLLM 이란 뭘까?

by 머킹 2024. 8. 29.
728x90

[vLLM]코드 실습 vLLM 이란 뭘까?

 

안녕하세요. 머킹입니다.

vLLM을 사용하고자 vLLM에 대해서 조금 알아보았습니다.

아래 examples 예제도 많으니 꼭 시도해보세요!

 

 

vLLM: 대형 언어 모델 서빙의 새로운 기준

대형 언어 모델(LLM)은 오늘날 다양한 응용 프로그램에서 핵심적인 역할을 하고 있습니다.

이러한 모델을 효과적으로 배포하고 실시간으로 서비스하는 것은 점점 더 중요한 과제가 되고 있습니다.

여기서 등장하는 것이 바로 vLLM입니다. vLLM은 대형 언어 모델을 고성능, 저지연으로 서빙하기 위해 설계된 라이브러리입니다. 

vLLM의 주요 기능

1. 고성능 서빙:

vLLM의 가장 큰 강점 중 하나는 PagedAttention이라는 기술을 사용하여 메모리 관리와 처리 성능을 극대화한다는 점입니다. 이 기술을 통해 대기 중인 요청을 연속적으로 처리할 수 있으며, 이를 통해 고처리량을 유지하면서도 낮은 지연 시간을 실현할 수 있습니다. 이로 인해 vLLM은 실시간 응용 프로그램에서 특히 강력한 성능을 발휘합니다.

2. 유연한 배포 및 확장성:

vLLM은 Hugging Face와 같은 다양한 모델 허브에서 모델을 가져올 수 있으며, Tensor Parallelism과 Pipeline Parallelism을 지원하여 여러 GPU에 걸쳐 모델을 분산 배포할 수 있습니다. 이를 통해 대규모 데이터 처리와 추론 작업에서 탁월한 성능을 제공합니다. 또한, vLLM은 GPU뿐만 아니라 NVIDIA 및 AMD 환경에서도 최적화되어 있습니다.

3. API 호환성:

vLLM은 OpenAI API와 호환되는 서버를 설정할 수 있습니다. 이를 통해 기존에 OpenAI API를 사용하던 애플리케이션을 vLLM으로 대체하거나 보완할 수 있습니다. 예를 들어, OpenAI의 completions 및 chat 엔드포인트를 완벽하게 지원하여, OpenAI API 기반의 서비스를 쉽게 자가 호스팅할 수 있습니다.

4. 양자화 지원:

vLLM은 GPTQ, AWQ, FP8 KV Cache와 같은 다양한 양자화 기법을 지원합니다. 이를 통해 모델의 메모리 사용량을 줄이고, 특히 GPU에서 실행 시 성능을 최적화할 수 있습니다. 양자화된 모델은 대규모 인퍼런스를 실행할 때에도 높은 성능을 유지할 수 있습니다.

5. 스트리밍 출력 및 프리픽스 캐싱:

vLLM은 실시간 스트리밍 출력을 지원하여 실시간 응답이 필요한 애플리케이션에서 유용하게 사용할 수 있습니다. 또한, 실험적인 기능인 프리픽스 캐싱(prefix caching)을 통해 특정 시나리오에서 성능을 더욱 향상시킬 수 있습니다.

 


 vLLM Examples

여기 examples 에 들어가보면 정말 엄청 많은 케이스가 있습니다~!

 

그중에 하나인 LLM Engine Example입니다.

import argparse
from typing import List, Tuple

from vllm import EngineArgs, LLMEngine, RequestOutput, SamplingParams
from vllm.utils import FlexibleArgumentParser


def create_test_prompts() -> List[Tuple[str, SamplingParams]]:
    """Create a list of test prompts with their sampling parameters."""
    return [
        ("A robot may not injure a human being",
         SamplingParams(temperature=0.0, logprobs=1, prompt_logprobs=1)),
        ("To be or not to be,",
         SamplingParams(temperature=0.8, top_k=5, presence_penalty=0.2)),
        ("What is the meaning of life?",
         SamplingParams(n=2,
                        best_of=5,
                        temperature=0.8,
                        top_p=0.95,
                        frequency_penalty=0.1)),
        ("It is only with the heart that one can see rightly",
         SamplingParams(n=3, best_of=3, use_beam_search=True,
                        temperature=0.0)),
    ]


def process_requests(engine: LLMEngine,
                     test_prompts: List[Tuple[str, SamplingParams]]):
    """Continuously process a list of prompts and handle the outputs."""
    request_id = 0

    while test_prompts or engine.has_unfinished_requests():
        if test_prompts:
            prompt, sampling_params = test_prompts.pop(0)
            engine.add_request(str(request_id), prompt, sampling_params)
            request_id += 1

        request_outputs: List[RequestOutput] = engine.step()

        for request_output in request_outputs:
            if request_output.finished:
                print(request_output)


def initialize_engine(args: argparse.Namespace) -> LLMEngine:
    """Initialize the LLMEngine from the command line arguments."""
    engine_args = EngineArgs.from_cli_args(args)
    return LLMEngine.from_engine_args(engine_args)


def main(args: argparse.Namespace):
    """Main function that sets up and runs the prompt processing."""
    engine = initialize_engine(args)
    test_prompts = create_test_prompts()
    process_requests(engine, test_prompts)


if __name__ == '__main__':
    parser = FlexibleArgumentParser(
        description='Demo on using the LLMEngine class directly')
    parser = EngineArgs.add_cli_args(parser)
    args = parser.parse_args()
    main(args)

 

이 예제를 보면서 제 코드에도 적용하려고 했는데..

잘 안되더라구요. 어떻게 하면 좋을지 계속 시도해보고자 합니다!

 

 

https://docs.vllm.ai/en/latest/index.html

> vLLM 공식 docs 사이트