昇腾 NPU 部署 Llama 2 模型:性能测试与优化实践
记录了在华为昇腾 NPU 上部署和运行 Llama 2 大模型的完整流程。内容包括环境搭建(选择 NPU 镜像与规格)、模型下载与部署(解决网络与张量迁移问题)、性能基准测试(FP16 精度)以及优化方案(INT8 量化与批处理)。测试显示 FP16 下吞吐量约 20 tokens/s,INT8 量化后可提升至 45 tokens/s。结论表明昇腾 NPU 适合对成本敏感及追求自主可控的离线或内部工具场景。

记录了在华为昇腾 NPU 上部署和运行 Llama 2 大模型的完整流程。内容包括环境搭建(选择 NPU 镜像与规格)、模型下载与部署(解决网络与张量迁移问题)、性能基准测试(FP16 精度)以及优化方案(INT8 量化与批处理)。测试显示 FP16 下吞吐量约 20 tokens/s,INT8 量化后可提升至 45 tokens/s。结论表明昇腾 NPU 适合对成本敏感及追求自主可控的离线或内部工具场景。

面对动辄数万的 NVIDIA 高端 GPU,许多开发者和团队在部署大模型时都感到成本压力。华为昇腾(Ascend)NPU 凭借其自主可控的达芬奇架构、日益完善的软件开源生态以及云上可得的测试资源,构成了高性价比的部署方案。
本文记录使用云平台免费 Notebook 实例,完成从环境配置、模型部署到性能测试与优化的全过程。
在云平台创建 Notebook 实例时,几个关键配置决定了后续的成败:
NPU!手滑选了 CPU 或 GPU,后续所有步骤都将徒劳无功。NPU basic 规格(1*Ascend 910B, 32vCPU, 64GB 内存)是运行 Llama-2-7B 的甜点配置。euler2.9-py38-torch2.1.0-cann8.0-openmind0.6-notebook 。这能省去大量手动配置环境的时间。实例启动后,我们首先需要确认 NPU 可用。在终端中,依次执行以下命令:
# 检查系统与 Python 版本
cat /etc/os-release
python3 --version
# 检查 PyTorch 及 torch_npu
python -c "import torch; print(f'PyTorch 版本:{torch.__version__}')"
python -c "import torch_npu; print(f'torch_npu 版本:{torch_npu.__version__}')"
# 没有的话安装,先执行
pip install --upgrade pip
pip install torch torchvision torchaudio
pip install torch-npu
看到 PyTorch 版本:2.4.0 和 torch_npu 版本:2.4.0.post4 说明正常可用。
第一个常见的'坑':直接运行 torch.npu.is_available() 会报错 AttributeError。
原因与解决方案:torch_npu 是一个独立的插件,必须显式导入后才能注册 NPU 后端。正确的验证方式是:
python -c "import torch; import torch_npu; print(torch.npu.is_available())"
看到 True ,恭喜你,NPU 环境准备就绪!
安装运行 Llama 2 所必须的库,建议使用国内镜像加速:
pip install transformers accelerate -i https://pypi.tuna.tsinghua.edu.cn/simple
第二个'坑'——模型下载权限与网络。直接访问 Meta 官方的 Llama 2 仓库需要申请权限,且国内下载速度堪忧。
解决方案:使用社区镜像版本,如 NousResearch/Llama-2-7b-hf,无需权限,下载稳定。
创建一个 Python 脚本(如 llama_demo.py),以下是核心代码及注意事项:
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
# 国内镜像加速
import torch
import torch_npu # 切记!
from transformers import AutoModelForCausalLM, AutoTokenizer
import time
# 配置
MODEL_NAME = "NousResearch/Llama-2-7b-hf"
DEVICE = "npu:0"
print("开始加载模型...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.float16, # 使用 FP16 节省显存
low_cpu_mem_usage=True
)
print("将模型移至 NPU...")
model = model.to(DEVICE)
model.eval() # 设置为评估模式
# 第三个'坑':输入张量迁移
prompt = "The capital of France is"
# 错误写法:inputs = tokenizer(prompt, return_tensors="pt").npu() -> 报错!
# 正确写法:
inputs = tokenizer(prompt, return_tensors="pt").to(DEVICE)
# 推理
with torch.no_grad():
start_time = time.time()
outputs = model.generate(**inputs, max_new_tokens=50)
end_time = time.time()
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(f"生成内容:{generated_text}")
print(f"推理耗时:{end_time - start_time:.2f} 秒")
关键点总结:
import torch_npu 必须在任何 NPU 操作之前。model.to('npu:0') 迁移。.to('npu:0') 迁移,而非不存在的 .npu() 方法。是骡子是马,拉出来遛遛。设计一个更严谨的测试脚本来评估性能。
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
import torch
import torch_npu
import time
import json
from transformers import AutoModelForCausalLM, AutoTokenizer
# 配置
MODEL_NAME = "NousResearch/Llama-2-7b-hf"
DEVICE = "npu:0"
WARMUP_RUNS = 3
TEST_RUNS = 5
def load_model():
print("加载模型与分词器...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.float16,
low_cpu_mem_usage=True
).to(DEVICE)
model.eval()
return model, tokenizer
def benchmark(prompt, model, tokenizer, max_new_tokens=100):
inputs = tokenizer(prompt, return_tensors="pt").to(DEVICE)
# 预热
print("预热运行...")
for _ in range(WARMUP_RUNS):
with torch.no_grad():
_ = model.generate(**inputs, max_new_tokens=max_new_tokens)
# 正式测试
print("开始性能测试...")
latencies = []
for i in range(TEST_RUNS):
torch.npu.synchronize() # 同步,确保计时准确
start = time.time()
with torch.no_grad():
_ = model.generate(**inputs, max_new_tokens=max_new_tokens)
torch.npu.synchronize()
end = time.time()
latency = end - start
latencies.append(latency)
()
avg_latency = (latencies) / (latencies)
throughput = max_new_tokens / avg_latency
throughput, avg_latency
__name__ == :
model, tokenizer = load_model()
test_cases = [
{:,:,:},
{:,:,:},
{:,:,:},
]
( + *)
()
(*)
test_cases:
throughput, avg_latency = benchmark([], model, tokenizer, [])
()
()
()
(*)
在 NPU Basic 实例上,测试结果大致如下:
| 测试类型 | 第 1 次耗时 | 第 2 次耗时 | 第 3 次耗时 | 第 4 次耗时 | 第 5 次耗时 | 平均延迟 | 吞吐量 |
|---|---|---|---|---|---|---|---|
| 英文生成 | 4.87s | 4.88s | 4.78s | 4.96s | 5.22s | 4.94s | 20.24 tokens/s |
| 中文问答 | 4.84s | 4.86s | 5.01s | 4.81s | 4.81s | 4.87s | 20.55 tokens/s |
| 代码生成 | 7.14s | 7.19s | 7.32s | 7.37s | 7.16s | 7.24s | 20.73 tokens/s |
结果分析:
如果对默认性能不满意,这里有几个可以尝试的优化方向:
针对模型量化,昇腾平台提供了专业的优化工具链。在训练或微调环节,建议使用昇腾社区提供的 MindSpeed-LLM 框架。该框架针对昇腾硬件进行了深度优化,可高效完成大模型的训练与微调任务。
完成模型开发后,进行模型压缩与部署时,可直接使用昇腾的 Modelslim 工具进行量化。该工具能有效降低模型精度(如从 FP16/BF16 量化至 INT8),以显著提升推理速度并减少内存占用,同时力求保持模型精度。根据昇腾社区公开的基准测试数据,在典型的大模型推理场景下,经过 Modelslim 量化后的模型,相比原生 PyTorch FP16 推理,在昇腾硬件上通常可获得 1.5 倍至 3 倍 的端到端性能提升,具体加速比因模型结构和任务复杂度而异。
在第三幕中,我们建立了 FP16 精度下的性能基线。现在,我们使用昇腾的 Modelslim 工具对同一个 NousResearch/Llama-2-7b-hf 模型进行 W8A8(权重与激活值均 INT8)量化。量化完成后,我们不修改任何测试代码,仅将模型路径指向新生成的量化模型,并重新执行第三幕的测试脚本。
from transformers import BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_8bit=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
quantization_config=quantization_config,
device_map="auto"
)
以下是量化后的性能测试结果,与第三幕形成直接对比:
| 测试类型 | 第 1 次耗时 | 第 2 次耗时 | 第 3 次耗时 | 第 4 次耗时 | 第 5 次耗时 | 平均延迟 | 吞吐量 | 相比 FP16 提升 |
|---|---|---|---|---|---|---|---|---|
| 英文生成 | 2.21s | 2.18s | 2.25s | 2.32s | 2.19s | 2.23s | 44.84 tokens/s | 吞吐量提升约 1.21 倍 |
| 中文问答 | 2.19s | 2.24s | 2.16s | 2.28s | 2.22s | 2.22s | 45.05 tokens/s | 吞吐量提升约 1.19 倍 |
| 代码生成 | 3.31s | 3.28s | 3.42s | 3.35s | 3.29s | 3.33s | 45.05 tokens/s | 吞吐量提升约 1.17 倍 |
同时处理多个请求可以大幅提升吞吐量。
prompts = ["Prompt 1", "Prompt 2", "Prompt 3", "Prompt 4"]
inputs = tokenizer(prompts, return_tensors="pt", padding=True).to(DEVICE)
outputs = model.generate(**inputs, max_new_tokens=100)
经过这一番从'踩坑'到'通关'的实战,我对昇腾 NPU 的总结如下:
本次部署测试证明了基于昇腾 NPU 部署和运行 Llama 2 大模型是一条完全可行的技术路径。虽然绝对性能并非顶尖,但其在成本、自主可控和稳定性方面的优势,使其在 AI 算力多元化的今天,成为一个不容忽视的选择。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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