주:

Oracle Cloud Infrastructure Compute에서 vLLM으로 간단한 LLM 추론 벤치마킹 시스템 설정

소개

시스템의 성능 특성을 이해하면 구성 요소와 구성 요소에 대한 정보를 기반으로 선택할 수 있습니다. 이 자습서에서는 AI LLM(대형 언어 모델) 추론을 위한 완전한 벤치마킹 시스템을 설정합니다. 이를 통해 LLM에 대한 특정 Oracle Cloud Infrastructure(OCI) Compute 구성의 적합성을 평가하고 다양한 LLM을 서로 비교하기 위한 성능 요구사항을 평가하는 등 다양한 실험을 실행할 수 있습니다.

이 자습서에서는 최신 LLM의 여러 상태를 지원하는 인기 있는 오픈 소스 추론 서버 vLLM을 사용하고, 해당 모델을 효율적으로 제공하기 위해 매우 중요한 성능 최적화를 제공하며, 수천 건의 동시 요청을 처리할 수 있습니다. 또한 벤치마크를 실행하기 위해 Ray LLMPerf를 사용합니다.

참고: 이 자습서에서는 GPU 할당량이 있는 OCI 테넌시가 있다고 가정합니다. 할당량에 대한 자세한 내용은 컴퓨트 할당량을 참조하십시오.

목표

필요 조건

작업 1: 네트워크 구성

이 작업에서는 벤치마크를 실행하기 위한 기능 및 보안 설정을 제공하도록 VCN(가상 클라우드 네트워크)을 구성합니다. 이 예에서는 하나의 공용 서브넷과 하나의 전용 서브넷이 있는 VCN이 필요합니다. VCN 설정 마법사를 사용하거나, 보안 목록에서 SSH 액세스를 허용하고 NAT 게이트웨이가 프라이빗 서브넷에 지정되도록 모든 구성요소를 수동으로 설정할 수 있습니다.

테스트 중인 전용 및 공용 서브넷, 배스천 호스트 및 GPU VM으로 구성된 솔루션 아키텍처 개요

OCI 컴퓨팅 인스턴스를 프로비저닝하고 벤치마크 설정을 진행하기 전에 네트워크 설정이 올바르게 구성되었는지 확인해야 합니다. 기본적으로 프로비전된 네트워크는 서브넷 간의 필수 트래픽만 허용합니다. 벤치마킹에 필요한 네트워크 트래픽을 허용하려면 공용 서브넷과 전용 서브넷 간의 HTTP 트래픽을 허용하도록 이러한 설정을 조정해야 합니다. 특히, VCN CIDR 블록에서 대상 포트 8000으로의 트래픽을 허용하는 전용 서브넷의 보안 목록에 수신 규칙을 추가합니다.

작업 2: OCI 컴퓨트 인스턴스 프로비전

이 작업에서는 벤치마크 설정을 위해 두 개의 OCI 컴퓨트 인스턴스를 프로비전합니다. 하나는 배스천 및 벤치마크 클라이언트 시스템 역할을 하는 CPU 전용 VM(가상 머신) 인스턴스이고, 다른 하나는 테스트 중인 GPU 장착 인스턴스입니다.

  1. OCPU 8개 및 Oracle Linux 8로 VM.Flex.E5 인스턴스를 프로비전합니다. 배스천/벤치마크 클라이언트는 별도의 시스템에 호스트된 모델로만 요청을 전송하므로 GPU가 필요하지 않으므로 CPU 구성을 선택할 수 있습니다. 네트워크 매개변수에서 퍼블릭 서브넷을 선택해야 하며 반드시 SSH 퍼블릭 키를 업로드해야 합니다(또는 원하는 경우 제공된 프라이빗 키 다운로드).

  2. VM.GPU.A10.1 인스턴스를 프로비전합니다. 설정을 간소화하려면 NVIDIA 드라이버 및 CUDA 프레임워크가 포함된 Oracle Linux 8 이미지를 사용하여 인스턴스를 프로비전하십시오. 먼저 원하는 구성을 선택한 다음 이미지 선택 메뉴로 돌아가 GPU 지원이 내장된 Oracle Linux 8 변형을 선택합니다. 이 인스턴스는 프라이빗 서브넷에서 프로비전되어야 합니다. 즉, 배스천 호스트를 통해서만 액세스할 수 있습니다. SSH 키도 설정해야 합니다.

GPU 지원 기능이 내장된 Oracle Linux 8 이미지 선택 스크린샷

작업 3: 벤치마크 클라이언트 설정

