在昇腾 NPU 上部署 Llama 大模型实战指南
本文分享了在昇腾 NPU 上部署测试 Llama-2-7B 大模型的全过程,提供踩坑经验。由于硬件成本考量,选择昇腾 NPU 进行自主可控的达芬奇架构测试。
一、选择昇腾 NPU 的原因
- 自主可控:昇腾采用华为自研达芬奇架构,供应链安全性高。
- 生态适配:支持 PyTorch、TensorFlow,拥有 MindSpeed-LLM 等框架。
- 云资源测试:可通过云端 Notebook 实例按小时租用或申请免费资源进行测试。
二、环境准备
1. 创建 Notebook 实例
进入云端开发环境控制台,关键配置如下:
- 计算类型:必选 NPU,避免误选 CPU 或 GPU。
- 规格:推荐 1*NPU 800T A2、32v CPU、64GB 内存。
- 镜像:选择预装 PyTorch 2.1.0、CANN 8.0 的镜像(如 euler2.9-py38-torch2.1.0-cann8.0-openmind0.6-notebook)。
- 存储:50G 足够存放约 13GB 的模型文件。
2. 环境验证
进入终端后,执行以下命令检查版本及 NPU 可用性:
cat /etc/os-release
python3 --version
python -c "import torch; print(f'PyTorch 版本:{torch.__version__}')"
python -c "import torch_npu; print(f'torch_npu 版本:{torch_npu.__version__}')"
注意:验证 NPU 可用时必须先导入 torch_npu 插件。
import torch
import torch_npu
print(torch.npu.is_available())
三、安装依赖
安装 transformers 和 accelerate 库,建议使用国内镜像加速:
pip install transformers accelerate -i https://pypi.tuna.tsinghua.edu.cn/simple
四、部署 Llama 模型
1. 模型下载
官方仓库需权限且访问不稳定,建议使用开源镜像版本 NousResearch/Llama-2-7b-hf。
设置环境变量加速下载:
export HF_ENDPOINT=https://hf-mirror.com
2. 核心代码示例
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,
low_cpu_mem_usage=True
).to(DEVICE)
model.eval()
prompt = "The capital of France is"
inputs = tokenizer(prompt, return_tensors="pt").to(DEVICE)
start = time.time()
outputs = model.generate(**inputs, max_new_tokens=50)
end = time.time()
text = tokenizer.decode(outputs[0])
print(f"生成文本:{text}")
print(f"吞吐量:{50/(end-start):.2f} tokens/s")
注意:输入张量转移设备应使用 .to('npu:0'),而非 .npu()。
五、性能测试与优化
1. 完整测试脚本
包含预热、同步计时及多场景测试(英文生成、中文对话、代码生成)。
import torch
import torch_npu
import time
import json
from datetime import datetime
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL_NAME = "NousResearch/Llama-2-7b-hf"
DEVICE = "npu:0"
WARMUP_RUNS = 3
TEST_RUNS = 10
def load_model_and_tokenizer(model_name):
print(f"正在加载模型 {model_name}...")
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()
print(f"显存占用:{torch.npu.memory_allocated()/1e9:.2f}GB")
return model, tokenizer
def benchmark(prompt, tokenizer, model, max_new_tokens=100):
inputs = tokenizer(prompt, return_tensors="pt").to(DEVICE)
for _ in range(WARMUP_RUNS):
with torch.no_grad():
_ = model.generate(**inputs, max_new_tokens=max_new_tokens, do_sample=False, pad_token_id=tokenizer.eos_token_id)
latencies = []
for i in range(TEST_RUNS):
torch.npu.synchronize()
start_time = time.time()
with torch.no_grad():
outputs = model.generate(**inputs, max_new_tokens=max_new_tokens, do_sample=False, pad_token_id=tokenizer.eos_token_id)
torch.npu.synchronize()
end_time = time.time()
latency = end_time - start_time
latencies.append(latency)
avg_latency = (latencies) / (latencies)
throughput = max_new_tokens / avg_latency
{
: prompt,
: (avg_latency, ),
: (throughput, ),
: (torch.npu.memory_allocated()/, )
}
__name__ == :
model, tokenizer = load_model_and_tokenizer(MODEL_NAME)
test_cases = [
{: , : , : },
{: , : , : },
{: , : , : }
]
results = []
test_cases:
result = benchmark([], tokenizer, model, [])
result[] = []
results.append(result)
()
2. 测试结果
实测吞吐量约为 16-17 tokens/s,性能稳定。
3. 优化建议
- MindSpeed-LLM 框架:昇腾官方框架,针对 NPU 深度优化。
- INT8 量化:减少显存占用并提升速度。
- 批处理推理:增加 batch size 可显著提升吞吐量。
六、常见问题总结
- torch.npu 找不到:必须显式
import torch_npu。
- tokenizer.npu() 不存在:使用
.to('npu:0') 转移数据。
- 模型下载权限:使用开源镜像版本代替官方仓库。
- 网络超时:设置
HF_ENDPOINT 或使用 ModelScope 镜像。
七、总结
昇腾 NPU 适合对供应链自主可控有要求的政企项目或预算有限的团队。云上测试成本低,流程相对成熟,但需注意环境配置细节。性能虽略低于顶级 NVIDIA GPU,但在特定场景下性价比突出。