使用docker部署tensorrtllm推理大模型baichuan2-7b

2024-09-04 02:04

本文主要是介绍使用docker部署tensorrtllm推理大模型baichuan2-7b,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

大模型的推理框架,我之前用过vllm和mindie。近期有项目要用tensorrtllm,这里将摸索的过程记录下,特别是遇到的问题。
我的环境是Linux+rt3090

准备docker环境

本次使用docker镜像部署,需要从网上拉取:

docker pull nvcr.io/nvidia/tritonserver:24.08-trtllm-python-py3

The Triton Inference Server的docker的tag可以从这里浏览:https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver

他要用更新或者更久的版本,都可以从这里获取。

拉取的时间较久,拉完镜像启动本地的docker容器并进入:

#  docker run  -dit --ipc=host --runtime=nvidia --gpus '"device=6,7"' -v /home/xxxxx/docker_shared/:/docker_shared --name triton-llm-test  nvcr.io/nvidia/tritonserver:24.08-trtllm-python-py3# docker exec -it   triton-llm-test bash

上面的命令中,我将一个磁盘目录映射到docker内的/docker_shared,并指定映射了2张显卡。

我预先下载了baichuan2-7b-chat的模型,在docker内它的目录是/docker_shared/Baichuan2-7B-Chat

转换模型

转换模型的方法可参考:https://nvidia.github.io/TensorRT-LLM/quick-start-guide.html

下载https://github.com/NVIDIA/TensorRT-LLM的代码放到docker中,解压后然后到它的目录中,解压后进入其目录:

cd /docker_shared/TensorRT-LLM-main/examples/baichuan/

提前建好转换模型的输出目录/docker_shared/Baichuan2-7B-trllm/convert_out/ , 然后执行转换脚本:

python3 convert_checkpoint.py --model_version v2_7b --model_dir /docker_shared/Baichuan2-7B-Chat --output_dir /docker_shared/Baichuan2-7B-trllm/convert_out/ --tp_size 2
>> Total time of converting checkpoints: 00:01:35# ls /docker_shared/Baichuan2-7B-trllm/convert_out/
config.json  rank0.safetensors  rank1.safetensors

这里我指定了tensor并行度 --tp_size为2,所以生成了2个safetensors文件。

创建引擎目录/docker_shared/Baichuan2-7B-trllm/build_out/,然后将模型编译为tensorrt的引擎文件:

trtllm-build --checkpoint_dir /docker_shared/Baichuan2-7B-trllm/convert_out/  --output_dir /docker_shared/Baichuan2-7B-trllm/build_out/    --gpt_attention_plugin float16 --gemm_plugin float16  --max_batch_size 64# ls  /docker_shared/Baichuan2-7B-trllm/build_out/
config.json  rank0.engine  rank1.engine

到这里,模型转换的工作就做完了。

简单测试

cd /docker_shared/TensorRT-LLM-main/examplesmpirun -n 2 --allow-run-as-root python3 ./run.py --engine_dir /docker_shared/Baichuan2-7B-trllm/build_out/  --max_output_len 500 --tokenizer_dir /docker_shared/Baichuan2-7B-Chat --input_text "讲一个200字左右的故事"Output [Text 0 Beam 0]: "
从前,有一个小村庄,村子里住着许多勤劳、善良的人们。他们和睦相处,互相帮助,生活得非常幸福。在这个村子里,有一个年轻人叫小明,他聪明、勇敢,深受村民们的喜爱。有一天,村子里来了一个陌生的老人,他看起来非常疲惫,小明见状,便主动上前帮助他。老人感激地说:“谢谢你,年轻人。我是从远方来的,我的家乡遭受了一场大旱,庄稼枯萎,水源干涸,我带着唯一的希望——一颗神奇的种子,来寻求帮助。”小明听了非常同情,他决定帮助老人,于是他们一起回到了村子里。小明将神奇的种子种在了村子的中心,村民们纷纷前来观看。不久,神奇的种子长出了一棵大树,树上结满了晶莹剔透的水珠。村民们欣喜若狂,纷纷取水,不久,村子里的水源恢复了,庄稼也重新焕发生机。老人感激不已,他告诉小明,这颗神奇的种子叫做“希望之树”,它能给人们带来希望和力量。小明和村民们为了纪念这次奇迹,将这棵树作为村子的象征,代代相传。从此,这个村子变得更加美好,人们过上了幸福美满的生活。"

如果之前设置的-tp_size为1,则不需要mpirun命令,直接执行run.py脚本就行。如果tp_size大于1则需要借助mpirun 并指定-n参数,否则会出错:

RuntimeError: [TensorRT-LLM][ERROR] Assertion failed: MPI size 1 != TP size 2 * PP size 1

准备配置文件

下载https://github.com/triton-inference-server/tensorrtllm_backend的v0.12.0版本,放到docker内解压。

使用模板新建一个目录:

cd  /docker_shared/tensorrtllm_backend-0.12.0
cp all_models/inflight_batcher_llm/ triton_model_repo/ -rf

使用脚本fill_template.py填充配置文件:

