콘텐츠로 이동

OpenAI 호환 서버

vLLM은 OpenAI의 completions APIchat API 등을 구현한 OpenAI 호환 HTTP Server를 제공합니다. OpenAI compatible server에 대한 더 자세한 정보는 vLLM 문서를 참고하시기 바랍니다. 이 튜토리얼에서는 Eager와 Flash Attention을 각각 사용하는 Llama3-8B와 Llama3.1-8B 모델을 이용해 OpenAI 호환 서버를 설정하는 방법을 안내합니다. 이 모델들을 배포하는 과정을 통해 유저가 원하는 모델로 OpenAI API 서버를 구축하는 방법을 배울 수 있습니다.

사전 준비

rebel-compiler, optimum-rbln, vllm-rbln 패키지의 최신 버전이 설치되어 있어야 합니다. 각 패키지를 설치하기 위해 리벨리온 사설 PyPI 서버의 접근 권한이 필요합니다. 관련 내용은 설치 가이드를 참고하시기 바랍니다. 각 패키지의 최신 버전은 릴리즈 노트에서 확인 할 수 있습니다.

$ pip3 install --extra-index https://pypi.rbln.ai/simple/ "rebel-compiler>=0.7.3" "optimum-rbln>=0.7.3.post2" "vllm-rbln>=0.7.3"

기본 모델 예제: Llama3-8B

1 단계. Llama3-8B 컴파일

튜토리얼 예시에서는 Llama3-8B 모델을 사용하여 진행합니다. 먼저, optimum-rbln을 사용하여 Llama3-8B 모델을 컴파일합니다.

from optimum.rbln import RBLNLlamaForCausalLM
import os

# HuggingFace PyTorch Llama3 모델을 RBLN 컴파일된 모델로 내보내기
model_id = "meta-llama/Meta-Llama-3-8B-Instruct"
compiled_model = RBLNLlamaForCausalLM.from_pretrained(
    model_id=model_id,
    export=True,
    rbln_max_seq_len=8192,
    rbln_tensor_parallel_size=4,  # Rebellions Scalable Design (RSD)를 위한 ATOM+ 개수
    rbln_batch_size=4,            # Continuous batching을 위함, batch_size > 1 권장
)

# 컴파일 결과를 저장하기
compiled_model.save_pretrained(os.path.basename(model_id))

Note

서빙에 사용할 적절한 배치 크기를 선택해야 합니다. 여기에서는 4로 설정합니다.

2 단계. OpenAI API server 실행

다음과 같이 vllm.entrypoints.openai.api_server 모듈을 실행하면 API 서버가 시작됩니다.

1
2
3
4
5
6
7
$ python3 -m vllm.entrypoints.openai.api_server \
  --model <PATH/TO/Meta-Llama-3-8B-Instruct> \
  --device rbln \
  --max-num-seqs 4 \
  --max-num-batched-tokens 8192 \
  --max-model-len 8192 \
  --block-size 8192
  • model: 컴파일된 모델의 절대 경로를 설정합니다.
  • device: vLLM 실행을 위한 디바이스. rbln 으로 설정합니다.
  • max_num_seqs: 최대 시퀀스 수. 컴파일시 사용한 인자 batch_size와 반드시 일치해야 합니다.
  • block_size: max_model_len(컴파일시 적용한 rbln_max_seq_len)와 동일하게 맞춰주면 됩니다. (Flash Attention 적용시에는 다르게 적용해야하며, 응용 예제를 참고하시면 됩니다.)
  • max_num_batched_tokensmax_model_len는 동일해야하며, 컴파일시 사용한 인자 rbln_max_seq_len와 반드시 일치해야 합니다.
  • 인증 기능을 활성화하려면 --api-key <API key로 사용될 문자열> 플래그를 추가합니다.

API 서버가 실행되고 나면 OpenAI의 파이썬 및 node.js 클라이언트를 이용해 API를 호출하거나, 다음과 같이 curl 명령을 이용해 API를 실행할 수 있습니다.

$ curl http://<host and port number of the server>/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <API key, if specified when running the server>" \
  -d '{
    "model": "<PATH/TO/Meta-Llama-3-8B-Instruct>",
    "messages": [
      {
        "role": "system",
        "content": "You are a helpful assistant."
      },
      {
        "role": "user",
        "content": "Hello!"
      }
    ],
    "stream": true
  }'