이 작업에서는 성능 벤치마크에 필요한 모든 구성 요소를 설치하고 GPU 호스트를 구성합니다.

  1. SSH 키를 사용하여 배스천에 로그인하고 다음 명령을 사용하여 LLMPerf에 대한 모든 요구사항을 설정합니다.

    sudo dnf install epel-release -y
    sudo yum-config-manager --enable ol8_baseos_latest ol8_appstream ol8_addons ol8_developer_EPEL
    sudo dnf install git python3.11 python3.11-devel python3.11-pip -y
    
  2. Ray LLMPerf 저장소를 복제하고 다음 명령을 사용하여 Python venv을 설정하고 LLMPerf를 설치합니다.

    git clone https://github.com/ray-project/llmperf.git
    cd llmperf
    mkdir venv && python3.11 -mvenv venv && source venv/bin/activate
    
  3. LLMPerf(및 Python 종속성)을 설치하기 전에 pyproject.toml 파일을 편집하고 Python 요구 사항 절을 제거하십시오. 이 절은 불필요하게 Python 버전을 3.11 미만으로 제한합니다.

    diff --git a/pyproject.toml b/pyproject.toml
    index 7687fb2..521a2a7 100644
    --- a/pyproject.toml
    +++ b/pyproject.toml
    @@ -8,7 +8,6 @@ version = "0.1.0"
     description = "A framework for load testing LLM APIs"
     authors = [{name="Avnish Narayan", email="avnish@anyscale.com"}]
     license = {text= "Apache-2.0"}
    -requires-python = ">=3.8, <3.11"
     dependencies = ["pydantic<2.5",
                     "ray",
                     "pytest>=6.0",
    
  4. pip install -e 명령을 실행하여 설정을 완료합니다.

작업 4: 벤치마크 대상 설정

이 작업에서는 벤치마크 대상 자체를 설정합니다. 필요한 드라이버와 CUDA(Compute Unified Device Architecture) 프레임워크로 노드를 이미 프로비저닝했으므로 vLLM 및 python 종속성을 설치하고 벤치마크할 모델을 배포하기만 하면 됩니다.

참고: 프로비저닝한 GPU 컴퓨트 인스턴스는 전용 서브넷에 있습니다. 따라서 배스천 호스트에 접속하려면 먼저 배스천 호스트에 로그인하고 벤치마크 대상에 대해 선택한 프라이빗 SSH 키를 설정해야 합니다. 그러면 전용 IP 주소를 사용하여 벤치마크 대상에 로그인할 수 있습니다.

  1. 배스천 호스트의 초기 설정과 같이 필요한 패키지를 설치합니다. 또한 다음 명령을 사용하여 8000 포트에서 수신 트래픽을 허용하도록 호스트의 방화벽을 업데이트합니다.

    sudo dnf install epel-release -y
    sudo yum-config-manager --enable ol8_baseos_latest ol8_appstream ol8_addons ol8_developer_EPEL
    sudo dnf install git python3.11 python3.11-devel python3.11-pip -y
    sudo firewall-cmd --permanent --zone=public --add-port=8000/tcp
    sudo firewall-cmd --reload
    
  2. 다음 명령을 실행하여 vLLM 및 해당 요구 사항을 설치합니다.

    mkdir venv
    python3.11 -mvenv venv && source venv/bin/activate
    pip install -U pip "bitsandbytes>=0.44.0" vllm gpustat mistral_common
    
  3. 테스트할 모델로 vLLM을 시작할 준비가 되었습니다.

    export HF_TOKEN=<your huggingface token>
    export MODEL="meta-llama/Llama-3.2-3B-Instruct"
    ulimit -Sn 65536 # increase limits to avoid running out of files that can be opened
    vllm serve $MODEL --tokenizer-mode auto --config-format hf --load-format auto \
                      --enforce-eager --max-model-len 65536
    

    참고: A10 GPU 메모리에 맞게 모델 컨텍스트 길이를 줄여야 하며 컨텍스트 길이를 기본 크기인 128k 토큰에서 64k 토큰으로 줄여야 합니다. 로드 후 vLLM 모델은 추론 통계를 정기적으로 출력하기 시작해야 합니다.

    INFO 12-09 15:46:36 metrics.py:449] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 0.0 tokens/s, Running: 0 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 0.0%, CPU KV cache usage: 0.0%.
    
  4. 이제 설정을 테스트하고 벤치마크할 다른 터미널로 전환하는 동안 서버가 백그라운드에서 계속 실행되도록 합니다. 다음과 같이 curl를 사용하여 간단한 테스트를 실행할 수 있습니다.

    export HOST="<the ip address of the benchmark machine"
    export MODEL="meta-llama/Llama-3.2-3B-Instruct"
    curl --location "http://${HOST}:8000/v1/chat/completions"     --header 'Content-Type: application/json'     --header 'Authorization: Bearer token'     --data '{
            "model": "'"$MODEL"'",
            "messages": [
              {
                "role": "user",
                "content": "What is the question to the answer to the ultimate question of life, the universe, and everything. You may give a humorous response."
              }
            ]
        }' -s | jq
    

    출력:

    {
      "id": "chatcmpl-f11306f943604d41bad84be1dadd9da6",
      "object": "chat.completion",
      "created": 1733997638,
      "model": "meta-llama/Llama-3.2-3B-Instruct",
      "choices": [
        {
          "index": 0,
          "message": {
            "role": "assistant",
            "content": "You want to know the ultimate question to the answer of 42?\n\nWell, after years of intense research and contemplation, I've discovered that the answer is actually a giant, cosmic joke. The question is: \"What's for lunch?\"",
            "tool_calls": []
          },
          "logprobs": null,
          "finish_reason": "stop",
          "stop_reason": null
        }
      ],
      "usage": {
        "prompt_tokens": 62,
        "total_tokens": 112,
        "completion_tokens": 50,
        "prompt_tokens_details": null
      },
      "prompt_logprobs": null
    }
    

