qwen_triton_trt_llm

我要开发同款
匿名用户2024年07月31日
27阅读
所属分类aiPytorch
开源地址https://modelscope.cn/models/tiansz/qwen_triton_trt_llm

作品详情

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 参考资料

tritondeploytrt-llm.md

6 其他脚本

关闭 tritonserver 服务:

pkill tritonserver

删除 docker 容器:

docker ps -a
docker rm -f <容器编号>

删除 docker 镜像:

docker images
docker rmi -f <镜像号>
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论