deepseek适配昇腾开源验证任务心得
一、背景介绍
deepseek是一个高性能的混合专家(MoE)语言模型,能够生成高质量的文本内容,解决自然语言处理任务。它在文本生成、对话系统、情感分析和机器翻译等应用场景中表现出色,显著提升处理效率和生成质量。本文将介绍在华为的Ascend NPU上配置deepseek项目的过程中遇到的问题和解决方案,以及心得总结。
二、资源清单
Ascend NPU:
产品名称 |
芯片类型 |
CANN版本 |
驱动版本 |
操作系统 |
堡垒机 |
昇腾910B3 |
CANN 7.0.1.5 |
23.0.6 |
Huawei Cloud EulerOS 2.0 |
三、遇到的问题和解决方案
具体步骤详见:https://blog.csdn.net/qq_54958500/article/details/144064251?spm=1001.2014.3001.5501
1.问题:原项目没有提供所需环境文档,无法预先配置好所需环境依赖。
解决方法:根据所需实现的DEMO涉及到的内容和报错信息总结尝试。
2.问题:由于国内网络限制,无法直接访问 Hugging Face 下载模型。
解决方法:通过设置环境变量 HF_ENDPOINT 指向 Hugging Face 的国内镜像地址,确保模型可以顺利下载。
3.问题:模型较大,需要预留至少 40G 的空间用于下载和加载模型。
解决方法:确保有足够的磁盘空间,并合理配置 max_memory 参数,避免内存不足导致的问题。
4.问题:Ascend NPU尚未实现对torch.isin 算子的适配,会回退到 CPU 执行,影响性能。
解决方法:自定义算法实现替代功能,并验证两种方法的输出是否一致。
def new_isin(elements, test_elements, *, assume_unique=False, invert=False, out=None):
# 检查输入类型
if not isinstance(elements, torch.Tensor) or not isinstance(test_elements, torch.Tensor):
raise TypeError("Both elements and test_elements must be torch tensors.")
# 确保输入张量在 NPU 上
elements = elements.to(”npu“)
test_elements = test_elements.to(”npu“)
# 如果 assume_unique 为 True,确保 test_elements 是唯一的
if assume_unique:
test_elements = test_elements.unique()
# 扁平化 test_elements 并展开为一维张量
flat_test_elements = test_elements.flatten()
# 使用广播机制逐元素检查
result = (elements.unsqueeze(-1) == flat_test_elements).any(dim=-1)
# 根据 invert 参数反转结果
if invert:
result = ~result
# 如果指定了 out 参数,赋值给 out
if out is not None:
if out.shape != result.shape:
raise ValueError("Output tensor must have the same shape as the result.")
out.copy_(result)
return out
return result
def verify_isin():
num = random.randint(1, 5)
tensor1 = torch.randint(low=0, high=10, size=(num,num))
tensor2 = torch.randint(low=0, high=10, size=(num,num))
old_isin_out = torch.isin(tensor1, tensor2).to(”cpu“)
new_isin_out = new_isin(tensor1, tensor2)
print("torch.isin output:",old_isin_out)
print("new_isin output:",new_isin_out)
are_equal = torch.equal(old_isin_out, new_isin_out)
print(f"outputs is equal? {are_equal}")
return are_equal
if isin_are_equal:
print("torch.isin replaced")
print(f"old isin:{torch.isin = }")
torch.isin = new_isin
print(f"new isin:{torch.isin = }")
else:
print("new_isin cannot replace torch.isin")
sys.exit()
这里需要注意:new_isin的张量是必须放在NPU上的,否则没有意义。torch.isin的输出结果也需要移动到NPU上,才能进行对比。
5.问题:生成的文本只到最大长度,不考虑完整性直接截断了。
解决方法:对生成的文本做个后处理。
def clean_output(output):
# 查找最后一个句号或感叹号的位置
last_punctuation = max(output.rfind('.'), output.rfind('!'))
# 如果找到了标点符号,截断文本
if last_punctuation != -1:
return output[:last_punctuation + 1]
else:
return output
四、验证结果
- DEMO内容:基于torch、torch_npu和transformer框架,使用deepseek-V2预训练模型,实现文本补全功能。
输入文本:"An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is"
在NPU:0上运行代码:
五、心得总结
在项目中,我们成功搭建了基于昇腾NPU的文本生成环境,通过设置国内镜像地址,克服了Hugging Face模型下载的地域限制,解决了模型下载和torch.isin不支持NPU的问题。通过自定义函数替代原生方法,避免了性能损耗,同时实现了生成文本的后处理以提高输出质量。最终,代码优化显著提升了系统的稳定性和效率。
- 点赞
- 收藏
- 关注作者
评论(0)