前言
随着大语言模型在各类场景的落地加速,算力平台适配性已成为模型规模化应用的核心瓶颈之一。昇腾 NPU 作为国产算力的核心载体,其对主流大模型的支持能力,直接影响国产化 AI 基础设施的落地效率。
本报告聚焦 Llama-2-7B 在昇腾 910B(Atlas 800T A2 训练卡)NPU 平台的部署与性能,从环境配置、模型加载到多场景推理全流程展开实测:提供可复用的昇腾 NPU 环境配置方案,解决开发者在框架适配、模型加载中的实际问题;并通过真实数据验证昇腾 NPU 的算力表现。
一、环境配置
1.1 测试目的
验证 Llama-2-7B 大模型在昇腾 NPU(910B)算力平台的环境适配性、部署效率及多场景性能表现,为国产算力平台的大模型落地提供可复用的环境配置方案与真实数据参考。
1.2 测试范围
- 昇腾 NPU 环境预配置与依赖兼容性验证
- Llama-2-7B 模型的 NPU 加载流程与资源占用
- 多场景推理性能(中文问答、代码生成等)
- 批量并发场景下的算力利用率
1.3 启动 Notebook
选择支持昇腾 NPU 的 Notebook 环境并启动。
二、测试环境详情
2.1 环境兼容性检查
先确认环境能不能用,常用的检查命令如下:
# 看系统版本
cat /etc/os-release
# 看 Python 版本
python3 --version
# 看 PyTorch 版本
python -c "import torch; print(f'PyTorch 版本:{torch.__version__}')"
# 看昇腾 PyTorch 插件版本
python -c "import torch_npu; print(f'torch_npu 版本:{torch_npu.__version__}')"
国内下载依赖慢是老问题了,直接用清华源:
pip install transformers accelerate -i https://pypi.tuna.tsinghua.edu.cn/simple
三、Llama 模型部署实操
3.1 快速跑通测试代码
先给个能直接跑的极简版代码,帮大家快速验证模型能不能在昇腾上跑起来:
import torch
import torch_npu
from transformers import AutoModelForCausalLM, AutoTokenizer
import time
print("开始测试昇腾 NPU 部署 Llama-2-7B...")
MODEL_NAME = "NousResearch/Llama-2-7b-hf"
print(f"正在加载模型:{MODEL_NAME}")
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
# 加载模型(用 FP16 省显存)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.float16,
low_cpu_mem_usage=True # 减少 CPU 内存占用
)
# 把模型移到昇腾 NPU 上
print("将模型加载到昇腾 NPU...")
model = model.npu()
model.eval()
print(f"当前显存占用:{torch.npu.memory_allocated() / 1e9:.2f} GB")
# 简单跑个测试
prompt = "法国的首都是"
inputs = tokenizer(prompt, return_tensors="pt")
# 这里要注意:逐个张量移到 NPU,避免批量转移报错
inputs = {k: v.npu() for k, v in inputs.items()}
start = time.time()
outputs = model.generate(inputs, max_new_tokens=50)
end = time.time()
print(f"\n生成结果:{tokenizer.decode(outputs[0])}")
print(f"生成耗时:{(end-start)*1000:.2f} ms")
print(f"生成速度:{50/(end-start):.2f} tokens/秒")
四、综合测评脚本
如果想做更全面的性能测试,以下脚本涵盖环境检测、模型加载、多场景推理,大家改改路径就能用:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""昇腾 NPU 部署 Llama-2-7B 的综合测评脚本"""
import time
import mindspore as ms
from mindspore import context
from mindformers import LlamaForCausalLM, LlamaTokenizer, GenerationConfig
# 这里改自己的模型路径就行
MODEL_PATH = "/path/to/你的 llama-7b 权重"
TOKENIZER_PATH = "/path/to/你的 llama 分词器"
DEVICE_ID = 0 # 昇腾 NPU 设备 ID
# 测试场景覆盖日常常用的类型
TEST_PROMPTS = [
"请介绍人工智能的发展历程",
"计算 1+2+3+...+100 的结果",
"用 Python 写一个快速排序的函数"
]
# 生成配置(max_new_tokens 别太大,省显存)
GEN_CONFIG = {"max_new_tokens": 200, "top_k": 50, "temperature": 0.7}
def main():
# 1. 配置昇腾环境
context.set_context(mode=context.GRAPH_MODE, device_target="Ascend", device_id=DEVICE_ID)
# 2. 加载模型和分词器(记个时,看加载速度)
start_load = time.time()
tokenizer = LlamaTokenizer.from_pretrained(TOKENIZER_PATH)
model = LlamaForCausalLM.from_pretrained(MODEL_PATH, dtype=ms.float16)
model.set_train(False)
model.set_generate_config(GenerationConfig(**GEN_CONFIG))
print(f"模型加载完成!耗时:{time.time() - start_load:.2f} 秒")
# 3. 先预热几轮(首次推理慢是正常的,预热后速度会上来)
print("开始预热(消除首次编译开销)...")
for i in range(5):
tokenizer(TEST_PROMPTS[i % 3], return_tensors="ms")
print("预热完成!开始正式测试")
# 4. 多场景测试(每个场景跑 5 次,取平均)
total_tokens = 0
total_time = 0.0
for prompt in TEST_PROMPTS * 5:
inputs = tokenizer(prompt, return_tensors="ms")
start_infer = time.time()
outputs = model.generate(**inputs)
infer_time = time.time() - start_infer
# 统计生成的 token 数
gen_token_num = len(tokenizer.encode(tokenizer.decode(outputs[0]))) - len(inputs.input_ids[0])
total_tokens += gen_token_num
total_time += infer_time
print(f"\n测试完成!平均生成速度:{total_tokens / total_time:.2f} tokens/秒")
if __name__ == "__main__":
main()
五、常见问题与解决方案
这部分是实际运行中遇到的问题及解决方案:
5.1 环境配置类问题
| 遇到的问题 | 当时的现象 | 解决方案 |
|---|---|---|
| 框架调用不了 NPU | MindSpore/PyTorch 提示'找不到设备' | 1. 查 CANN 版本和框架版本是否匹配;2. 配 ASCEND_DEVICE_ID、LD_LIBRARY_PATH 这两个环境变量;3. 重装对应版本的 torch_npu/mindspore |
| 国内下载依赖超时/冲突 | pip 下载一半断了,或者装完提示版本不兼容 | 1. 全程用清华镜像源;2. 严格按 transformers==4.46.3、mindformers==1.9.0 这些版本装;3. 优先选稳定版别选最新版 |
5.2 模型加载类问题
| 遇到的问题 | 当时的现象 | 解决方案 |
|---|---|---|
| 模型权重下载慢/中断 | 下了半小时才 10%,或者直接报错断开 | 1. 改用 ModelScope、Hugging Face 国内镜像;2. 先在本地下好权重,再用路径加载;3. 大文件分块下 |
| 内存/显存不够用 | CPU 提示 OOM,或者 NPU 显存爆了 | 1. 加 low_cpu_mem_usage=True 参数;2. 用 FP16 精度;3. 把其他占资源的进程关了;4. 开 GQA 优化 |
| 分词器提示'pad_token 没设置' | 加载模型时直接报错 | 1. 手动指定 pad_token=eos_token;2. 重新下完整的分词器文件 |
5.3 推理运行类问题
| 遇到的问题 | 当时的现象 | 解决方案 |
|---|---|---|
| 首次推理特别慢 | 第一个请求等了 1 分钟才出结果 | 1. 服务启动时先跑 5 轮预热;2. 提前编译模型的计算图 |
| 张量转移失败 | 提示'无法将张量移到 NPU' | 1. 别批量转移张量,一个一个移;2. 检查输入格式对不对 |
| 连续跑几轮后进程崩了 | 跑 10 轮后显存一直涨,最后直接崩溃 | 1. 定期清 NPU 显存缓存;2. 限制单进程跑的轮次,别一直跑;3. 监控显存,超了就重启 |
六、总结
本次报告将 Llama-2-7B 在昇腾 910B(Atlas 800T A2 训练卡)上从环境到推理的全流程拆成了实操步骤,分享了常见问题的解决办法。昇腾 NPU 跑 Llama-2-7B 已经比较成熟,按此指南基本能稳定跑起来。

