Туториал: запускаем Hunyuan-A13B модель на vLLM и на llama.cpp

в 5:29, , рубрики: hunyuan, llm, llm-модели

Недавно вышла новая модель - Hunyuan-A13B:

https://huggingface.co/tencent/Hunyuan-A13B-Instruct-GPTQ-Int4 (это уже квант)

Туториал: запускаем Hunyuan-A13B модель на vLLM и на llama.cpp - 1

Это MOE (Mixture of Experts), размер модели - 80 миллиардов параметров, но для вычисление следующего токена используется ограниченное количество "экспертов", которые активизируют только 13 миллиардов.

Я заметил, что когда выкатывают новые модели, то для них обычно готовят поддержку в таких движках, как vLLM, а вот для "народного" llama.cpp - поддержка приходит с задержкой в несколько недель.

vLLM

https://github.com/vllm-project/vllm

Это более "энтерпрайзный" движок.

У него лучше сделано поддержка многих запросов одновременно.

В чём vLLM отличается от llama.cpp?

  • llama.cpp поддерживает GGUF кванты, а vLLM - не очень (https://docs.vllm.ai/en/latest/features/quantization/index.html).

  • llama.cpp можно запустить так, чтобы выгрузить модель на одну или несколько GPU и частично в память. У vLLM в этом плане намного меньше вариантов. Несколько одинаковых GPU поддерживается - а разные GPU, или GPU + RAM не запускаются. Может и есть какие "танцы с бубном" для таких вещей, но у меня не запустилось.

  • vLLM лучше поддерживает одновременные запросы, более эффективно использует KV cache под каждый запрос.

Конкретно в случае с этой моделью, преимущество vLLM в том, что квант INT4 выпущен разработчиками модели, и как они пишут, натренирован этот квант был вместе с основной моделью, то есть качество выше, чем например у квантов GGUF.

Квант INT4 занимает 40GB VRAM. Плюс нужна память для контекста.

Получается, как минимум нужно 48GB VRAM. Тогда помещается контекст на 19500 токенов.

Я запускал на китайской поделке: RTX 4090D 48GB VRAM.

Запускаем vLLM в Docker compose

services:
vllm:
image: vllm/vllm-openai:latest
container_name: Hunyuan80B
deploy:
resources:
reservations:
devices:
- driver: nvidia
capabilities: [gpu]
ports:
- "37000:8000"
volumes:
- /home/user/.cache/huggingface:/root/.cache/huggingface
ipc: host
command:
- "--model"
- "tencent/Hunyuan-A13B-Instruct-GPTQ-Int4"
- "--trust-remote-code"
- "--quantization"
- "gptq_marlin"
- "--max-model-len"
- "19500"
- "--max-num-seqs"
- "4"
- "--served-model-name"
- "Hunyuan80B"

Я тестировал версию 0.9.2

Наверное оно должно запуститься если есть две карточки по 24GB. В этом случае надо будет добавить --tensor-parallel-size 2

Вам нужно будет поменять volumes на подходящий для вас.

Когда контейнер запуститься, то будут доступны только REST запросы. UI у vLLM нету.

И вам надо будет отправлять curl запросы, или использовать что-то типа OpenWebUI.

Запускаем llama.cpp в Docker compose

Разработчика llama.cpp недавно добавили поддержку этой модели, и есть уже разные кванты, но как-то народ пишет, что качество поддержки надо бы ещё улучшить.

https://github.com/ggml-org/llama.cpp

Модель скачиваем вот здесь: https://huggingface.co/unsloth/Hunyuan-A13B-Instruct-GGUF

Я использовал квант Q4_0. Размер - чуть больше чем INT4.

services:
llama-server:
image: ghcr.io/ggml-org/llama.cpp:full-cuda
container_name: hun80b
deploy:
resources:
reservations:
devices:
- driver: nvidia
capabilities: [gpu]
ports:
- "37000:37000"
volumes:
- /home/user/.cache:/root/.cache
entrypoint: ["./llama-server"]
command: >
--model /root/.cache/huggingface/hub/models--unsloth--Hunyuan-A13B-Instruct-GGUF/snapshots/14968524348ad0b4614ee6837fd9c5cda8265831/Hunyuan-A13B-Instruct-Q4_0.gguf
--alias Hunyuan80B
--ctx-size 19500
--flash-attn
--threads 4
--host 0.0.0.0 --port 37000
--n-gpu-layers 999

Скорость

Вот что у меня логах vLLM:

Avg prompt throughput: 193.3 tokens/s, Avg generation throughput: 71.4 tokens/s

А вот что в логах llama.cpp:

prompt eval time = 744.02 ms / 1931 tokens ( 2595.36 tokens per second)
eval time = 29653.01 ms / 2601 tokens ( 87.71 tokens per second)

На одном запросе llama.cpp - быстрее. Проверять на многих запросах я не стал, это не мой сценарий, но вроде бы там vLLM должен проявить себя лучше, чем llama.cpp.

vLLM вроде бы ожидается будет иметь немного лучшее качество ответов, но тут я не уверен, как это протестировать.

Контекст

vLLM не сможет обработать контекста больше, чем помещается в GPU VRAM.

llama.cpp - если контекст не помещается в GPU VRAM, то можно разгрузиться на второй GPU, или в обычную память, хотя это будет значительно снижать скорость.

Заключение

Я - обычный пользователь, не эксперт. Тут на Хабре есть те, кто больше в теме. Поэтому критика, дополнения, рекомендации по использую других параметров и конфигурация - приветствуются.

Автор: SlavikF

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js