DashInfer-VLM, производительность мультимодальных выводов SOTA, ultra-vLLM!
вводная
DashInfer-VLM - это архитектура вывода для визуальных мультимодальных больших моделей VLM, специально оптимизированная для ускорения вывода моделей Qwen VL. Самое большое отличие DashInfer-VLM от других фреймворков ускорения вывода для VLM заключается в том, что он отделяет часть VIT от части LLM, и VIT и LLM работают параллельно, не мешая друг другу. не мешая друг другу.
Это характеризуется тем, что предварительная обработка изображений и видео в VLM, а также часть извлечения признаков в VIT не прерывают генерацию LLM, а также может быть разделенной архитектурой VIT/LLM, и это первый сервисный фреймворк VLM в сообществе open-source, который использует такую архитектуру.
При развертывании на нескольких картах на каждой из них установлен процессор ViT, что дает значительное преимущество в производительности в сценариях с видео и несколькими изображениями.
Кроме того, для части ViT поддерживается кэширование памяти, что избавляет от необходимости многократно пересчитывать ViT при нескольких раундах диалога.
Ниже приведена схема его архитектуры и конфигурации в соответствии с 4-карточной частью 72B.

Диаграмма архитектуры описывает процесс и архитектуру:
- В части ViT для выводов может использоваться множество элексиров, таких как TensorRT или onnxruntime (экспорт модели onnx будет выполняться для ViT-части модели в рамках фреймворка). В настоящее время TensorRT поддерживается во фреймворке по умолчанию.
- В разделе LLM для выводов используется DashInfer.
- Часть кэша, поддержка результата ViT Кэш памяти, LLM часть кэша префиксов, LLM часть мультимодального кэша префиксов (по умолчанию не включена)
Код Адрес:
https://github.com/modelscope/dash-infer
Адрес документа:
https://dashinfer.readthedocs.io/en/latest/vlm/vlm_offline_inference_en.html
передовая практика
Испытайте DashInfer на бесплатной GPU-арифметике сообщества Magic Hitch:
首先是dashinfer-vlm和TensorRT的安装。 # 首先安装所需的 package import os # 下载并安装 dashinfer 2.0.0rc2 版本 # 如果需要,可以使用 wget 下载并解压 TensorRT 包 # pip 安装 dashinfer 2.0.0rc2 #!pip install https://github.com/modelscope/dash-infer/releases/download/v2.0.0-rc2/dashinfer-2.0.0rc2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl #!wget https://modelscope.oss-cn-beijing.aliyuncs.com/releases/TensorRT-10.6.0.26.Linux.x86_64-gnu.cuda-12.6.tar.gz #!tar -xvzf TensorRT-10.6.0.26.Linux.x86_64-gnu.cuda-12.6.tar.gz # 下载到本地并替换为 modelscope 对应的 URL # 安装 dashinfer,因 package 较大,推荐下载到本地后安装 #!wget https://modelscope.oss-cn-beijing.aliyuncs.com/releases/dashinfer-2.0.0rc3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl #!pip install ./dashinfer-2.0.0rc3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl # 安装 dashinfer vlm #!pip install dashinfer-vlm # 安装 OpenAI 客户端 #!pip install openai==1.56.2 # 安装 TensorRT 的 Python 包,从下载的包中打开安装 #!pip install TensorRT-10.6.0.26/python/tensorrt-10.6.0-cp310-none-linux_x86_64.whl
TensorRT требует настройки переменных окружения:
import os # 获取 TensorRT 运行时库的路径 trt_runtime_path = os.getcwd() + "/TensorRT-10.6.0.26/lib/" # 获取当前的 LD_LIBRARY_PATH 环境变量值 current_ld_library_path = os.environ.get('LD_LIBRARY_PATH', '') # 将新路径添加到现有值中 if current_ld_library_path: # 如果 LD
После установки окружения запустите dashinfer vlm, чтобы узнать о моделях и сформировать openai-совместимый сервер, где модели могут быть изменены на 7B, 72B и т. д.
По умолчанию используется вся память GPU в окружении.
!dashinfer_vlm_serve --model qwen/Qwen2-VL-2B-Instruct --port 8000 --host 127.0.0.1
Этот процесс инициализирует DashInfer, а также внешний движок, используемый ViT (в данном случае TensorRT), и запускает службу openai.
Просмотр этих журналов свидетельствует об успешной инициализации TRT:

Просмотр этих журналов указывает на то, что инициализация DashInfer прошла успешно:

Просмотр этих журналов указывает на то, что служба openai была успешно инициализирована:

