Перейти к содержанию

Обслуживание моделей с адаптерами LoRA

LoRA (адаптация низкого ранга) — это эффективный по параметрам метод точной настройки, который адаптирует базовую модель к конкретной области путем загрузки небольших файлов адаптеров вместо повторного обучения полных весов.

GPUStack позволяет монтировать несколько адаптеров LoRA на развернутый базовый LLM и автоматически создает один модельный маршрут для каждого адаптера; вызывающие абоненты переключают адаптеры по запросу, устанавливая в поле model, совместимом с OpenAI, соответствующее имя маршрута, не выделяя отдельный графический процессор для каждой тонкой настройки.

В этом руководстве показано, как подключить несколько адаптеров LoRA к одной базовой модели на серверной части vLLM, SGLang или Ascend MindIE, а также как вызвать определенный адаптер через OpenAI-совместимый API.

Примечание

LoRA в настоящее время поддерживается только на бэкэндах vLLM, SGLang и Ascend MindIE. Конфигурация lora_list игнорируется на других серверах.

Предварительные условия

Прежде чем продолжить, убедитесь в следующем:

  • GPUStack установлен и работает.
  • Доступен рабочий узел Linux с графическим процессором. Используемая здесь базовая модель — Qwen3-8B, поэтому графическому процессору требуется достаточно памяти для обслуживания модели 8B (например, 24 ГБ или более). Два адаптера используют один и тот же экземпляр и добавляют лишь небольшой объем дополнительной памяти.
  • Доступ к Hugging Face для загрузки файлов модели и адаптера.

В этом руководстве монтируются два адаптера LoRA на одной базовой модели, чтобы вы могли видеть, как вызывающие абоненты переключаются между тонкими настройками по запросу. Он использует следующую конфигурацию:

Предмет Значение, используемое в этом уроке.
Источник модели Hugging Face
Бэкэнд vLLM
Базовая модель Qwen/Qwen3-8B
Адаптер LoRA 1 AMaslovskyi/qwen-devops-foundation-lora (название devops)
Адаптер LoRA 2 XinyuanWang/qwen3-8b-medical-lora (название medical)

Оба адаптера указывают Qwen/Qwen3-8B как свою базовую модель. Это жесткое требование: каждый адаптер, установленный в одном развертывании, должен иметь одну и ту же базовую модель.

Совет

После завершения руководства с этими значениями вы можете поменять местами ModelScope или Local Path в качестве источника, SGLang или Ascend MindIE в качестве серверной части, а также свою собственную базовую модель и адаптеры. См. раздел Совместимость и ограничения серверной части, чтобы узнать о различиях в зависимости от серверной части.

Шаг 1. Развертывание базовой модели с помощью адаптеров LoRA.

  1. Перейдите на страницу Deployments и нажмите Deploy Model, затем выберите Hugging Face в качестве источника.
  2. В поле поиска введите Qwen/Qwen3-8B и выберите его из результатов.
  3. Установите для серверной части значение vLLM.
  4. Разверните раздел Advanced и найдите LoRA Adapters. Добавьте адаптер первый:

    • В раскрывающемся списке адаптера введите AMaslovskyi/qwen-devops-foundation-lora и выберите его.
    • В поле LoRA name введите devops.
  5. Нажмите, чтобы добавить адаптер второй:

    • В раскрывающемся списке адаптера введите XinyuanWang/qwen3-8b-medical-lora и выберите его.
    • В поле LoRA name введите medical.
  6. Нажмите Save, чтобы завершить развертывание.

Снимок экрана: раздел «Адаптеры LoRA» в форме развертывания с добавлением обоих адаптеров

Примечание

Введите только имя адаптера (devops, medical) без префикса базовой модели. GPUStack автоматически получает полный идентификатор (qwen3-8b:devops, qwen3-8b:medical), который также является именем маршрута модели, которое вы используете для вызова каждого адаптера (см. Шаг 2).

Совет

Каждому адаптеру нужен отдельный LoRA name — чтобы установить больше, просто повторите шаг добавления. Если нужный вам адаптер не отображается в раскрывающемся списке, сначала подтвердите на Hugging Face или ModelScope, что модель действительно поставляется с адаптером LoRA, а затем вставьте полный идентификатор репозитория в поле поиска, чтобы выбрать его.

