Ascend-SACT/DeepSeek-V3.1-Terminus-w4a8
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

基于MindIE 最新版本(2.2.RC1),使用昇腾A2单机8卡部署DeepSeek-V3.1-Terminus-w4a8模型,最大支持32K上下文长度。如果要使用长上下文,推荐使用w8a8c8量化模型并双机部署(可参考https://ai.gitcode.com/Ascend-SACT/DeepSeek-V3.1-Terminus-w8a8c8)。

1. 模型概述及场景

2025年9月22日,DeepSeek-V3.1 更新至 DeepSeek-V3.1-Terminus 版本。此次更新在保持模型原有能力的基础上,针对用户反馈的问题进行了改进,包括:

① 语言一致性: 缓解了中英文混杂、偶发异常字符等情况;

② Agent 能力: 进一步优化了 Code Agent 与 Search Agent 的表现。DeepSeek-V3.1-Terminus的输出效果相比前一版本更加稳定。特别适合长文本处理任务和代码生成。

基于MindIE 最新版本(2.2.RC1),可以在昇腾A2单机(8卡)上部署DeepSeek-V3.1-Terminus-w4a8模型,最大支持到32K上下文长度。

不推荐使用双机部署此量化模型,性能没有优势,仅上下文扩充到128K。如果要使用长上下文,推荐使用w8a8c8量化模型并双机部署(可参考https://ai.gitcode.com/Ascend-SACT/DeepSeek-V3.1-Terminus-w8a8c8)。

DeepSeek-V3.1-Terminus-w4a8模型权重下载地址:https://modelscope.cn/models/taoxiaoxin/DeepSeek-V3.1-Terminus-w4a8

2. 准备运行环境

2.1 硬件环境准备

设备数量
Atlas 800I/800T A2(910B 64G*8)1

服务器需要有网络权限方便下载镜像和权重。如果无法联网,请事先下载好文件上传到服务器上。

2.2 软件环境准备

软件版本
Python3.11.10
PyTorch7.2.0
MindIE2.2.RC1
Ascend HDK25.2.1
CANN8.3.RC2

3. 运行指导

3.1 准备工作

提前将所有昇腾服务器上的HDK和CANN升级到最新版本,升级驱动参考。

注意:选择arm版本,先升级固件,再升级驱动。

升级过程中会导致业务中断,提前做好变更规划。

3.2 下载推理镜像和模型权重

3.2.1 下载推理镜像

分别通过ssh工具登录到昇腾服务器后台,执行下载操作。

登录昇腾社区/昇腾镜像仓库,下载镜像前需要申请权限, 耐心等待权限申请通过后,根据指南下载对应镜像文件。

权限申请通过后可以使用docker pull命令下载MindIE推理框架镜像:

docker pull --platform=arm64 swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.2.RC1-800I-A2-py311-openeuler24.03-lts

3.2.2 下载模型权重

安装modelscope,通过网络下载模型权重。

pip install modelscope

通过modelscope下载模型权重文件到服务器目录,下载前确保昇腾服务器上都有足够空间存放权重文件,文件大小总计378GB。

下载过程非常耗时,依赖网络情况,通过nohup方式来下载。

nohup modelscope download --model taoxiaoxin/DeepSeek-V3.1-Terminus-w4a8 --local_dir /ai > ds3.1t-w4a8-download.log 2>&1 &

下载后修改模型目录下的config.json,将第54行的"torch_dtype"的值"bfloat16"改为"float16"。

3.3 创建推理容器

使用docker run命令创建容器并挂载8张npu卡。

docker run -itd --privileged=true --name=ds3.1t-w4a8 --net=host --shm-size 800g \
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--device=/dev/davinci2 \
--device=/dev/davinci3 \
--device=/dev/davinci4 \
--device=/dev/davinci5 \
--device=/dev/davinci6 \
--device=/dev/davinci7 \
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device /dev/devmm_svm \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /usr/local/sbin:/usr/local/sbin \
-v /etc/hccn.conf:/etc/hccn.conf \
-v /home/:/home/ \
-v /ai:/ai \
swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.2.RC1-800I-A2-py311-openeuler24.03-lts \
/bin/bash

注意:上面命令中挂载的/ai目录中存放的是模型的权重文件,视具体情况修改。

3.4 启动推理服务

昇腾服务器上执行下列操作: 进入容器:

docker exec -it ds3.1t-w4a8 bash

3.4.1 创建环境变量配置文件

vi env.sh

输入以下内容

source /usr/local/Ascend/mindie/set_env.sh
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh
source /usr/local/Ascend/atb-models/set_env.sh
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export ATB_WORKSPACE_MEM_ALLOC_ALG_TYPE=3
export ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1
export HCCL_OP_EXPANSION_MODE="AIV"
export NPU_MEMORY_FRACTION=0.92
export ATB_LLM_HCCL_ENABLE=1
export INF_NAN_MODE_ENABLE=1
#8244特性防止oom开关
export ATB_LAYER_INTERNAL_TENSOR_REUSE=1
export HCCL_CONNECT_TIMEOUT=3600
export HCCL_EXEC_TIMEOUT=0
#A3到15, A3双机到33
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
export ATB_OPERATION_EXECUTE_ASYNC=1
export ATB_LLM_ENABLE_AUTO_TRANSPOSE=0
export HCCL_RDMA_PCIE_DIRECT_POST_NOSTRICT=TRUE
export HCCL_BUFFSIZE=64
#异步双发
export MINDIE_ASYNC_SCHEDULING_ENABLE=1
#jemalloc优化
 
#jemalloc优化
export LD_PRELOAD="/usr/lib64/libjemalloc.so.2:$LD_PRELOAD" #社区镜像中的路径为/usr/lib64/libjemalloc.so.2;研发镜像中的路径为/usr/lib/aarch64-linux-gnu/libjemalloc.so.2
#队列优化特性
export TASK_QUEUE_ENABLE=2
for var in $(compgen -e | grep 'STDOUT$'); do
    export "$var=0"
done
for var in $(compgen -e | grep 'LOG_TO_FILE$'); do
    export "$var=0"
done
#遇到config.json文件权限问题
find /usr/local/lib/python3.11/site-packages/mindie* -name config.json |xargs chmod -R 640
export OMP_NUM_THREADS=10
export HCCL_ALGO="level0:NA;level1:pipeline"

#日志开关
export MINDIE_LOG_TO_STDOUT=0
export MINDIE_LOG_TO_FILE=1
export MINDIE_LOG_LEVEL=info

保存文件后,使用下面的命令加载环境变量。

source env.sh

等待环境变量加载成功。

3.4.2 修改配置config.json文件

cd /usr/local/Ascend/mindie/latest/mindie-service/conf
vi config.json

由于单机部署最大只能支持到32K长度上下文,使用下面的配置:

{
    "Version" : "1.0.0",
    "ServerConfig" :
    {
        "ipAddress" : "{本机IP}",
        "managementIpAddress" : "{本机IP}",
        "port" : 1025,
        "managementPort" : 1026,
        "metricsPort" : 1027,
        "allowAllZeroIpListening" : false,
        "maxLinkNum" : 1000,
        "httpsEnabled" : false,
        "fullTextEnabled" : false,
        "tlsCaPath" : "security/ca/",
        "tlsCaFile" : ["ca.pem"],
        "tlsCert" : "security/certs/server.pem",
        "tlsPk" : "security/keys/server.key.pem",
        "tlsPkPwd" : "security/pass/key_pwd.txt",
        "tlsCrlPath" : "security/certs/",
        "tlsCrlFiles" : ["server_crl.pem"],
        "managementTlsCaFile" : ["management_ca.pem"],
        "managementTlsCert" : "security/certs/management/server.pem",
        "managementTlsPk" : "security/keys/management/server.key.pem",
        "managementTlsPkPwd" : "security/pass/management/key_pwd.txt",
        "managementTlsCrlPath" : "security/management/certs/",
        "managementTlsCrlFiles" : ["server_crl.pem"],
        "kmcKsfMaster" : "tools/pmt/master/ksfa",
        "kmcKsfStandby" : "tools/pmt/standby/ksfb",
        "inferMode" : "standard",
        "interCommTLSEnabled" : false,
        "interCommPort" : 1121,
        "interCommTlsCaPath" : "security/grpc/ca/",
        "interCommTlsCaFiles" : ["ca.pem"],
        "interCommTlsCert" : "security/grpc/certs/server.pem",
        "interCommPk" : "security/grpc/keys/server.key.pem",
        "interCommPkPwd" : "security/grpc/pass/key_pwd.txt",
        "interCommTlsCrlPath" : "security/grpc/certs/",
        "interCommTlsCrlFiles" : ["server_crl.pem"],
        "openAiSupport" : "vllm",
        "tokenTimeout" : 3600,
        "e2eTimeout" : 65535,
        "distDPServerEnabled":false
    },

    "BackendConfig" : {
        "backendName" : "mindieservice_llm_engine",
        "modelInstanceNumber" : 1,
        "npuDeviceIds" : [[0,1,2,3,4,5,6,7]],
        "tokenizerProcessNumber" : 8,
        "multiNodesInferEnabled" : true,
        "multiNodesInferPort" : 1120,
        "interNodeTLSEnabled" : false,
        "interNodeTlsCaPath" : "security/grpc/ca/",
        "interNodeTlsCaFiles" : ["ca.pem"],
        "interNodeTlsCert" : "security/grpc/certs/server.pem",
        "interNodeTlsPk" : "security/grpc/keys/server.key.pem",
        "interNodeTlsPkPwd" : "security/grpc/pass/mindie_server_key_pwd.txt",
        "interNodeTlsCrlPath" : "security/grpc/certs/",
        "interNodeTlsCrlFiles" : ["server_crl.pem"],
        "interNodeKmcKsfMaster" : "tools/pmt/master/ksfa",
        "interNodeKmcKsfStandby" : "tools/pmt/standby/ksfb",
        "kvPoolConfig" : {"backend":"", "configPath":""},
        "ModelDeployConfig" :
        {
            "maxSeqLen" : 32768,
            "maxInputTokenLen" : 32768,
            "truncation" : false,
            "ModelConfig" : [
                {
                    "modelInstanceType" : "Standard",
                    "modelName" : "ds3.1t-w4a8",
                    "modelWeightPath" : "/ai/DeepSeek-V3.1-Terminus-w4a8/",
                    "worldSize" : 8,
                    "cpuMemSize" : 5,
                    "npuMemSize" : -1,
                    "backendType" : "atb",
                    "trustRemoteCode" : false,
                    "async_scheduler_wait_time": 120,
                    "kv_trans_timeout": 10,
                    "kv_link_timeout": 1080,
                    "dp": 1,
                    "sp": 1,
                    "tp": 8,
                    "moe_ep": 1,
                    "moe_tp": 8,
                    "plugin_params":"{\"plugin_type\":\"mtp\",\"num_speculative_tokens\": 1}",
                    "models": {
                        "deepseekv2": {
                            "enable_mlapo_prefetch": true,
                            "kv_cache_options": {"enable_nz": true}
                       }
                   },
                   "llm": {
                        "parallel_options": {
                        "dense_mlp_local_tp": 16
                        }
                }
                }
            ]
        },

        "ScheduleConfig" :
        {
            "templateType" : "Standard",
            "templateName" : "Standard_LLM",
            "cacheBlockSize" : 128,

            "maxPrefillBatchSize" : 50,
            "maxPrefillTokens" : 32768,
            "prefillTimeMsPerReq" : 150,
            "prefillPolicyType" : 0,

            "decodeTimeMsPerReq" : 50,
            "decodePolicyType" : 0,

            "maxBatchSize" : 200,
            "maxIterTimes" : 32768,
            "maxPreemptCount" : 0,
            "supportSelectBatch" : false,
            "maxQueueDelayMicroseconds" : 5000
        }
    },

    "LogConfig": {
        "dynamicLogLevel" : "",
        "dynamicLogLevelValidHours" : 2,
        "dynamicLogLevelValidTime" : ""
    }
}

保存配置文件后就可以拉起服务化了。

3.4.3 拉起服务化推理

使用下面命令拉起服:

cd /usr/local/Ascend/mindie/latest/mindie-service/
nohup ./bin/mindieservice_daemon > output.log 2>&1 &

查看日志命令

tail -f output.log

等待5~10分钟,直到日志中显示“Daemon start success!”表示推理服务拉起成功。

3.4.4 推理接口测试

在宿主机上面执行curl命令测试接口是否正常返回。

time curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{
"model": "ds3.1t-w4a8",
"messages": [
{
"role": "user",
"content": "中国有哪些景点?"
}
],
"max_tokens": 300,
"temperature": 0.5,
"top_p": 0.96,
"stream": false
}' http://{本机IP}:1025/v1/chat/completions

4. 性能测试

使用Run_Benchmark工具测试模型推理性能,工具介绍:https://gitcode.com/Ascend-SACT/Run_Benchmark

此工具基于AISBench评测工具开发,集成了文本、图片、视频、音频的数据集,可以方便地对各种模型进行评测。

4.1 安装AISBench

运行性能测试工具Run_Benchmark之前需要安装好AISBench,安装指导参考https://gitee.com/aisbench/benchmark#-%E5%B7%A5%E5%85%B7%E5%AE%89%E8%A3%85。

安装完成后执行ais_bench -h命令,如果正常回显命令参数则说明安装成功。

4.2 下载并配置Run_Benchmark

打开Run_Benchmark工具首页,下载zip格式源代码。上传到服务器并做如下配置。

vi run_benchmark.sh

对下面的测试配置做修改:

VERSION=""       
Sever_NAME=""   #服务化时使用的model-name
SERVICE_IP=""   #本地推理服务器的IP
SERVICE_PORT=""    #拉起服务时设置的端口
MODEL_PATH=""      #权重路径
#8卡PD混部,下面2个参数都配置为8
D_NUM=8
ALL_NUM=8
#相当于轮次。测试请求总数=并发数*轮次
Concurrent_Multiplier=4
#测试DeepSeek的NLP模型,使用SYN合成数据集即可:
PARAM_SETS=(
  "0 1 32768 1024 SYN 0"
  "0 2 32768 1024 SYN 0"
  "0 4 32768 1024 SYN 0"
  "0 8 32768 1024 SYN 0"
)
#上面的例子中表示分别跑4个并发测试任务,任务的并发数分别为1/2/4/8,每个任务都使用64K输入,1K输出,SYN类型的测试集,跑4个轮次。
#填写pip show ais-bench-benchmark命令中显示的Location路径
AISBENCHMARK_PATH=""
#搜索Data_Command_Type,修改数据集名称
#本案例使用MindIE推理框架,对于SYN类型的数据集,使用synthetic_gen数据集,默认脚本中不用修改。

保存修改后的文件。

4.3 运行测试任务

因为测试请求数越多,测试耗时越久,所以使用nohup的方式拉起测试任务:

nohup bash run_benchmark.sh > test_ais_bench.log &

等待测试任务运行结束后,在目标目录下查看summary.csv内容即为测试结果。

当前版本每次运行完性能测试脚本后,都会在summary.csv内容末尾追加测试结果,测试结果中包含了TTFT、TPOP、吞吐量、输出吞吐量、单卡吞吐量、QPS、QPM等指标,可以根据测试结果来调整业务参数获得最佳性能。