Поскольку LLM необходимо обрабатывать большое количество параметров для прогнозирования, которое может увеличиться с 7 миллиардов параметров до 321 миллиарда, развертывание такой модели может потребовать значительных ресурсов и оптимизации вместо использования традиционных методов развертывания моделей машинного обучения.
Когда предложение или токен являются сложными,Обработка результатов займет несколько минут,Это может вызвать проблемы в масштабе или в реальных операциях. Например,Компания может иметь продуктQ&AПриложения для чат-ботовLLM,Медленный ответ может расстраивать пользователей. поэтому,Хорошей практикой является применение некоторых методов для уменьшения зависимости.
В крупномасштабных системах или когда в системе несколько LLM.,Потратит много бюджета,Потому что LLM используют много ресурсов для обработки,Как MLE,Поиск способа использования ресурсов принесет системе финансовую выгоду. Например,Снизьте стоимость каждого запроса.
Этот проект реализован студентами Калифорнийского университета в Беркли, которые увлечены оптимизацией эффективности обслуживания студентов LLM. Многие системы тратят много ресурсов на обслуживание LLM, но имеют плохое время отклика при развертывании с использованием простых методов. Поэтому команда vLLM предложила новый метод решения этой проблемы. Используя дизайн виртуальной памяти операционной системы, производительность службы LLM можно повысить примерно в 24 раза, при этом используемая память графического процессора сокращается вдвое по сравнению с традиционным методом. Для интеграции в вашу систему vLLM предоставляет инженерам по машинному обучению простой интерфейс для разработки через интерфейс Python, который вы можете интегрировать в свою систему без использования сложных пакетов или зависимостей.
чтобы понятьvLLMКак уменьшить Задерживатьи Цель оптимизации общей производительности системы.,Нам следует понять узкое место vLLM и способы решения этой проблемы.
Модель большого языка (LLM) — это, по сути, ветвь нейронной сети внимания, или некоторые называют ее преобразователем, с декодированием на основе специальной модели. Поэтому нам необходимо понять ключевую концепцию: как LLM генерирует токены.
По сути, запрошенный KV-кеш хранится в непрерывном пространстве памяти, поскольку многие вычисления платформы глубокого обучения требуют, чтобы значения тензора хранились в непрерывной памяти. Однако в зависимости от архитектуры модели кэш KV может со временем увеличиваться или уменьшаться, и этот формат хранения может вызывать проблемы и непрактичен для вычислений.
Команда vLLM разработала новый алгоритм внимания под названием PageAttention, вдохновленный концепцией виртуальной памяти операционной системы. Думайте о блоках как о страницах, о токенах как о байтах, а о запросах как о процессах.
Еще одним преимуществом использования PageAttention является то, что оно позволяет системам совместно использовать кэш KV, поскольку токены хранятся в несмежной памяти. Это позволяет использовать LLM во многих приложениях.
Если вы хотите быстро использовать vLLM для запуска сервера, совместимого с OpenAI, вы можете сделать следующее:
Установка из командной строки:
pip3 install vllm==0.5.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
Обычный запуск (на примере Qwen2-7B):
python -m vllm.entrypoints.openai.api_server --model Qwen/Qwen2-7B-Instruct
Подробное объяснение других параметров запуска:
python3 -m vllm.entrypoints.openai.api_server -h
использование: api_server.py [-h] [--host HOST] [--port PORT] [--uvicorn-log-level {debug,info,warning,error,critical,trace}] [--allow-credentials] [--allowed-origins ALLOWED_ORIGINS] [--allowed-methods ALLOWED_METHODS] [--allowed-headers ALLOWED_HEADERS]
[--api-key API_KEY] [--lora-modules LORA_MODULES [LORA_MODULES ...]] [--chat-template CHAT_TEMPLATE] [--response-role RESPONSE_ROLE] [--ssl-keyfile SSL_KEYFILE] [--ssl-certfile SSL_CERTFILE] [--ssl-ca-certs SSL_CA_CERTS]
[--ssl-cert-reqs SSL_CERT_REQS] [--root-path ROOT_PATH] [--middleware MIDDLEWARE] [--model MODEL] [--tokenizer TOKENIZER] [--skip-tokenizer-init] [--revision REVISION] [--code-revision CODE_REVISION]
[--tokenizer-revision TOKENIZER_REVISION] [--tokenizer-mode {auto,slow}] [--trust-remote-code] [--download-dir DOWNLOAD_DIR] [--load-format {auto,pt,safetensors,npcache,dummy,tensorizer,bitsandbytes}]
[--dtype {auto,half,float16,bfloat16,float,float32}] [--kv-cache-dtype {auto,fp8,fp8_e5m2,fp8_e4m3}] [--quantization-param-path QUANTIZATION_PARAM_PATH] [--max-model-len MAX_MODEL_LEN]
[--guided-decoding-backend {outlines,lm-format-enforcer}] [--distributed-executor-backend {ray,mp}] [--worker-use-ray] [--pipeline-parallel-size PIPELINE_PARALLEL_SIZE] [--tensor-parallel-size TENSOR_PARALLEL_SIZE]
[--max-parallel-loading-workers MAX_PARALLEL_LOADING_WORKERS] [--ray-workers-use-nsight] [--block-size {8,16,32}] [--enable-prefix-caching] [--disable-sliding-window] [--use-v2-block-manager]
[--num-lookahead-slots NUM_LOOKAHEAD_SLOTS] [--seed SEED] [--swap-space SWAP_SPACE] [--gpu-memory-utilization GPU_MEMORY_UTILIZATION] [--num-gpu-blocks-override NUM_GPU_BLOCKS_OVERRIDE]
[--max-num-batched-tokens MAX_NUM_BATCHED_TOKENS] [--max-num-seqs MAX_NUM_SEQS] [--max-logprobs MAX_LOGPROBS] [--disable-log-stats]
[--quantization {aqlm,awq,deepspeedfp,fp8,marlin,gptq_marlin_24,gptq_marlin,gptq,squeezellm,compressed-tensors,bitsandbytes,None}] [--rope-scaling ROPE_SCALING] [--rope-theta ROPE_THETA] [--enforce-eager]
[--max-context-len-to-capture MAX_CONTEXT_LEN_TO_CAPTURE] [--max-seq-len-to-capture MAX_SEQ_LEN_TO_CAPTURE] [--disable-custom-all-reduce] [--tokenizer-pool-size TOKENIZER_POOL_SIZE] [--tokenizer-pool-type TOKENIZER_POOL_TYPE]
[--tokenizer-pool-extra-config TOKENIZER_POOL_EXTRA_CONFIG] [--enable-lora] [--max-loras MAX_LORAS] [--max-lora-rank MAX_LORA_RANK] [--lora-extra-vocab-size LORA_EXTRA_VOCAB_SIZE] [--lora-dtype {auto,float16,bfloat16,float32}]
[--long-lora-scaling-factors LONG_LORA_SCALING_FACTORS] [--max-cpu-loras MAX_CPU_LORAS] [--fully-sharded-loras] [--device {auto,cuda,neuron,cpu,openvino,tpu,xpu}] [--image-input-type {pixel_values,image_features}]
[--image-token-id IMAGE_TOKEN_ID] [--image-input-shape IMAGE_INPUT_SHAPE] [--image-feature-size IMAGE_FEATURE_SIZE] [--image-processor IMAGE_PROCESSOR] [--image-processor-revision IMAGE_PROCESSOR_REVISION]
[--disable-image-processor] [--scheduler-delay-factor SCHEDULER_DELAY_FACTOR] [--enable-chunked-prefill] [--speculative-model SPECULATIVE_MODEL] [--num-speculative-tokens NUM_SPECULATIVE_TOKENS]
[--speculative-draft-tensor-parallel-size SPECULATIVE_DRAFT_TENSOR_PARALLEL_SIZE] [--speculative-max-model-len SPECULATIVE_MAX_MODEL_LEN] [--speculative-disable-by-batch-size SPECULATIVE_DISABLE_BY_BATCH_SIZE]
[--ngram-prompt-lookup-max NGRAM_PROMPT_LOOKUP_MAX] [--ngram-prompt-lookup-min NGRAM_PROMPT_LOOKUP_MIN] [--model-loader-extra-config MODEL_LOADER_EXTRA_CONFIG] [--preemption-mode PREEMPTION_MODE]
[--served-model-name SERVED_MODEL_NAME [SERVED_MODEL_NAME ...]] [--qlora-adapter-name-or-path QLORA_ADAPTER_NAME_OR_PATH] [--otlp-traces-endpoint OTLP_TRACES_ENDPOINT] [--engine-use-ray] [--disable-log-requests]
[--max-log-len MAX_LOG_LEN]
vLLM RESTful с совместимостью с OpenAI API-сервер.
Дополнительные параметры:
-h, --help Показать это справочное сообщение и выйти
--host HOST имя хоста
--port PORT номер порта
--uvicorn-log-level {debug,info,warning,error,critical,trace}
уровень журнала uvicorn
--allow-credentials Разрешить учетные данные
--allowed-origins ALLOWED_ORIGINS
разрешенные источники
--allowed-methods ALLOWED_METHODS
разрешенные методы
--allowed-headers ALLOWED_HEADERS
Разрешенные заголовки
--api-key API_KEY Если он предоставлен, сервер запросит этот ключ в заголовке.
--lora-modules LORA_MODULES [LORA_MODULES ...]
Конфигурация модуля LoRA, формат имя=путь. Можно указать несколько модулей.
--chat-template CHAT_TEMPLATE
Путь к файлу шаблона чата или однострочный шаблон для указанной модели.
--response-role RESPONSE_ROLE
Имя роли возвращается, если `request.add_generation_prompt=true`.
--ssl-keyfile SSL_KEYFILE
Путь к файлу ключа SSL
--ssl-certfile SSL_CERTFILE
Путь к файлу сертификата SSL
--ssl-ca-certs SSL_CA_CERTS
Файл сертификата CA
--ssl-cert-reqs SSL_CERT_REQS
Требуется ли сертификат клиента (см. модуль SSL стандартной библиотеки)
--root-path ROOT_PATH
FastAPI, когда приложение находится за прокси-сервером маршрутизации на основе пути root_path
--middleware MIDDLEWARE
Дополнительное промежуточное ПО ASGI, которое можно применить к вашему приложению. Мы принимаем несколько аргументов --middleware. Его значение должно быть путем импорта. Если функция предоставлена, vLLM добавит ее на сервер с помощью @app.middleware('http'). Если класс указан, vLLM добавляет его с помощью app.add_middleware().
--model MODEL Имя модели Huggingface или путь к использованию.
--tokenizer TOKENIZER
Имя или путь токенизатора Huggingface. Если не указано, используется имя модели или путь.
--skip-tokenizer-init
Пропустить инициализацию токенизатора и антитокенизатора
--revision REVISION Конкретная версия модели, которую следует использовать. Это может быть имя ветки, имя тега или идентификатор фиксации. Если не указано, будет использоваться версия по умолчанию.
--code-revision CODE_REVISION
Используется для кода модели в Hugging. Face Конкретная ревизия Хаба. Это может быть имя ветки, имя тега или идентификатор фиксации. Если не указано, будет использоваться версия по умолчанию.
--tokenizer-revision TOKENIZER_REVISION
Пересмотренная версия токенизатора Huggingface. Это может быть имя ветки, имя тега или идентификатор фиксации. Если не указано, будет использоваться версия по умолчанию.
--tokenizer-mode {auto,slow}
Режим токенизатора. * «auto» будет использовать быстрый токенизатор, если он доступен. * «медленный» всегда будет использовать медленный токенизатор.
--trust-remote-code Доверяйте удаленному коду от HuggingFace.
--download-dir DOWNLOAD_DIR
Загрузите и загрузите каталог Weight, который по умолчанию соответствует каталогу кэша HuggingFace по умолчанию.
--load-format {auto,pt,safetensors,npcache,dummy,tensorizer,bitsandbytes}
Формат, используемый для загрузки весов модели. * «авто» попытается загрузить веса в формате защитных тензоров и вернуться к pytorch, если формат защитных тензоров недоступен. формат бин. * "pt" будет pytorch Загрузите вес в формате контейнера. * «safetensors» будет загружать веса в формате Safetensors. * «npcache» будет загружать веса в формате pytorch и сохранять кеш numpy для ускорения загрузки. * «dummy» инициализирует веса случайными значениями и в основном используется для анализа производительности. * «тензоризатор» загрузит веса с помощью тензоризатора из CoreWeave. Дополнительную информацию см. в разделе «Тензоризация» в разделе «Примеры». Скрипт модели vLLM. * «bitsandbytes» будет использовать биты и байты для количественной оценки весов нагрузки.
--dtype {auto,half,float16,bfloat16,float,float32}
Веса модели и типы данных активации. * «Авто» будет использовать точность FP16 для моделей FP32 и FP16 и точность BF16 для моделей BF16. * «половина» — для FP16. Рекомендуется для квантования AWQ. * «float16» — то же самое, что «половина». * «bfloat16» используется для балансировки точности и дальности. * «Поплавок» — это сокращение от точности FP32. * «float32» соответствует точности FP32.
--kv-cache-dtype {auto,fp8,fp8_e5m2,fp8_e4m3}
Тип данных, хранящийся в кэше kv. Если «авто», будет использоваться тип данных модели. КУДА 11.8+ поддерживает fp8(=fp8_e4m3) и fp8_e5m2. ROCm (AMD графический процессор) поддерживает fp8(=fp8_e4m3)
--quantization-param-path QUANTIZATION_PARAM_PATH
Путь к файлу JSON, содержащему коэффициенты масштабирования кэша KV. Этот файл обычно следует предоставлять, если тип данных кэша KV — FP8. В противном случае коэффициент масштабирования кэша KV по умолчанию будет равен 1,0, что может вызвать проблемы с точностью. FP8_E5M2 (немасштабированный) поддерживается только в том случае, если версия CUDA выше 11,8. В ROCm (AMD GPU) вместо этого поддерживает FP8_E4M3 для соответствия общим стандартам вывода.
--max-model-len MAX_MODEL_LEN
Длина контекста модели. Если не указано, оно будет автоматически получено из конфигурации модели.
--guided-decoding-backend {outlines,lm-format-enforcer}
Какой механизм будет использоваться по умолчанию для управления декодированием (схема/регулярное выражение JSON и т. д.). В настоящее время поддерживает https://github.com/outlines-dev/outlines. и https://github.com/noamgat/lm-format-enforcer. Может быть переопределено с помощью параметраguide_decoding_backend в запросе.
--distributed-executor-backend {ray,mp}
Бэкэнд для распределенных сервисов. При использовании более 1 графического процессора для параметра «ray» автоматически устанавливается значение «ray», если оно установлено, в противном случае устанавливается значение «mp» (многопроцессный).
--worker-use-ray Устарело, используйте --distributed-executor-backend=ray.
--pipeline-parallel-size PIPELINE_PARALLEL_SIZE, -pp PIPELINE_PARALLEL_SIZE
Количество этапов конвейера.
--tensor-parallel-size TENSOR_PARALLEL_SIZE, -tp TENSOR_PARALLEL_SIZE
Количество параллельных копий тензора.
--max-parallel-loading-workers MAX_PARALLEL_LOADING_WORKERS
Загружайте модели последовательно несколькими партиями.,Чтобы избежать использования тензорного параллелизмаи Встречается с большими моделямиRAM OOM。
--ray-workers-use-nsight
Если указано, используйте nsight для анализа рабочих узлов Ray.
--block-size {8,16,32}
Размер блока токенов для последовательных блоков токенов.
--enable-prefix-caching
Включите автоматическое кэширование префиксов.
--disable-sliding-window
Отключить скользящее окно, установить размер скользящего окна.
--use-v2-block-manager
Используйте BlockSpaceMangerV2.
--num-lookahead-slots NUM_LOOKAHEAD_SLOTS
Экспериментальная конфигурация планирования, необходимая для прогнозирования начального декодирования. В будущем это будет заменено спекулятивной конфигурацией; в настоящее время она существует для обеспечения возможности проверки правильности до тех пор.
--seed SEED Случайное начальное число для операции.
--swap-space SWAP_SPACE
Размер пространства подкачки ЦП на каждый графический процессор (Ги Б).
--gpu-memory-utilization GPU_MEMORY_UTILIZATION
Доля памяти графического процессора, используемая исполнителем модели, может находиться в диапазоне от 0 до 1. Например, значение 0,5 будет означать использование памяти графического процессора на 50 %. Если не указано, будет использоваться значение по умолчанию 0,9.
--num-gpu-blocks-override NUM_GPU_BLOCKS_OVERRIDE
Если указано, игнорируйте результаты теста производительности графического процессора и используйте это количество блоков графического процессора. Используется для тестирования упреждения.
--max-num-batched-tokens MAX_NUM_BATCHED_TOKENS
Максимальное количество токенов пакетной обработки на итерацию.
--max-num-seqs MAX_NUM_SEQS
Максимальное количество последовательностей на итерацию.
--max-logprobs MAX_LOGPROBS
Возвращает максимальное количество logprobs, если logprobs указаны в SamplingParams.
--disable-log-stats Отключить статистику журнала.
--quantization {aqlm,awq,deepspeedfp,fp8,marlin,gptq_marlin_24,gptq_marlin,gptq,squeezellm,compressed-tensors,bitsandbytes,None}, -q {aqlm,awq,deepspeedfp,fp8,marlin,gptq_marlin_24,gptq_marlin,gptq,squeezellm,compressed-tensors,bitsandbytes,None}
Метод, используемый для количественного определения весов. Если нет, мы сначала проверяем атрибут quantization_config в файле конфигурации модели. Если это None, мы предполагаем, что веса модели не квантуются, и используем dtype для определения типа данных весов.
--rope-scaling ROPE_SCALING
Формат JSON конфигурации масштабирования RoPE. Например, {"type":"dynamic","factor":2.0}
--rope-theta ROPE_THETA
RoPE с использованием `rope_scaling` тета. В некоторых случаях смена RoPE тета может улучшить производительность масштабированных моделей.
--enforce-eager Всегда используйте режим ожидания PyTorch. Если ложь,Для максимальной производительности и гибкости будет использоваться сочетание режима энергичности и графиков CUDA.
--max-context-len-to-capture MAX_CONTEXT_LEN_TO_CAPTURE
Максимальная длина контекста, покрываемая графом CUDA. Когда длина контекста последовательности превышает эту длину, мы возвращаемся в режим ожидания. (Устарело. Вместо этого используйте --max-seq-len-to-capture)
--max-seq-len-to-capture MAX_SEQ_LEN_TO_CAPTURE
Максимальная длина последовательности, охватываемая графом CUDA. Когда длина контекста последовательности превышает эту длину, мы возвращаемся в режим ожидания.
--disable-custom-all-reduce
См. параллельную конфигурацию.
--tokenizer-pool-size TOKENIZER_POOL_SIZE
Размер пула токенизатора, используемого для асинхронной токенизации. Если 0, будет использоваться синхронная сегментация слов.
--tokenizer-pool-type TOKENIZER_POOL_TYPE
Тип пула токенизатора, используемого для асинхронной токенизации. Игнорируется, если tokenizer_pool_size равен 0.
--tokenizer-pool-extra-config TOKENIZER_POOL_EXTRA_CONFIG
Дополнительная настройка пула токенизаторов. Это должна быть строка JSON, которая будет проанализирована в словаре. Игнорируется, если tokenizer_pool_size равен 0.
--enable-lora Если True, включает обработку адаптеров LoRA.
--max-loras MAX_LORAS
Максимальное количество LoRA в одной партии.
--max-lora-rank MAX_LORA_RANK
Максимальное значение ранга LoRA.
--lora-extra-vocab-size LORA_EXTRA_VOCAB_SIZE
Максимальный размер дополнительного словаря (добавленного к словарю базовой модели), который может существовать в адаптере LoRA.
--lora-dtype {auto,float16,bfloat16,float32}
Тип данных LoRA. Если auto, по умолчанию будет использоваться dtype базовой модели.
--long-lora-scaling-factors LONG_LORA_SCALING_FACTORS
Укажите несколько коэффициентов масштабирования (которые могут отличаться от коэффициентов базовой модели — см., например, Long). LoRA), чтобы обеспечить одновременное использование нескольких адаптеров LoRA, обученных с помощью этих коэффициентов масштабирования. Если не указано, разрешены только адаптеры, обученные с использованием коэффициента масштабирования базовой модели.
--max-cpu-loras MAX_CPU_LORAS
Максимальное количество LoRA, хранящихся в памяти ЦП. Должно быть больше или равно max_num_seqs. По умолчанию — max_num_seqs.
--fully-sharded-loras
По умолчанию только половина вычислений LoRA сегментируется с использованием тензорного параллелизма. Включение этой опции будет использовать полностью сегментированные слои. Это может быть быстрее при больших длинах последовательностей, максимальных рангах или размерах тензорных параллелей.
--device {auto,cuda,neuron,cpu,openvino,tpu,xpu}
Тип устройства, на котором выполняется vLLM.
--image-input-type {pixel_values,image_features}
Тип ввода изображения передается в vLLM.
--image-token-id IMAGE_TOKEN_ID
Входной идентификатор токена изображения.
--image-input-shape IMAGE_INPUT_SHAPE
Самая большая форма ввода изображения для данного типа ввода (наименее удобная для памяти). Profile_run только для vLLM.
--image-feature-size IMAGE_FEATURE_SIZE
Размер элементов изображения по контекстным измерениям.
--image-processor IMAGE_PROCESSOR
Имя или путь к используемому процессору изображений HuggingFace. Если не указано, будет использоваться имя модели или путь.
--image-processor-revision IMAGE_PROCESSOR_REVISION
Используемая версия процессора изображений Huggingface. Это может быть имя ветки, имя тега или идентификатор фиксации. Если не указано, будет использоваться версия по умолчанию.
--disable-image-processor
Отключает использование процессоров изображений, даже если они определены в HuggingFace для модели.
--scheduler-delay-factor SCHEDULER_DELAY_FACTOR
Применяет Задержку (умноженную на коэффициент Задержки предыдущего запроса) перед планированием следующего запроса.
--enable-chunked-prefill
Если установлено, запросы предварительного заполнения могут быть разбиты на блоки на основе max_num_batched_tokens.
--speculative-model SPECULATIVE_MODEL
Название черновой модели, используемой при спекулятивной расшифровке.
--num-speculative-tokens NUM_SPECULATIVE_TOKENS
Количество спекулятивных токенов, выбранных из черновой модели при спекулятивном декодировании.
--speculative-draft-tensor-parallel-size SPECULATIVE_DRAFT_TENSOR_PARALLEL_SIZE, -spec-draft-tp SPECULATIVE_DRAFT_TENSOR_PARALLEL_SIZE
Количество параллельных копий тензоров черновых моделей при спекулятивном декодировании.
--speculative-max-model-len SPECULATIVE_MAX_MODEL_LEN
Максимальная длина последовательности, поддерживаемая черновой моделью. Последовательности, превышающие эту длину, будут пропускать предположения.
--speculative-disable-by-batch-size SPECULATIVE_DISABLE_BY_BATCH_SIZE
Если количество запросов в очереди превышает это значение, спекулятивное декодирование новых входящих запросов отключается.
--ngram-prompt-lookup-max NGRAM_PROMPT_LOOKUP_MAX
Максимальный размер окна для поиска подсказок ngram при спекулятивном декодировании.
--ngram-prompt-lookup-min NGRAM_PROMPT_LOOKUP_MIN
Минимальный размер окна для поиска подсказок ngram при спекулятивном декодировании.
--model-loader-extra-config MODEL_LOADER_EXTRA_CONFIG
Дополнительная конфигурация для загрузчиков моделей. Это будет передано загрузчику модели, соответствующему выбранному load_format. Это должна быть строка JSON, которая будет проанализирована в словаре.
--preemption-mode PREEMPTION_MODE
Если «перевычислить», механизм выполняет вытеснение посредством замены блоков; если «обмен», механизм выполняет вытеснение посредством замены блоков;
--served-model-name SERVED_MODEL_NAME [SERVED_MODEL_NAME ...]
Имя модели, используемое в API. Если указано несколько имен, сервер ответит на любое из предоставленных имен. Имя модели в поле модели в ответе будет первым именем в этом списке. Если не указано, имя модели будет таким же, как аргумент --model. Обратите внимание, что это имя также будет использоваться для содержимого тега model_name в метриках Prometheus. Если указано несколько имен, метка метрики примет первое из них.
--qlora-adapter-name-or-path QLORA_ADAPTER_NAME
vLLM показывает, как можно делать удивительные вещи, используя простые концепции, которые мы применяем уже десять лет. Эта платформа обеспечивает огромные улучшения в использовании памяти графического процессора и использует различные преимущества технологии PageAttention. Уменьшая использование кэша KV, система может обрабатывать большие нагрузки и быстрее выполнять логический вывод.