Шаг 2. Вызов адаптера LoRA

После развертывания GPUStack автоматически создает модельный маршрут для каждого адаптера LoRA с именем <base-model-name>:<adapter-name>. В этом уроке получается три маршрута — базовый qwen3-8b, плюс qwen3-8b:devops и qwen3-8b:medical. Каждый маршрут LoRA отображается рядом с собственным модельным маршрутом базовой модели на странице Model Routes и помечен значком LoRA для облегчения идентификации.

Снимок экрана: страница «Модельные маршруты» со списком базового маршрута и обоих маршрутов адаптера LoRA

Когда вы выбираете модель в Playground, в раскрывающемся списке отображаются базовая модель и все адаптеры LoRA; переключение этой опции направляет запрос на соответствующий адаптер. То же самое относится и к API-интерфейсу, совместимому с OpenAI: установите в поле model имя базовой модели или имя маршрута любого адаптера. Под капотом все адаптеры используют один и тот же экземпляр графического процессора, поэтому переключение между ними обходится гораздо дешевле, чем замена моделей.

Скриншот: раскрывающийся список моделей Песочницы со списком базовой модели и обоих адаптеров LoRA

Например, одно и то же приглашение можно перенаправить на любую точную настройку, просто изменив поле model. Отправьте адаптеру DevOps вопрос о Kubernetes:

1
2
3
4
5
6
7
curl http://<your-gpustack-server>/v1/chat/completions \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3-8b:devops",
    "messages": [{"role": "user", "content": "How do I debug a CrashLoopBackOff pod?"}]
  }'

Затем направьте клинический вопрос на медицинский адаптер, изменив только значение model:

1
2
3
4
5
6
7
curl http://<your-gpustack-server>/v1/chat/completions \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3-8b:medical",
    "messages": [{"role": "user", "content": "What are the first-line treatments for type 2 diabetes?"}]
  }'

Замените <your-gpustack-server> адресом вашего сервера и <your-api-key> ключом API, созданным на странице API Keys. Вместо этого отправка "model": "qwen3-8b" нацелена на базовую модель без примененного адаптера.

Шаг 3. Управление адаптерами LoRA

Вы можете настроить конфигурацию LoRA после создания развертывания:

  • Добавить адаптер: отредактируйте развернутую модель и сохраните ее. Экземпляры, уже находящиеся в состоянии Running, необходимо перезапустить, прежде чем новый добавленный адаптер будет смонтирован и обслужен.
  • Удалить адаптер: удалить соответствующую запись из развернутой модели. GPUStack автоматически удаляет соответствующий маршрут модели, если ни один экземпляр Running все еще не использует адаптер.
  • Конфликты имен: если в две разные базовые модели добавляются адаптеры, имена которых соответствуют одному и тому же маршруту модели, отправка отклоняется с ошибкой конфликта. Переименуйте один из адаптеров для восстановления.

Серверная совместимость и ограничения

Поддержка LoRA различается в зависимости от серверной части вывода:

Бэкэнд Аргументы/конфигурация запуска LoRA Ключевые ограничения
vLLM --enable-lora, --max-loras, --lora-modules --max-loras устанавливается автоматически, начиная с длины lora_list. Количество адаптеров фиксируется после запуска базовой модели; изменения требуют перезапуска экземпляра.
SGLang --enable-lora, --lora-paths name=path, --max-loras-per-batch Количество LoRA, активируемых одновременно в одной партии, ограничено --max-loras-per-batch.
Ascend MindIE maxLoras / maxLoraRank / LoraModules в файле конфигурации maxLoraRank по умолчанию — 64; адаптеры более высокого ранга не запускаются. maxLoras=0 автоматически соответствует количеству установленного адаптера.

GPUStack автоматически вводит эти параметры; обычно вам не нужно повторять их под Backend Parameters. Отменяйте значения по умолчанию (например, повышение maxLoraRank), добавляя флаг под Advanced → Backend Parameters.

Полную информацию и ограничения см. в официальной документации каждого бэкэнда: