Aprendizagem pessoal com IA
e orientação prática
Espelho de desenho CyberKnife

DashInfer-VLM, desempenho de inferência SOTA multimodal, ultra-vLLM!

introdutório

O DashInfer-VLM é uma arquitetura de inferência para grandes modelos VLMs multimodais visuais, especialmente otimizada para a aceleração da inferência dos modelos VL da Qwen. A maior diferença entre o DashInfer-VLM e outras estruturas de aceleração de inferência para VLMs é que ele separa a parte VIT da parte LLM, e a VIT e a LLM são executadas em paralelo sem interferir uma na outra. sem interferir um no outro.

Isso é caracterizado pelo fato de que o pré-processamento de imagem e vídeo no VLM, bem como a parte de extração de recursos do VIT, não interromperá a geração do LLM, e também pode ser uma arquitetura separada de VIT/LLM, que é a primeira estrutura de serviço VLM na comunidade de código aberto a usar essa arquitetura.


Em uma implementação com várias placas, ele tem uma unidade de processamento ViT em cada placa, o que proporciona uma vantagem de desempenho muito significativa em cenários de vídeo e de várias imagens.

Além disso, para a parte ViT, ele oferece suporte ao armazenamento em cache na memória para que não haja necessidade de recalcular o ViT repetidamente em várias rodadas de diálogo.

Abaixo está um diagrama de sua arquitetura e sua configuração de acordo com a parte de 4 cartões 72B.

DashInfer-VLM, desempenho de inferência SOTA multimodal, além do vLLM!

 

O diagrama de arquitetura descreve o processo e a arquitetura:

  • Na parte ViT, muitas elicitações de inferência podem ser usadas para inferência, como TensorRT ou onnxruntime (a exportação do modelo onnx será realizada na parte ViT do modelo dentro da estrutura).
  • Na seção LLM, o DashInfer é usado para inferência.
  • Parte do cache, suporte ao resultado do ViT Cache de memória, parte do LLM Cache de prefixo, parte do LLM Cache de prefixo multimodal (não ativado por padrão)

 

Endereço do código:

https://github.com/modelscope/dash-infer

Endereço do documento: 

https://dashinfer.readthedocs.io/en/latest/vlm/vlm_offline_inference_en.html

 

melhores práticas

Experimente o DashInfer na aritmética de GPU gratuita da comunidade 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

 

O TensorRT requer a configuração de variáveis de ambiente:

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

Depois que o ambiente estiver instalado, inicie o dashinfer vlm para raciocinar sobre os modelos e formar um servidor compatível com openai, onde os modelos podem ser alterados para 7B, 72B, etc.

 

Toda a memória da GPU no ambiente é usada por padrão.

!dashinfer_vlm_serve --model qwen/Qwen2-VL-2B-Instruct --port 8000 --host 127.0.0.1

Esse processo inicializa o DashInfer, bem como o mecanismo externo usado pelo ViT (nesse caso, o TensorRT), e inicia um serviço openai.

 

A visualização desses registros indica que o TRT foi inicializado com êxito:

DashInfer-VLM, desempenho de inferência SOTA multimodal, além do vLLM!

 

A visualização desses registros indica que o DashInfer foi inicializado com êxito:

DashInfer-VLM, desempenho de inferência SOTA multimodal, além do vLLM!

 

A visualização desses registros indica que o serviço openai foi inicializado com êxito:

DashInfer-VLM, desempenho de inferência SOTA multimodal, além do vLLM!

 

Quando toda a inicialização for bem-sucedida, você poderá abrir outro notebook para o cliente e o benchmarking.

Endereço do notebook:https://modelscope.cn/notebook/share/ipynb/6ea987c5/vl-start-server.ipynb

 

Demonstração de compreensão de imagens

Demonstrar uma demonstração para compreensão de imagens com várias imagens:

# 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}")

 

Demonstração de compreensão de vídeo

Como o openai não define uma interface de vídeo padrão, este documento fornece um tipo video_url, que faz o download automático, extrai quadros e analisa o vídeo.

# 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}")

 

referência

Use a imagem acima para entender o EXEMPLO e simplesmente faça um teste multicorrente para testar a taxa de transferência.

# 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)

 

Resultados do teste:

DashInfer-VLM, desempenho de inferência SOTA multimodal, além do vLLM!

Endereço do notebook:https://modelscope.cn/notebook/share/ipynb/5560603a/vl-test-and-benchmark.ipynb

 

Comparação de desempenho abrangente e vLLM:

Para comparar e contrastar o desempenho do vLLM de forma mais abrangente e precisa, usamos o OpenGVLab/InternVL-Chat-V1-2-SFT-Data para comparar conversas simultâneas simples, múltiplas e de várias rodadas em diferentes tamanhos de modelos, e os scripts de reprodução detalhados são mostrados no link, e os resultados são os seguintes:

É possível observar que o DashInfer tem algumas vantagens de desempenho em todos os casos, especialmente no diálogo de várias rodadas.

DashInfer-VLM, desempenho de inferência SOTA multimodal, além do vLLM!

DashInfer-VLM, desempenho de inferência SOTA multimodal, além do vLLM!

Não pode ser reproduzido sem permissão:Chefe do Círculo de Compartilhamento de IA " DashInfer-VLM, desempenho de inferência SOTA multimodal, ultra-vLLM!
pt_BRPortuguês do Brasil