LLM推理引擎怎么选?TensorRT vs vLLM vs LMDeploy vs MLC-LLM

LLM擅长文本生成应用程序,如聊天和代码完成模型,能够高度理解和流畅。但是它们的大尺寸也给推理带来了挑战。有很多个框架和包可以优化LLM推理和服务,所以在本文中我将整理一些常用的推理引擎并进行比较。

TensorRT-LLM

TensorRT-LLM是NV发布的一个推理引擎。llm被编译成TensorRT后与triton服务器一起部署并支持多GPU-多节点推理和FP8。

我们将比较HF模型、tensorrt模型和TensorRT-INT8模型(量化)的执行时间、ROUGE分数、延迟和吞吐量。

我这里在Linux上安装Nvidia-container-toolkit,初始化Git LFS(用于下载HF Models),并下载所需的软件包如下:

 !curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list!apt-get update!git clone https://github.com/NVIDIA/TensorRT-LLM/!apt-get update && apt-get -y install python3.10 python3-pip openmpi-bin libopenmpi-dev!pip3 install tensorrt_llm -U --pre --extra-index-url https://pypi.nvidia.com!pip install -r TensorRT-LLM/examples/phi/requirements.txt!pip install flash_attn pytest!curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash!apt-get install git-lfs

然后下载模型权重

 PHI_PATH="TensorRT-LLM/examples/phi"!rm -rf $PHI_PATH/7B!mkdir -p $PHI_PATH/7B && git clone https://huggingface.co/microsoft/Phi-3-small-128k-instruct $PHI_PATH/7B

使用下面的命令将模型转换为TensorRT-LLM格式,并从检查点构建TensorRT-LLM。

 !python3 $PHI_PATH/convert_checkpoint.py --model_dir $PHI_PATH/7B/ \--dtype bfloat16 \--output_dir $PHI_PATH/7B/trt_ckpt/bf16/1-gpu/# Build TensorRT-LLM model from checkpoint!trtllm-build --checkpoint_dir $PHI_PATH/7B/trt_ckpt/bf16/1-gpu/ \--gemm_plugin bfloat16 \--output_dir $PHI_PATH/7B/trt_engines/bf16/1-gpu/

我们还测试INT8的量化应用

 !python3 $PHI_PATH/convert_checkpoint.py --model_dir $PHI_PATH/7B \--dtype bfloat16 \--use_weight_only \--output_dir $PHI_PATH/7B/trt_ckpt/int8_weight_only/1-gpu/!trtllm-build --checkpoint_dir $PHI_PATH/7B/trt_ckpt/int8_weight_only/1-gpu/ \--gemm_plugin bfloat16 \--output_dir $PHI_PATH/7B/trt_engines/int8_weight_only/1-gpu/

然后就可以在摘要任务上测试phi3和两个TensorRT模型

 %%capture phi_hf_results# Huggingface!time python3 $PHI_PATH/../summarize.py --test_hf \--hf_model_dir $PHI_PATH/7B/ \--data_type bf16 \--engine_dir $PHI_PATH/7B/trt_engines/bf16/1-gpu/%%capture phi_trt_results# TensorRT-LLM!time python3 $PHI_PATH/../summarize.py --test_trt_llm \--hf_model_dir $PHI_PATH/7B/ \--data_type bf16 \--engine_dir $PHI_PATH/7B/trt_engines/bf16/1-gpu/%%capture phi_int8_results# TensorRT-LLM (INT8)!time python3 $PHI_PATH/../summarize.py --test_trt_llm \--hf_model_dir $PHI_PATH/7B/ \--data_type bf16 \--engine_dir $PHI_PATH/7B/trt_engines/int8_weight_only/1-gpu/

得到结果后就可以解析输出并绘制图表,比较所有模型的执行时间、ROUGE分数、延迟和吞吐量。

可以看到速度提高了不少,所有结果我们最后一起总结。

vLLM

vLLM提供LLM推理和服务,具有SOTA吞吐量,分页注意力,连续批处理,量化(GPTQ, AWQ, FP8)的支持和优化的CUDA内核。

