
# 启动推理服务（大语言模型）
本章节主要介绍大语言模型的推理服务启动方式，包括离线推理和在线推理2种方式。
![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/caution_3.0-zh-cn.png)
无论是离线推理还是在线推理方式，以下的框架通用环境变量都需要设置。
框架通用环境变量如下:
```
# VPC网段
# 需用户手动修改，修改方式见下方注意事项
VPC_CIDR="7.150.0.0/16"  #7.150.0.0是Snt9b23的网段，Snt9b机型需要替换为7.242.0.0
VPC_PREFIX=$(echo "$VPC_CIDR" | cut -d'/' -f1 | cut -d'.' -f1-2)
POD_INET_IP=$(ifconfig | grep -oP "(?<=inet\s)$VPC_PREFIX\.\d+\.\d+" | head -n 1)
POD_NETWORK_IFNAME=$(ifconfig | grep -B 1 "$POD_INET_IP" | head -n 1 | awk '{print $1}' | sed 's/://')
echo "POD_INET_IP: $POD_INET_IP"
echo "POD_NETWORK_IFNAME: $POD_NETWORK_IFNAME" 
# 指定通信网卡
export GLOO_SOCKET_IFNAME=$POD_NETWORK_IFNAME
export TP_SOCKET_IFNAME=$POD_NETWORK_IFNAME
export HCCL_SOCKET_IFNAME=$POD_NETWORK_IFNAME
# 多机场景下配置
export RAY_EXPERIMENTAL_NOSET_ASCEND_RT_VISIBLE_DEVICES=1
# 开启显存优化
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
# 配置通信算法的编排展开位置在Device侧的AI Vector Core计算单元
export HCCL_OP_EXPANSION_MODE=AIV
# 指定可使用的卡，按需指定
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3 
# 指定绑核，按需指定
export CPU_AFFINITY_CONF=1
export LD_PRELOAD=/usr/local/lib/libjemalloc.so.2:${LD_PRELOAD}
# 默认启用 ascend-turbo-graph模式，指定启动插件ascend_vllm；否则为ascend
export VLLM_PLUGINS=ascend_vllm
# 指定vllm后端 v1
export VLLM_USE_V1=1
# 指定vllm版本
export VLLM_VERSION=0.9.0
```
#### 离线推理
编辑一个python脚本offline_inference.py，脚本内容如下，运行该脚本使用ascend-vllm进行模型离线推理。
```
from vllm import LLM, SamplingParams
def main():
    # prompts 内容用户可以改
    prompts = [
        "Hello, my name is",
        "The president of the United States is",
        "The capital of France is",
        "The future of AI is",
    ]
    # 参数temperature，top_p用户可以改，具体参考【推理请求测试】章节OpenAI服务请求参数说明
    sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
    # ${model_path}用户必须改，具体参考【启动在线推理服务】章节推理服务基础参数说明--model
    model_path = "${model_path}"
    llm = LLM(
        model=model_path,
        # tensor_parallel_size用户根据实际情况可以改，具体参考【启动在线推理服务】章节推理服务基础参数说明--tensor-parallel-size
        tensor_parallel_size=2,
        # block_size用户根据实际情况可以改，具体参考【启动在线推理服务】章节推理服务基础参数说明--block-size
        block_size=128,
        # max_num_seqs用户根据实际情况可以改，具体参考【启动在线推理服务】章节推理服务基础参数说明--max-num-seqs        
        max_num_seqs=256,
        # max_model_len用户根据实际情况可以改，具体参考【启动在线推理服务】章节推理服务基础参数说明--max-model-len
        max_model_len=8192,
        additional_config={
            "ascend_turbo_graph_config": {
                "enabled": True
            },
            "ascend_scheduler_config": {
                "enable": True,
                "chunked_prefill_enabled": False
            }
        },
        # distributed_executor_backend用户根据实际情况可以改，具体参考【启动在线推理服务】章节推理服务基础参数说明--distributed-executor-backend
        distributed_executor_backend='ray'
    )
    outputs = llm.generate(prompts, sampling_params)
    # Print the outputs.
    for output in outputs:
        prompt = output.prompt
        generated_text = output.outputs[0].text
        print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
if __name__=="__main__":
    main()
```
![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
脚本中，未标注释部分，请勿更改。
参数说明：
${model_path}：替换成能访问的实际环境模型权重路径。
执行如下命令运行推理脚本：
```
python offline_inference.py
```
 #### 启动在线推理服务
此处提供OpenAI服务API接口启动方式。详细启动服务与请求方式参考：<https://docs.vllm.ai/en/latest/getting_started/quickstart.html>。
**推荐通过OpenAI服务的API接口启动推理，单机单卡和单机多卡场景下的具体操作命令如下，可以根据参数说明修改配置**。
![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
在框架通用环境变量外，Qwen系列模型部分性能提升参数可参考如下表格。
Qwen2.5、Qwen3系列的大语言模型
- Qwen Moe模型不支持表1的Qwen系列优化环境变量
- Aclgraph和eager模式，不支持配置表1的Qwen系列优化环境变量
- Qwen系列W4A16量化模型仅走AscendTurbo图模式，且不支持配置Qwen系列优化环境变量
 
如果使用Qwen2.5、Qwen3 系列模型，推荐使用ascend-turbo-graph模式，也即是**推理服务启动参数**中的默认模式。 另外，Qwen系列模型，需要根据支持Qwen系列模型来配置环境变量。
 表1Qwen Dense系列启动环境变量 
| 变量名                           | 变量说明                                                                                                                                                                                                                                                                                           |
|:---|:---|
| ENABLE_QWEN_HYPERDRIVE_OPT    | 默认关闭； flashcomm通信优化 + 融合算子通用(TDynamicquant)优化 Qwen全系列通用，bf16场景下要配合 DISABLE_QWEN_DP_PROJ一起使用， w8a8 不受影响； |
| ENABLE_QWEN_MICROBATCH        | 默认关闭； micro batch优化； 需要配合ENABLE_QWEN_HYPERDRIVE_OPT一起使用， Qwen全系列通用w8a8，bf16 全局通用                                                                      |
| ENABLE_PHASE_AWARE_QKVO_QUANT | 默认关闭； 运行时增加bf16权重，混合量化权重推理，会增加部分显存， Qwen全系列通用w8a8，bf16 不可用。需要配合ENABLE_QWEN_HYPERDRIVE_OPT一起使用                                                                                                    |
| DISABLE_QWEN_DP_PROJ          | 默认关闭； export ENABLE_QWEN_HYPERDRIVE_OPT=1使能时， DISABLE_QWEN_DP_PROJ 生效，用于关闭mlp down_proj的完全权重加载，Qwen bf16场景关闭，w8a8场景可开启；                                                                            |
   
| 支持Qwen Dense系列模型                                                                   | 环境变量使用示例                                                                                                                                                                                                                                                                             | 备注                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|:---|
| Qwen2.5 系列-bf16 Qwen3 dense 系列-bf16 | export ENABLE_QWEN_HYPERDRIVE_OPT=1 export ENABLE_QWEN_MICROBATCH=1 export DISABLE_QWEN_DP_PROJ=1                                                                                     | -                                                                                                                                                                                                                                                                                                                                                        |
| Qwen2.5 系列-w8a8 Qwen3 dense 系列-w8a8 | export ENABLE_QWEN_HYPERDRIVE_OPT=1 export ENABLE_QWEN_MICROBATCH=1 export ENABLE_PHASE_AWARE_QKVO_QUANT=0 export DISABLE_QWEN_DP_PROJ=0 | ● export ENABLE_PHASE_AWARE_QKVO_QUANT=1（仅Qwen3-32b-w8a8 tp8场景设为1） ● bf16时，设置export DISABLE_QWEN_DP_PROJ=1, 禁止权重拷贝优化。 ● w8a8时，默认设置DISABLE_QWEN_DP_PROJ=0。如果在服务端日志观测到 GPU KV cache usage 长时间在90%以上，并且ttft增长过快，那么设置export DISABLE_QWEN_DP_PROJ=1，禁止权重拷贝优化。 |
   
**推理服务启动参数：**
```
source /home/ma-user/AscendCloud/AscendTurbo/set_env.bash
python -m vllm.entrypoints.openai.api_server \
--model ${container_model_path} \
--max-num-seqs=256 \
--max-model-len=4096 \
--max-num-batched-tokens=4096 \
--tensor-parallel-size=1 \
--block-size=128 \
--host=${docker_ip} \
--port=8080 \
--gpu-memory-utilization=0.95 \
--trust-remote-code \
--no-enable-prefix-caching \
--disable-log-requests \
--additional-config='{"ascend_turbo_graph_config": {"enabled": true}, "ascend_scheduler_config": {"enabled": true}}'
```
**推理服务基础参数说明如下：**
- --model ${container_model_path}：容器内模型地址上对应权重，模型格式是HuggingFace的目录格式。即上传的HuggingFace权重文件存放目录。如果使用了量化功能，则使用[量化](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5908013.html)章节转换后的权重。如果使用的是训练后模型转换为HuggingFace格式的地址，还需要有Tokenizer原始文件。
- --quantization, -q：用于量化权重的方法，来自于模型配置文件中的 quantization_config 属性。如果上面的model是量化模型，那么该值是必须的。
- --max-num-seqs：最大同时处理的请求数，超过后在等待池等候处理。
- --max-model-len：推理时最大输入+最大输出tokens数量，输入超过该数量会直接返回。max-model-len的值必须小于config.json文件中的"max_position_embeddings"的值，否则推理预测会报错。config.json存在模型对应的路径下，例如：${container_model_path}/chatglm3-6b/config.json。不同模型推理支持的max-model-len长度不同，具体差异请参见[表1](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5908003.html#ZH-CN_TOPIC_0000002484417925__table598419217347)。
- --max-num-batched-tokens：prefill阶段，最多会使用多少token，必须大于或等于--max-model-len。
- --dtype：模型推理的数据类型。支持FP16和BF16数据类型推理。float16表示FP16，bfloat16表示BF16。如果不指定，则根据输入数据自动匹配数据类型。使用不同的dtype会影响模型精度。如果使用开源权重，建议不指定dtype，使用开源权重默认的dtype。
- --tensor-parallel-size：模型并行数。模型并行与流水线并行的乘积取值需要和启动的NPU卡数保持一致，可以参考[表1](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5908003.html#ZH-CN_TOPIC_0000002484417925__table598419217347)。此处举例为1，表示使用单卡启动服务。
- --pipeline-parallel-size：流水线并行数。模型并行与流水线并行的乘积取值需要和启动的NPU卡数保持一致，默认为1。当前仅支持pipeline-parallel-size为1。若是多机部署，该参数值要与ASCEND_RT_VISIBLE_DEVICES变量指定卡数保持一致。
- --block-size：kv-cache的block大小，推荐设置为128。
- --host=${docker_ip}：服务部署的IP，${docker_ip}替换为宿主机实际的IP地址，默认为None，举例：参数可以设置为0.0.0.0。
- --port：服务部署的端口。
- --gpu-memory-utilization：NPU使用的显存比例，复用原vLLM的入参名称，推荐值为0.95。
- --trust-remote-code：是否信任远程代码。添加该参数表示信任，不添加该参数表示不信任。
- --distributed-executor-backend：多卡推理启动后端，可选值为"ray"或者"mp"，其中"ray"表示使用ray进行启动多卡推理，"mp"表示使用python多进程进行启动多卡推理。默认使用"mp"后端启动多卡推理。
- --disable-async-output-proc：关闭异步后处理特性，关闭后性能会下降。
- --speculative-config：配置投机参数；配置参数为JSON字符串，默认是None。
- --no-enable-prefix-caching：关闭prefix-caching，需要打开请参照[Prefix Caching](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5908014.html)
- --enforce-eager：未设置INFER_MODE环境变量时，部分模型会默认使用AclGraph图模式启动来提升性能，设置该参数后将关闭图模式。推荐Meta-Llama系列等非Qwen系列开启。
- --additional-config: {"ascend_turbo_graph_config": {"enabled": true}} 为开启ascend_turbo图模式。开启下Qwen系列有性能提升，不开启则默认走acl_graph。当前acl_graph仅支持bf16，不支持compress_tensors， smoothquant， awq。 "ascend_scheduler_config": {"enabled": true}为昇腾调度器的配置选项
  
 
**多机部署启动推理服务**
当单机显存无法放下模型权重时，可选用多机方式部署；多机部署方式，需要机器在同一个集群，NPU卡之间IP能够ping通方可，具体步骤如下，步骤1和2在容器外执行，步骤3和4在容器内执行。
1. 查看卡IP，在其中一个机器上执行。
   ```
   for i in $(seq 0 7);do hccn_tool -i $i -ip -g;done
   ```
   
2. 检查卡之间的网络是否通。
   ```
   # 在另一个机器上执行，29.81.3.172是上一步输出的ipaddr的值
   hccn_tool -i 0 -ping -g address 29.81.3.172
   ```
   如果参数量很大，那么建议再额外设置超时时延。
   ```
   export RAY_CGRAPH_get_timeout=180
   export HCCL_EXEC_TIMEOUT=700
   export HCCL_CONNECT_TIMEOUT=700
   ```
   
3. 进入容器，启动Ray集群。
   ```
   # 指定通信网卡，使用ifconfig查看，找到和主机IP一致的网卡名
   export GLOO_SOCKET_IFNAME=enp67s0f5
   export TP_SOCKET_IFNAME=enp67s0f5
   export RAY_EXPERIMENTAL_NOSET_ASCEND_RT_VISIBLE_DEVICES=1
   # 指定可使用的卡
   export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
   # 将其中一个机器设为头节点
   ray start --head --num-gpus=8
   # 在其他机器执行
   ray start --address='10.170.22.18:6379' --num-gpus=8
   ```
   - --num-gpus：要跟ASCEND_RT_VISIBLE_DEVICES指定的可用卡数一致。
   
   - --address：头节点IP+端口号，头节点创建成功后，会有打印。
   
   
   ![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
   - 环境变量每个节点都要设置。
   
   - 更新环境变量需要重启Ray集群。
     
4. 选择其中一个节点，添加指定分布式后端参数【--distributed-executor-backend=ray】，其他参数与正常启服务一致即可。具体参考本文单机场景下OpenAI服务的API接口[启动在线推理服务]方式。
#### 推理请求测试
使用命令测试推理服务是否正常启动。服务启动命令中的参数设置请参见[启动在线推理服务]。
通过OpenAI服务API接口启动服务使用以下推理测试命令。${docker_ip}替换为实际宿主机的IP地址。如果启动服务未添加 served-model-name 参数，${container_model_path} 的值请与 model 参数的值保持一致；如果使用了 served-model-name 参数，${container_model_path} 请替换为 served-model-name参数 。端口8080和启动推理服务时的port参数保持一致。
**OpenAI Completions API with vLLM**
```
curl -X POST http://${docker_ip}:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{        
      "model": "${container_model_path}",      
      "prompt": "hello",
      "max_tokens": 32,
      "temperature": 0   
}'
```
**OpenAI Chat Completions API with vLLM**
```
curl -X POST http://${docker_ip}:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
    "model": "${container_model_path}",
    "messages": [
        {
            "role": "user",
            "content": "hello"
        }
    ],
    "max_tokens": 32,
    "temperature": 0
}'
```
服务的API与vLLM官网相同，此处介绍关键参数。详细参数解释请参见官网<https://docs.vllm.ai/en/stable/api/vllm/vllm.sampling_params.html>。
OpenAI服务相关请求参数说明请参照[表2]。
 表2OpenAI服务请求参数说明 
| 参数                | 是否必选 | 默认值   | 参数类型          | 描述                                                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|:---|:---|:---|
| model             | 是    | 无     | Str           | 通过OpenAI服务API接口启动服务时，推理请求必须填写此参数。取值必须和启动推理服务时的model ${container_model_path} 参数保持一致。 通过vLLM服务API接口启动服务时，推理请求不涉及此参数。                                                                                                                                                                                                                     |
| prompt            | 是    | -     | Str           | 请求输入的问题。                                                                                                                                                                                                                                                                                                                                                                            |
| max_tokens        | 否    | 16    | Int           | 每个输出序列要生成的最大tokens数量。                                                                                                                                                                                                                                                                                                                                                               |
| top_k             | 否    | -1    | Int           | 控制要考虑的前几个tokens数量的整数。设置为-1表示考虑所有tokens。 适当降低该值可以减少采样时间。                                                                                                                                                                                                                                                                                |
| top_p             | 否    | 1.0   | Float         | 控制要考虑的前几个tokens的累积概率的浮点数。必须在(0, 1\]范围内。设置为1表示考虑所有tokens。                                                                                                                                                                                                                                                                                                                            |
| temperature       | 否    | 1.0   | Float         | 控制采样的随机性的浮点数。较低的值使模型更加确定性，较高的值使模型更加随机。0表示贪婪采样。                                                                                                                                                                                                                                                                                                                                      |
| stop              | 否    | None  | None/Str/List | 用于停止生成的字符串列表。返回的输出将不包含停止字符串。 例如：\["你", "好"\]，生成文本时遇到"你"或者"好"将停止文本生成。                                                                                                                                                                                                                                                                   |
| stream            | 否    | False | Bool          | 是否开启流式推理。默认为False，表示不开启流式推理。                                                                                                                                                                                                                                                                                                                                                        |
| presence_penalty  | 否    | 0.0   | Float         | presence_penalty表示会根据当前生成的文本中新出现的词语进行奖惩。取值范围\[-2.0，2.0\]。                                                                                                                                                                                                                                                                                                                           |
| frequency_penalty | 否    | 0.0   | Float         | frequency_penalty会根据当前生成的文本中各个词语的出现频率进行奖惩。取值范围\[-2.0，2.0\]。                                                                                                                                                                                                                                                                                                                         |
| length_penalty    | 否    | 1.0   | Float         | length_penalty表示在beam search过程中，对于较长的序列，模型会给予较大的惩罚。 如果要使用length_penalty，必须添加如下三个参数，并且需将use_beam_search参数设置为true，best_of参数设置大于1，top_k固定为-1。 "top_k": -1 "use_beam_search":true "best_of":2 |
| ignore_eos        | 否    | False | Bool          | ignore_eos表示是否忽略EOS并且继续生成token。                                                                                                                                                                                                                                                                                                                                                     |
   
