Llama 3-8B-Instruct 在昇腾 NPU 上的 SGLang 性能实测
测试了 Llama 3-8B-Instruct 模型在昇腾 NPU 上使用 SGLang 框架的性能表现。通过实验环境准备、模型加载及推理配置,进行了吞吐量、时延、显存占用及压力测试。结果显示,该组合在高并发、大批量场景下具有高吞吐和低延迟特性,显存控制良好,适合大模型推理部署。

测试了 Llama 3-8B-Instruct 模型在昇腾 NPU 上使用 SGLang 框架的性能表现。通过实验环境准备、模型加载及推理配置,进行了吞吐量、时延、显存占用及压力测试。结果显示,该组合在高并发、大批量场景下具有高吞吐和低延迟特性,显存控制良好,适合大模型推理部署。

随着大模型在各类智能应用中的广泛应用,高效的推理硬件成为关键瓶颈。昇腾 NPU(Ascend Neural Processing Unit)凭借其高算力、低能耗以及对 SGLang 的深度优化,能够显著提升大模型推理性能。本文以 Llama 3-8B-Instruct 为例,通过在昇腾 NPU 上的实测,展示其在吞吐量、延迟和资源利用方面的优势,并探索可行的优化策略,为开发者在今后的开发中提供可参考的案例。
采用云端开发环境进行实战,进入官网后选择对应的开发环境配置。
启动成功后进入控制台。
使用 npu-smi info 指令查询 NPU 的硬件信息和运行状态,确保开发环境没有问题。
使用 python3 --version 查看 Python 版本。
使用 python3 -c "import sglang; print(f'SGLang Version: {sglang.version} is ready and loaded!')" 指令查看 SGLang 是否安装好。
在进行 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")
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))
在确认 Llama 3-8B 模型已下载完成后,下一步是准备推理环境。这里我们使用 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])
吞吐量用于衡量模型在单位时间内能够处理多少 token 或多少样本,是评估大模型推理性能最关键的指标之一。
常见的指标:
吞吐量越高,模型批量推理能力越强,尤其适用于多用户并发、大批量离线生成的场景。
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 上具有极高吞吐量,适合多用户并发和大批量生成场景。
时延(latency)主要关注模型 响应一个单独请求 的速度,通常使用:
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 可以高效支持在线推理场景,并在需要快速生成文本时表现出优异性能。
显存是限制大模型部署的关键资源,在运行大模型的时候经常会遇到爆显存的问题,这个是比较核心也是需要重视的点。
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")
系统命令:
import subprocess
out = subprocess.check_output("npu-smi info", shell=True)
print(out.decode())
批量吞吐量和批量时延是衡量大模型在 多用户并发 或 批量任务生成 场景下性能的关键指标。
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:f}, ")
表格总结分析:
| 批量大小(batch_size) | 序列长度(seq_len) | 延迟(latency)(秒) | 吞吐量(throughput)(tokens / 秒) | 说明 |
|---|---|---|---|---|
| 1 | 128 | 1.024 | 125 | 小批量下性能较低 |
| 2 | 128 | 0.554 | 462.5 | 批量提升后性能开始优化 |
| 4 | 128 | 0.288 | 1775 | 性能明显提升 |
| 8 | 128 | 0.147 | 6950 | 延迟进一步降低,吞吐量大幅增长 |
| 16 | 128 | 0.074 | 27500 |
随着 batch size 增大,总吞吐量显著提升,虽然总延迟略有增加,但每个 token 的平均延迟下降,充分体现了 Ascend NPU 在大批量并发推理中强大的并行计算能力和高效资源利用率。
接下来我们来进行压力测试,压力测试也是性能评估中非常关键的一环,它能够帮助我们深入分析 Llama 3-8B-Instruct 模型在 SGLang 调度下的表现,尤其是在大 batch、高并发和长序列生成等复杂场景中,全面了解模型的稳定性、吞吐能力和延迟特性。
下面使用 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" # 在 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 =
total_latency =
_ (num_iters):
start = time.time()
output = model.generate(**inputs, max_new_tokens=seq_len)
end = time.time()
gen_tokens = (output.shape[-] - inputs[].shape[-]) * batch_size
total_tokens += gen_tokens
latency = end - start
total_latency += latency
avg_latency = total_latency / num_iters
avg_throughput = total_tokens / total_latency
avg_latency, avg_throughput
()
seq_len seq_lengths:
bs batch_sizes:
avg_lat, avg_th = stress_test(bs, seq_len)
()
bs_test =
seq_test =
inputs = tokenizer([prompt]*bs_test, return_tensors=, padding=, truncation=).to()
output = model.generate(**inputs, max_new_tokens=seq_test)
total_tokens = (output.shape[-] - inputs[].shape[-]) * 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
()
()
测试结果:
表格总结:
| 批量大小(Batch) | 序列长度(SeqLen) | 平均延迟(AvgLatency)(秒) | 平均吞吐量(AvgThroughput)(tokens / 秒) |
|---|---|---|---|
| 1 | 64 | 0.038 | 1704.22(此配置下吞吐量最优) |
| 2 | 64 | 0.078 | 1646.42 |
| 4 | 64 | 0.156 | 1640.38 |
| 8 | 64 | 0.308 | 1662.26 |
| 16 | 64 | 0.615 | 1665.44 |
| 1 | 128 | 0.076 | 1675.37 |
| 2 | 128 | 0.155 | 1655.19 |
| 4 | 128 | 0.309 | 1657.79 |
| 8 | 128 | 0.619 | 1654.24 |
| 16 | 128 | 1.221 | 1676.65 |
| 1 | 256 | 0.157 | 1631.56(此配置下吞吐量略低) |
| 2 | 256 | 0.306 | 1673.5 |
| 4 | 256 | 0.616 | 1662.48 |
| 8 | 256 | 1.225 | 1672.28 |
| 16 | 256 | 2.425 | 1688.87(大序列 + 大批次下吞吐量仍稳定) |
从压力测试结果上面来看,Llama 3-8B-Instruct 在 SGLang 调度下,Ascend NPU 能够在大批量、高并发和长序列生成场景中保持高吞吐、低延迟和良好稳定性,在实际开发中能够完全胜任。
实测表明,Llama 3-8B-Instruct 在 Ascend NPU 上具有高吞吐量、低延迟和稳定性能,即使在大批量、高并发和长序列生成场景下也能高效运行,同时显存占用得到有效控制,开发者可以直接在云端环境中快速完成模型加载、推理和性能测试。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online