python3 tools/fill_template.py -i triton_model_repo/preprocessing/config.pbtxt tokenizer_dir:/docker_shared/Baichuan2-7B-Chat,triton_max_batch_size:64,preprocessing_instance_count:1
python3 tools/fill_template.py -i triton_model_repo/postprocessing/config.pbtxt tokenizer_dir:/docker_shared/Baichuan2-7B-Chat,triton_max_batch_size:64,postprocessing_instance_count:1
python3 tools/fill_template.py -i triton_model_repo/tensorrt_llm_bls/config.pbtxt triton_max_batch_size:64,decoupled_mode:False,bls_instance_count:1,accumulate_tokens:False
python3 tools/fill_template.py -i triton_model_repo/ensemble/config.pbtxt triton_max_batch_size:64
python3 tools/fill_template.py -i triton_model_repo/tensorrt_llm/config.pbtxt triton_backend:tensorrtllm,triton_max_batch_size:64,decoupled_mode:False,max_beam_width:1,engine_dir:/docker_shared/Baichuan2-7B-trllm/build_out/,max_tokens_in_paged_kv_cache:2560,max_attention_window_size:2560,kv_cache_free_gpu_mem_fraction:0.1,exclude_input_in_output:True,enable_kv_cache_reuse:False,batching_strategy:inflight_fused_batching,max_queue_delay_microseconds:0

启动服务并检测测试

cd  /docker_shared/tensorrtllm_backend-0.12.0
python3 scripts/launch_triton_server.py --world_size 2 --model_repo ./triton_model_repo/

启动成功,命令行最后会输出:

I0903 11:20:25.664256 203 grpc_server.cc:2463] "Started GRPCInferenceService at 0.0.0.0:8001"
I0903 11:20:25.664504 203 http_server.cc:4694] "Started HTTPService at 0.0.0.0:8000"
I0903 11:20:25.717022 203 http_server.cc:362] "Started Metrics Service at 0.0.0.0:8002"

简单测试:

测试服务:
curl -X POST localhost:8000/v2/models/ensemble/generate -d '{"text_input": "啥是机器学习啊?", "max_tokens": 500, "bad_words": "", "stop_words": ""}'
返回:
{"batch_index":0,"context_logits":0.0,"cum_log_probs":0.0,"generation_logits":0.0,"model_name":"ensemble","model_version":"1","output_log_probs":[0.0,0.0,0.0,0.0,0.0],"sequence_end":false,"sequence_id":0,"sequence_start":false,"text_output":"\n机器学习(Machine Learning)是人工智能(Artificial Intelligence)的一个子领域,它关注的是如何让计算机系统通过数据和算法自动地学习和改进。简单来说,机器学习就是让计算机从数据中学习规律,并根据这些规律进行预测和决策。\n\n在机器学习中,我们使用算法(Algorithm)来训练模型(Model),使它能够在新的数据上进行预测。这些算法可以分为监督学习(Supervised Learning)、无监督学习(Unsupervised Learning)和强化学习(Reinforcement Learning)等类型。\n\n监督学习是指在训练过程中,我们为模型提供输入数据和对应的正确输出,模型通过学习这些数据之间的映射关系来进行预测。无监督学习则是在没有正确输出的情况下,让模型自己发现数据中的结构和规律。强化学习则是让模型通过与环境的交互,学习如何采取最优行动以获得最大回报。\n\n机器学习已经广泛应用于各个领域,如自然语言处理、计算机视觉、推荐系统、医疗诊断等。随着技术的不断发展,机器学习将继续为我们的生活带来更多便利和创新。"}查询服务元数据
curl -X GET localhost:8000/v2
返回:
{"name":"triton","version":"2.49.0","extensions":["classification","sequence","model_repository","model_repository(unload_dependents)","schedule_policy","model_configuration","system_shared_memory","cuda_shared_memory","binary_tensor_data","parameters","statistics","trace","logging"]}

错误集锦

Error parsing text-format inference.ModelConfig: 29:17: Expected integer, got: $

I0903 06:55:43.852157 202 model_lifecycle.cc:472] "loading: tensorrt_llm:1"
[libprotobuf ERROR /tmp/tritonbuild/tritonserver/build/_deps/repo-third-party-build/grpc-repo/src/grpc/third_party/protobuf/src/google/protobuf/text_format.cc:337] Error parsing text-format inference.ModelConfig: 29:17: Expected integer, got: $
.......
error: creating server: Internal - failed to load all models

这个报错表示加载配置文件出错,需要借助tools/fill_template.py脚本将各个配置文件进行配置就能解决。

Cuda Runtime (out of memory)

报错信息

[TensorRT-LLM][ERROR] [defaultAllocator.cpp::allocate::31] Error Code 1: Cuda Runtime (out of memory)
[TensorRT-LLM][WARNING] Requested amount of GPU memory (6992953856 bytes) could not be allocated. There may not be enough free memory for allocation to succeed.
[TensorRT-LLM][ERROR] [safeDeserialize.cpp::load::284] Error Code 2: OutOfMemory (Requested size was 6992953856 bytes.)

我之前设置kv_cache_free_gpu_mem_fraction:0.3,结果显存不够,改为0.1就够了。

如果还不够,可以试试量化模型。

AttributeError: ‘BaichuanTokenizer’ object has no attribute ‘vocab’

报错信息

 "Failed to process the request(s) for model 'postprocessing_0_0', message: AttributeError: 'BaichuanTokenizer' object has no attribute 'vocab'\n\nAt:\n /docker_shared/tensorrtllm_backend-main/./triton_model_repo/postprocessing/1/model.py(243): _postprocessing\n/docker_shared/tensorrtllm_backend-main/./triton_model_repo/postprocessing/1/model.py(154): execute\n"

我本来下载的是tensorrtllm_backend的最新main分支代码,错误原因在all_models/inflight_batcher_llm/postprocessing/1/model.py的243行,这里使用了tokenizer的vocab成员,但是这个成员不存在:

在这里插入图片描述
网上有类似的问题说是要降transformers的版本,我试了没啥用,将tensorrtllm_backend替换为V0.12.0版本就好了。

这篇关于使用docker部署tensorrtllm推理大模型baichuan2-7b的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134682

相关文章

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H