LLM) HuggingFace 모델 다운로드부터 gguf 및 quantization 수행 후 vLLM 서빙하는 순서 정리해보기 (테스트 필요)

2024. 11. 16. 17:34관심있는 주제/LLM

qwen2.5-72b를 vllm에 올리는 테스트를 해보는 중에, ollama로 올린 것이 vllm으로 올린 것보다 더 빠른 것을 경험했습니다.

vllm에 올린 모델은 허깅페이스에 올라온 모델을 기반으로 테스트했습니다.

1. Qwen/Qwen2.5-72B-Instruct-AWQ

2. Qwen/Qwen2.5-72B-Instruct-GPTQ-Int8

 

ollama 역시 양자화된 것인데

Q4_K_M으로 양자화된 모델(gguf)임을 알 수 있습니다.

 

개인적으로 서빙을 할 때 당연히 ollama가 vllm 보다 느릴 줄 알았는데, vllm이 더 느린 것을 보고, 공식적으로 지원하지 않는 모델 같은 경우 느릴 수도 있겠다는 생각이 들었습니다.

https://docs.vllm.ai/en/latest/models/supported_models.html#text-generation

 

2024-11-16일 기준으로는 사이트에 공식적으로 생성형 모델 중에서 Qwen2.5에 대한 모델은 언급이 되어있지 않음. (물론 서빙은 되긴 함)

 

하지만 내용을 적은 부분도 있긴 함.

 

그래도 이번에는 저렇게 양자화된 GGUF를 vllm에 올려서 더 빠른 속도가 나오는 지 테스트해보고자 할 때

설치부터 실행까지 내용을 정리해보고자 합니다.

 

설치 (LLama.cpp,huggingface-cli) - 서버 환경에 따라 달라질 수 있습니다.

LLama.cpp 설치

1. 의존성 제거 및 기본 도구 설치

sudo apt-get remove --purge cmake -y # 기존 cmake 제거
sudo apt-get install -y software-properties-common build-essential # 기본 도구 설치

2. GCC/G++ 업데이트

GCC와 G++가 최신 버전이어야 OpenBLAS 및 llama.cpp 빌드에 문제가 없습니다.

sudo apt-add-repository -y ppa:ubuntu-toolchain-r/test  # 최신 GCC 저장소 추가
sudo apt-get update
sudo apt-get install -y gcc-10 g++-10  # GCC/G++ 10 설치
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10
sudo update-alternatives --config gcc  # 기본 GCC 설정
sudo update-alternatives --config g++  # 기본 G++ 설정

3. CMake 설치

최신 CMake는 여러 컴파일 옵션을 지원합니다.

sudo apt-get install -y cmake

4. OpenBLAS 설치

OpenBLAS는 GGML의 BLAS 가속화를 사용하려면 필수입니다.

sudo apt-get update
sudo apt-get install -y libopenblas-dev

5. llama.cpp 클론 및 빌드

git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
make LLAMA_OPENBLAS=1  # OpenBLAS 지원 빌드

 


6. (선택 사항) GPU 지원 추가

GPU 가속을 사용하려면 CUDA를 설치한 후 LLAMA_CUBLAS 옵션을 추가로 활성화해야 합니다. CUDA를 설치했다면 다음 명령을 실행하세요:

 
make LLAMA_CUBLAS=1

 

 

huggingface-cli 설치

 pip install -U "huggingface_hub[cli]"

 

DownLoad Model 

huggingface 에서 직접 다운로드하는 경우 

huggingface-cli download <huggingface_repo> --local-dir . --local-dir-use-symlinks False
# huggingface-cli download Qwen/Qwen2.5-72B-Instruct --local-dir . --local-dir-use-symlinks False

 

gguf를 직접 다운로드 하는 경우 

huggingface-cli download <huggingface_repo> --include "qwen2.5-72b-instruct-q5_k_m*.gguf" --local-dir . --local-dir-use-symlinks False
# huggingface-cli download Qwen/Qwen2.5-72B-Instruct-GGUF --include "qwen2.5-72b-instruct-q5_k_m*.gguf" --local-dir . --local-dir-use-symlinks False

 

Convert Model to GGUF

# convert the model to ggml FP16 format

python3 convert_hf_to_gguf.py models/mymodel/

 

 

GGUF split (옵션)

