Qwen1.5-MoE开源!魔搭社区推理训练最佳实践教程来啦!

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 通义千问团队推出Qwen系列的首个MoE模型,Qwen1.5-MoE-A2.7B。

引言

通义千问团队推出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倍。

模型结构

Qwen1.5-MoE模型采用了特别设计的MoE架构。通常情况下,如Mixtral等方法所示,每个transformer block中的MoE层会配备8个expert,并采用top-2门控策略进行routing。这种配置还存在很大的优化空间。Qwen1.5-MoE的架构进行了多项改进:

  • Finegrained experts
  • 初始化
  • 新的routing机制

DeepSeek-MoE和DBRX已经证明了finegrained experts的有效性。从FFN层过渡到MoE层时,一般只是简单地复制多次FFN来实现多个expert。而finegrained experts的目标是在不增加参数数量的前提下生成更多expert。为了实现这一点,Qwen1.5-MoE模型将单个FFN分割成几个部分,每个部分作为一个独立的expert。通义千问团队设计了具有总共64个expert的的MoE,对比其他配置,通义千问团队认为这个实现能达到效果和效率的最优。

模型初始化阶段至关重要。初步实验表明,从零开始训练MoE模型可能效率低下,且难以提升至预期的最优性能水平。因此,通义千问团队首先利用已有的Qwen-1.8B,将其改造为Qwen1.5-MoE-A2.7B。此外,在初始化阶段引入随机性可以显著加快收敛速度,并在整个预训练过程中带来更好的整体性能表现。

目前,一个明显的趋势是在MoE中实现共享expert与routing expert。从更宏观的角度看,这是一种广义的routing方法,因为在没有共享expert的情况下,实际上就退化为传统的MoE路由设置。对于Qwen1.5-MoE-A2.7B模型,通义千问团队在其中整合了4个总是被激活的共享expert和每次只激活其中4个的60个routing expert。这种方式非常灵活,同时在实验中表现最佳。

性能

为了全面评估和展示Qwen1.5-MoE-A2.7B的能力和优势,对base模型和chat模型进行了评估。对于base模型,在MMLU、GSM8K和HumanEval评估了其语言理解、数学和代码能力。此外,为了评估其多语言能力,按照Qwen1.5的评测方法在数学、理解、考试和翻译等多个领域的多语言基准测试中进行了测试,并在"Multilingual"列中给出了综合得分。对于chat模型,没有使用传统的基准测试,而是使用MT-Bench进行了测试。

Model

MMLU

GSM8K

HumanEval

Multilingual

MT-Bench

Mistral-7B

64.1

47.5

27.4

40.0

7.60

Gemma-7B

64.6

50.9

32.3



Qwen1.5-7B

61.0

62.5

36.0

45.2

7.60

DeepSeekMoE 16B

45.0

18.8

26.8


6.93

Qwen1.5-MoE-A2.7B

62.5

61.5

34.2

40.8

7.17

Qwen1.5-MoE-A2.7B在与最佳的7B模型相比取得了非常接近的性能。同时,也发现在chat模型方面仍有改进的空间。通义千问团队将继续研究如何更加有效地微调MoE模型。

训练成本与推理效率

MoE模型的训练成本与dense模型存在显著差异。尽管MoE模型通常拥有更多的参数,但由于其稀疏性,训练开销可以显著降低。先对比各个模型的三个关键参数,分别是总参数数量、激活参数数量和Non-embedding参数:

Model

Parameters

(Activated) Parameters

(Activated) Non-embedding parameters

Mistral-7B

7.2

7.2

7.0

Gemma-7B

8.5

7.8

7.8

Qwen1.5-7B

7.7

7.7

6.4

DeepSeekMoE 16B

16.4

2.8

2.4

Qwen1.5-MoE-A2.7B

14.3

2.7

2.0

