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 |
'관심있는 주제 > LLM' 카테고리의 다른 글
LangChain Products 알아보기 (LangChain, LangGraph, LangSmith, LangServe) (0) | 2024.08.07 |
---|---|
LLM) LLAVA 13b로 caption(설명) 또는 table 텍스트 데이터 생성해보기 (1) | 2024.07.30 |
Layout LM(=Language Model) 알아보기 - TODO (1) | 2024.07.23 |
논문 정리) Searching for Best Practices in Retrieval-Augmented Generation (0) | 2024.07.05 |
LangGraph) LangGraph에 대한 개념과 간단한 예시 만들어보기 (0) | 2024.06.29 |