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

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

综述由AI生成Llama 3-8B-Instruct 模型在昇腾 NPU 配合 SGLang 框架下的推理性能表现优异。实测覆盖吞吐量、延迟及显存占用,通过不同批量大小与序列长度的压力测试验证了高并发场景下的稳定性。结果显示,Ascend NPU 在矩阵运算与多核并行方面优势明显,能有效支持大模型的低延迟生成需求,为开发者提供了可靠的硬件选型参考与优化策略。

灰度发布发布于 2026/4/10更新于 2026/5/2518 浏览
Llama 3-8B-Instruct 在昇腾 NPU 上的 SGLang 性能实测

1. 引言

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

2. 实验环境与准备

2.1 环境配置

为了快速验证,我们推荐使用云端开发环境,支持 Python、SGLang 及昇腾 NPU 相关依赖,无需本地复杂配置即可运行。

建议配置如下:

  • 计算类型:NPU(Atlas 800T),搭配 32v CPU+64GB 内存,适合大模型推理/训练;
  • 容器镜像:ubuntu22.04 + Python3.11 + CANN8.2 + SGLang,直接兼容昇腾 + SGLang 的开发需求。

启动后,使用 npu-smi info 指令查询 NPU 的硬件信息和运行状态,确保开发环境正常。

npu-smi info

检查 Python 版本及 SGLang 是否安装成功:

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

2.2 模型加载

在进行 Llama 3-8B 的推理前,需确保模型已就绪。选择 Llama 3-8B 是因为其参数量适中,既能保证生成质量,又不会对硬件提出过高要求,非常适合在专用推理硬件上进行性能测试。

对于 SGLang 来说,Llama 3-8B 的结构与算子类型能够充分发挥其编译器优化能力,包括算子融合、内存布局优化和流水线调度等。昇腾 NPU 在矩阵运算、张量处理以及多核并行方面具备显著优势,能够高效执行 Llama 3-8B 的计算图。

首次运行时,如果本地没有模型,会自动下载并缓存;后续直接加载本地模型即可。

创建一个 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 和模型权重
    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")
:
    ()
    tokenizer = AutoTokenizer.from_pretrained(model_dir)
    model = AutoModelForCausalLM.from_pretrained(model_dir, torch_dtype=torch.float16, device_map=)


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

确认模型下载完成后,下一步是准备推理环境。这里使用 SGLang Engine 模式,能够直接在 Notebook 或 Python 脚本中调用昇腾 NPU 执行推理。

SGLang Engine 配置示例:

# sglang_engine_setup.py
import os
import time
import sglang as sgl

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

# -----------------------------
# 初始化 SGLang Engine
# -----------------------------
print("Initializing SGLang Engine (Backend: Ascend)...")
try:
    engine = sgl.Engine(
        model_path=MODEL_PATH,
        tp_size=1,  # 张量并行度,单卡即可
        trust_remote_code=True,  # 允许运行模型自带 Python 代码
        backend="ascend",  # 指定使用昇腾 NPU
        dtype="float16"  # 使用 FP16 精度,节省显存
    )
    print("✅ Engine initialized successfully! NPU memory allocated.\n")
except Exception as e:
    print(f"❌ Engine initialization failed: {e}")
    raise

构建推理函数以便进行性能测试和批量推理:

# inference_function.py
BATCH_SIZE = 4
MAX_NEW_TOKENS = 50

def run_inference(prompts):
    """使用 SGLang Engine 执行推理,返回输出列表"""
    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])

3. 性能基准测试

3.1 推理吞吐量测试

吞吐量用于衡量模型在单位时间内能够处理多少 token 或多少样本,是评估大模型推理性能最关键的指标之一。

常见指标:

  • tokens/sec:每秒可生成多少 token
  • samples/sec:每秒可处理多少输入

吞吐量越高,模型批量推理能力越强,尤其适用于多用户并发、大批量离线生成的场景。

Python 测试代码:

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"  # 在 Ascend 上推理
)
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")

从实际运行结果来看,Llama 3-8B 在 Ascend NPU 上具有极高吞吐量,适合多用户并发和大批量生成场景。

3.2 推理时延测试

时延(latency)主要关注模型响应一个单独请求的速度,通常使用:

  • E2E Latency(端到端时延):包含 tokenization、模型推理等全部流程
  • Per-token Latency:单 token 解码平均时间

Python 测试代码:

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")

模型端到端响应时间短,单个 token 的平均生成耗时也很低,说明 Ascend NPU 可以高效支持在线推理场景,并在需要快速生成文本时表现出优异性能。

3.3 显存占用测试

显存是限制大模型部署的关键资源,在运行大模型的时候经常会遇到爆显存的问题,这个是比较核心也是需要重视的点。

Ascend 提供 npu-smi 来实时查看设备 HBM 使用情况,也可在 PyTorch 层面统计。

PyTorch 内部统计:

import torch_npu
# 返回当前 NPU 设备占用情况(单位 Bytes)
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

3.4 批量吞吐量/时延自动化测试

批量吞吐量和批量时延是衡量大模型在多用户并发或批量任务生成场景下性能的关键指标。

  • 通过测不同 batch size,可以判断 NPU 并行利用率是否充分。
  • 可以帮助确定最大 batch、最佳 seq length 和实际部署的吞吐能力。
  • 同时评估 SGLang 调度、KV Cache 的优化效果。

