Background
여러 데모들을 동시에 만들게 되면서 LLM을 각 데모 별로 서버에 올리기에는 메모리 제한이 생길 수 밖에 없는 현상이 발생했다. 제작 중인 데모들은 실제 계약 및 사업 진행으로 이루어진 것들이 아니기에 LLM Base 모델로 Prompting 혹은 물리적인 작업들을 진행하는 게 전부였기 때문에 HuggingFace에 올라와 있는 Base 모델만 활용하고 있었다. 그렇기 때문에 LLM Serving Framework 중 하나인 SGLang을 활용해서 LLM API Server를 만들고 각 데모에서 텍스트를 입력받을 시 LLM API Server를 호출해서 답변을 얻는 방식으로 진행하고자 했다. 물론 이 과정은 진행 중인 데모에 특정 LLM 모델을 사용한다는 점을 전제로 한다. 또 SGLang의 Documentation(https://sgl-project.github.io/)이 생각보다 잘 되어 있다는 점 또한 해당 Framework를 선택한 계기가 되었다. 추가로 모든 작업은 Linux 서버에 진입 후 터미널에서 진행한다.
Install
1. 가상 환경 생성
먼저 LLM Server를 담당할 가상 환경을 생성한다. python 버전은 3.10으로 세팅했다.
conda create --name LLM_serving python=3.10
2. Git Clone
SGLang의 경우 Documentation을 보면 pip로 설치하는 방법도 있고, git clone을 통해 source로 작업하는 방법 등 여러 방법이 있다. 이 부분에서는 추후 gguf 형식의 양자화 모델을 로드하는 방법을 시도해 보기 위해 source로 작업을 결정했다. (현재 2024/11/13 기준 SGLang Github Issue에 보면 현재 GGUF 형식은 공식적으로 지원하지 않는다고 한다.)
아래 코드를 활용해 내가 원하는 위치에 git clone을 진행한다.
git clone https://github.com/sgl-project/sglang.git
3. Environment Setting
가상 환경을 만들었다면 SGLang을 실행하기 위한 라이브러리를 설치해야 한다.
git clone을 진행했다면 해당 폴더로 진입한다.
cd sglang
이후 아래 코드를 활용해 필요한 라이브러리를 설치한다.
pip install --upgrade pip
pip install -e "python[all]"
라이브러리 설치의 마지막 단계로 FlashInfer를 설치해야 하는데 Documentation를 보면 CUDA 버전에 따라 다르게 설치해 줘야 함을 알려준다. Pytorch 버전과 각자 보유하고 있는 CUDA 버전에 맞게 설정할 수 있는 Documentation은 아래 링크에 있다.
https://docs.flashinfer.ai/installation.html
보유하고 있는 서버의 CUDA 버전은 12.2버전이기 때문에 Quick Start에 있는 CUDA 12.1 버전의 FlashInfer 코드를 활용해 설치를 진행했다.
pip install flashinfer -i https://flashinfer.ai/whl/cu121/torch2.4/
4. SGLang Backend Server
SGLang 서버를 Background로 사용하기 위해 nohub 대신 tmux라는 라이브러리를 사용했다. tmux에 대한 설명은 다음 포스팅 예정에 있다. 그렇기 때문에 tmux window에 진입한 시점부터 설명한다.
Huggingface에 들어가면 현재 공개되어 있는 모델들이 있다. 이 모델들을 활용할 수 있으며, Local에 저장되어 있지 않은 모델에 대해서는 Backend Server 실행 시 cache에 모델이 저장된다는 점을 참고해야 한다.
Backend Server에 Load 할 LLM Model로 "Qwen2.5-14B-Instruct" 모델을 선택했다. Backend Server를 실행하기 위해 입력해야 하는 파라미터로 model_path가 있는데 이 부분에 설정한 모델명을 작성해야 하는데 아래 사진을 보면 모델 이름 옆에 복사 버튼을 통해서 모델명을 복사&붙여넣기 할 수 있다.
(1) Python 폴더 진입
현재 터미널에서의 위치는 sglang이다. 하지만 실행해야 하는 위치는 sglang 레포지토리 내 python 폴더이기 때문에 해당 위치로 이동한다.
cd python
(2) Backend Server 실행
아래 코드를 통해 SGLang Backend Server를 실행한다.
python -m sglang.launch_server --model-path Qwen/Qwen2.5-14B-Instruct --tp 2 --mem-fraction-static 0.7 --enable-p2p-check --host 0.0.0.0 --port 30300
보유 중인 머신 스펙에 따라 파라미터는 변경될 수 있다.
- --tp : 모델을 여러 gpu에 나누어 실행할 때 사용하는 "Tensor Parallelism" 세팅이다. 쉽게 말하면, 보유 중인 머신의 달려있는 GPU 수를 작성하면 된다.
- --mem-fraction-static : 사용할 메모리 비율을 지정하는 옵션이다. 본 디바이스에서는 70%의 메모리를 사용하도록 설정해 서버가 사용할 메모리 상한선을 설정한다.
- --enable-p2p-check : 장비 간 "peer-to-peer" 연결이 가능하도록 설정하는 옵션이다. 만약 보유 중인 머신의 gpu가 2way 이상이라면 해당 설정을 반드시 해 줘야 한다.
이 과정을 모두 수행했다면 위의 사진과 같이 정상적으로 서버가 올라갔다는 메시지를 받을 수 있다.
Test
현재 단계까지 진행했다면 실제 모델에 입력을 넣을 수 있게 되는데 이 부분은 사용하는 모델별로 지정해줘야하는 프롬프트 구성 방식이나 파라미터 세팅이 존재하기 때문에 달라지게 된다. 본 작업에서는 "Qwen2.5-14B-Instruct" 모델을 사용했기 때문에 여기서 제안하는 파라미터 세팅 및 프롬프트 구성 방식을 사용한다.
SGLang을 활용할 수 있는 방안은 여러 가지가 존재하고 어디까지나 Test이기 때문에 그 중 하나의 방안을 사용한 것임을 말하고 싶은데, 추가적인 방법들은 Documentation에서 확인할 수 있다.
SGLang의 설치에 대한 포스팅이므로 LLM Model 템플릿 제작에 대한 부분은 설명하지 않고, backend server에 모델 결과를 받는 부분에 대해 설명한다. 아래 코드는 python 코드이다.
def llm_server_post(templete) :
response = requests.post(
"http://서버 ip:30300/generate",
json={
"text": templete,
"sampling_params": {
"temperature": 0.01,
"top_p" : 0.9,
"max_new_tokens": 2048,
},
"stream": True,
},
stream=True,)
return response
templete를 제작 후 사전에 올라간 SGLang 서버 port번호를 통해서 값을 받아오면 test 진행이 완료된다.
'NLP > TIL' 카테고리의 다른 글
[TIL] tmux 사용 방법 (0) | 2024.11.14 |
---|