deepseek适配昇腾开源验证任务心得

举报
p_xcn 发表于 2024/12/13 17:56:33 2024/12/13
【摘要】 deepseek是一个高性能的混合专家(MoE)语言模型,能够生成高质量的文本内容,解决自然语言处理任务。它在文本生成、对话系统、情感分析和机器翻译等应用场景中表现出色,显著提升处理效率和生成质量。本文将介绍在华为的Ascend NPU上配置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内容:基于torchtorch_nputransformer框架,使用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的问题。通过自定义函数替代原生方法,避免了性能损耗,同时实现了生成文本的后处理以提高输出质量。最终,代码优化显著提升了系统的稳定性和效率。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。