不难看出,尽管Qwen1.5-MoE总参数量较大,但Non-embedding激活参数量远小于7B模型。在实践中,观察到使用Qwen1.5-MoE-A2.7B相比于Qwen1.5-7B,训练成本显著降低了75%。另外,由于Qwen1.5-MoE的初始化方法,不需要训练同样数量的token即可达到很好的模型效果,这也显著降低了训练成本。

如下是使用vLLM部署了Qwen1.5-7B和Qwen1.5-MoE-A2.7B模型,并使用单个NVIDIA A100-80G GPU进行性能测试。在实验设置中,输入token数设置为1000,输出token数设置为1000,通过吞吐量(每秒处理的请求数)和每秒token数(TPS)来衡量性能:

Model

Throughput

TPS

Qwen2-7B-Chat

1.15

2298.89

Qwen1.5-MoE-A2.7B-Chat

2.01

4010.27

Qwen1.5-MoE-A2.7B与Qwen1.5-7B相比,速度提高了约1.74倍。这种加速主要归因于MoE在前向过程中仅激活了其总参数的一小部分,从而降低了计算需求。此外,共享expert也提升了模型的推理效率。因此,尽管MoE模型增加了内存需求,但它们在吞吐性能和推理速度方面都表现出明显的优势。

Qwen1.5-MoE模型体验

英文常识&推理问答能力:

image.png

中文写作问答能力:

image.png

数学:在四则运算和中文应用题解题上都能正确解答

四则运算

image.png

应用题

image.png

Qwen1.5-MoE体验链接:

https://modelscope.cn/studios/qwen/qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4-demo

环境配置与安装

  1. python 3.8及以上版本
  2. pytorch 1.12及以上版本,推荐2.0及以上版本
  3. 建议使用CUDA 11.4及以上
  4. 依赖最新的Transformers代码

使用步骤

本文主要演示的模型为Qwen1.5-MoE对话模型,在魔搭免费算力PAI-DSW使用

image.png

模型链接和下载

Qwen1.5-MoE模型系列现已在ModelScope社区开源,包括:

Qwen1.5-MoE-A2.7B-Chat:https://modelscope.cn/models/qwen/Qwen1.5-MoE-A2.7B-Chat

Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4:https://modelscope.cn/models/qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4

Qwen1.5-MoE-A2.7B:https://modelscope.cn/models/qwen/Qwen1.5-MoE-A2.7B

社区支持直接下载模型的repo:

from modelscope import snapshot_download
model_dir = snapshot_download("qwen/Qwen1.5-MoE-A2.7B-Chat")

Qwen1.5-MoE模型推理

Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4推理代码,Qwen1.5-MoE已合并到HuggingFace的transformers最新官方代码