После успешной инициализации можно открыть другой ноутбук для работы с клиентом и бенчмарком.
Адрес ноутбука:https://modelscope.cn/notebook/share/ipynb/6ea987c5/vl-start-server.ipynb
Демонстрация понимания изображений
Продемонстрируйте демонстрацию понимания изображений с несколькими изображениями:
# Install the required OpenAI client version !pip install openai==1.56.2 # VL support requires a recent OpenAI client. from openai import OpenAI # Initialize the OpenAI client client = OpenAI( base_url="http://localhost:8000/v1", api_key="EMPTY" ) # Prepare the API call for a chat completion response = client.chat.completions.create( model="model", messages=[ { "role": "user", "content": [ {"type": "text", "text": "Are these images different?"}, { "type": "image_url", "image_url": { "url": "https://farm4.staticflickr.com/3075/3168662394_7d7103de7d_z_d.jpg", } }, { "type": "image_url", "image_url": { "url": "https://farm2.staticflickr.com/1533/26541536141_41abe98db3_z_d.jpg", } }, ], } ], stream=True, max_completion_tokens=1024, temperature=0.1, ) # Process the streamed response full_response = "" for chunk in response: # Append the delta content to the full response full_response += chunk.choices[0].delta.content print(".", end="") # Print a dot for each chunk received # Print the full response print(f"\nImage: Full Response:\n{full_response}")
Видеодемонстрация понимания
Поскольку openai не определяет стандартный видеоинтерфейс, в данной работе используется тип video_url, который автоматически загружает, извлекает кадры и анализирует видео.
# video example !pip install openai==1.56.2 # Ensure the OpenAI client supports video link features. from openai import OpenAI # Initialize the OpenAI client client = OpenAI( base_url="http://localhost:8000/v1", api_key="EMPTY" ) # Create a chat completion request with a video URL response = client.chat.completions.create( model="model", messages=[ { "role": "user", "content": [ { "type": "text", "text": "Generate a compelling description that I can upload along with the video." }, { "type": "video_url", "video_url": { "url": "https://cloud.video.taobao.com/vod/JCM2awgFE2C2vsACpDESXZ3h5_iQ5yCZCypmjtEs2Ck.mp4", "fps": 2 } } ] } ], max_completion_tokens=1024, top_p=0.5, temperature=0.1, frequency_penalty=1.05, stream=True, ) # Process the streaming response full_response = "" for chunk in response: # Append the delta content from the chunk to the full response full_response += chunk.choices[0].delta.content print(".", end="") # Indicate progress with dots # Print the complete response print(f"\nFull Response: \n{full_response}")
эталон
Используйте изображение выше, чтобы понять ПРИМЕР и просто выполнить многопоточный тест для проверки пропускной способности.
# benchmark!pip install openai==1.56.2 import time import concurrent.futures from openai import OpenAI # 初始化 OpenAI 客户端 client = OpenAI( base_url="http://localhost:8000/v1", api_key="EMPTY" ) # 请求参数 model = "model" messages = [ { "role": "user", "content": [ {"type": "text", "text": "Are these images different?"}, { "type": "image_url", "image_url": { "url": "https://farm4.staticflickr.com/3075/3168662394_7d7103de7d_z_d.jpg", } }, { "type": "image_url", "image_url": { "url": "https://farm2.staticflickr.com/1533/26541536141_41abe98db3_z_d.jpg", } }, ], } ] # 并发请求函数 def send_request(): start_time = time.time() response = client.chat.completions.create( model=model, messages=messages, stream=False, max_completion_tokens=1024, temperature=0.1, ) end_time = time.time() latency = end_time - start_time return latency # 基准测试函数 def benchmark(num_requests, num_workers): latencies = [] start_time = time.time() with concurrent.futures.ThreadPoolExecutor(max_workers=num_workers) as executor: futures = [executor.submit(send_request) for _ in range(num_requests)] for future in concurrent.futures.as_completed(futures): latencies.append(future.result()) end_time = time.time() total_time = end_time - start_time qps = num_requests / total_time average_latency = sum(latencies) / len(latencies) throughput = num_requests * 1024 / total_time # 假设每个请求的响应大小为 1024 字节 print(f"Total Time: {total_time:.2f} seconds") print(f"QPS: {qps:.2f}") print(f"Average Latency: {average_latency:.2f} seconds") # 主程序入口 if __name__ == "__main__": num_requests = 100 # 总请求数 num_workers = 10 # 并发工作线程数 benchmark(num_requests, num_workers)
Результаты испытаний:

Адрес ноутбука:https://modelscope.cn/notebook/share/ipynb/5560603a/vl-test-and-benchmark.ipynb
Комплексное сравнение производительности и производительности vLLM:
Чтобы сравнить производительность vLLM более полно и точно, мы использовали OpenGVLab/InternVL-Chat-V1-2-SFT-Data для бенчмарков однопоточных, многопоточных и многораундовых разговоров на моделях разного размера, подробные скрипты воспроизведения приведены в ссылках, а результаты следующие:
Видно, что DashInfer имеет некоторые преимущества в производительности во всех случаях, особенно в многораундовом диалоге.


© заявление об авторских правах
Авторское право на статью Круг обмена ИИ Пожалуйста, не воспроизводите без разрешения.
Похожие статьи
Нет комментариев...