云端如何部署测试Qwen1.5-MoE模型

云端如何部署测试Qwen1.5-MoE模型

今天,我们推出Qwen系列的首个MoE模型,Qwen1.5-MoE-A2.7B。它仅拥有27亿个激活参数,但其性能却能与当前最先进的70亿参数模型,如Mistral 7B和Qwen1.5-7B相媲美。相较于包含65亿个Non-Embedding参数的Qwen1.5-7B,Qwen1.5-MoE-A2.7B只有20亿个Non-Embedding参数,约为原模型大小的三分之一。此外,相比Qwen1.5-7B,Qwen1.5-MoE-A2.7B的训练成本降低了75%,推理速度则提升了1.74倍。

最近在用Qwen 7B/14B的模型做项目,看到这个Qwen1.5 MOE,想部署测试看看效果,具体的详细介绍这里不贴了,可以去这个地址看。

qwenlm.github.io/zh/blo

部署的时候也遇到了一些问题,这里同步分享出来。

在 huggingface 上面搜 Qwen1.5-MoE,有三个版本。分别是base版本,chat版本还有一个量化版本。

我第一次的时候尝试了chat版本,emmmm,高估自己了,没想到下载下来的模型权重30多G,没有A800的我,是没跑起来的。

退而求其次,选择了量化版本: Qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4, 模型权重下载后8G。

我都是在云端,linux环境下部署。这里有一个 huggingface 的镜像网站(hf-mirror.com),可以快速下载。

先执行这个命令

export HF_ENDPOINT=https://hf-mirror.com 

在执行下面的py文件。

local_dir 为自己的本地目录文件夹,一会会用

from huggingface_hub import snapshot_download

snapshot_download(repo_id='Qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4',
                  repo_type='model',
                  local_dir='./qwen1.5-moe-int4/',
                  resume_download=True)

量化版本的需要10G的显存能够加载成功,我这里用的是4090, 24G显存。

下面是加载模型,推理的代码

注意 : 修改 /root/qwen1.5-moe-int4 为上面自己的目录,可以相对路径或者绝对路径都行

from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained(
    "/root/qwen1.5-moe-int4",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("/root/qwen1.5-moe-int4")

while 1:
    print("你可以输入了......")
    prompt = input()

    # prompt = "Give me a short introduction to large language model."
    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": prompt}
    ]
    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

    generated_ids = model.generate(
        model_inputs.input_ids,
        max_new_tokens=512
    )
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]

    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

    print(messages)
    print(response)

这里有几个问题。

1、需要安装 transformers 库,但是直接用pip安装不行,需要从源码编译。

git clone https://github.com/huggingface/transformers
cd transformers
pip install -e .

不用git也行,自己下载源码压缩包,上传到服务器。

2、会有类似的报错:ModuleNotFoundError: No module named 'optimum'

重新安装optimum。

pip install optimum

如果重新安装optimum后,transformers 库的版本改了,重新安装 transformers

3、还可能会报这个错误❎: importlib.metadata.PackageNotFoundError: No package metadata was found for auto-gptq

重新安装 auto-gptq

pip install auto-gptq

然后运行上面的推理代码,就等待加载模型,测试。

我让它生成一段歌词。

基于 通义千问的能力,生成一段歌词

(诗歌标题:穿越星辰的旅程)

在无尽的宇宙中,我启航,
穿过星际的迷雾,寻找答案。
带着梦想和希望,我前行,
在黑暗中寻找,那一丝光芒。

像流星划破夜空,我燃烧自己,
只为照亮前行的路,让梦想成真。
每一个挑战,都是磨砺,
每一次挫折,都是成长的见证。

我们的征途,是星辰大海,
不怕风雨,不畏艰难险阻。
因为心中有梦,有信念,
我们勇往直前,无所畏惧。

穿越星辰的旅程,漫长又孤独,
但我知道,那才是真正的自由。
我会坚持到底,直到终点,
在这无尽的宇宙中,留下我的足迹。

星光照亮前方,指引我方向,
我将用生命,书写传奇。
穿越星辰的旅程,永不言败,
向着未来,坚定前行。

这个量化版本速度上面是肉眼可见的慢,生成上面的这些长文本,1-3分钟不等,当然这是直接加载模型做的推理,没有其他加速方式。

MOE这种方式真的行吗?后面深入了解下。

我是大林,算法工程师,从事自然语言处理(NLP)、知识图谱、大模型的实际业务落地。dalinvip2023,备注【知乎 大模型】,一起交流。

发布于 2024-03-29 17:17・IP 属地北京