Einführung
DashInfer-VLM ist eine Inferenzarchitektur für visuelle multimodale VLMs mit großen Modellen, die speziell für die Inferenzbeschleunigung von Qwen-VL-Modellen optimiert wurde. Der größte Unterschied zwischen DashInfer-VLM und anderen Inferenzbeschleunigungs-Frameworks für VLMs besteht darin, dass es den VIT-Teil vom LLM-Teil trennt und VIT und LLM parallel laufen, ohne sich gegenseitig zu behindern. ohne sich gegenseitig zu behindern.
Diese zeichnet sich dadurch aus, dass die Bild- und Videovorverarbeitung in VLM sowie die Merkmalsextraktion in VIT die LLM-Erzeugung nicht unterbrechen. Außerdem kann es sich um eine von VIT/LLM getrennte Architektur handeln, die als erstes VLM-Service-Framework in der Open-Source-Gemeinschaft diese Architektur verwendet.
Bei einem Einsatz mit mehreren Karten befindet sich auf jeder Karte eine ViT-Verarbeitungseinheit, was bei Video- und Mehrbildszenarien einen erheblichen Leistungsvorteil bedeutet.
Darüber hinaus unterstützt es für den ViT-Teil die Zwischenspeicherung im Speicher, so dass ViT bei mehreren Dialogrunden nicht wiederholt neu berechnet werden muss.
Nachstehend finden Sie ein Diagramm seiner Architektur und seiner Konfiguration gemäß dem 4-Karten-Teil 72B.

Das Architekturdiagramm beschreibt den Prozess und die Architektur:
- Im ViT-Teil können viele Inferenzerhebungen für die Inferenz verwendet werden, wie z.B. TensorRT oder onnxruntime (onnx-Modellexport wird auf dem ViT-Teil des Modells innerhalb des Frameworks durchgeführt). TensorRT wird derzeit standardmäßig im Framework unterstützt.
- Im LLM-Abschnitt wird DashInfer für die Inferenz verwendet.
- Cache-Teil, Unterstützung von ViT-Ergebnis-Speicher-Cache, LLM-Teil Prerfix-Cache, LLM-Teil Multimodaler Präfix-Cache (standardmäßig nicht aktiviert)
Code Adresse:
https://github.com/modelscope/dash-infer
Adresse des Dokuments:
https://dashinfer.readthedocs.io/en/latest/vlm/vlm_offline_inference_en.html
bestes Verfahren
Erleben Sie DashInfer auf der kostenlosen GPU-Arithmetik der Magic Hitch Community:
首先是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 erfordert die Konfiguration von Umgebungsvariablen:
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
Nachdem die Umgebung installiert ist, starten Sie dashinfer vlm, um über die Modelle nachzudenken und einen openai-kompatiblen Server zu bilden, auf dem die Modelle in 7B, 72B usw. geändert werden können.
Der gesamte GPU-Speicher in der Umgebung wird standardmäßig verwendet.
!dashinfer_vlm_serve --model qwen/Qwen2-VL-2B-Instruct --port 8000 --host 127.0.0.1
Dieser Prozess initialisiert DashInfer sowie die von ViT verwendete externe Engine (in diesem Fall TensorRT) und startet einen openai-Dienst.
Die Anzeige dieser Protokolle zeigt, dass der TRT erfolgreich initialisiert wurde:

Die Anzeige dieser Protokolle zeigt, dass DashInfer erfolgreich initialisiert wurde:

Die Anzeige dieser Protokolle zeigt, dass der openai-Dienst erfolgreich initialisiert wurde:

Wenn die Initialisierung erfolgreich war, können Sie ein weiteres Notebook für den Client und den Benchmark öffnen.
Notebook-Adresse:https://modelscope.cn/notebook/share/ipynb/6ea987c5/vl-start-server.ipynb
Demo zum Bildverständnis
Demonstration einer Demo für das Verstehen von Bildern mit mehreren Bildern:
# 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}")
Demo zum Video-Verständnis
Da openai keine Standardschnittstelle für Videos definiert, bietet dieses Dokument einen video_url-Typ, der das Video automatisch herunterlädt, Bilder extrahiert und analysiert.
# 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
Verwenden Sie das obige Bild, um das BEISPIEL zu verstehen, und führen Sie einfach einen Multicurrent-Test für Durchsatztests durch.
# 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)
Testergebnisse:

Notebook-Adresse:https://modelscope.cn/notebook/share/ipynb/5560603a/vl-test-and-benchmark.ipynb
Vergleich der Leistung von Comprehensive und vLLM:
Um die Leistung von vLLM umfassender und genauer zu vergleichen und gegenüberzustellen, haben wir OpenGVLab/InternVL-Chat-V1-2-SFT-Data zum Benchmarking von ein-, mehr- und mehrründigen Konversationen auf verschiedenen Modellgrößen verwendet. Detaillierte Reproduktionsskripte sind im Link enthalten:
Es zeigt sich, dass DashInfer in allen Fällen einige Leistungsvorteile hat, insbesondere beim Mehrrunden-Dialog.


