Note

API 서버를 실행할 때 사용한 --model 값은 해당 API 서버의 ID로 사용됩니다. 따라서, curl 명령의 "model" 값은 API 서버 실행 시 사용한 --model 값과 완전히 동일해야 합니다.

OpenAI의 API에 대한 더 자세한 사항은 OpenAI 문서를 참고하시기 바랍니다.

응용 예제: Flash Attention 을 이용한 Llama3.1-8B

Flash Attention은 메모리 사용량을 줄이고 처리량을 향상시켜 Llama3.1-8B등의 모델에서 긴 컨텍스트를 효율적으로 처리할 수 있습니다. optimum-rbln으로 컴파일할 때 rbln_kvcache_partition_len 매개변수를 추가하면 Flash Attention을 활성화할 수 있습니다.

1 단계. Llama3.1-8B 컴파일

from optimum.rbln import RBLNLlamaForCausalLM
import os

# HuggingFace PyTorch Llama3.1 모델을 RBLN 컴파일된 모델로 내보내기
model_id = "meta-llama/Llama-3.1-8B-Instruct"
model = RBLNLlamaForCausalLM.from_pretrained(
    model_id=model_id,
    export=True,  # Export a PyTorch model to RBLN model with Optimum
    rbln_batch_size=1, # Batch size
    rbln_max_seq_len=131_072,  # Maximum sequence length
    rbln_tensor_parallel_size=8,  # Tensor parallelism
    rbln_kvcache_partition_len=16_384,  # Flash Attention 을 사용하기 위한 KV cache 파티션 크기
)

# 컴파일 결과를 저장하기
model.save_pretrained(os.path.basename(model_id))

Note

서빙 요구 사항에 적합한 배치 크기를 선택하세요. 여기서는 1로 설정되어 있습니다.

2 단계. OpenAI API server 실행

다음과 같이 vllm.entrypoints.openai.api_server 모듈을 실행하면 API 서버가 시작됩니다.

1
2
3
4
5
6
7
$ python3 -m vllm.entrypoints.openai.api_server \
  --model <PATH/TO/Llama-3.1-8B-Instruct> \
  --device rbln \
  --max-num-seqs 1 \
  --max-num-batched-tokens 131072 \
  --max-model-len 131072 \
  --block-size 16384
  • model: 컴파일된 모델의 절대 경로를 설정합니다.
  • device: vLLM 실행을 위한 디바이스. rbln 으로 설정합니다.
  • max_num_seqs: 최대 시퀀스 수. 컴파일시 사용한 인자 batch_size와 반드시 일치해야 합니다.
  • block_size: Paged Attention을 위한 블록 크기입니다. Flash Attention을 사용할 때는 블록 크기가 rbln_kvcache_partition_len과 동일해야 합니다.
  • max_num_batched_tokensmax_model_len는 동일해야하며, 컴파일시 사용한 인자 rbln_max_seq_len와 반드시 일치해야 합니다.
  • 인증 기능을 활성화하려면 --api-key <API key로 사용될 문자열> 플래그를 추가합니다.

API 서버가 실행되고 나면 OpenAI의 파이썬 및 node.js 클라이언트를 이용해 API를 호출하거나, 다음과 같이 curl 명령을 이용해 API를 실행할 수 있습니다.

$ curl http://<host and port number of the server>/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <API key, if specified when running the server>" \
  -d '{
    "model": "<PATH/TO/Llama-3.1-8B-Instruct>",
    "messages": [
      {
        "role": "system",
        "content": "You are a helpful assistant."
      },
      {
        "role": "user",
        "content": "Hello!"
      }
    ],
    "stream": true
  }'

Note

API 서버를 실행할 때 사용한 --model 값은 해당 API 서버의 ID로 사용됩니다. 따라서, curl 명령의 "model" 값은 API 서버 실행 시 사용한 --model 값과 완전히 동일해야 합니다.

OpenAI의 API에 대한 더 자세한 사항은 OpenAI 문서를 참고하시기 바랍니다.