AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


Qwen家族新成员:32B开源!魔搭社区推理训练最佳实践!
发布日期:2024-04-24 07:20:07 浏览次数: 2462


01

导读


开源社区长期以来一直在寻求一种在性能、效率和内存占用之间达到理想平衡的模型。尽管出现了诸如Qwen1.5-72B和DBRX这样的SOTA模型,但这些模型持续面临诸如内存消耗巨大、推理速度缓慢以及显著的微调成本等问题。当前,参数量约30B的模型往往在这方面被看好,得到很多用户的青睐。顺应这一趋势,通义千问团队推出Qwen1.5语言模型系列的最新成员:Qwen1.5-32B和Qwen1.5-32B-Chat。


Qwen1.5-32B基础模型旨在对标甚至超越当前最先进的30B模型所设定的性能基准。同时,通义千问团队在对齐方面取得了进展,特别是在RLHF方面,以提升Qwen1.5-32B-Chat的对话能力。


模型效果 Qwen1.5-32B 是 Qwen1.5 语言模型系列的最新成员,除了模型大小外,其在模型架构上除了GQA几乎无其他差异。GQA能让该模型在模型服务时具有更高的推理效率潜力。


以下对比展示其与参数量约为30B或更大的当前最优(SOTA)模型在基础能力评估、chat评估以及多语言评估方面的性能。以下是对于基础语言模型能力的评估结果:



Qwen1.5-32B模型在多种任务上展现出颇具竞争力的表现,涵盖MMLU、GSM8K、HumanEval以及MT-BENCH等。相较于72B参数模型,Qwen1.5-32B虽在性能上有轻微下降,但在多数任务中仍优于其他30B级别模型,如Mixtral-8x7B。


而在Chat模型的评估上,遵循Qwen1.5的评估方案,对它们在MT-Bench与Alpaca-Eval 2.0上的表现进行了测试。具体结果如下:


Models

MT-Bench

AlpacaEval 2.0

Avg. Score

LC Win Rate

Qwen1.5-72B-Chat

8.61

36.60

Qwen1.5-32B-Chat

8.30

27.49


值得注意的是,Qwen1.5-32B-Chat的得分超过8分,且Qwen1.5-32B-Chat与Qwen1.5-72B-Chat之间的差距相对较小。这一结果表明,对于需要更高效、更经济实惠的应用解决方案的用户而言,32B模型是一个可行的选择。


同时还对Qwen1.5-32B的多语言能力进行了测试,涵盖了包括阿拉伯语、西班牙语、法语、葡萄牙语、德语、意大利语、俄语、日语、韩语、越南语、泰语和印尼语在内的12种语言,涉及考试、理解、数学及翻译等多个领域。具体结果如下所示:


Models

Exams

Understanding

Math

Translation

Average

Mixtral-8x7B

56.08

70.70

45.00

29.78

50.39

Qwen1.5-72B

66.35

78.16

61.67

35.57

60.44

Qwen1.5-32B

61.57

76.48

56.13

33.46

56.91


与其他Qwen1.5模型相似,32B版本同样具备出色的多语言能力,其表现略逊于72B模型。


最后,测试了Qwen1.5-32B在大海捞针上的效果,Qwen1.5-32B能够在长达32K tokens的上下文中实现了优秀的表现。



总结:通义千问团队发布了中等规模模型Qwen1.5-32B及其Chat模型。相较于72B模型,这些模型的内存占用大幅减少运行速度显著提升。期望此次发布能帮助用户为其下游应用找到更优解决方案,以应对14B模型尤其在智能体场景下能力偏弱以及72B模型推理成本过高的问题。


魔搭社区提供下载、推理、微调实战教程,欢迎开发者小伙伴们体验!




02

模型体验


创空间体验地址:

https://modelscope.cn/studios/qwen/Qwen1.5-32B-Chat-demo/summary


翻译能力,还不错:


角色扮演能力:


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

四则运算


应用题


PS:也试了下GPT4,GPT4错了

应用题


03

环境配置与安装


  1. python 3.10及以上版本

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

  3. 建议使用CUDA 11.4及以上



04

Qwen1.5-32B模型链接和下载


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


Qwen1.5-32B:

https://modelscope.cn/models/qwen/Qwen1.5-32B


Qwen1.5-32B-Chat:

https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat


Qwen1.5-32B-Chat-GPTQ-Int4:

https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat-GPTQ-Int4


Qwen1.5-32B-Chat-AWQ:

https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat-AWQ


Qwen1.5-32B-Chat-GGUF:

https://modelscope.cn/models/qwen/Qwen1.5-32B-Chat-GGUF


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

from modelscope import snapshot_downloadmodel_dir = snapshot_download("qwen/Qwen1.5-32B-Chat")


05

Qwen1.5-32B模型推理


Qwen1.5-32B-Chat-GPTQ-Int4推理代码:

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

资源消耗:



Qwen1.5-32B-Chat推理代码:

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

资源消耗:



Qwen1.5-32B-Chat使用vLLM加速推理:

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

export VLLM_USE_MODELSCOPE=True


下面这个示例说明如何使用vLLM构建一个与Qwen1.5-32B-Chat兼容的OpenAI-API接口:

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


使用llama.cpp部署Qwen1.5-32B-Chat-GGUF版本:

下载GGUF文件:

