大模型国产化适配2-基于昇腾910使用ChatGLM-6B进行模型推理

本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!

随着 ChatGPT 的现象级走红,引领了AI大模型时代的变革,从而导致 AI 算力日益紧缺。与此同时,中美贸易战以及美国对华进行AI芯片相关的制裁导致 AI 算力的国产化适配势在必行。之前对华为昇腾AI软硬件平台进行过相应的介绍,本文将讲述针对ChatGLM-6B大模型在昇腾910加速卡上面进行模型推理,具体代码放置在GitHub:llm-action

ChatGLM-6B 简介

ChatGLM-6B 是一个由清华开源的中英双语对话大语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。

ChatGLM-6B 一经面世便受到了国内外的广泛关注;与此同时,在同等参数规模的大模型中,中文效果优异,在各种榜单中名列前茅。相对于其他中文领域大模型,在国内,基于 ChatGLM-6B 的生态最活跃。因此,本文选择它在昇腾910上面进行适配。

环境搭建

  • 操作系统版本/架构:EulerOS release 2.0 (SP8)/aarch64
  • NPU:8卡 910 ProB 32G
  • Python:3.7
  • NPU 驱动:23.0.rc1,下载
  • NPU 固件:6.3.0.1.241,下载
  • CANN 工具包:6.3.RC1.alpha003,下载
  • MindSpore:2.0.0-rc1,下载
  • MindFormers:dev ( commit id: 6f2b0b8 )

首先,下载CANN工具包。CANN 软件按照功能主要分为Toolkit(开发套件)、NNAE(深度学习引擎)、NNRT(离线推理引擎)几种软件包,各软件包支持功能范围如下:

  • Toolkit:支持训练和推理业务、模型转换、算子/应用/模型开发和编译。
  • NNAE:支持训练和推理业务。
  • NNRT:仅支持离线推理。

image.png

然后,选择产品系列、产品型号、CANN版本、CPU架构等选择对应的驱动和固件进行下载。

image.png

用户需完成硬件、OS、昇腾NPU驱动固件、CANN软件(Toolkit(开发套件)),深度学习框架(PyTorch、MindSpore等)的安装,同时,还需要升级 GCC 以及安装 Cmake。

image.png

NPU驱动固件、CANN软件、升级GCC等就不一一详细讲述了,具体可参考放置在GitHub(llm-action)的文档,这里直接从创建虚拟环境以及安装深度学习框架开始讲述。

这里为了原始的环境避免干扰,创建一个新的虚拟环境:

conda create -n chatglm_py37 python=3.7 -y
conda activate chatglm_py37
python -m pip install -U pip

安装科学计算库(sympy)、通信库(hccl)、TBE算子开发依赖的底层库(te)等。

# 如果升级了昇腾AI处理器配套软件包,配套的whl包也需要重新安装,先将原来的安装包卸载,再重新安装。
# pip uninstall te topi hccl -y

pip install sympy -i https://pypi.tuna.tsinghua.edu.cn/simple  --trusted-host pypi.tuna.tsinghua.edu.cn 
pip install /usr/local/Ascend/ascend-toolkit/latest/lib64/te-*-py3-none-any.whl -i https://pypi.tuna.tsinghua.edu.cn/simple  --trusted-host pypi.tuna.tsinghua.edu.cn 
pip install /usr/local/Ascend/ascend-toolkit/latest/lib64/hccl-*-py3-none-any.whl -i https://pypi.tuna.tsinghua.edu.cn/simple  --trusted-host pypi.tuna.tsinghua.edu.cn 

然后,安装 mindspore,用于模型训练及推理,如下图所示选择对应的版本安装即可,由于本文使用的2.0.0-rc1,需点击右上角链接进行下载。

image.png

# conda install mindspore=2.0.0 -c mindspore -c conda-forge
wget -c https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.0.0rc1/MindSpore/unified/aarch64/mindspore-2.0.0rc1-cp37-cp37m-linux_aarch64.whl
pip install ./mindspore-2.0.0rc1-cp37-cp37m-linux_aarch64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple  --trusted-host pypi.tuna.tsinghua.edu.cn

下面,安装requests用于从云端下载模型权重。

pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple  --trusted-host pypi.tuna.tsinghua.edu.cn

接下来,安装torch和transformers库,用于模型格式转换。

pip install torch transformers -i https://pypi.tuna.tsinghua.edu.cn/simple  --trusted-host pypi.tuna.tsinghua.edu.cn

下面,安装mindformers。

git clone https://gitee.com/mindspore/mindformers.git
cd mindformers/
git checkout 6f2b0b8
# python setup.py develop
python setup.py install

