基于知识蒸馏技术构建的高效语言模型,将DeepSeek-R1的先进推理能力迁移至轻量级Llama模型,其中Deepseek-R1-Distill-Llama-8B是其中之一。
1. 1台REX1032服务器(卡满插且卡均正常)。
2. 清微docker镜像:TX8100_REX1032_Release_v4.3.8.tar.gz。
3. Conda环境:opt.miniconda.tar.gz。
4. 模型权重准备。
来源1:在魔塔社区直接下载权重,或者使用已经下载好的权重DeepSeek-R1-Distill-Llama-8B.tar.gz。
来源2:重新训练或微调后的模型权重保存为safetensor格式。
5. kcore.bin:deepseek_llama3_8b_bf16_seq8192_c4.tar.gz,
来源1:如果仅演示官方开源模型,可使用清微提供的该文件。
来源2:如果需要部署经训练或微调后的模型,则需要使用转换工具离线编译生成。
6. 工具链TxNN_convert软件包:txnn_convert_1.3.0.tar.gz。
7. 工具链TxNN软件包:txnn_1.3.0.tar.gz,解压后,内容如下:
script文件夹,内包含2个子文件夹
deploy文件夹为环境部署文件夹,其下install_vllm.sh文件为部署模型执行文件;
run_infer文件夹为运行推理文件夹,其下openai_completion_server.py等文件为运行推理文件。
txnn.1.3.0.tar.gz压缩包为推理引擎版本包。
注意:
1. 根据需要推理的模型准备相应的kcore.bin目录,kore.bin生成方式参见章节离线编译。
2. 清微提供的模型权重压缩包中config.json为适配TX81的修改版本:
- 离线编译阶段依赖的模型config.json与官方下载资源一致, 若使用清微提供的模型权重压缩包,需将config.json替换为官方开源的文件。
- 模型推理阶段则需要依赖清微提供的config.json完成推理。
1. 使用终端工具ssh登录REX1032服务器
执行如下命令行:
# HOST_IP为REX1032服务器IP,用户需替换为实际IP地址数值 ssh -X user@HOST_IP
2. 解压压缩包
将opt.miniconda.tar.gz,TX8100_REX1032_Release_v4.3.8.tar.gz放至登录用户指定目录下,如用户根目录(~/,下文中绝对路径/login_home),并解压:
cd ~/ tar -xvf opt.miniconda.tar.gz
解压后得到miniconda目录。
解压docker镜像压缩包, 执行如下命令行:
sudo tar -zxf TX8100_REX1032_Release_v4.3.8.tar.gz
解压得到文件:
TX8100_REX1032_Release_v4.3.8.tar Tsm_driver_4.3.8_x86_64_installer.run
3. 加载docker镜像
执行如下命令行:
sudo docker load -i TX8100_REX1032_Release_v4.3.8.tar
Load完毕可以使用如下命令查看镜像是否load成功:
sudo docker images
4. 创建容器
执行如下命令创建容器:
sudo docker run -d --name txnn --ipc=host --privileged -v /dev:/dev -v /tmp:/tmp -v /lib/modules:/lib/modules -v /sys: /sys -v /login_home/xxx/miniconda/:/opt/miniconda -v /login_home/xxx/txnn_convert:/login_home/xxx/txnn_convert -v /login_home/xxx/txnn_infer/:/login_home/xxx/txnn_infer/ -w /login_home/xxx/txnn_infer hub.tsingmicro.com/tx8/v4.3.8: kuiper-rex1032-release
注意:章节资源准备中的压缩包均需要放在/login_home/xxx 目录下,挂载至容器内。
5. 配置环境变量
在容器内export 环境变量
sudo docker exec -it txnn /bin/bash sed -i '$a export PATH="/opt/miniconda/bin:$PATH"' /root/.bashrc sed -i '$a export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libffi.so.7' /root/.bashrc sed -i '$a export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH' /root/.bashrc sed -i '$a export HOME=/opt/miniconda' /root/.bashrc source /root/.bashrc # 首次设置需要用source进入conda,后面切换可以直接 conda activate tx8_txnn source activate tx8_base # 切换其他环境 conda activate tx8_txnn
此时环境变量即可生效,不同conda环境对应说明如下:
tx8_base:用于模型训练;
tx8_txnn:用于模型推理;
tx8_txnn_trans_4.46:用于模型离线编译,适用于模型Llama3系列模型转换,比如DeepSeek-R1-Distill-Llama-8B;
tx8_xla_llama3:用于Llama3-8B-Instruct模型训练;
开始本章节的操作流程之前,需要完成开发环境准备。该章节主要介绍了模型转换生成kcore.bin的过程,如果已经有预先生成好的kcore.bin文件,该章节可跳过。
1. 解压工具链TxNN_Convert软件包
将txnn_convert_1.3.0.tar.gz放至登录用户指定目录下,如用户根目录(~/,下文中绝对路径/login_home),并解压:
cd ~/ tar -xzvf txnn_convert_1.3.0.tar.gz
解压后得到convert_weight目录,需要关注的目录内容如下:
toolchain_release文件夹为转换工具依赖的库和环境;
convert_weigth.py为模型转换的执行脚本文件夹。
whl为模型转换工具依赖的安装包。
2. 进入docker容器,安装依赖包
执行如下命令进入容器:
sudo docker exec -it txnn /bin/bash source activate tx8_txnn_trans_4.46
依次安装依赖包,示例如下
cd $HOME_PATH/txnn_convert_1.3.0/convert_weight/whl pip uninstall torch -y pip uninstall torch_xla -y pip install torch-2.0.0a0+gitd8b87bc-cp310-cp310-linux_x86_64.whl pip install torch_xla-2.0.0+2cfaf58.tf.180e6e1-cp310-cp310-linux_x86_64.whl cd $HOME_PATH/txnn_convert_1.3.0/convert_weight/install_tx8_quant/ bash install_tx8_cpu.sh
模型转换脚本convert_weight.py支持以下参数,用户可根据需要选择不同的参数进行执行。
参数名称 | 必需/可选 | 默认值 | 说明 |
--input_model | 必需 | string | Hugging face官网下载的模型权重safetensor所在目录。 |
--backend-model-type | 必需 | string | [“deepseek_qwen2_1.5b_bf16”, “deepseek_qwen2_7b_bf16”, “deepseek_qwen2_14b_bf16”, “qwen2_14b_quant”, “deepseek_qwen2_32b_bf16”, “qwen2_32b_quant”, “deepseek_llama3_8b_bf16”, “deepseek_llama3_8b_quant”, “deepseek_llama3_70b_bf16”, “deepseek_llama3_70b_quant”, “llama2_7b_fp16”, “llama2_7b_quant”, “qwen2_7b_bf16”, ”qwen2_7b_quant”,] |
--q-model-path | 可选 | string | 量化后模型权重文件路径。 |
进入模型转换工具目录,执行转换命令。
cd $HOME_PATH/txnn_convert_1.3.0/convert_weight #设置环境变量 source toolchain_release/scripts/env_set.sh #执行转换命令 python convert_weight.py --backend-model-type deepseek_llama3_8b_bf16 --input_model $HOME_PATH/DeepSeek-R1-Distill-Llama-8B
执行成功后,输出C代码结果保存在在目录$HOME_PATH/txnn_convert_1.3.0/convert_weight/toolchain_release/codegen_tool/bin/deepseek_llama3_8b_bf16_seq8192_c4/node_0_0中。
执行RTT 编译, 将上一步生成的C代码编译到TX8硬件,需要传入2个参数,分别为:1. toolchain_release 目录;2. 上一步骤的输出C代码目录。
cd $HOME_PATH/txnn_convert_1.3.0/convert_weight/toolchain_release #执行RTT 编译 bash ./scripts/soc_compile.sh $HOME_PATH/txnn_convert_1.3.0/convert_weight/toolchain_release $HOME_PATH/txnn_convert_1.3.0/convert_weight/toolchain_release/codegen_tool/bin/deepseek_llama3_8b_bf16_seq8192_c4/node_0_0
执行成功后,输出kcore.bin结果保存在在目录$HOME_PATH/txnn_convert_1.3.0/convert_weight/toolchain_release/codegen_tool/bin/deepseek_llama3_8b_bf16_seq8192_c4/
node_0_0中。
用户在Host端部署执行环境,执行启动Device
拉起TX8 Device并等待ready,新开会话窗口2,执行如下命令:
./Tsm_driver_4.3.8_x86_64_installer.run install silicon
1. 解压工具链TxNN软件包
将`txnn_1.3.0.tar.gz`、`DeepSeek-R1-Distill-Llama-8B.tar.gz`、`deepseek_llama3_8b_bf16_seq8192_c4.tar.gz`
放至登录用户指定目录下,如用户根目录(~/,下文中绝对路径/login_home),并解压:
cd ~/ tar -xvf txnn_1.3.0.tar.gz tar -xvf deepseek_llama3_8b_bf16_seq8192_c4.tar.gz tar -xvf DeepSeek-R1-Distill-Llama-8B.tar.gz
解压后得到`txnn_1.3.0`,`DeepSeek-R1-Distill-Llama-8B` 和`deepseek_llama3_8b_bf16_seq8192_c4`目录。
2 进入docker容器
sudo docker exec -it txnn /bin/bash source activate tx8_txnn
3. 执行环境部署脚本
进入登录用户home目录,带参数执行install_vllm.sh脚本,共需要传入2个参数,分别为:1. HOME_PATH 目录;2. VERSION版本号。示例如下
cd $HOME_PATH/txnn_1.3.0/script/deploy #带参数运行脚本 bash install_vllm.sh /login_home/xxx txnn.1.3.0
script/run_infer目录下提供有脚本:offline_auto_test.py,供用户在docker内执行,体验推理功能。
示例1:在REX1032服务器上,8batch同时推理(适用于满卡满配推理,结合-mt/--max-token、-rn/--repeat-num参数可做压测)
在会话窗口1执行如下命令:
cd $HOME_PATH/txnn_1.3.0/script/run_infer python offline_auto_test.py -mp $HOME_PATH/DeepSeek-R1-Distill-Llama-8B/ -cd $HOME_PATH/deepseek_llama3_8b_bf16_seq8192_c4/chip_out/node_0_0/ -pp quests_v1.txt -s ./ -mt 2048 -tf True -bs 8 -rn 1
示例2:在REX1032服务器上,指定ID执行1batch推理
在会话窗口1执行如下命令:
python offline_auto_test.py -mp $HOME_PATH/DeepSeek-R1-Distill-Llama-8B/ -cd $HOME_PATH/deepseek_llama3_8b_bf16_seq8192_c4/chip_out/node_0_0/ -pp quests_v1.txt -s ./ -mt 2048 -bs 1 -rn 1 -cn 0..3
$HOME_PATH/ txnn_1.3.0/script/run_infer路径下日志文件 TX8_offline_func_batchsize_$batch_size_$quest_$time.log可追踪查看当前循环轮次以及问题回答情况。
more TX8_offline_func_batchsize_xxx_quest_xxx_$time.log
offline_auto_test.py支持以下参数,用户可根据需要选择不同的参数进行执行。
参数名称 | 必需/可选 | 参数类型 | 默认值 | 说明 |
-mp或 --model-path | 必需 | string | 无 | Int8/fp 16模型文件路径。 |
-pp或--prompt-path | 必需 | string | 无 | Prompt问题文件路径。 |
-gp或--golden-path | 可选 | string | None | Golden_gpu脚本运行的response回答文件路径,用作相似度对比。 |
-s或--save-dir | 必需 | string | 无 | 当前脚本运行的response回答保存文件路径,指定路径即可。 |
-cd或--case-dir | 必需 | string | 无 | kcore.bin路径。 |
-lp或--txda-log-path | 可选 | string | 无 | txda log保存路径,默认打屏显示,指定路径时保存在指定路径下。 |
-cn或--card-num | 可选 | Int | 0,1,2,3 | 当前脚本运行所选用的卡数(..表示区间)。 支持以下场景配置: 1. 单卡单batch场景,配置0; 2. 四卡单batch场景,有以下8种配置组合:0..3/4..7/8..11/…/28..31。 N batch场景:上述8种配置组合可以同时任选N组,N最大为8。 |
-bs或--batch-size | 可选 | Int | None | 指定当前脚本需要运行的batch数 ,最大支持8。 注: 1. 需要和traversal-flag参数搭配使用; 2. 支持列表输入,eg:-bs [1,5,6]; 3. 与--card-num参数同时使用时,以batch-size为准。 |
-rn或--repeat-num | 可选 | Int | 1 | 当前脚本运行循环次数。 |
-mt或--max-tokens | 可选 | Int | 1024 | 支持最大输出token数,最大支持8192。 |
online推理兼容OpenAI API接口,script/run_infer目录下提供有脚本:
openai_completion_server.py,server端,适用于非多轮对话;(deepseek、llama需要指定不同的模型路径以及kcore.bin路径)
openai_completion_server_mul_conversations.py,server端,适用于多轮对话;
openai_chat_completion_client.py,client端,供用户在docker内执行,体验推理功能;
mul_process_online_client.py,client多进程启动方式,供用户在docker内执行,体验online_openai场景的8batch同时推理的功能。
示例1:在REX1032服务器8卡上,在8卡中指定1卡ID进行1batch推理
Server端:在会话窗口1执行如下命令,启动server服务:
cd $HOME_PATH/txnn_1.3.0/script/run_infer python openai_completion_server.py --model=$HOME_PATH/DeepSeek-R1-Distill-Llama-8B/ --device=txnpu --load_format=tx --num_gpu_blocks_override=512 --block_size=16 --model-dtype bfloat16 -cd $HOME_PATH/deepseek_llama3_8b_bf16_seq8192_c4/chip_out/node_0_0/ --port 8000 -cn 0..3 --max-model-len=8192 -ts=4
当前窗口会打印log信息,出现如下log后表示server ready。
Client端:新开会话窗口3,进入docker容器
sudo docker exec -it txnn /bin/bash source activate tx8_txnn
在docker容器内,执行如下命令,开始client请求:
cd $HOME_PATH/txnn_1.3.0/script/run_infer python openai_chat_completion_client.py -sp 8000 -pp quests_v1.txt -s ./ -mt 2048
示例2:在REX1032服务器32卡上,8batch同时推理
Server端:在会话窗口1执行如下命令,启动server服务:
cd $HOME_PATH/txnn_1.3.0/script/run_infer python openai_completion_server.py --model=$HOME_PATH/DeepSeek-R1-Distill-Llama-8B/ --device=txnpu --load_format=tx --num_gpu_blocks_override=512 --block_size=16 --model-dtype bfloat16 -cd $HOME_PATH/deepseek_llama3_8b_bf16_seq8192_c4/chip_out/node_0_0/ --port 8000 -cn 0..31 --max-model-len=8192 -ts=4
当前窗口会打印log信息,出现如下log后表示server ready。
Client端:新开会话窗口3,进入docker容器
sudo docker exec -it txnn /bin/bash source activate tx8_txnn
在docker容器内,执行如下命令,开始client请求:
cd $HOME_PATH/txnn_1.3.0/script/run_infer python mul_process_online_client.py -pp quests_v1.txt -sp 8000,8000,8000,8000,8000,8000,8000,8000 -s ./ -mt 2048
Client端所有问题集推理结束后,client端脚本会自动无痕退出,server端脚本需要手动ctrl+c中断。txnn_1.3.0/script/run_infer路径下TX8_online_batchsize_xxx_quest_xxx_bid_xxx_$time.log日志文件可追踪查看当前循环轮次以及问题回答情况
openai_completion_server.py支持以下参数,用户可根据需要选择不同的参数进行执行。
参数名称 | 必需/可选 | 参数类型 | 默认值 | 说明 |
--model | 必需 | string | None | Int8/fp 16模型文件路径。 |
--device | 必需 | string | None | 使用TX NPU卡进行推理。 |
--load_format | 必需 | string | None | 加载TX加载器;加载safetensors权重。 |
--num_gpu_blocks_override | 必需 | Int | 512 | 在内存中分配的block_table的block大小,用于KV_Cache使用。 |
--block_size | 必需 | Int | 16 | Block_table中每一个block的大小。 |
-ts或 --tp-size | 必需 | Int | 4 | 使用NPU卡数量。 |
-cd或 --case-dir | 必需 | string | 无 | kcore.bin路径。 |
--port | 必需 | Int | 8000 | Serve端口号。 |
-cn或 --card-num | 必需 | string | 0,1,2,3 | 当前脚本运行所选用的卡数。 |
--max-model-len | 必需 | int | None | 模型支持最大文本长度。 |
--model-dtype | 可选 | string | bfloat16 | 模型以及kcore精度类型。[bfloat16, int8] |
openai_chat_completion_client.py支持以下参数,用户可根据需要选择不同的参数进行执行。
参数名称 | 必需/可选 | 参数类型 | 默认值 | 说明 |
-sp或 --server-port | 必需 | Int | 12000 | Server端口号。 |
-pp或 --prompt-path | 必需 | string | 无 | Prompt问题文件路径。 |
-gp或 --golden-path | 可选 | string | None | Golden_gpu脚本运行的response回答文件路径,用作相似度对比。 |
-s或 --save-dir | 必需 | string | 无 | 当前脚本运行的response回答保存文件路径,指定路径即可。 |
-rn或 --repeat-num | 可选 | Int | 1 | 当前脚本运行循环次数。 |
-mt或 --max-tokens | 可选 | Int | 1024 | 支持最大输出token数,最大支持8192。 |
mul_process_online_client.py
参数名称 | 必需/可选 | 参数类型 | 默认值 | 说明 |
-sp或 --server-port | 必需 | Int | None | Serve端口号,多进程支持多参数传入 8batch场景下需传入 12000,13000,14000,15000,16000,17000,18000,19000 |
-pp或 --prompt-path | 必需 | string | 无 | Prompt问题文件路径。 |
-gp或 --golden-path | 可选 | string | None | Golden_gpu脚本运行的response回答文件路径,用作相似度对比。 |
-s或 --save-dir | 必需 | string | 无 | 当前脚本运行的response回答保存文件路径,指定路径即可。 |
-rn或 --repeat-num | 可选 | Int | 1 | 当前脚本运行循环次数。 |
-mt或 --max-tokens | 可选 | Int | 1024 | 支持最大输出token数,最大支持8192。 |
性能测试工具用于评估大语言模型在TX8服务器上的性能。版本包目录benchmark提供以下脚本:
benchmark_serving.py为执行脚本;
backend_request_func.py为依赖脚本。
示例:在REX1032服务器上,指定卡ID进行1batch推理
Server端:在会话窗口1执行如下命令,启动server服务:
cd $HOME_PATH/txnn_1.3.0/script/run_infer python openai_completion_server.py --model=$HOME_PATH/DeepSeek-R1-Distill-Llama-8B/ --device=txnpu --load_format=tx --num_gpu_blocks_override=512 --block_size=16 --model-dtype bfloat16 -cd $HOME_PATH/deepseek_llama3_8b_bf16_seq8192_c4/chip_out/node_0_0/ --port 8000 -cn 0..3 --max-model-len=8192 -ts=4
当前窗口会打印log信息,出现如下log后表示server ready。
Client端:新开会话窗口2,进入docker容器
sudo docker exec -it txnn /bin/bash source activate tx8_txnn
在benchmark目录下,执行如下命令,开始性能测试:
python benchmark_serving.py --model=$HOME_PATH/DeepSeek-R1-Distill-Llama-8B/ --random-input-len=1024 --random-output-len=1024 --port 8000 --seed 20
性能测试结束后,窗口2会输出当前测试场景的性能指标,其中性能指标参数包括:
吞吐量:Output token throughput (tokens/s)
首token时延:TTFT (ms)
每token耗时:TPOT (ms)
词间时延:TBT或ITL (ms)
benchmark_serving.py支持以下参数,用户可根据需要选择不同的参数进行执行。
参数名称 | 必需/可选 | 参数类型 | 默认值 | 说明 |
--model | 必需 | string | None | int8/fp 16模型文件路径。 |
--random-input-len | 必需 | int | None | 每个请求的输入token长度。 |
--random-output-len | 必需 | int | None | 每个请求的输出token长度。 |
--seed | 必需 | int | None | 控制随机生成token的id,用作调整测试的随机性。 |
2025/3/21 第一版
2025/4/2 第二版,更新版本号1.3.0