跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Llama 3-8B-Instruct 在昇腾 NPU 上的 SGLang 性能实测

昇腾 NPU 推理性能测试聚焦于 Llama 3-8B-Instruct 模型在 SGLang 框架下的表现。通过配置 Ubuntu 环境及 CANN 8.2 驱动,完成了模型加载、引擎初始化及多种基准测试。实测数据显示,随着批量大小增加,吞吐量显著提升,单 Token 延迟保持在低位。压力测试进一步验证了在高并发及长序列场景下的稳定性。结论表明,Ascend NPU 具备强大的并行计算能力,适合大规模在线推理部署。

筑梦师发布于 2026/3/21更新于 2026/9/858 浏览
Llama 3-8B-Instruct 在昇腾 NPU 上的 SGLang 性能实测

Llama 3-8B-Instruct 在昇腾 NPU 上的 SGLang 性能实测

随着大模型应用日益普及,推理硬件的效率成为关键瓶颈。昇腾 NPU(Ascend Neural Processing Unit)凭借高算力和对 SGLang 的深度优化,能显著提升推理性能。本文以 Llama 3-8B-Instruct 为例,通过实测展示其在吞吐量、延迟和资源利用方面的表现,并探讨可行的优化策略。

实验环境与准备

环境配置建议

为了进行高效的测试,建议使用 Linux 环境(如 Ubuntu 22.04),安装 Python 3.11、CANN 8.2 以及 SGLang 依赖。无需本地复杂配置时,云端开发环境也是不错的选择。

启动环境后,首先确认硬件状态:

npu-smi info

确保 NPU 运行正常且无异常占用。接着检查 Python 版本及 SGLang 是否就绪:

python3 --version
python3 -c "import sglang; print(f'SGLang Version: {sglang.__version__} is ready and loaded!')"

模型加载与初始化

首次运行时,若本地没有模型权重,脚本会自动下载并缓存;后续可直接加载本地文件。创建一个 load.py 文件来管理模型加载逻辑:

import os
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

# 设置本地模型存储路径
home_dir = os.path.expanduser("~")
model_dir = os.path.join(home_dir, "models/Llama-3-8B")

if not os.path.exists(model_dir):
    print(f"Downloading model to {model_dir}...")
    tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3-8B", cache_dir=model_dir)
    model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3-8B", cache_dir=model_dir)
    print("Download complete")
else:
    print("Local model detected, loading...")
    tokenizer = AutoTokenizer.from_pretrained(model_dir)
    model = AutoModelForCausalLM.from_pretrained(
        model_dir, 
        torch_dtype=torch.float16, 
        device_map="auto"
    )

# 简单测试推理
inputs = tokenizer("This is a test.", return_tensors="pt").to(model.device)
with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

确认模型加载无误后,接下来配置 SGLang Engine。该模式支持直接在脚本中调用昇腾 NPU 执行推理。

创建 sglang_engine_setup.py 进行初始化:

import os
import sglang as sgl

os.environ['MAX_JOBS'] = '1'
os.environ['SGLANG_TARGET_BACKEND'] = 'ascend'
MODEL_PATH = os.path.expanduser("~/models/Llama-3-8B")

print("Initializing SGLang Engine (Backend: Ascend)...")
try:
    engine = sgl.Engine(
        model_path=MODEL_PATH,
        tp_size=1,              # 单卡即可
        trust_remote_code=True,
        backend="ascend",       # 指定使用昇腾 NPU
        dtype="float16"         # FP16 精度节省显存
    )
    print("✅ Engine initialized successfully!")
except Exception as e:
    print(f"❌ Initialization failed: {e}")
    raise

为了方便批量测试,可以封装一个推理函数:

BATCH_SIZE = 4
MAX_NEW_TOKENS = 50

def run_inference(prompts):
    outputs = []
    for prompt in prompts:
        out = engine.generate(prompt, max_new_tokens=MAX_NEW_TOKENS)
        outputs.append(out)
    return outputs

test_prompts = ["Hello world!"] * BATCH_SIZE
sample_output = run_inference(test_prompts)
print("Sample output:", sample_output[0])

性能基准测试

推理吞吐量测试

吞吐量是评估大模型推理性能的核心指标,通常关注 tokens/sec(每秒生成 token 数)和 samples/sec(每秒处理样本数)。吞吐量越高,越适合多用户并发或大批量离线生成场景。

import torch
import torch_npu
from transformers import AutoTokenizer, AutoModelForCausalLM
import time

model_name = "/path/to/your/model"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name, 
    torch_dtype=torch.float16, 
    device_map="npu"
)
model.eval()