然后,安装chatglm依赖包。

pip install numpy sentencepiece ftfy regex tqdm \
pyyaml rouge_chinese nltk jieba datasets gradio==3.23.0 pandas openpyxl et-xmlfile mdtex2html \
 -i https://pypi.tuna.tsinghua.edu.cn/simple  --trusted-host pypi.tuna.tsinghua.edu.cn

最后,下载mindpet,并设置环境变量。

git clone https://gitee.com/mindspore-lab/mindpet.git


# 建议配置在~/.bashrc中
export PYTHONPATH=/root/workspace/code/mindpet/:$PYTHONPATH

模型准备及模型格式转换

从huggingface下载chatglm-6b模型权重文件:

git lfs clone https://huggingface.co/THUDM/chatglm-6b
# git lfs pull
# git pull
git checkout a70fe6b

由于下载下来的模型格式为huggingface transformers(pytorch)文件格式,因此,我们需要将其转换为mindspore格式。具体模型格式转换命令(pt2ms.py)如下所示:

export LD_PRELOAD=/usr/local/python3.7.5/lib/python3.7/site-packages/torch/lib/libgomp-d22c30c5.so.1
python pt2ms.py --src_checkpoint_dir /root/workspace/model/chatglm-6b --dst_checkpoint_file ms_glm_6b.ckpt

如果不想进行模型转换,也可以通过mindformers库提供的API,自动从华为提供的模型仓库下载mindspore格式的chatglm模型,如下所示。

from mindformers import AutoModel, AutoTokenizer, TextGenerationPipeline
model = AutoModel.from_pretrained("glm_6b_chat")

它会下载到当前目录的checkpoint_download/glm子目录下面。

2023-07-11 19:38:03,662 - mindformers - INFO - Start download ./checkpoint_download/glm/glm_6b_chat.ckpt
Downloading:  44%|███████████████████▋                         | 5.87G/13.4G [03:01<03:54, 32.2MB/s]
2023-07-11 19:44:54,206 - mindformers - INFO - Download completed!,times: 410.87s

模型以及环境准备好之后,接下来就可以进行模型推理了。

模型推理

目前,可以通过如下三种方式进行模型推理。

AutoClass推理

使用AutoClass接口,通过模型名称获取相应的模型/Tokenizer实例,并自动下载和加载权重。其中,from_pretrained() 接口会自动从云上下载预训练模型和分词模型。

首次运行Pipeline进行推理时,会进行模型编译,需等待一段时间(目测针对ChatGLM-6b需要几分钟)。

from mindformers import AutoModel, AutoTokenizer, TextGenerationPipeline
model = AutoModel.from_pretrained("glm_6b_chat")
tokenizer = AutoTokenizer.from_pretrained("glm_6b")
pipeline = TextGenerationPipeline(model, tokenizer, max_length=2048)


pipeline("推荐5本金庸写的小说:", top_p=0.7)
# [{'text_generation_text': ['推荐5本金庸写的小说: 金庸是中国著名的武侠小说作家,他的作品被广泛传播并深受读者喜爱。以下是我推荐的五本金庸写的小说:\n\n1. 《天龙八部》:这是金庸最著名的小说之一,讲述了一个关于武林的故事。小说中有众多武功高强的人物,情节曲折,人物形象鲜明。\n\n2. 《笑傲江湖》:这是另一本金庸的经典小说,讲述了一个君子剑岳不群的故事。小说中有众多精彩的情节和人物形象,是读者了解中国武侠小说的经典之一。\n\n3. 《鹿鼎记》:这是金庸的一本轻松幽默的小说,讲述了一个关于江湖的故事。小说中有众多有趣的人物和情节,适合读者放松心情。\n\n4. 《白马啸西风》:这是金庸的一本感人至深的小说,讲述了一个关于亲情的故事。小说中有众多人物形象鲜明,情节曲折,是读者了解中国武侠小说的经典之作。\n\n5. 《侠客行》:这是金庸的一本情节复杂、人物众多的小说,讲述了一个关于江湖的故事。小说中有众多武功高强的人物,情节曲折,人物形象鲜明,是读者了解中国武侠小说的经典之作。']}]

注意:

AutoModel.from_pretrained() 接口当前支持 glm_6b 和 glm_6b_chat 两类模型,前者为通用模型,后者具备推理加速特性,仅用于推理,两者共享权重,在推理场景下建议使用后者,以获得更快的推理体验。

pipeline 推理

当然,也可以不实例化构造模型,直接通过指定任务名与模型名的方式进行pipeline的构造。

在pipeline中,也可以使用 glm_6b_chat 模型加速推理。

from mindformers import pipeline