我们首先安装相应的包

 !pip install -q vllm!git clone https://github.com/vllm-project/vllm.git!pip install -q datasets!pip install transformers scipyfrom vllm import LLM, SamplingParamsfrom datasets import load_datasetimport timefrom tqdm import tqdmfrom transformers import AutoTokenizer

然后加载模型并在数据集的一小部分上生成它的输出。

 dataset = load_dataset("akemiH/MedQA-Reason", split="train").select(range(10))prompts = []for sample in dataset:prompts.append(sample)sampling_params = SamplingParams(max_tokens=524)llm = LLM(model="microsoft/Phi-3-mini-4k-instruct", trust_remote_code=True)def generate_with_time(prompt):start = time.time()outputs = llm.generate(prompt, sampling_params)taken = time.time() - startgenerated_text = outputs[0].outputs[0].textreturn generated_text, takengenerated_text = []time_taken = 0for sample in tqdm(prompts):text, taken = generate_with_time(sample)time_taken += takengenerated_text.append(text)# Tokenize the outputs and calculate the throughputtokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3-mini-4k-instruct")token = 1for sample in generated_text:tokens = tokenizer(sample)tok = len(tokens.input_ids)token += tokprint(token)print("tok/s", token // time_taken)

通过vLLM在ShareGPT数据集上对模型的性能进行基准测试

 !wget https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json%cd vllm!python benchmarks/benchmark_throughput.py --backend vllm --dataset ../ShareGPT_V3_unfiltered_cleaned_split.json --model microsoft/Phi-3-mini-4k-instruct --tokenizer microsoft/Phi-3-mini-4k-instruct --num-prompts=1000

LMDeploy

LMDeploy允许压缩、部署和服务llm,同时提供高效的推理(持久批处理、阻塞KV缓存、动态分裂和融合、张量并行、高性能CUDA内核)、有效的量化(4位推理性能比FP16高2.4倍)。跨多台机器和GPU部署多模型服务。此外,它还允许分析令牌延迟和吞吐量、请求吞吐量、API服务器和triton推理服务器性能。

!pip install -q lmdeploy
!pip install nest_asyncio
import nest_asyncio
nest_asyncio.apply()
!git clone --depth=1 https://github.com/InternLM/lmdeploy
%cd lmdeploy/benchmark

LMdeploy还开发了两个推理引擎TurboMind和PyTorch。我们来使用PyTorch引擎。

!python3 profile_generation.py microsoft/Phi-3-mini-128k-instruct --backend pytorch

它在多个回合中对引擎进行配置,并报告每个回合的令牌延迟和吞吐量。

MLC-LLM

MLC-LLM提供了一个高性能的部署和推理引擎,称为MLCEngine。

conda activate your-environment
python -m pip install --pre -U -f https://mlc.ai/wheels mlc-llm-nightly-cu121 mlc-ai-nightly-cu121
conda env remove -n mlc-chat-venv
conda create -n mlc-chat-venv -c conda-forge \"cmake>=3.24" \rust \git \python=3.11
conda activate mlc-chat-venv
git clone --recursive https://github.com/mlc-ai/mlc-llm.git && cd mlc-llm/
mkdir -p build && cd build
python ../cmake/gen_cmake_config.py
cmake .. && cmake --build . --parallel $(nproc) && cd ..
set(USE_FLASHINFER ON)
conda activate your-own-env
cd mlc-llm/python
pip install -e .

我们需要将模型权重转换为MLC格式。通过Git LFS下载HF模型,然后转换权重。

mlc_llm convert_weight ./dist/models/Phi-3-small-128k-instruct/ \--quantization q0f16 \--model-type "phi3" \-o ./dist/Phi-3-small-128k-instruct-q0f16-MLC

现在将MLC格式模型加载到MLC引擎中

