赞
踩
通义千问团队推出 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 + 技术交流
python 3.8及以上版本
pytorch 1.12及以上版本,推荐2.0及以上版本
建议使用CUDA 11.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_download
model_dir = snapshot_download("qwen/Qwen1.5-MoE-A2.7B-Chat")
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):
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等。
我们使用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 \
微调后推理脚本:
(这里的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:
训练后生成样例:
[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
资源消耗
微调
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。