Llama 3 추론 엔드포인트 배포하기

Llama 3 추론 엔드포인트 배포하기

Meta의 Llama 3 시리즈는 텍스트 생성 특화 모델로, 흔히 쓰는 업계 벤치마크에서 최상위권 성능을 내는 모델이에요. 이 가이드에서는 Lambda On-Demand Cloud 인스턴스 위에 vLLM으로 Llama 3 모델 서버를 띄워, 실제로 curl로 질문을 보내 답변을 받아보는 전 과정을 따라 해요.

사용할 모델은 Hugging Face에 호스팅된 meta-llama/Meta-Llama-3-8B예요. 8B와 70B 두 가지 크기로 제공되는데, 모델이 커질수록 필요한 GPU도 달라져요. 이번 도입부를 지나면 어떤 인스턴스를 골라야 하는지부터 시작해서 vLLM 서버 기동, 그리고 추론 응답 확인까지 한 흐름으로 잡을 수 있어요.

출처: Deploying a Llama 3 inference endpoint - Lambda Docs

모델 크기에 따른 인스턴스 선택

모델 크기 특징
8B (80억 파라미터) 리소스가 부족한 환경에도 적합한 가볍고 접근성 좋은 모델. 1x A100 또는 H100 GPU 노드가 필요해요.
70B (700억 파라미터) 복잡하거나 고난도 작업에 적합한 우수한 성능. 8x A100 또는 H100 GPU 노드가 필요해요.

사전 준비

이 튜토리얼을 따라 하려면 몇 가지가 준비돼 있어야 해요.

  1. 실행하려는 Llama 3 크기에 맞는 Lambda On-Demand Cloud 인스턴스.
  2. Hugging Face 사용자 계정.
  3. 사용하려는 meta-llama-3 모델 레포지토리 읽기 권한이 포함된 Hugging Face 사용자 액세스 토큰.

이 튜토리얼의 JSON 출력은 jq로 포맷해 보여줄게요.

인스턴스 준비와 vLLM 설치

적절한 Lambda On-Demand Cloud 인스턴스와 Hugging Face 권한이 준비되면, 먼저 추론 환경을 세팅해요.

  1. Lambda On-Demand Cloud 인스턴스를 시작해요.
  2. SSH 키를 추가하거나 생성해 인스턴스에 접근할 수 있게 해요.
  3. 인스턴스로 SSH 접속해요.
  4. 전용 파이썬 환경을 만들어요. 8B 모델용이라면 이렇게요.
python3 -m venv Meta-Llama-3-8B
source Meta-Llama-3-8B/bin/activate
python3 -m pip install vllm==0.4.3 huggingface-hub==0.23.2 torch==2.3.0 numpy==1.26.4

70B 모델용이라면 별도의 가상 환경을 만들어요.

python3 -m venv Meta-Llama-3-70B
source Meta-Llama-3-70B/bin/activate
python3 -m pip install vllm==0.4.3 huggingface-hub==0.23.2 torch==2.3.0 numpy==1.26.4
  1. Hugging Face에 로그인해요.
huggingface-cli login
  1. 모델 서버를 시작해요. 필요하면 모델을 내려받고 캐시하는 과정이 함께 진행돼요. 8B는 이렇게요.
python3 -m vllm.entrypoints.openai.api_server \
  --host=0.0.0.0 \
  --port=8000 \
  --model=meta-llama/Meta-Llama-3-8B &> api_server.log &

70B는 8개 GPU에 모델을 나눠 올리도록 텐서 병렬 크기를 지정해요.

python3 -m vllm.entrypoints.openai.api_server \
  --host=0.0.0.0 \
  --port=8000 \
  --model=meta-llama/Meta-Llama-3-70B \
  --tensor-parallel-size 8 &> api_server.log &

API 서버가 기동을 마치는 데 몇 분이 걸릴 수 있어요. 로그를 확인하면서 서버가 뜰 때까지 기다리면 돼요.

모델과 대화하기

다음 요청이 Llama 3 모델에 언어 프롬프트를 전달해요. 8B 모델에 "프랑스의 수도 이름이 뭔가요?"라고 물어보는 예시예요.

curl -X POST http://localhost:8000/v1/completions \
     -H "Content-Type: application/json" \
     -d '{
           "prompt": "What is the name of the capital of France?",
           "model": "meta-llama/Meta-Llama-3-8B",
           "temperature": 0.0,
           "max_tokens": 1   // sets the response length
         }'

70B 모델에는 모델명만 바꿔서 보내면 돼요.

curl -X POST http://localhost:8000/v1/completions \
     -H "Content-Type: application/json" \
     -d '{
           "prompt": "What is the name of the capital of France?",
           "model": "meta-llama/Meta-Llama-3-70B",
           "temperature": 0.0,
           "max_tokens": 1   // sets the response length
         }'

Llama 3는 이런 형식으로 응답해요. usage 필드에 프롬프트 토큰과 생성 토큰 수가 담겨 있으니 이걸로 요청 비용을 가늠해볼 수 있어요.

{
  "id": "cmpl-d898e2089b7b4855b48e00684b921c95",
  "object": "text_completion",
  "created": 1718221710,
  "model": "meta-llama/Meta-Llama-3-8B",
  "choices": [
    {
      "index": 0,
      "text": " Paris",
      "logprobs": null,
      "finish_reason": "length",
      "stop_reason": null
    }
  ],
  "usage": {
      "prompt_tokens": 11,
      "total_tokens": 12,
      "completion_tokens": 1
  }
}

max_tokens를 1로 둔 덕분에 응답이 "Paris"라는 단어 하나로 짧게 끝난 걸 볼 수 있어요. 이렇게 모델 크기에 맞는 인스턴스를 골라 vLLM 서버를 띄우면, OpenAI 호환 /v1/completions 엔드포인트로 어떤 앱에서든 Llama 3를 호출할 수 있게 돼요.

더 알아보기