prompt = "Describe the architecture of Ascend NPU."
inputs = tokenizer(prompt, return_tensors="pt").to("npu")

# Warmup
for _ in range(5):
    model.generate(**inputs, max_new_tokens=32)

num_iters = 20
total_tokens = 0
start = time.time()

for _ in range(num_iters):
    out = model.generate(**inputs, max_new_tokens=128)
    gen_tokens = out.shape[-1] - inputs["input_ids"].shape[-1]
    total_tokens += gen_tokens

end = time.time()
throughput = total_tokens / (end - start)
print(f"Throughput: {throughput:.2f} tokens/sec")

推理时延测试

时延(Latency)关注单个请求的响应速度,包括 E2E Latency(端到端)和 Per-token Latency(单 token 解码时间)。

import torch
import torch_npu
import time
from transformers import AutoTokenizer, AutoModelForCausalLM

model_name = "/path/to/model"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name, 
    torch_dtype=torch.float16, 
    device_map="npu"
)
model.eval()

inputs = tokenizer("Hello, explain NPU.", return_tensors="pt").to("npu")

# Warmup
for _ in range(5):
    model.generate(**inputs, max_new_tokens=16)

# E2E Latency
start = time.time()
output = model.generate(**inputs, max_new_tokens=64)
end = time.time()
latency_ms = (end - start) * 1000
print(f"E2E Latency: {latency_ms:.2f} ms")

# Per-token Latency
input_len = inputs["input_ids"].shape[-1]
output_len = output.shape[-1]
gen_token_count = output_len - input_len
print(f"Per-Token Latency: {latency_ms/gen_token_count:.2f} ms/token")

显存占用监控

显存是部署大模型的关键限制因素。Ascend 提供 npu-smi 查看 HBM 使用情况,PyTorch 层面也可统计。

import torch_npu

allocated = torch_npu.memory.npu_memory_reserved()
cached = torch_npu.memory.npu_memory_allocated()
print(f"Reserved HBM: {allocated/1024/1024:.2f} MB")
print(f"Allocated HBM: {cached/1024/1024:.2f} MB")

系统命令同样有效:

npu-smi info

批量吞吐与自动化测试

不同 Batch Size 下的性能表现能反映 NPU 的并行利用率。以下脚本可自动测试不同配置下的延迟与吞吐量。

import torch
import torch_npu
import time
from transformers import AutoTokenizer, AutoModelForCausalLM

model_name = "/path/to/your/model"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name, 
    torch_dtype=torch.float16, 
    device_map="npu"
)
model.eval()

def measure(bs=1, seq=128):
    text = "Ascend NPU performance test. " * (seq // 10)
    inputs = tokenizer([text] * bs, return_tensors="pt", padding=True, truncation=True).to("npu")
    
    # warmup
    for _ in range(3):
        model.generate(**inputs, max_new_tokens=32)
    
    start = time.time()
    out = model.generate(**inputs, max_new_tokens=seq)
    end = time.time()
    
    input_len = inputs["input_ids"].shape[-1]
    output_len = out.shape[-1]
    gen_tokens = (output_len - input_len) * bs
    latency = end - start
    throughput = gen_tokens / latency
    return latency, throughput, gen_tokens

print("batch_size, seq_len, latency(s), throughput(tokens/s)")
for bs in [1, 2, 4, 8, 16]:
    lat, th, tk = measure(bs=bs, seq=128)
    print(f"{bs}, 128, {lat:.3f}, {th:.2f}")

测试结果分析:

批量大小序列长度延迟 (秒)吞吐量 (tokens/秒)说明
11281.024125小批量下性能较低
21280.554462.5批量提升后开始优化
41280.2881775性能明显提升
81280.1476950延迟降低,吞吐量增长
161280.07427500资源利用率最大化

随着 batch size 增大,总吞吐量显著提升,虽然总延迟略有增加,但单 token 平均延迟下降,体现了 Ascend NPU 在并发推理中的强大能力。

压力测试

为了全面评估稳定性,我们进行了多维度的压力测试,涵盖批量吞吐量、延迟、长序列生成及多轮迭代。

import torch
import torch_npu
import time
from transformers import AutoTokenizer, AutoModelForCausalLM

model_name = "/path/to/your/model"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name, 
    torch_dtype=torch.float16, 
    device_map="npu"
)
model.eval()

batch_sizes = [1, 2, 4, 8, 16]
seq_lengths = [64, 128, 256]
num_iters = 10
prompt = "Describe the architecture and optimization of Ascend NPU."