task_pipeline = pipeline(task='text_generation', model='glm_6b_chat', max_length=2048)
# 2023-06-20 10:35:07,102 - mindformers - INFO - weights in ./checkpoint_download/glm/glm_6b.ckpt are loaded


task_pipeline('请介绍一下马斯克')
# [{'text_generation_text': ['请介绍一下马斯克 伊隆·马斯克(Elon Musk)是一位知名的企业家、工程师和发明家,出生于南非,曾在加拿大和美国接受教育。马斯克目前是特斯拉汽车、SpaceX航天公司、SolarCity太阳能公司、Neuralink神经科技公司和The Boring Company隧道挖掘公司的创始人和CEO。\n\n马斯克的愿景是让人类在2060年前实现太空旅游和移民,并建立可持续的能源系统,使人类能够摆脱对石油和天然气的依赖。他的公司正在开发各种技术,包括超级高铁、太空旅游、太阳能和风能等,以推动这些愿景的发展。\n\n马斯克也积极参与慈善事业,成立了The SpaceX Foundation,致力于推动太空探索和航天技术的研究,并帮助解决全球环境问题。']}]

基于API接口的推理

除此之外,还可以通过底层的API进行模型推理,具体的推理代码(chat_glm.py)如下所示,主要逻辑为:

  • 首先,加载ChatGLM-6B模型以及对应的分词模型。
  • 然后,将Prompt输入进行Tokenizer编码。
  • 之后,将编码结果输入到生成模型,模型根据具体的解码策略输出相应的结果。
  • 最后,将模型输出的结果进行Tokenizer解码。
import time
import mindspore as ms
import numpy as np
from mindformers.models.glm import GLMConfig, GLMChatModel
from mindformers.models.glm.chatglm_6b_tokenizer import ChatGLMTokenizer
from mindformers.models.glm.glm_processor import process_response

config = GLMConfig(
    position_encoding_2d=True,
    use_past=True,
    is_npu_acceleration=True,
)

def chat_glm():
    ms.set_context(mode=ms.GRAPH_MODE, device_target="Ascend", device_id=7)
    model = GLMChatModel(config)
    ms.load_checkpoint("./checkpoint_download/glm/glm_6b.ckpt", model)
    tokenizer = ChatGLMTokenizer('./checkpoint_download/glm/ice_text.model')

    prompts = ["你好", "请介绍一下华为"]
    history = []
    for query in prompts:
        if not history:
            prompt = query
        else:
            prompt = ""
            for i, (old_query, response) in enumerate(history):
                prompt += "[Round {}]\n问:{}\n答:{}\n".format(i, old_query, response)
            prompt += "[Round {}]\n问:{}\n答:".format(len(history), query)
        inputs = tokenizer(prompt)

        start_time = time.time()
        outputs = model.generate(np.expand_dims(np.array(inputs['input_ids']).astype(np.int32), 0),
                                    max_length=config.max_decode_length, do_sample=False, top_p=0.7, top_k=1)
        end_time = time.time()
        print(f'generate speed: {outputs[0].shape[0]/(end_time-start_time):.2f} tokens/s')
        response = tokenizer.decode(outputs)
        response = process_response(response[0])
        history = history + [(query, response)]
        print(response)

if __name__ == "__main__":
    chat_glm()

运行结果:

generate speed: 0.11 tokens/s
你好 你好?!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。
generate speed: 32.14 tokens/s
[Round 0]
问:你好
答:你好 你好?!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。
[Round 1]
问:请介绍一下华为
答: 华为是一家总部位于中国深圳的跨国科技公司,成立于 1987 年,是全球最大的电信设备制造商之一。该公司也生产和销售智能手机、电脑和其他消费电子产品。华为的产品和服务覆盖全球 170 多个国家和地区,拥有数百万的用户。

华为以其高品质的产品和服务赢得了全球客户的信任和好评。公司在全球范围内建立了高效的供应链和运营体系,并通过不断创新和优化技术,提高了产品和服务的质量和效率。

然而,华为也面临着来自一些国家政府的安全问题和政治压力。华为一直坚称自己是独立的、安全的和透明的公司,并采取了一系列措施来确保其产品和服务的安全性和透明度。

通常情况下,使用API接口的推理会比使用pipeline进行推理更快。

结语

本文主要讲述了针对华为昇腾910加速卡进行环境搭建、基于ChatGLM-6B进行模型权重格式转换以及模型推理。接下来,将讲述针对基于ChatGLM-6B进行模型全量微调以及LoRA微调。

如果觉得我的文章能够能够给您带来帮助,期待您的点赞收藏加关注~~

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYX5wlir' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片