Command line options:

  • --split: split GGUF to multiple GGUF, default operation.
  • --split-max-size: max size per split in M or G, f.ex. 500M or 2G.
  • --split-max-tensors: maximum tensors in each split: default(128)
  • --merge: merge multiple GGUF to a single GGUF.

여러 개의 gguf 파일을 하나의 gguf 파일로 만드는 명령

./llama-gguf-split --merge qwen2.5-72b-instruct-q4_k_m-00001-of-00012.gguf qwen2.5-72b-instruct-q4_k_m.gguf

 

Quantize (양자화)

quantize the model to 4-bits (using Q4_K_M method)

./llama-quantize ./models/mymodel/ggml-model-f16.gguf ./models/mymodel/ggml-model-Q4_K_M.gguf Q4_K_M

 

최종 확인

모든 설치가 완료되었으면 모델을 테스트하세요:

./main -m /path/to/your/model.gguf -p "Hello, world!"

 

 

vLLM 서빙하기 (양자화 기준) - 테스트 필요 

참고로 실제 문서에서도 이 부분이 없어서 여러 사이트를 찾아봤고, 어느 정도 진행하다 실패를 한 경험이 있다.

일단 내가 테스트한 모델이 qwen2.5인데, 현재 시점에서 vllm에서 정식적으로 지원하지 않아서 그런지 gguf는 안되었고, 좀 더 알아봐야 하는 부분이다.

 

 

그래서 포인트가 되는 부분은 크게 세 부분이다.

  • -v
    • 볼륨 마운트로 로컬에 있는 gguf 폴도 경로랑 컨테이너의 폴더 경로를 마운트해주는 것을 해준다.
  • --model
    • gguf 경로를 적어줘되, 컨테이너 기준으로 경로를 적어줘야 한다.
  • --tokenizer
    • --model에는 기존에 config.json도 있고 여러 tokenizer 정보가 있지만, gguf를 사용하면 없기 때문에 tokenizer 파라미터를 추가해야 한다.
docker run --runtime nvidia --gpus=all \
    -v /path/to/your/dot/gguf/models:/models \
    --env "HUGGING_FACE_HUB_TOKEN=<your-hf-token>" \
    -p 8000:8000 \
    --ipc=host \
    vllm/vllm-openai:latest \
    --model /models/codestral-22b-v0.1.Q4_K.gguf \
    --tokenizer mistralai/Codestral-22B-v0.1

 

이런 식으로 했을 때 아쉽게도 qwen2.5-72b에 대해서 테스트는 실패했다. 

에러로는 vocab size가 안 맞다고 하는데, 원인으로는 gguf 만들 때랑 내가 사용한 tokenizer로 사용한 거랑 먼가 달라진 것일 수도 있다. 
그래서 다시 gguf부터 만드는 작업을 하면 될 수도 있지만, 나중에 해보고자 한다.

 

https://huggingface.co/Qwen/Qwen2.5-72B-Instruct

https://huggingface.co/Qwen/Qwen2.5-72B-Instruct-GGUF

 

문제점

일단 vllm 자체가 gguf를 아직 완벽하게 지원하지 않고 있고, qwen2.py 에 코드가 좀 불완전한 것 같다.

이걸 수정하려면 내용을 수정해서 이미지로 써야하지만, 그러면 관리 포인트가 늘어나서 애매한 것 같다...

 

정리

이번에는 huggingface model을 다운로드부터 gguf로 변환하고 vllm에 서빙하는 것까지 알아봤습니다.

물론 해당 모델로는 실패했지만, 다음에 다시 한번 테스트해보고자 하고, 항상 vLLM이 빠르진 않다는 것을 경험해서 서빙할 때 테스트는 꼭 해봐야 할 것 같습니다.

 

참고

제목 링크
vllm docs (gguf) https://docs.vllm.ai/en/latest/getting_started/examples/gguf_inference.html
Qwen VLLM  https://qwen.readthedocs.io/en/latest/deployment/vllm.html
vllm docs (gguf) https://docs.vllm.ai/en/latest/quantization/gguf.html
vllm Engine Args https://docs.vllm.ai/en/latest/models/engine_args.html
quantize github example https://github.com/ggerganov/llama.cpp/blob/master/examples/quantize/README.md
vllm gguf https://github.com/vllm-project/vllm/issues/8570
vllm output dim 안맞는 이슈 논의 깃헙 https://github.com/vllm-project/vllm/issues/5203

 

728x90