작업 5: 벤치마크 실행

이제 벤치마크를 실행할 준비가 되었습니다. 선택한 대규모 언어 모델을 사용하는 특정 응용 프로그램 시나리오를 고려할 때 대상 시스템에서 동시 추론 요청 실행의 성능 특성을 파악하고자 합니다.

다음 시나리오를 벤치마크해 보겠습니다.

매개변수
모델 메타 LLaMa 3.2 3B 강사
사용 사례 채팅
입력 토큰 N(200, 40)
출력 토큰 N(100, 10
동시 요청입니다. 1 - 32
  1. 홈 디렉토리 내의 벤치마크 클라이언트(배스천 호스트)에 llm_benchmark.sh이라는 다음 스크립트를 만듭니다.

    #!/usr/bin/env bash
    
    set -xe
    
    # Use vLLM OpenAPI endpoint
    export OPENAI_API_BASE="http://<benchmark host>:8000/v1"
    # API key is not in use, but needs to be set for llmbench
    export OPENAI_API_KEY="none"
    
    model="meta-llama/Llama-3.2-3B-Instruct"
    
    modelname="${model##*/}"
    mkdir "$modelname"
    
    concurrent_requests=(1 2 4 8 16 32)
    
    pushd llmperf
    
    source venv/bin/activate
    
    for cr in "${concurrent_requests[@]}"
    do
        python3 token_benchmark_ray.py --model $model \
            --mean-input-tokens 200 --stddev-input-tokens 40 \
            --mean-output-tokens 100 --stddev-output-tokens 10 \
            --max-num-completed-requests $((cr * 100)) --num-concurrent-requests $cr \
            --metadata "use_case=chatbot" \
            --timeout 1800 --results-dir "../$modelname/result_outputs_chat_creq_$cr" --llm-api openai
    done
    popd
    

    이 스크립트를 사용하면 동시 요청 수가 증가하는 llmperf를 사용하여 일련의 벤치마크를 자동으로 실행할 수 있습니다(1부터 시작하여 연속적으로 최대 32배까지). token_benchmark_ray.py 스크립트에 전달된 인수에서 알 수 있듯이 위 테이블에 정의된 대로 토큰 입력 및 출력을 설정하고 있습니다.

  2. 다음 명령을 사용하여 벤치마크 스크립트를 실행합니다.

    bash -x llm_benchmark.sh
    

완료되면 홈 디렉토리에서 Llama-3.2-3B-Instruct이라는 새 디렉토리를 찾을 수 있습니다. 이 디렉토리에서는 모든 실험 결과가 JSON 형식으로 저장되므로 즐겨찾는 데이터 분석 도구를 사용하여 다운로드하고 후행 처리할 수 있습니다.

주: 벤치마크를 플롯으로 전환하는 한 가지 쉬운 방법은 작은 셸 스크립트 및 jq를 사용하여 가장 관심 있는 그림을 .csv 형식으로 추출하는 것입니다. 이 형식은 Excel로 쉽게 복사하여 붙여넣을 수 있습니다.

echo "concurrent_requests,token_throughput"
for i in *; do
    cat $i/*_summary.json | jq -r '[.num_concurrent_requests, .results_request_output_throughput_token_per_s_mean] | join(",")'
done;

확인

추가 학습 자원

docs.oracle.com/learn에서 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer을 방문하십시오.

제품 설명서는 Oracle Help Center를 참조하십시오.