本文档记录 Marmeladov/sentiment_classification(基于 Qwen-1_8B + SWIFT LoRA)在昇腾 Ascend NPU 上的适配与验证。
qwen/Qwen-1_8B(1.8B 参数)| 组件 | 版本 |
|---|---|
| 硬件 | Ascend910_9362 |
| PyTorch | 2.5.1 |
| torch_npu | 对应 PyTorch 2.5.1 |
| Transformers | 4.57.6 |
| SWIFT (ms-swift) | 最新 |
| Python | 3.x |
该模型为 LoRA 适配器,需加载基座模型后合并使用:
import torch
import torch_npu
torch_npu.npu.set_device(0)
from transformers import AutoTokenizer, AutoModelForCausalLM
BASE = "qwen/Qwen-1_8B"
ADAPTER = "Marmeladov/sentiment_classification"
tokenizer = AutoTokenizer.from_pretrained(BASE, trust_remote_code=True)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained(BASE, torch_dtype=torch.bfloat16, trust_remote_code=True)
from swift.tuners import Swift
model = Swift.from_pretrained(model, ADAPTER)
model = model.npu().eval()
texts = ["这件衣服挺好看", "这个产品质量很差,完全不值这个价钱"]
for text in texts:
inputs = tokenizer(text, return_tensors="pt")
inputs = {k: v.npu() for k, v in inputs.items()}
with torch.no_grad():
outputs = model.generate(**inputs, max_new_tokens=10, do_sample=False,
use_cache=False, pad_token_id=tokenizer.pad_token_id)
response = tokenizer.decode(outputs[0][inputs['input_ids'].shape[1]:], skip_special_tokens=True)
print(f"Input: {text}")
print(f"Output: {response}")python3 inference.py预期输出:模型对正面输入(如"这件衣服挺好看")生成正面评论延续,对负面输入(如"你去死吧")生成负面或拒绝回应。
测试条件:max_new_tokens=10, do_sample=False, use_cache=False
| 指标 | 数值 |
|---|---|
| 平均推理时间 | 0.283 s |
| 平均吞吐量 | 35.38 tok/s |
| 加速比(CPU vs NPU) | ~49x |
use_cache=False 以兼容新缓存系统与 Qwen 模型的交互torch_npu.npu.set_device(0))NPU vs CPU 精度对比(CPU 为基线,NPU 为验证目标):
| 指标 | 数值 |
|---|---|
| 测试用例数 | 5 |
| 最大输出差异 % | 200.00 |
| 预测一致性 | 2/5 (40.0%) |
| 精度要求 | NPU vs CPU 输出差异 < 1.0% |
| 精度结论 | ⚠️ 部分通过 (最大差异 200.00% > 1.0% 阈值) |
精度评测源代码和日志详见 eval/ 目录。