Python 测试代码:

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()
    
    # 统计 tokens
    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}")

表格总结分析:

批量大小(batch_size)序列长度(seq_len)延迟(latency)(秒)吞吐量(throughput)(tokens / 秒)说明
11281.024125小批量下性能较低
21280.554462.5批量提升后性能开始优化
41280.2881775性能明显提升
81280.1476950延迟进一步降低,吞吐量大幅增长
161280.07427500大批量下效率最高

随着 batch size 增大,总吞吐量显著提升,虽然总延迟略有增加,但每个 token 的平均延迟下降,充分体现了 Ascend NPU 在大批量并发推理中强大的并行计算能力和高效资源利用率。

4. 压力测试

接下来进行压力测试,这是性能评估中非常关键的一环,能够帮助我们深入分析 Llama 3-8B-Instruct 模型在 SGLang 调度下的表现,尤其是在大 batch、高并发和长序列生成等复杂场景中,全面了解模型的稳定性、吞吐能力和延迟特性。

主要测试对象包括批量吞吐量、延迟、长序列生成、多轮迭代。

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"  # 在 Ascend 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
        latency = end - start
        total_latency += latency
    
    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 = 4
seq_test = 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")

测试结果汇总:

批量大小(Batch)序列长度(SeqLen)平均延迟(AvgLatency)(秒)平均吞吐量(AvgThroughput)(tokens / 秒)
1640.0381704.22(此配置下吞吐量最优)
2640.0781646.42
4640.1561640.38
8640.3081662.26
16640.6151665.44
11280.0761675.37
21280.1551655.19
41280.3091657.79
81280.6191654.24
161281.2211676.65
12560.1571631.56(此配置下吞吐量略低)
22560.3061673.5
42560.6161662.48
82561.2251672.28
162562.4251688.87(大序列 + 大批次下吞吐量仍稳定)

从压力测试结果来看,Llama 3-8B-Instruct 在 SGLang 调度下,Ascend NPU 能够在大批量、高并发和长序列生成场景中保持高吞吐、低延迟和良好稳定性,在实际开发中能够完全胜任。

5. 总结

实测表明,Llama 3-8B-Instruct 在 Ascend NPU 上具有高吞吐量、低延迟和稳定性能,即使在大批量、高并发和长序列生成场景下也能高效运行,同时显存占用得到有效控制。开发者可以直接在云端环境中快速完成模型加载、推理和性能测试,为后续的大模型落地提供了可靠的参考依据。

目录

  1. 1. 引言
  2. 2. 实验环境与准备
  3. 2.1 环境配置
  4. 2.2 模型加载
  5. 设置本地模型存储路径
  6. 判断模型是否已经存在
  7. 测试推理
  8. sglangenginesetup.py
  9. -----------------------------
  10. 环境配置
  11. -----------------------------
  12. -----------------------------
  13. 初始化 SGLang Engine
  14. -----------------------------
  15. inference_function.py
  16. 测试输入
  17. 3. 性能基准测试
  18. 3.1 推理吞吐量测试
  19. Warmup
  20. 3.2 推理时延测试
  21. Warmup
  22. E2E Latency
  23. Per-token Latency
  24. 3.3 显存占用测试
  25. 返回当前 NPU 设备占用情况(单位 Bytes)
  26. 3.4 批量吞吐量/时延自动化测试
  27. 4. 压力测试
  28. ===============================
  29. 模型加载
  30. ===============================
  31. ===============================
  32. 测试配置
  33. ===============================
  34. ===============================
  35. 压力测试函数
  36. ===============================
  37. ===============================
  38. 批量 + 长序列压力测试
  39. ===============================
  40. ===============================
  41. 单 token 延迟分析
  42. ===============================
  43. 5. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Arduino BLDC 模糊逻辑避障控制机器人实战
  • Llama 3-8B-Instruct 在昇腾 NPU 上的 SGLang 性能实测
  • Whisper 模型参数调优实战:适配不同语音识别场景
  • 学习大语言模型原理必看的 10 篇论文
  • Java 入门指南:环境配置与第一个程序
  • Robo-Diffusion 机器人图像生成使用技巧
  • Visual C++ 运行库安装故障诊断与修复指南
  • Visual C++ Release 模式使用 Win32 API 导出崩溃堆栈
  • HuggingFace 镜像与反向代理加速 GLM-4.6V-Flash-WEB 模型加载
  • 前端状态管理对比:如何选择合适的方案
  • 大模型常见面试问题及核心技术原理解析
  • 纯 CSS 实现 3D 文字效果实战教程
  • Linux 下 libwebkit2gtk-4.1-0 安装指南
  • Ubuntu 22.04 更换镜像源全流程
  • 冯诺依曼体系结构与操作系统初理解
  • AI绘画的商业应用:广告、插画与游戏设计
  • 2026 年降低 AIGC 检测率工具红黑榜评测
  • Cookie 与 Session:Web 用户状态管理的双刃剑
  • 零基础搭建 FPGA 下载环境:USB-Blaster 驱动安装指南
  • Poll 函数原理与 TCP 服务器实现详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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