from modelscope import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # the device to load the model onto
model = AutoModelForCausalLM.from_pretrained(
    "qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4",
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("qwen/Qwen1.5-MoE-A2.7B-Chat-GPTQ-Int4")
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(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(response)

资源消耗(10G):

image.png

Qwen1.5-MoE-A2.7B-Chat使用vLLM加速推理:

要使用vLLM加速模型推理,请从源代码安装vLLM:

git clone https://github.com/wenyujin333/vllm.git
cd vllm
git checkout add_qwen_moe
pip install -e .

设置环境变量VLLM_USE_MODELSCOPE为True,从ModelScope下载模型:

export VLLM_USE_MODELSCOPE=True

下面这个示例说明如何使用vLLM构建一个与Qwen-MoE兼容的OpenAI-API接口:

python -m vllm.entrypoints.openai.api_server --model qwen/Qwen1.5-MoE-A2.7B-Chat
curl http://localhost:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
    "model": "qwen/Qwen1.5-MoE-A2.7B-Chat",
    "messages": [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Tell me something about large language models."}
    ]
    }'

Qwen1.5-MoE模型还将继续更新对第三方框架的支持,包括llama.cpp、MLX等。

Qwen1.5-MoE微调和微调后推理

我们使用SWIFT来对模型进行微调, swift是魔搭社区官方提供的LLM&AIGC模型微调推理框架.

微调代码开源地址: https://github.com/modelscope/swift

我们使用blossom-math-zh数据集进行微调,任务是: 解数学题

环境准备:

git clone https://github.com/modelscope/swift.git
cd swift
pip install .[llm]

微调脚本: LoRA

# https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/qwen1half-moe-a2_7b-chat/lora/sft.sh
# Experimental environment: A100
# 42GB GPU memory
PYTHONPATH=../../.. \
CUDA_VISIBLE_DEVICES=0 \
python llm_sft.py \
    --model_type qwen1half-moe-a2_7b-chat \
    --sft_type lora \
    --tuner_backend swift \
    --dtype AUTO \
    --output_dir output \
    --dataset dureader-robust-zh \
    --train_dataset_sample 10000 \
    --num_train_epochs 1 \
    --max_length 1024 \
    --check_dataset_strategy warning \
    --lora_rank 8 \
    --lora_alpha 32 \
    --lora_dropout_p 0.05 \
    --lora_target_modules ALL \
    --gradient_checkpointing true \
    --batch_size 1 \
    --weight_decay 0.1 \
    --learning_rate 1e-4 \
    --gradient_accumulation_steps 16 \
    --max_grad_norm 0.5 \
    --warmup_ratio 0.03 \
    --eval_steps 100 \
    --save_steps 100 \
    --save_total_limit 2 \
    --logging_steps 10 \
    --use_flash_attn true \
    --self_cognition_sample 1000 \
    --model_name 卡卡罗特 \
    --model_author 陶白白 \

训练过程也支持本地数据集,需要指定如下参数:

--custom_train_dataset_path xxx.jsonl \
--custom_val_dataset_path yyy.jsonl \

自定义数据集的格式可以参考:

https://github.com/modelscope/swift/blob/main/docs/source/LLM/%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8E%E6%8B%93%E5%B1%95.md#%E6%B3%A8%E5%86%8C%E6%95%B0%E6%8D%AE%E9%9B%86%E7%9A%84%E6%96%B9%E5%BC%8F

微调后推理脚本:

(这里的ckpt_dir需要修改为训练生成的checkpoint文件夹)

# Experimental environment: A100
# 3GB GPU memory
PYTHONPATH=../../.. \
CUDA_VISIBLE_DEVICES=0 \
python llm_infer.py \
    --ckpt_dir "output/qwen1half-moe-a2_7b-chat/vx-xxx/checkpoint-xxx" \
    --load_dataset_config true \
    --use_flash_attn true \
    --max_new_tokens 2048 \
    --temperature 0.1 \
    --top_p 0.7 \
    --repetition_penalty 1. \
    --do_sample true \
    --merge_lora false \

微调的可视化结果

训练loss:

image.png

训练后生成样例:

[PROMPT]<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
学校需新添28套课桌椅,共付款1820元,椅子每把17元,课桌每张多少元?<|im_end|>
<|im_start|>assistant
[OUTPUT]设课桌每张x元。
根据题意,椅子每把17元,课桌每张x元。
则椅子的总费用为17元/把 × 28把 = 476元。
课桌的总费用为x元/张 × 28张 = 28x元。
根据题意,课桌和椅子的总费用为1820元。
所以,28x + 476 = 1820。
解方程得:28x = 1820 - 476 = 1344。
x = 1344 / 28 = 48。
所以,课桌每张48元。
Answer: 48<|im_end|>
[LABELS]假设课桌的价格为x元每张。
根据题意可得方程:
28(17+x) = 1820
化简得:
476 + 28x = 1820
移项得:
28x = 1820 - 476
化简得:
28x = 1344
将等式两边同时除以28,得:
x = 1344 / 28
化简得:
x = 48
所以,每张课桌的价格为48元。
Answer: 48
--------------------------------------------------
[PROMPT]<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
甲数是18,乙数比甲数的2倍少5,乙数=.<|im_end|>
<|im_start|>assistant
[OUTPUT]设乙数为x,则根据题意可得:
x = 2 * 18 - 5
x = 36 - 5
x = 31
所以乙数为31。
Answer: 31<|im_end|>
[LABELS]首先,让我们用变量来表示甲数和乙数。
甲数 = 18
乙数 = 2 * 甲数 - 5
将甲数的值代入乙数的表达式中,我们得到:
乙数 = 2 * 18 - 5
      = 36 - 5
      = 31
所以,乙数=31。
Answer: 31

资源消耗

微调

image.png

点击直达体验创空间:

魔搭社区 (modelscope.cn)

相关文章
|
4月前
魔塔社区的模型支持使用DJL 进行推理吗?
想使用DJL 加载魔塔社区的模型并进行推理
|
3月前
|
自然语言处理 API Swift
Qwen1.5开源!魔搭最佳实践来啦!
近几个月来,通义千问团队一直在努力探索如何构建一个“好”的模型,同时优化开发者体验。就在刚刚,中国新年前夕,通义千问团队分享了Qwen开源系列的下一个版本,Qwen1.5。
|
5月前
|
数据可视化 PyTorch 算法框架/工具
零一万物Yi-34B-Chat 微调模型及量化版开源!魔搭社区最佳实践教程!
11月24日,零一万物基正式发布并开源微调模型 Yi-34B-Chat,可申请免费商用。同时,零一万物还为开发者提供了 4bit/8bit 量化版模型,Yi-34B-Chat 4bit 量化版模型可以直接在消费级显卡(如RTX3090)上使用。魔搭社区已支持下载、推理训练体验,并推出相关教程,欢迎大家来玩!
|
6月前
|
人工智能 监控 Swift
魔搭社区LLM模型部署实践 —— 以ChatGLM3为例
本文将以ChatGLM3-6B为例,介绍在魔搭社区如何部署LLM
|
6月前
|
数据可视化 测试技术 PyTorch
智谱ChatGLM3魔搭最佳实践教程来了!
ChatGLM3-6B 是 ChatGLM 系列最新一代的开源模型,在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上
|
4月前
|
自然语言处理 物联网 Swift
零一万物开源Yi-VL多模态大模型,魔搭社区推理&微调最佳实践来啦!
近期,零一万物Yi系列模型家族发布了其多模态大模型系列,Yi Vision Language(Yi-VL)多模态语言大模型正式面向全球开源。
|
3天前
|
自然语言处理 Swift
千亿大模型来了!通义千问110B模型开源,魔搭社区推理、微调最佳实践
近期开源社区陆续出现了千亿参数规模以上的大模型,这些模型都在各项评测中取得杰出的成绩。今天,通义千问团队开源1100亿参数的Qwen1.5系列首个千亿参数模型Qwen1.5-110B,该模型在基础能力评估中与Meta-Llama3-70B相媲美,在Chat评估中表现出色,包括MT-Bench和AlpacaEval 2.0。
|
9天前
|
安全 测试技术 Swift
Llama 3开源!魔搭社区手把手带你推理,部署,微调和评估
Meta发布了 Meta Llama 3系列,是LLama系列开源大型语言模型的下一代。在接下来的几个月,Meta预计将推出新功能、更长的上下文窗口、额外的模型大小和增强的性能,并会分享 Llama 3 研究论文。
Llama 3开源!魔搭社区手把手带你推理,部署,微调和评估
|
5天前
|
人工智能 测试技术 API
Phi-3:小模型,大未来!(附魔搭社区推理、微调实战教程)
近期, Microsoft 推出 Phi-3,这是 Microsoft 开发的一系列开放式 AI 模型。Phi-3 模型是一个功能强大、成本效益高的小语言模型 (SLM),在各种语言、推理、编码和数学基准测试中,在同级别参数模型中性能表现优秀。为开发者构建生成式人工智能应用程序时提供了更多实用的选择。
社区供稿 | XTuner发布LLaVA-Llama-3-8B,支持单卡推理,评测和微调
日前,XTuner 团队基于 meta 最新发布的 Llama-3-8B-Instruct 模型训练并发布了最新版多模态大模型 LLaVA-Llama-3-8B, 在多个评测数据集上取得显著提升。