포스팅 개요
이번 포스팅은 대규모 언어 모델(Large Language Models, LLM)을 쉽고 빠르게 배포할 수 있는 vLLM 라이브러리를 활용해서 OpenAI API Server(OpenAI-Compatible Server)로 배포하여 모델을 서빙(serving)할 수 있는 방법을 알아봅니다. 이전 포스팅(https://lsjsj92.tistory.com/668)에서는 vLLM에 대한 설명과 설치 방법에 대해서 알아보았는데요. 이 vLLM을 마치 OpenAI의 API 서버처럼 활용해서 LangChain이나 OpenAI 라이브러리에도 연동하여 사용할 수 있습니다.
vLLM과 관련된 포스팅은 아래와 같습니다.
- vLLM 사용법과 소개 : https://lsjsj92.tistory.com/668
- vLLM을 OpenAI 서버(server)로 배포하는 방법(현재 포스팅 글) : https://lsjsj92.tistory.com/673
- OpenAI 서버로 배포된 vLLM을 랭체인(LangChain)과 연동하는 방법 : https://lsjsj92.tistory.com/674
이번 포스팅을 작성하면서 참고한 자료는 아래와 같습니다.
- https://docs.vllm.ai/en/v0.6.0/getting_started/quickstart.html
- https://huggingface.co/MLP-KTLim/llama-3-Korean-Bllossom-8B
- https://github.com/vllm-project/vllm
- https://platform.openai.com/docs/quickstart?language-preference=python
- https://python.langchain.com/docs/integrations/llms/openai/
포스팅 본문
포스팅 개요에서도 언급하였듯이, 이번 포스팅은 vLLM을 활용해 OpenAI API 서버(server)로 배포하고 서빙(serving) 할 수 있는 방법에 대해 알아보겠습니다. 그리고 Python을 활용한 간단한 예제 들과 curl로 통신하는 방법 등 각종 예제(example) 코드로 결과도 확인해보겠습니다.
본 포스팅의 순서는 다음과 같습니다.
1. vLLM이란 무엇인가?
2. OpenAI 서버로 활용한다는 것은?
3. vLLM을 OpenAI 서버로 활용하기 (OpenAI-Compatible server)
4. OpenAI 파이썬(Python) 라이브러리 예제와 Curl 예제로 결과 확인하기
5. 랭체인(LangChain)에서 vLLM OpenAI server와 통신하여 RAG 구성하기 ( 다음글로 이어집니다. )
1. vLLM이란?
이전 포스팅(https://lsjsj92.tistory.com/668)에서 vLLM을 소개해드렸지만, 못 보고 오신 분들을 위해 간략하게 vLLM에 대해서 정리해보겠습니다. vLLM은 LLM 추론(inference) 및 서빙(serving)을 쉽고 빠르게 도와주는 라이브러리입니다. vLLM의 주요 특징은
- 페이지 어텐션(page attention) 방법으로 key, value 메모리를 효과적으로 관리
- 입력 요청(request)에 대해서 지속적인 배치(Continuous batching) 처리 가능
- 양자화(Quantization) 제공
- 허깅페이스(HuggingFace)와 월활하게 인기있는 LLM 모델을 사용할 수 있음
등등 다양한 장점과 특징을 가지고 있는 라이브러리입니다. 이렇게 vLLM을 사용한다면 쉽고 빠르게 LLM 모델들을 서빙할 수 있는 것입니다. 자세한 것은 vLLM의 Github나 도큐먼트(docs) 등을 확인해보시면 좋을 것 같습니다.
2. OpenAI API 서버로 배포 및 serving 한다는 것은?
이번 포스팅의 주제는 vLLM을 OpenAI API 서버로 활용하여 LLM을 추론 및 서빙하는 방법에 대해 정리합니다. 그러면, vLLM을 OpenAI API 서버로 활용한다는 것의 의미는 무엇일까요?
아마 LLM을 활용하시는 분들은 아래와 같은 코드를 보셨던 경험, 사용해보셨던 경험이 있을 것이라 생각합니다.
from openai import OpenAI
client = OpenAI()
completion = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{
"role": "user",
"content": "Write a haiku about recursion in programming."
}
]
)
print(completion.choices[0].message)
위 파이썬(Python) 코드는 OpenAI 라이브러리를 활용해 OpenAI에서 제공해주는 gpt-4o나 gpt-4o-mini와 같은 LLM 모델들을 API 형태로 사용하는 코드입니다. 이때 OpenAI에서 받은 key들을 적용하기도 하죠.
또 다른 코드도 있습니다. LLM 및 RAG를 활용하시는 분들에게 인기가 많은 랭체인(LangChain)에서도 이와 비슷한 방식의 코드가 있습니다.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")
위 파이썬 코드는 랭체인(LangChain)에서 OpenAI 모델을 사용하는 예제 코드입니다. 즉, OpenAI에서 제공해주는 모델을 API로 받아서 사용하는 것이죠.
이렇게 OpenAI 라이브러리를 활용하면 OpenAI에서 제공해주는 각종 모델들을 활용해(API 통신을 받아) RAG 구축이나 서빙(serving) 등에 활용할 수 있는 것입니다. 문제는, OpenAI의 API를 활용하는 것이다보니 비용 등이 발생할 수 있고 새롭게 올라온 다양한 Llama3 파인튜닝 모델들을 사용하기엔 번거롭다는 것이 있습니다.
vLLM을 OpenAI API 서버로 활용한다는 것의 의미는 이 부분을 vLLM으로 활용하는 것입니다. OpenAI의 라이브러리 형태로 그대로 사용할 수 있지만, 사용되는 모델은 vLLM에서 실행하여 inference에 쓰고 있는 LLM을 활용하는 것입니다.
그럼 vLLM을 어떻게 OpenAI 서버로 사용할 수 있을까요?
3. vLLM을 OpenAI API 서버로 활용하기(OpenAI-Compatible server)
그러면 vLLM을 어떻게 실행시키면 OpenAI API 서버처럼 활용할 수 있을까요? 먼저 살펴볼 것은 OpenAI의 API 포멧입니다. OpenAI의 API는 아래와 같은 포멧으로 API를 제공해주고 있으며, 이에 맞춰서 파이썬 라이브러리가 제공되고 있습니다.
# 파이썬 OpenAI 라이브러리 활용 시
client.chat.completions.create(model="gpt-4o-mini", ... )
# curl 활용시
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "안녕하세요. 이수진입니다."}],
"temperature": 0.7
}'
즉, chat 포멧으로 지원해주면서 completions 경로를 따르고 있습니다. 즉, vLLM에서도 이와 같이 제공해줘야 OpenAI API처럼 사용할 수 있는 것입니다.
vLLM에서 OpenAI API 형태로 제공해주는 방법은 아래와 같이 실행하면 됩니다.
python -m vllm.entrypoints.openai.api_server --model /llm_models/llama-3-Korean-Bllossom-8B --max-model-len=2048 --port 8007 --tensor-parallel-size 2
명령어는 vLLM이 Python에 설치되었다고 했을 때 vllm.entrypoints.openai.api_server 형태로 실행을 시켜주시면 됩니다. 즉, 이미 명령어에서 openai의 api server로 사용한다(openai.api_server)라고 명시가 되어있죠?
또한, 저는 Bllossom팀에서 제공해주신 매우 훌륭한 Bllossom-8B 모델을 사용했습니다. (좋은 모델 만들어주셔서 감사합니다!) 이 모델을 활용해 OpenAI API처럼 제공할 수 있도록 할 것이고 포트는 8007번, 병렬 텐서는 2개를 사용했습니다.
정상적으로 잘 실행이 되었다면, 아래 사진처럼 실행한 터미널에 API 서버가 실행될 것입니다.
또한, 이렇게 제공되는 API는 FastAPI로 제공해주기 때문에 swagger 형태로도 볼 수 있습니다.
API가 실행된 경로의 /docs를 확인하면 (ex. localhost:8007/docs) 아래 사진과 같은 Swagger API 명세를 확인할 수 있습니다.
4. OpenAI 파이썬(Python) 라이브러리 예제와 Curl 예제
자! 이제 vLLM을 OpenAI API 서버 형태로 배포하여 올려두었는데요. 이거를 어떻게 사용할 수 있을까요?
사용할 수 있는 간단한 예제를 살펴보고 랭체인을 활용한 예제 코드(다음 글에서 계속됩니다)를 통해 사용 방법에 대한 이해도를 올려봅시다.
curl로 통신하는 방법
가장 먼저, 간단하게 curl 명령어로 통신하는 방법입니다. API 서버가 올라가 있으니, API 서버에 curl로 통신을 하는 방법이죠. 아래와 같이 통신을 해서 사용할 수 있습니다.
curl http://localhost:8007/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "/llm_models/llama-3-Korean-Bllossom-8B",
"prompt": "안녕하세요. 겨울이 오나봐요. 오늘 날씨는 운동하기 좋아요. 운동을 하면",
"max_tokens": 250,
"temperature": 0
}'
curl 명령어로 API 서버가 올라가 있는 쪽에 통신을 하면 되는데요. 이때, API 통신 경로는 host/v1/completions 를 따르게 됩니다. 즉 앞에서 봤던 OpenAI 경로와 매칭이 되죠.
또한, 모델을 어떤 모델을 쓰는지에 대한 것과 프롬프트(prompt), 최대 토큰(max_token), temperature를 설정할 수 있습니다.
이렇게 curl로 vLLM OpenAI API 서버를 호출한 결과는 아래와 같습니다.
정상적으로 호출이 잘 된 것을 확인할 수 있습니다.
Python의 OpenAI 라이브러리로 통신하는 방법
다음으로 Python OpenAI 라이브러리를 활용해서 통신하는 방법도 있습니다. 포스팅 앞쪽에서 소개해드린 OpenAI 코드와 매우 유사한 방법입니다.
여기서는 2가지 방법을 소개해볼까 합니다.
from openai import OpenAI
openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8007/v1"
model_path = "/llm_models"
model_code = "llama-3-Korean-Bllossom-8B"
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
completion = client.completions.create(model=f'{model_path}/{model_code}',
prompt="안녕하세요? 날씨가 춥네요.")
print("Completion result:", completion)
먼저, 단순히 문장을 생성해주는 방법입니다. Python에 있는 OpenAI 라이브러리를 활용하면 쉽게 통신할 수 있는데요. 여기서 특징은 아래와 같습니다.
- openai_api_key 값은 EMPTY라는 값으로 넣어줍니다. 원래 OpenAI를 사용하면 OpenAI에서 제공해주는 key를 넣어주는데요. vLLM 환경에서 실행하는 것이다보니 Key라는 것이 딱히 존재하지 않기 때문입니다.
- 또한 url을 vLLM이 OpenAI server로 올라간 host로 넣어주면 되는데 v1이라는 경로까지 넣어주면 됩니다.
- 어떤 모델을 사용하는지에 대한 정보도 같이 넣어주면 정상적으로 실행이 아래와 같이 됩니다
또 다른 방법은 chat 형태로 사용하는 방법입니다. 일반적으로 많이 사용하는 방법이죠. 이때는 아래와 같은 Python 코드로 실행할 수 있습니다.
openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8007/v1"
model_path = "/llm_models"
model_code = "llama-3-Korean-Bllossom-8B"
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
chat_response = client.chat.completions.create(
model=f'{model_path}/{model_code}',
messages=[
{"role": "system", "content": "당신은 친절하게 저를 돕는 어시스턴트입니다."},
{"role": "user", "content": "안녕하세요? 날씨가 춥네요."},
]
)
print("Chat response:", chat_response)
chat으로 실행할 때는 system role이나 user role과 같은 값을 추가로 명시할 수 있고 대화를 하는 형태로 결과를 주고받고 할 수 있습니다.
마무리
이렇게 vLLM을 OpenAI api server로 실행시키고 curl 및 Python openai 라이브러리에서 활용할 수 있는 방법에 대해 알아보았습니다.
다음 글에서는 랭체인(LangChain)에서 vLLM API server를 활용하는 방법에 대해서 알아보겠습니다.
긴 글 읽어주셔서 감사합니다.
'LLM&RAG' 카테고리의 다른 글
PostgreSQL PGVector 설치 및 사용하기(Feat. 벡터 데이터베이스(Vector Database) 구축) (2) | 2024.12.09 |
---|---|
vLLM OpenAI API 서버와 랭체인(LangChain) 연동하여 RAG 구축하기 (1) | 2024.11.02 |
vLLM 사용법 - LLM을 쉽고 빠르게 추론(inference) 및 API 서빙(serving)하기 (4) | 2024.05.06 |
Ollama 사용법 - 개인 로컬 환경에서 LLM 모델 실행 및 배포하기 (5) | 2024.04.25 |
논문 리뷰 - What Should Data Science Education Do with Large Language Models? (3) | 2024.04.02 |