跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
PythonAI算法

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

Ascend NPU 结合 SGLang 框架对 Llama 3-8B-Instruct 进行了全方位性能评估。测试覆盖吞吐量、延迟、显存占用及批量压力场景。结果显示该组合在高并发和长序列生成下具备显著优势,能有效降低单 token 延迟并提升整体吞吐,适合企业级大模型推理部署。

asphyx_a发布于 2026/3/30更新于 2026/4/251 浏览
Llama 3-8B-Instruct 在昇腾 NPU 上基于 SGLang 的性能实测

引言

大模型落地应用时,推理硬件的效率往往是关键瓶颈。昇腾 NPU(Ascend Neural Processing Unit)凭借高算力和对 SGLang 的深度优化,为大规模推理提供了新的选择。本文以 Llama 3-8B-Instruct 为例,通过实际部署与测试,分析其在吞吐量、延迟及资源利用上的表现,并分享一些优化思路。

环境准备

搭建开发环境是第一步。我们采用 Ubuntu 22.04 系统,配置 Python 3.11,并安装 CANN 8.2 和 SGLang 依赖。这种组合能直接兼容昇腾与 SGLang 的开发需求。

启动环境后,建议先确认硬件状态是否正常。使用 npu-smi info 指令查询 NPU 的硬件信息和运行状态,确保没有异常报错后再进行后续操作。同时检查 Python 版本及 SGLang 是否成功加载:

import sglang
print(f'SGLang Version: {sglang.__version__} is ready and loaded!')

模型加载与引擎初始化

Llama 3-8B 参数量适中,既能保证生成质量,又不会给硬件带来过大压力,非常适合在专用推理硬件上进行性能测试。SGLang 的编译器优化能力(如算子融合、内存布局优化)能充分发挥昇腾 NPU 在矩阵运算和多核并行方面的优势。

首次运行时若本地无模型,脚本会自动下载并缓存;后续则直接加载本地权重即可。创建一个 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)
 torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=)
    (tokenizer.decode(outputs[], skip_special_tokens=))
with
50
print
0
True

接下来配置 SGLang Engine 模式,以便在脚本中直接调用昇腾 NPU 执行推理。这里指定后端为 ascend,并使用 FP16 精度以节省显存。

# 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",
        dtype="float16"
    )
    print("✅ Engine initialized successfully!")
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):
    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])

性能基准测试

吞吐量与延迟

吞吐量衡量单位时间内处理的 token 或样本数,是评估推理性能的核心指标。常见的有 tokens/sec 和 samples/sec。吞吐量越高,越适合多用户并发或大批量离线生成场景。

测试代码如下,注意在 Ascend 设备上需设置 device_map="npu":

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 平均时间)。低时延对于在线交互场景至关重要。

# 单次请求时延测试
inputs = tokenizer("Hello, explain NPU.", return_tensors="pt").to("npu")
for _ in range(5):
    model.generate(**inputs, max_new_tokens=16)

start = time.time()
output = model.generate(**inputs, max_new_tokens=64)
end = time.time()
latency_ms = (end - start) * 1000

input_len = inputs["input_ids"].shape[-1]
output_len = output.shape[-1]
gen_token_count = output_len - input_len
per_token_latency = latency_ms / gen_token_count

print(f"E2E Latency: {latency_ms:.2f} ms")
print(f"Per-Token Latency: {per_token_latency:.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")

# 或者使用系统命令
import subprocess
out = subprocess.check_output("npu-smi info", shell=True)
print(out.decode())

批量压力测试

批量吞吐量和时延能反映 NPU 在并发场景下的并行利用率。通过调整 batch size,可以判断最佳配置。

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")
    
    for _ in range(3): # warmup
        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}")

从测试结果来看,随着 batch size 增大,总吞吐量显著提升。虽然总延迟略有增加,但每个 token 的平均延迟下降,体现了 Ascend NPU 在大批量并发推理中的强大并行计算能力。

总结

本次实测表明,Llama 3-8B-Instruct 在 Ascend NPU 配合 SGLang 框架下,能够展现出高吞吐量、低延迟和稳定的性能。即使在大批量、高并发和长序列生成的复杂场景中,NPU 也能保持高效的资源利用率。开发者可以直接在云端或本地环境中快速完成模型加载、推理和性能调优,无需过度担心环境配置的复杂性。

目录

  1. 引言
  2. 环境准备
  3. 模型加载与引擎初始化
  4. 简单测试推理
  5. sglangenginesetup.py
  6. inference_function.py
  7. 性能基准测试
  8. 吞吐量与延迟
  9. Warmup
  10. 单次请求时延测试
  11. 显存占用
  12. 或者使用系统命令
  13. 批量压力测试
  14. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • VS Code 远程连接后 GitHub Copilot 无法使用怎么办
  • WebGIS 开发:WKT 转 GeoJSON 的多种实现方案与 Leaflet 集成
  • 直流无刷电机 FOC 矢量控制算法详解
  • LeetCode 92 区间反转:递归与哨兵节点实战解析
  • C++ 入门实战指南:从环境搭建到面向对象编程
  • 飞算 JavaAI 实战指南:安装、配置与核心功能解析
  • OpenClaw 本地部署指南:从零搭建可控 AI Agent 框架
  • 鸿蒙金融理财全栈项目:风险控制、合规审计与产品创新
  • AIGC 在现代教育技术中的应用与实现
  • C++ STL list 容器底层实现详解
  • 本地离线部署 Whisper 模型实现语音转写
  • 主流 AI 编程模型对比与选型实战指南
  • VSCode 中通过扩展使用 OpenAI 兼容模型配置 GitHub Copilot
  • Raphael AI:基于 Flux 模型的免费 AI 图像生成工具解析
  • Git-AI:追踪 AI 生成代码的开源工具
  • 前端首屏全链路性能优化实战:从诊断到落地
  • 2026 年热门 Python 毕业设计选题方向与实战建议
  • Java 多用户网页版聊天室:项目总览与用户及好友管理模块实现
  • OpenClaw 全平台卸载指南:Windows、macOS、Linux 与包管理器
  • 鸿蒙金融理财全栈实战:生态合作与数据变现优化

相关免费在线工具

  • 加密/解密文本

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