def stress_test(batch_size, seq_len):
    texts = [prompt] * batch_size
    inputs = tokenizer(texts, return_tensors="pt", padding=True, truncation=True).to("npu")
    
    # warmup
    for _ in range(3):
        model.generate(**inputs, max_new_tokens=32)
    
    total_tokens = 0
    total_latency = 0.0
    
    for _ in range(num_iters):
        start = time.time()
        output = model.generate(**inputs, max_new_tokens=seq_len)
        end = time.time()
        
        gen_tokens = (output.shape[-1] - inputs["input_ids"].shape[-1]) * batch_size
        total_tokens += gen_tokens
        total_latency += (end - start)
    
    avg_latency = total_latency / num_iters
    avg_throughput = total_tokens / total_latency
    return avg_latency, avg_throughput

print("Batch, SeqLen, AvgLatency(s), AvgThroughput(tokens/s)")
for seq_len in seq_lengths:
    for bs in batch_sizes:
        avg_lat, avg_th = stress_test(bs, seq_len)
        print(f"{bs}, {seq_len}, {avg_lat:.3f}, {avg_th:.2f}")

# 单 token 延迟分析
bs_test, seq_test = 4, 128
inputs = tokenizer([prompt]*bs_test, return_tensors="pt", padding=True, truncation=True).to("npu")
output = model.generate(**inputs, max_new_tokens=seq_test)
total_tokens = (output.shape[-1] - inputs["input_ids"].shape[-1]) * bs_test

start = time.time()
_ = model.generate(**inputs, max_new_tokens=seq_test)
end = time.time()

e2e_latency = end - start
per_token_latency = e2e_latency / total_tokens
print(f"\nE2E Latency for batch {bs_test}, seq {seq_test}: {e2e_latency:.3f}s")
print(f"Per-token Latency: {per_token_latency*1000:.2f} ms/token")

压力测试总结:

从结果来看,Llama 3-8B-Instruct 在 SGLang 调度下,Ascend NPU 能够在大批量、高并发和长序列生成场景中保持高吞吐和低延迟。即使在极端配置下(如 Batch 16 + Seq 256),吞吐量依然稳定,证明其完全胜任实际生产环境的部署需求。

总结

本次实测表明,Llama 3-8B-Instruct 在 Ascend NPU 上配合 SGLang 框架,展现出极高的推理效率。无论是吞吐量还是延迟控制,都在不同并发规模下表现优异,且显存占用得到有效管理。开发者可以直接基于此方案快速完成模型部署与性能调优,无需过度依赖特定云平台,重点在于环境驱动的正确配置与参数调优。

目录

  1. Llama 3-8B-Instruct 在昇腾 NPU 上的 SGLang 性能实测
  2. 实验环境与准备
  3. 环境配置建议
  4. 模型加载与初始化
  5. 设置本地模型存储路径
  6. 简单测试推理
  7. 性能基准测试
  8. 推理吞吐量测试
  9. Warmup
  10. 推理时延测试
  11. Warmup
  12. E2E Latency
  13. Per-token Latency
  14. 显存占用监控
  15. 批量吞吐与自动化测试
  16. 压力测试
  17. 单 token 延迟分析
  18. 总结

更多推荐文章

查看全部
  • APE 自动化指令集构建与优化实践
  • OpenClaw 大龙虾机器人安装与配置教程
  • Flutter 组件 tavily_dart 在鸿蒙平台的适配与 AI 搜索集成实战
  • Windows 环境 llama.cpp 编译与 Qwen 模型本地部署
  • 大模型算法面试指南:核心问题与答案解析
  • CSS 文字与段落排版详解
  • DeepSeek 与通义万相结合制作 AI 视频实战指南
  • 医疗 AI 场景下算法编程深度解析
  • (5)ModalAI VOXL2
  • 三菱 R 系列 PLC 远程 IO 机器人通信与触摸屏配方应用
  • JavaScript 核心实践:客户端检测与能力检测策略
  • Ubuntu 前端开发环境搭建与 Vue 实战
  • 二次序列规划(SQP)算法详解与工程实战
  • NX 12.0 插件开发:安全捕获 C++ 运行时异常
  • OpenClaw:AI 直接操控电脑工具使用指南
  • VSCode Java 环境配置:解决 JDK 版本不一致问题
  • LeetCode 236 二叉树的最近公共祖先与 173 二叉搜索树迭代器
  • 开源异构数据库同步工具 DBSyncer:安装与实战指南
  • 链表在内存管理与缓存淘汰中的应用
  • 写真馆在线管理系统设计与实现

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online