qwentritontrt_llm
1 环境准备
1.1 安装显卡驱动
首先需要安装显卡驱动,ubuntu 和 windows 用户在 N卡官网 下载并安装即可,
同时 windows 用户请使用 wsl 运行,当你在 windows 本机安装显卡驱动后,wsl 也会自动检测到驱动了,无需再重复安装。安装完成后可使用 nvidia-smi
命令检测安装是否正常
1.2 安装 cuda
请安装 cuda 12.1,请根据系统情况安装对应的版本,推荐下载 run 后缀的文件进行安装。
在安装完成后,你需要将 cuda 写入环境变量,可使用 vim 编辑环境变量:
vim ~/.bashrc
并在文件的末尾处添加如下内容:
export CUDA_HOME=/usr/local/cuda
export PATH=$PATH:$CUDA_HOME/bin
export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
编辑完成后退出即可,最后你还要激活修改后的环境变量:
source ~/.bashrc
同时你可以使用 nvcc -V
来验证 cuda 是否激活成功。若失败你还可以使用 switch-cuda 来配置 cuda 环境
1.3 安装 docker
ubuntu 系统安装 docker 只需运行如下命令即可:
sudo apt install docker.io
sudo apt install docker-buildx
(可选)若使用 windows 的 linux 子系统 wsl,则还要启动 docker:
sudo update-alternatives --config iptables # 运行命令后输入 1 并回车即可
sudo service docker start # 也可以将该行命令添加到 ~/.bashrc,这样每次启动机器就会开启 docker
同时为了让 docker 支持使用 gpu,我们还需要运行如下命令:
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
sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
1.4 准备 tritonserver 环境
请下载已编译好的 docker 镜像,下载速度可能慢些,还可能存在需要重复运行该命令的情况,但使用该镜像总比自己重新编译方便些。
docker pull tiansz/triton_trt_llm:v0.7.0
接着克隆代码:
git clone https://www.modelscope.cn/tiansz/qwen_triton_trt_llm.git
进入项目目录:
cd qwen_triton_trt_llm
然后映射容器和本地文件夹的路径:
docker run -d \
--name triton \
--net host \
--shm-size=2g \
--ulimit memlock=-1 \
--ulimit stack=67108864 \
--gpus all \
-v ${PWD}/tensorrtllm_backend:/tensorrtllm_backend \
-v ${PWD}/Qwen-TensorRT-LLM/examples/qwen:/root/qwen \
tiansz/triton_trt_llm:v0.7.0 sleep infinity
现在我们就可以进入容器了:
docker exec -it triton /bin/bash
2 将模型转换为 trt_llm 模型
首先进入 qwen 目录:
cd /root/qwen
然后安装依赖:
pip install -r requirements.txt
pip install --upgrade optimum auto-gptq
在编译模型之前,你还可以验证下 tensorrt-llm 是否已安装:
python -c "import tensorrt_llm; print(tensorrt_llm.__version__)"
这里我已 Qwen-1_8B-Chat-Int4 为例来编译模型,首先需要克隆模型:
apt update
apt install git-lfs
git clone https://www.modelscope.cn/qwen/Qwen-1_8B-Chat-Int4.git
接着修改当前目录的 default_config.py
下的配置。然后我们就可以来编译模型了:
python build.py --use_weight_only \
--weight_only_precision int4_gptq \
--per_group \
--use_inflight_batching \
--paged_kv_cache \
--remove_input_padding
编译完成后让我们来验证是否编译成功:
python run.py
(可选)以上是单卡的模型转换,那么对于双卡或者多卡用户,需要克隆未量化的模型:
git clone https://www.modelscope.cn/qwen/Qwen-1_8B-Chat.git
接着同样需要修改当前目录的 default_config.py
下的配置。然后我们就可以来编译模型了:
python build.py --use_weight_only \
--weight_only_precision int4 \
--use_inflight_batching \
--paged_kv_cache \
--remove_input_padding \
--tp_size 2 --world_size 2
编译完成后让我们来验证是否编译成功:
mpirun -n 2 --allow-run-as-root python run.py
3 部署 tritonserver 服务
将编译好的 trt-llm 模型移动到指定目录下:
cd /root/qwen/trt_engines/fp16/1-gpu/
mv ./* /tensorrtllm_backend/triton_model_repo/tensorrt_llm/1/
cd /root/qwen/
rm ./Qwen-1_8B-Chat-Int4/*.safetensors # gptq 模型路径请注意修改
mv Qwen-1_8B-Chat-Int4 /tensorrtllm_backend/triton_model_repo/tensorrt_llm/ # gptq 模型路径请注意修改
设置好模型路径后,还需要修改 /tensorrtllm_backend/triton_model_repo/postprocessing/config.pbtxt
和 /tensorrtllm_backend/triton_model_repo/preprocessing/config.pbtxt
文件中的 tokenizer_dir
为:
/tensorrtllm_backend/triton_model_repo/tensorrt_llm/Qwen-1_8B-Chat-Int4
最终我们就可以启动服务了:
cd /tensorrtllm_backend
python scripts/launch_triton_server.py --http_port 8000 --grpc_port 8001 --metrics_port 8002
对于双卡或者多卡用户,在移动模型文件时需要更改为未量化的模型路径,接着使用如下命令启动服务:
python scripts/launch_triton_server.py --http_port 8000 --grpc_port 8001 --metrics_port 8002 --world_size 2
4 调用服务
运行如下代码即可:
import requests
import json
import random
def qwen_tritonserver(prompt):
url = 'http://192.168.1.1:8000/v2/models/ensemble/generate'
headers = {'Content-Type': 'application/json'}
template = f"<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant\n"
data = {"text_input": template,
"max_tokens": 512,
"bad_words": "",
"stop_words": "",
"end_id": [151645],
"pad_id": [151645],
"random_seed": random.randint(1, 10000),
"top_k": 10,
"top_p": 0.8,
"temperature": 0.7}
res = requests.post(url=url, data=json.dumps(data), headers=headers)
res = res.json()
text_output = res.get("text_output", "")
return text_output
res = qwen_tritonserver("你好")
print(res)
请注意以上代码为随机生成,即每次请求传递不同的随机种子,若想固定生成结果,则每次转递相同的随机种子就行。
5 参考资料
6 其他脚本
关闭 tritonserver 服务:
pkill tritonserver
删除 docker 容器:
docker ps -a
docker rm -f <容器编号>
删除 docker 镜像:
docker images
docker rmi -f <镜像号>
评论