from mlc_llm import MLCEngine
# Create engine
model = "HF://mlc-ai/Phi-3-mini-128k-instruct-q0f16-MLC"
engine = MLCEngine(model)# Now let’s calculate throughput
import time
from transformers import AutoTokenizer
start = time.time()
response = engine.chat.completions.create(messages=[{"role": "user", "content": "What is the Machine Learning?"}],model=model,stream=False,
)
taken = time.time() - start
tokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3-mini-128k-instruct")
print("tok/s", 82 // taken)

总结

TensorRT INT8模型在推理速度上优于HF模型和TensorRT模型,而TensorRT模型在总结任务上表现更好,ROUGE得分最高。可以看到这几个推理引擎都要比使用HF模型的速度快2倍左右,这是因为HF使用的是Python和Pytorch,也没有进行任何的优化。而者4个引擎在推理速度上相差不大,差距在5%-10%左右,这是因为目前这几个引擎都是用了优化的技术,区别只是代码实现的方式不同会产生一些差距,所以在实际使用时,我们只要选择一个兼容性好(或者符合你正在使用的大语言模型)的框架就可以了。

最后这里有个列表 TGI我不熟,就没测,不过结果应该差不多


https://avoid.overfit.cn/post/33f6420c91e74c0eb8d6737cb9471e27

作者:Zain ul Abideen

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/43248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

imazing电脑怎么下载 imazing怎么下载软件 使用iMazing下载和卸载Apple设备上的应用程序

iMazing官方版是一款管理苹果设备的软件,是一款帮助用户管理 iOS手机的PC端应用程序,能力远超 iTunes 提供的终极 iOS 设备管理器。在iMazing官方版上与苹果设备连接后,可以轻松传输文件,浏览保存信息等,功能比iTunes更…

泛微开发修炼之旅--35关于基于页面扩展和自定义按钮实现与后端交互调用的方法

文章链接:35关于基于页面扩展和自定义按钮实现与后端交互调用的方法

vue3中使用 tilwindcss报错 Unknown at rule @tailwindcss

解决方法: vscode中安装插件 Tailwind CSS IntelliSense 在项目中的 .vscode中 settings.json添加 "files.associations": {"*.css": "tailwindcss"}

基于YOLOv9的脑肿瘤区域检测

数据集 脑肿瘤区域检测,我们直接采用kaggle公开数据集,Br35H 数据中已对医学图像中脑肿瘤位置进行标注 数据集我已经按照YOLO格式配置好,数据内容如下 数据集中共包含700张图像,其中训练集500张,验证集200张 模型训…

AI绘画:艺术与科技的交融,创新浪潮与无限可能

在科技日新月异的当下,AI 绘画作为人工智能领域的一颗璀璨新星,正以惊人的速度在国内崭露头角,引发了艺术与技术交融的全新变革。随着人工智能技术的飞速发展,AI绘画已成为艺术与科技交融的新宠。2024年,AI绘画行业在国…

Autogen智能体实战-Autogen框架介绍

文章目录 一,Autogen简介二,Autogen原理1,Autogen原理图解2,拆解Autogen是如何完成绘制特斯拉股票趋势图的 这篇文章介绍一个开源的Agent框架-微软的Autogen。 一,Autogen简介 官网:https://microsoft.github.io/aut…

在idea中查看某个接口的所有实现类图

一、选中某个接口右键 ---> Diagrams ---> show Diagrams,然后就会进入一个新的 tab 页; 二、然后在出来的图上选中某个接口右键 ---> show Implementations,就会显示选中接口的所有实现类列表; 三、最后 ctrl A 全部选…

uniapp父页面调用子页面 组件方法记录

文章目录 导文如何点击父页面,触发子页面函数先写一个子页面的基础内容父元素 如何点击父页面,修改子页面的值先写一个子页面的基础内容父元素 导文 如何点击父页面,触发子页面函数? 如何点击父页面,修改子页面的值&am…

英区PayPal账号3分钟绑定WISE英镑的银行收款账户

正文开始,我们先登录英区PayPal账号后 有很多银行给我们选择,但是没有WISE的选项,所以我们手动输入“WISE”,然后如下图所示点击“Enter Your Bank Detailds”输入银行详细信息按钮。 然后输入我们的WISE英镑账户的收款银行信息&a…

Advanced Electronic Materials:磁性智能皮肤作为人机界面

近年来,电子可穿戴设备的普及率迅速上升,柔性可穿戴设备因其高生物相容性、功能性、适应性和低成本而在人机界面上引起了极大的关注。柔性磁性智能皮肤是这一快速发展的柔性可穿戴电子领域的一部分,为人类感知发展开辟了一条新的道路。磁感是…

SpringCloud第一篇Docker基础

文章目录 一、常见命令二、数据卷三、数据挂载四、自定义镜像五、网络 一、常见命令 Docker最常见的命令就是操作镜像、容器的命令,详见官方文档: https://docs.docker.com/ 需求: 在DockerHub中搜索Nginx镜像,查看镜像的名称 …

k8s集群如kubeadm init和kube-flannel.yam问题

查看k8s中角色内容kubectl get all (显示pod和server以及delment) 删除应用资源选择删除先删除部署查看部署和pod没了服务还在,但资源和功能以及删除,删除服务kubectl delete 服务名(部署名),get pods 获取默认空间的容…

从资金到未来:技术融资如何重塑IT顾问在AI与网络安全的角色?

一方面是人工智能 (AI) 和机器学习 (ML) 的双引擎,另一方面是网络安全和数据泄露威胁中不断变化的威胁形势,IT 格局正在经历翻天覆地的变化。这场数字革命对 IT 顾问来说既是挑战也是机遇,但要成…

解决计算机中mfc140u.dll没有被指定在windows上运行

在打开电脑软件时候出现mfc140u.dll丢失或找不到mfc140u.dll怎么办?遇到这个问题相当困扰,mfc140u.dll到底是什么?为什么会出现这个情况,相信很多人都不知道,今天我给大家详细介绍一下mfc140u.dll是什么,为…

【C++修行之道】string类的使用

目录 一.C语言中的字符串 二、标准库中的string类 (了解) 2.1 string类(了解) 2.2 帮助文档阅读 三、 string类的常用接口说明 3.1 string类对象的常见构造 3.2 string类对象的容量操作 3.3 string类对象的访问及遍历操作 字符串类的简单实现 3.4 string类对象的修改…

【论文阅读笔记】ASPS: Augmented Segment Anything Model for Polyp Segmentation

1.论文介绍 ASPS: Augmented Segment Anything Model for Polyp Segmentation ASPS:用于息肉分割的扩展SAM模型 2024年 arxiv Paper Code 2.摘要 息肉分割在结直肠癌诊断中起着至关重要的作用。最近,Segment Anything Model(SAM)的出现利用其在大规模…

视频压缩软件哪个压缩最小,视频用什么软件压缩最小

在数字媒体时代,视频内容的生产与分享已成为生活常态。但随之而来的问题就是,大视频文件占用过多存储空间,上传和分享也变得不便。本文将为你揭示如何将视频压缩到最小,同时保持画质清晰。让我们一起探索吧! 下载并文件…

剪辑抽帧技巧有哪些 剪辑抽帧怎么做视频 剪辑抽帧补帧怎么操作 剪辑抽帧有什么用 视频剪辑哪个软件好用在哪里学

打破视频节奏,让作品告别平庸。抽帧剪辑可以改变视频叙事节奏,人为制造冲突、转折、卡顿的效果。这种剪辑方式,不仅可以推进剧情发展,还能吸引观众的注意力,有效防止观影疲劳。有关剪辑抽帧技巧有哪些,剪辑…

Typora篇-忍痛开启

语雀专业会员即将到期, 我看着99元的学费款, 我决定重新用回Typora。 虽然里面有一些文件但是我还是舍不得ಥ_ಥ 99元巨款。 下面开启我的Typora整活历程, 大家有什么好用的插件快捷方式一起来分享啊。

MyBatis框架学习笔记(二):原生API 的调用 和 注解的使用

1 MyBatis原生API 1.1 原生API 快速入门需求 在笔记一案例的基础上将增删改查,使用 MyBatis 原生的 API 完成,就是直接通过SqlSession 接口的方法来完成 1.2 原生API 快速入门-代码实现 创建 src\test\java\com\hspedu\mapper\MyBatisNativeTest.jav…