阿里通义千问 Qwen1.5-MoE 开源!推理训练最佳实践教程来啦

开源 0

通义千问团队推出 Qwen 系列的首个MoE模型,Qwen1.5-MoE-A2.7B。它仅拥有27亿个激活参数,但其性能却能与当前最先进的70亿参数模型,如Mistral 7B和Qwen1.5-7B相媲美。

模型结构

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

  • Finegrained experts

  • 初始化

  • 新的routing机制

Qwen1.5-MoE-A2.7B在与最佳的7B模型相比取得了非常接近的性能。同时,也发现在chat模型方面仍有改进的空间。

训练成本与推理效率

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模型增加了内存需求,但它们在吞吐性能和推理速度方面都表现出明显的优势。

技术交流&资料

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

成立了大模型面试和技术交流群,相关资料、技术交流&答疑,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2040,备注:来自CSDN + 技术交流

环境配置与安装

  1. python 3.8及以上版本

  2. pytorch 1.12及以上版本,推荐2.0及以上版本

  3. 建议使用CUDA 11.4及以上

  4. 依赖最新的Transformers代码

使用步骤

模型链接和下载

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_downloadmodel_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, AutoTokenizerdevice = "cuda" # the device to load the model ontomodel = 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):

图片

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

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

git clone https://github.com/wenyujin333/vllm.gitcd vllmgit checkout add_qwen_moepip 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.gitcd swiftpip 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 memoryPYTHONPATH=../../.. /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 /

微调后推理脚本:

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

# Experimental environment: A100# 3GB GPU memoryPYTHONPATH=../../.. /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:

图片

训练后生成样例:

[PROMPT]<|im_start|>systemYou 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|>systemYou are a helpful assistant.<|im_end|><|im_start|>user甲数是18,乙数比甲数的2倍少5,乙数=<|im_end|><|im_start|>assistant[OUTPUT]设乙数为x,则根据题意可得:x = 2 * 18 - 5x = 36 - 5x = 31所以乙数为31。Answer: 31<|im_end|>[LABELS]首先,让我们用变量来表示甲数和乙数。甲数 = 18乙数 = 2 * 甲数 - 5将甲数的值代入乙数的表达式中,我们得到:乙数 = 2 * 18 - 5      = 36 - 5      = 31所以,乙数=31。Answer: 31

资源消耗

微调

图片

通俗易懂讲解大模型系列

  • 重磅消息!《大模型面试宝典》(2024版) 正式发布!

  • 重磅消息!《大模型实战宝典》(2024版) 正式发布!

  • 做大模型也有1年多了,聊聊这段时间的感悟!

  • 用通俗易懂的方式讲解:不要再苦苦寻觅了!AI 大模型面试指南(含答案)的最全总结来了!

  • 用通俗易懂的方式讲解:我的大模型岗位面试总结:共24家,9个offer

  • 用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战

  • 用通俗易懂的方式讲解:一文讲清大模型 RAG 技术全流程

  • 用通俗易懂的方式讲解:如何提升大模型 Agent 的能力?

  • 用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

  • 用通俗易懂的方式讲解:基于扩散模型(Diffusion),文生图 AnyText 的效果太棒了

  • 用通俗易懂的方式讲解:在 CPU 服务器上部署 ChatGLM3-6B 模型

  • 用通俗易懂的方式讲解:使用 LangChain 和大模型生成海报文案

  • 用通俗易懂的方式讲解:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式讲解:使用 LangChain 封装自定义的 LLM,太棒了

  • 用通俗易懂的方式讲解:基于 Langchain 和 ChatChat 部署本地知识库问答系统

  • 用通俗易懂的方式讲解:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境

  • 用通俗易懂的方式讲解:Llama2 部署讲解及试用方式

  • 用通俗易懂的方式讲解:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

  • 用通俗易懂的方式讲解:一份保姆级的 Stable Diffusion 部署教程,开启你的炼丹之路

  • 用通俗易懂的方式讲解:对 embedding 模型进行微调,我的大模型召回效果提升了太多了

  • 用通俗易懂的方式讲解:LlamaIndex 官方发布高清大图,纵览高级 RAG技术

  • 用通俗易懂的方式讲解:为什么大模型 Advanced RAG 方法对于AI的未来至关重要?

  • 用通俗易懂的方式讲解:使用 LlamaIndex 和 Eleasticsearch 进行大模型 RAG 检索增强生成

  • 用通俗易懂的方式讲解:基于 Langchain 框架,利用 MongoDB 矢量搜索实现大模型 RAG 高级检索方法

  • 用通俗易懂的方式讲解:使用Llama-2、PgVector和LlamaIndex,构建大模型 RAG 全流程

也许您对下面的内容还感兴趣: