LLM Optimizer: 다양한 LLM의 추론 성능을 벤치마킹하고 최적화하는 도구 (feat. BentoML)

LLM Optimizer 소개

LLM Optimizer는 BentoML 팀에서 개발한 파이썬 기반 오픈소스 툴로, 다양한 오픈소스 대규모 언어 모델(LLM)의 추론 성능을 벤치마킹하고 최적화하는 데 사용됩니다. LLM을 실제 서비스 환경에서 활용하려면 지연 시간(latency), 처리량(throughput), 동시 처리(concurrency) 등 여러 요소를 고려해야 합니다. 그러나 이러한 최적 설정을 찾는 과정은 반복적인 실험과 많은 시간을 요구합니다. LLM Optimizer는 이러한 과정을 자동화하고 시각화 도구까지 제공해, 연구자와 엔지니어가 효율적으로 최적의 환경을 구축할 수 있도록 돕습니다.

특히 이 도구는 SGLangvLLM 같은 대표적인 오픈소스 추론 프레임워크와 호환되며, 각 프레임워크의 네이티브 인자를 그대로 사용할 수 있도록 설계되었습니다. 또한 단순히 실험을 반복하는 것이 아니라, 이론적 성능 예측 기능까지 포함하고 있어 빠르게 가능한 설정 범위를 좁히고 원하는 조건(SLO, Service Level Objective)에 맞춘 환경을 찾을 수 있습니다. 이를 통해 사용자는 모델의 실제 성능 한계를 명확히 이해하고, 필요에 따라 하드웨어 및 소프트웨어 환경을 최적화할 수 있습니다.

이 프로젝트는 단순한 벤치마킹 툴을 넘어, 대규모 모델의 서비스 운영을 위한 엔드투엔드 최적화 파이프라인을 구축하는 기반 도구로 주목받고 있습니다. 특히, GPU 클러스터 환경에서 추론 효율성을 높이고, 비용 대비 성능을 극대화해야 하는 기업 환경에서 실질적인 가치를 제공합니다.

LLM Optimizer는 직접적으로 모델을 서빙하는 프레임워크는 아니며, SGLangvLLM 같은 백엔드 추론 엔진을 제어하고 최적화하는 메타 툴입니다. LLM Optimizer는 이 두 프레임워크의 네이티브 옵션을 그대로 활용하면서도, 자동화된 탐색 및 벤치마크 실행, 제약 조건 기반의 최적 설정 탐색, 대시보드 시각화 기능을 제공하여 단순히 SGLang이나 vLLM만 사용하는 것보다 훨씬 효율적인 최적화 과정을 가능하게 합니다.

LLM Optimizer의 주요 기능

  • 설치 및 시작하기: pip install -e . 명령어를 통해 간단히 설치할 수 있으며, 개발 환경에서는 pip install -e .[dev]를 사용할 수 있습니다. 설치 후 가장 빠른 시작 방법은 성능 예측 기능(estimate)을 활용하는 것으로, 모델과 GPU, 입력/출력 길이를 지정하면 예상 지연 시간과 처리량을 계산할 수 있습니다.

  • 벤치마크 실행: LLM Optimizer는 다양한 파라미터 조합을 자동으로 탐색합니다. 예를 들어, SGLang의 텐서 병렬화와 데이터 병렬화 조합, vLLM의 배치 크기 및 시퀀스 개수 조합 등을 설정해 대규모 벤치마크를 수행할 수 있습니다. 각 실험 결과는 JSON 파일로 저장되며, 이후 분석과 시각화에 활용할 수 있습니다.

  • 제약 조건 기반 최적화: 단순히 성능을 측정하는 것을 넘어, **서비스 수준 목표(SLO)**를 반영한 최적 구성을 도출할 수 있습니다. 예를 들어, “첫 토큰 지연(TTFT)이 300ms 이하” 또는 “인터 토큰 지연(ITL)이 p95 기준 50ms 이하” 같은 조건을 설정하면 해당 조건을 만족하는 결과만 필터링할 수 있습니다.

  • 시각화 기능: 저장된 벤치마크 결과는 대시보드를 통해 시각화할 수 있습니다. Pareto Frontier 분석을 지원하여, 지연 시간과 처리량 사이의 트레이드오프를 명확히 확인할 수 있으며, 여러 실험 결과를 비교하면서 가장 효율적인 구성을 도출할 수 있습니다.

  • 사용자 정의 서버 명령어: 기본적으로 지원하는 SGLang 및 vLLM 실행 방식 외에도, 사용자가 직접 서버 실행 명령어를 정의할 수 있습니다. 이를 통해 특정 환경에 맞춘 고급 설정이나 커스텀 서버 실행이 가능합니다.

  • 지원 GPU: 현재 NVIDIA H100, H200, A100, L20, L40, B100, B200 GPU를 공식 지원하며, 각 GPU의 TFLOPS 사양을 기반으로 정확한 성능 예측을 제공합니다.