from modelscope.hub.file_download import model_file_download
model_dir = model_file_download(model_id='qwen/Qwen1.5-32B-Chat-GGUF',file_path='qwen1_5-32b-chat-q5_k_m.gguf',revision='master',cache_dir='/mnt/workspace/'
git clone llama.cpp代码并推理:
git clone https://github.com/ggerganov/llama.cpp.gitcd llama.cppmake -j && ./main -m /mnt/workspace/qwen/Qwen1.5-32B-Chat-GGUF/qwen1_5-32b-chat-q5_k_m.gguf -p "Building a website can be done in 10 simple steps:\nStep 1:" -n 400 -e



06

Qwen1.5-32B模型微调和微调后推理


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

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


我们使用ms-bench-mini数据集进行微调,任务是: 通用问答


环境准备:

git clone https://github.com/modelscope/swift.gitcd swiftpip install .[llm]
# [optional] pip install flash-attn --no-build-isolation

微调脚本: LoRA

# https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/scripts/qwen1half_32b_chat/lora_mp/sft.sh# Experimental environment: A100# 2*49GB GPU memoryCUDA_VISIBLE_DEVICES=0,1 \swift sft \--model_type qwen1half-32b-chat \--sft_type lora \--tuner_backend swift \--dtype AUTO \--output_dir output \--dataset ms-bench-mini \--train_dataset_sample 5000 \--num_train_epochs 2 \--max_length 2048 \--check_dataset_strategy warning \--lora_rank 8 \--lora_alpha 32 \--lora_dropout_p 0.05 \--lora_target_modules DEFAULT \--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 false \

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

--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# 66GB GPU memoryCUDA_VISIBLE_DEVICES=0 \swift infer \--ckpt_dir "output/qwen1half-32b-chat/vx-xxx/checkpoint-xxx" \--load_dataset_config true \--use_flash_attn false \--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解决以下数学问题:如果一件物品最初的价格为100元,并以每年5%的速度上涨,那么在10年后它的价格是多少?<|im_end|><|im_start|>assistant[OUTPUT]在10年后,该物品的价格将是162.89元。<|im_end|>
[LABELS]这是一个复利计算问题。复利计算是指以一定的利率每年将原本资金所获得的利息加入本金中并计算下一年的利息。在本题中,物品价格每年都以5%的速度上涨,也就是说每年物品的价格增加为原先的1.05倍。因此,我们可以使用以下公式来计算10年后物品的价格:价格 = 初始价格 × (1 + 年利率)^年数将年利率设为0.05,年数设为10,初始价格设为100元,代入公式得到:价格 = 100 × (1 + 0.05)^10 = 100 × 1.62889 ≈ 162.89因此,10年后这件物品的价格约为162.89元。--------------------------------------------------<|im_start|>user重新写一遍这个句子,让它更容易被理解。在计划下个月的公司旅行时,必须先确定所有员工的意见和偏好以便可以作出最佳决策。<|im_end|><|im_start|>assistant[OUTPUT]为了做出最佳决策,需要在计划下个月的公司旅行之前先确定所有员工的意见和偏好。<|im_end|>
[LABELS]为了做出最佳的决策,计划下个月公司旅行的时候需要先确定所有员工的意见和偏好。--------------------------------------------------[PROMPT]<|im_start|>systemYou are a helpful assistant.<|im_end|><|im_start|>user请建议一种有效的工作流程,以提高团队的效率和生产力。<|im_end|><|im_start|>assistant[OUTPUT]一种有效的工作流程是采用敏捷开发方法,它强调快速迭代和反馈,以确保团队能够快速响应变化和需求。以下是敏捷开发方法的一些关键步骤:1. 定义目标和需求:团队需要明确项目的目标和需求,以便确定要完成的任务和优先级。2. 制定计划:团队需要制定一个详细的计划,包括要完成的任务、时间表和资源分配。3. 迭代开发:团队需要将项目分解为一系列小的迭代,每个迭代都包括设计、开发、测试和反馈等步骤。4. 每日站立会议:团队需要每天进行一次站立会议,以讨论进度、问题和下一步计划。5. 代码审查:团队需要进行代码审查,以确保代码质量、可维护性和可扩展性。6. 测试和反馈:团队需要进行测试和反馈,以确保产品符合需求和质量标准。7. 评估和改进:团队需要定期评估和改进工作流程,以提高效率和生产力。通过采用敏捷开发方法,团队可以快速响应变化和需求,提高效率和生产力。同时,团队成员可以更好地协作和沟通,以确保项目成功完成。<|im_end|>
[LABELS]以下是一个有效的工作流程建议,以提高团队的效率和生产力:1. 设定明确的目标和对任务的优先级排序在团队开始工作之前,确保明确指定任务的目标和优先级。这样能帮助团队了解他们需要专注哪些任务,以及哪些任务是最紧急的。这有助于团队可以更高效地为达成目标而努力。2. 分配任务和设置期限根据任务的优先级,划分任务以使每个人都有具体的职责。并且需要为每个任务设定期限,以确保进度的跟踪和保证任务按时完成。3. 沟通协作协作和沟通至关重要。团队成员可以通过定期会议、电子邮件、聊天等多种方式交流,并确保他们了解其他成员的进展。结构化的课程表,以便每个团队成员知道繁忙时间段在何时何地,以便更好地进行协作。4. 保持记录在每个任务结束时,团队成员应该时刻保持追踪每个任务的完成情况,并监控团队整体的进展情况。可以利用基于云的应用程序或在线工具来共享,以促进透明度和团队合作。5. 审查和更新进度定期审查团队的进展情况和成果。需要时进行调整和更新,以确保每个人专注于正确的任务,并且每个任务都保持在预期时间内完成。以上是一个有效的工作流程建议,旨在提高团队的效率和生产力。通过这些流程,团队成员可以更有效地协作,更快地完成任务,并交付更好的项目。


资源消耗

微调


推理







53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询