LLM Optimizer 사용 예시

  • 빠른 성능 예측(Estimate) 활용: 실험에 앞서 대략적인 성능을 예측하고 싶을 때 estimate 명령어를 사용합니다. 이는 실제 벤치마크를 돌리지 않고도, 모델 크기·입출력 길이·GPU 정보를 기반으로 성능을 계산해 줍니다. 예를 들어 A100 GPU 환경에서 Llama-3.1-8B-Instruct 모델을 사용할 경우에는 다음과 같이 실행합니다:

    llm-optimizer estimate \
      --model meta-llama/Llama-3.1-8B-Instruct \
      --gpu A100 \
      --input-len 1024 \
      --output-len 512
    

    이렇게 하면 예상 지연 시간(latency), 처리량(throughput), 동시 처리(concurrency) 한계 등을 바로 확인할 수 있습니다. 특히 실험 환경이 제한적이거나 GPU 클러스터 자원을 아직 할당받지 못한 상황에서 유용합니다.

  • 다양한 하드웨어/배치 설정 실험: 모델 성능은 GPU 종류, 병렬화 전략, 배치 크기에 따라 크게 달라집니다. 예를 들어, H100 GPU 8장을 사용할 때 여러 조합을 탐색하려면 다음과 같이 실행합니다:

    llm-optimizer estimate \
      --model meta-llama/Llama-3.1-8B-Instruct \
      --input-len 2048 \
      --output-len 1024 \
      --gpu H100 \
      --num-gpus 8
    

    또는, 다음과 같이 동시성 제약 조건을 적용해 최적 구성을 찾을 수도 있습니다:

    llm-optimizer estimate \
      --model meta-llama/Llama-3.1-8B-Instruct \
      --input-len 1024 \
      --output-len 512 \
      --gpu H100 \
      --num-gpus 4 \
      --constraints "ttft:mean<300ms;itl:p95<50ms"
    

    위 명령어는 “첫 토큰 출력(TTFT; Time-To-First-Token)이 평균 300ms 미만, Inter-Token Latency(ITL)가 95퍼센타일 기준 50ms 미만” 조건을 만족하는 설정만 추천해 줍니다.

  • 실제 벤치마크 실행: LLM Optimizer는 단순 예측을 넘어서, 실제 서버와 클라이언트를 띄워 실제 요청 부하를 걸어 벤치마크를 수행할 수 있습니다. 예를 들어, 다음과 같은 명령어로 SGLang에서 다양한 텐서 병렬화/데이터 병렬화 조합을 테스트할 수 있습니다:

    llm-optimizer \
      --framework sglang \
      --model meta-llama/Llama-3.1-8B-Instruct \
      --server-args "tp_size*dp_size=[(1,4),(2,2),(4,1)];chunked_prefill_size=[2048,4096,8192]" \
      --client-args "max_concurrency=[50,100,200];num_prompts=1000" \
      --output-json sglang_results.json
    

    이 경우 총 27개의 조합(서버 9개 × 클라이언트 3개)이 자동으로 실행되고, 결과가 sglang_results.json 파일에 저장됩니다.

  • vLLM에서 배치 크기 튜닝: vLLM은 배치 크기와 병렬 시퀀스 개수에 따라 성능이 크게 달라집니다.

    llm-optimizer \
      --framework vllm \
      --model meta-llama/Llama-3.1-8B-Instruct \
      --server-args "tensor_parallel_size*data_parallel_size=[(1,2),(2,1)];max_num_batched_tokens=[4096,8192,16384]" \
      --client-args "max_concurrency=[32,64,128];num_prompts=1000;dataset_name=sharegpt" \
      --output-json vllm_results.json
    

    여기서 dataset_name=sharegpt 옵션을 주면 실제 대화 데이터 기반 요청을 보낼 수 있어, 실제 서비스 시나리오와 가까운 성능 데이터를 얻을 수 있습니다.

  • 벤치마크 결과 시각화: 실험 결과가 JSON 파일로 저장되면, visualize 기능을 활용해 웹 대시보드로 시각화할 수 있습니다:

    llm-optimizer visualize --data-file results.json --port 8080
    

    이후 웹 브라우저에서 http://localhost:8080/pareto_llm_dashboard.html 에 접속하면, Pareto Frontier 분석을 통해 “지연 시간과 처리량의 최적 균형점”을 직관적으로 확인할 수 있습니다. 아래와 같은 명령어로 여러 결과 파일을 동시에 비교하는 것도 가능합니다:

    llm-optimizer visualize --data-file "sglang_results.json,vllm_results.json" --port 8080
    
  • 사용자 정의 서버 명령어 실행: 기본 지원되는 프레임워크 외에도, 직접 서버 실행 명령어를 넣을 수 있습니다. 예를 들어, 다음과 같이 SGLang 서버를 직접 띄우고 벤치마크를 수행할 수 있습니다:

    llm-optimizer \
      --server-cmd "python3 -m sglang.launch_server --model-path meta-llama/Llama-3.1-8B-Instruct --host 0.0.0.0 --port 30000" \
      --client-args "max_concurrency=[25,50,100];num_prompts=1000" \
      --host 0.0.0.0 \
      --port 30000
    

    이 기능은 커스텀 런처나 프레임워크를 사용하는 환경에서도 유용하게 활용할 수 있습니다.

라이선스

LLM Optimizer 프로젝트는 Apache License 2.0으로 공개 및 배포되고 있습니다. 상업적 사용에도 제약이 없습니다.

:house: LLM Optimizer 공식 홈페이지

:scroll: LLM Optimizer 원문 문서

:github: LLM Optimizer GitHub 저장소




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요