支持私有云部署
AI知识库 AI知识库

53AI知识库

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


新一代端侧模型,面壁 MiniCPM 2.0开源,魔搭社区最佳实践
浏览次数: 1565
01

导读



优秀的端侧模型系列面壁 MiniCPM 上新!一口气带来:

  • 端侧多模态模型 MiniCPM-V 2.0:OCR 能力显著增强、甚至部分能力比肩 Gemini Pro;

  • 适配更多端侧场景的基座模型 MiniCPM-1.2B:性能超越 Llama2-13B、推理速度达到人类语速近 25 倍;

  • 最小的 128K 长文本模型 MiniCPM-2B-128K ;

  • 性能进一步增强的 MoE 架构模型 MiniCPM-MoE-8x2B


开源地址(内含技术报告)如下:

 ➤  MiniCPM-V 2.0:

?https://github.com/OpenBMB/MiniCPM-V


 ➤  MiniCPM 系列开源地址:

?https://github.com/OpenBMB/MiniCPM


 ➤  MiniCPM 技术Blog地址:

?https://openbmb.vercel.app/?category=Chinese+Blog


端侧多模态模型 MiniCPM-V 2.0

多模态能力已成为当前大模型的核心竞争力之一,智能终端设备由于其影像视觉处理的高频需求,对在端侧部署的人工智能模型提出了更高的多模态识别与推理能力要求。


这一次,MiniCPM-V 2.0 不仅带来优秀端侧多模态通用能力,更带来惊艳的 OCR 表现。通过自研的高清图像解码技术,可以突破传统困境,让更为精准地识别充满纷繁细节的街景、长图在端侧成为可能。


甚至,还能识读 2300 多年前的清华简上一些难以辨别的古老字迹,以卓越的 OCR 能力,为我们叩响识读老文字的大门。譬如,它不仅可以在三根竹简中准确找到最短的竹简,也能精准地识别出上面的字迹。甚至,连无从辨别的复杂楚文字都被正确解读。


作为多模态识别与推理能力的硬核指标,新一代 MiniCPM-V 2.0 在 OCR(光学字符识别)方面的成绩,已被一项项权威榜单验证。


在 权威 OCR 综合能⼒榜单 OCRBench 中,MiniCPM-V 2.0 秉承面壁「小钢炮」系列「以小博大」传统,刷新了开源模型 SOTA。在 场景图片文字识别榜单 TextVQA 中,越级超越 13B 量级通用模型。


这一次,新一代 MiniCPM-V 2.0 还加速解锁了过去难以识别的高清图像信息识别,譬如街景、长图这类典型场景。


为什么我们在手机上随手可得的影像,用于 OCR 识别却如此困难?这是由于传统处理方法,只能处理固定尺寸图片,会将大像素或不规则图片强制压缩,导致原始图片中丢失大量信息、难以识别,这对充满了细节文字信息、又大量零散分布的街景类画面提出了极大挑战。


得益于自研高清图片解码技术,新一代 MiniCPM-V 2.0 带来清晰大图识别体验的大幅提升。可以处理最大 180 万像素高清大图,甚至 1:9 极限宽高比的高清图片(譬如要翻阅好几屏的长图),对它们进行高效编码和无损识别。


具体效果如下:


在 中文OCR 能力方面,识别同一张街景图,MiniCPM-V 2.0 可以准确地叫出大厦的名字。


目前,MiniCPM-V 2.0 已经可部署于智能手机,在图像理解和推理效率方面取得了卓越的表现:



小钢炮四连发,还带来

更适配端侧场景的1.2B尺寸,以及长文本、MoE版本

在「高效大模型」的路径下,把大模型变得更小!更强!推动大模型落地应用!

我们再次追求极致,制造了一颗小小钢炮—— MiniCPM-1.2B。参数减少一半,速度提升 38%,成本下降 60%(1元= 4150000 tokens) 。在手机上的 推理速度 达到 25 token / s,甚至相当于 人的语速的 15 ~25 倍。

25 token / s, 则是将 MiniCPM-1.2B 离线部署于 iPhone 15 的实测成绩。

同时而来的,还有当前 最小的“128K长文本”模型,将原先4K上下文窗口一口气扩增至 128K(20万字)。


MiniCPM在多维度综合性能评测中表现卓越。此评测集针对大模型在长文本方面的五项能力(检索、数学、代码、问答和摘要)而设计,相较于当前主流的仅关注检索能力的大海捞针测试更加全面。


此外,MiniCPM通过 MoE 的性能增强,让 2B 小钢炮(MiniCPM 1.0)在其原来的基础之上性能平均提高 4.5 个百分点。从榜单成绩上来看,MiniCPM-MoE-8x2B 模型做到了在性能上的越级超越,并且推理成本仅为 Gemma-7B 的 69.7%。


02

模型链接和下载



MiniCPM系列模型现已在ModelScope社区开源:


MiniCPM-V-2.0

https://modelscope.cn/models/OpenBMB/MiniCPM-V-2.0


MiniCPM-MoE-8x2B

https://modelscope.cn/models/OpenBMB/MiniCPM-MoE-8x2B


MiniCPM-2B-128k

https://modelscope.cn/models/OpenBMB/MiniCPM-2B-128k


MiniCPM-1.2B

https://modelscope.cn/models/OpenBMB/MiniCPM-1B-sft-bf16


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


from modelscope import snapshot_downloadmodel_dir = snapshot_download("OpenBMB/MiniCPM-MoE-8x2B")


03

模型推理



本文使用的模型为 MiniCPM-MoE-8x2B 模型,在PAI-DSW运行(单卡A100) 。


MoE模型推理

from modelscope import AutoModelForCausalLM, AutoTokenizerimport torchtorch.manual_seed(0)
path = 'openbmb/MiniCPM-MoE-8x2B'tokenizer = AutoTokenizer.from_pretrained(path)model = AutoModelForCausalLM.from_pretrained(path, torch_dtype=torch.bfloat16, device_map='cuda', trust_remote_code=True)
responds, history = model.chat(tokenizer, "山东省最高的山是哪座山, 它比黄山高还是矮?差距多少?", temperature=0.8, top_p=0.8)print(responds)


资源消耗:


多模态模型推理:

# test.pyimport torchfrom PIL import Imagefrom modelscope import AutoModel, AutoTokenizer
model = AutoModel.from_pretrained('openbmb/MiniCPM-V-2.0', trust_remote_code=True, torch_dtype=torch.bfloat16)# For Nvidia GPUs support BF16 (like A100, H100, RTX3090)model = model.to(device='cuda', dtype=torch.bfloat16)# For Nvidia GPUs do NOT support BF16 (like V100, T4, RTX2080)#model = model.to(device='cuda', dtype=torch.float16)# For Mac with MPS (Apple silicon or AMD GPUs).# Run with `PYTORCH_ENABLE_MPS_FALLBACK=1 python test.py`#model = model.to(device='mps', dtype=torch.float16)
tokenizer = AutoTokenizer.from_pretrained('openbmb/MiniCPM-V-2.0', trust_remote_code=True)model.eval()
image = Image.open('xx.jpeg').convert('RGB')question = 'What is in the image?'msgs = [{'role': 'user', 'content': question}]
answer, context, _ = model.chat(image=image,msgs=msgs,context=None,tokenizer=tokenizer,sampling=True,temperature=0.7)print(answer)


04 模型微调和微调后推理



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


微调代码开源地址: 

https://github.com/modelscope/swift


环境准备:

git clone https://github.com/modelscope/swift.gitcd swiftpip install -e .[all]


MiniCPM-MoE-8x2B

我们使用数据集 blossom-math-zh 微调 MiniCPM-MoE-8x2B 模型. 任务是: 解数学题


微调脚本: LoRA+ddp

# Experimental environment: 4 * A100# 4 * 41GB GPU memorynproc_per_node=4CUDA_VISIBLE_DEVICES=0,1,2,3 \NPROC_PER_NODE=$nproc_per_node \MASTER_PORT=29500 \swift sft \--model_id_or_path OpenBMB/MiniCPM-MoE-8x2B \--model_revision master \--sft_type lora \--tuner_backend peft \--dtype bf16 \--output_dir output \--dataset blossom-math-zh \--train_dataset_sample -1 \--num_train_epochs 1 \--max_length 2048 \--check_dataset_strategy warning \--lora_rank 8 \--lora_alpha 32 \--lora_dropout_p 0.05 \--lora_target_modules DEFAULT \--gradient_checkpointing false \--batch_size 1 \--weight_decay 0.1 \--learning_rate 1e-4 \--gradient_accumulation_steps $(expr 16 / $nproc_per_node) \--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 \


对于消费级显卡,可以用模型并行来支持训练

LoRA+mp

# Experimental environment: 2 * A100# 2 * 17GB GPU memoryCUDA_VISIBLE_DEVICES=0,1 \swift sft \--model_id_or_path OpenBMB/MiniCPM-MoE-8x2B \--model_revision master \--sft_type lora \--tuner_backend peft \--dtype bf16 \--output_dir output \--dataset blossom-math-zh \--train_dataset_sample -1 \--num_train_epochs 1 \--max_length 2048 \--check_dataset_strategy warning \--lora_rank 8 \--lora_alpha 32 \--lora_dropout_p 0.05 \--lora_target_modules DEFAULT \--gradient_checkpointing false \--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


微调后推理脚本: (这里的ckpt_dir需要修改为训练生成的checkpoint文件夹)


对于消费级显卡,可以设置CUDA_VISIBLE_DEVICES来支持推理

# Experimental environment: A100# 30GB GPU memory
CUDA_VISIBLE_DEVICES=0 \swift infer \--ckpt_dir "output/minicpm-moe-8x2b/vx-xxx/checkpoint-xxx" \--load_dataset_config true \--max_new_tokens 2048 \--temperature 0.1 \--top_p 0.7 \--repetition_penalty 1. \--do_sample true \--merge_lora false \


训练loss图:


资源占用

训练

lora+ddp


lora+mp


推理


[PROMPT]<s> <用户>新华书店运到2车图书,每辆车装125包,每包有80本.新华书店运到图书多少本?<AI>[OUTPUT]新华书店运到2车图书,每辆车装125包,每包有80本。所以,每辆车装的总包数为125 * 80 = 10000本。因此,新华书店运到图书的总数为10000 * 2 = 20000本。
Answer: 20000</s>
[LABELS]新华书店运到的图书总数为2车图书的数量之和。每辆车装125包,每包有80本,所以每辆车的图书数量为125包 x 80本/包 = 10000本。两辆车的图书数量之和为2辆 x 10000本/辆 = 20000本。新华书店运到的图书总数为20000本。
Answer: 20000--------------------------------------------------[PROMPT]<s> <用户>Jacob的水箱能容纳50升水。Jacob从河里和雨水中收集水来填满他的水箱。他每天可以从雨水中收集800毫升的水,从河里收集1700毫升的水。Jacob需要多少天才能填满他的水箱?<AI>[OUTPUT]Jacob每天收集的水量为800毫升 + 1700毫升 = 2500毫升。每天填满水箱需要的量为50升 * 1000毫升/升 = 50000毫升。所以,Jacob需要50000毫升 / 2500毫升/天 = 20天才能填满他的水箱。
Answer: 20</s>
[LABELS]每天从雨水和河水中收集到的水总量为800毫升+1700毫升=2500毫升=2.5升。所以,填满50升水箱需要的天数为50升/2.5升=20天。
Answer: 20--------------------------------------------------[PROMPT]<s> <用户>一种小家电,打0.8后的价格是160元,这种小家电原价多少元.<AI>[OUTPUT]设小家电原价为x元,则打0.8后的价格为0.8x元。根据题意,打0.8后的价格是160元,所以0.8x = 160。解方程得:x = 160 / 0.8 = 200元。所以小家电原价为200元。
Answer: 200</s>
[LABELS]设小家电的原价为x元。根据题意,打0.8折扣后的价格为0.8x元。根据题意,0.8x = 160。解这个方程可以得到x = 200。所以,这种小家电的原价为200元。
Answer: 200


MiniCPM-V 2.0

我们使用数据集coco-mini-en-2 微调MiniCPM-V 2.0模型. 任务是: 图像描述

微调脚本: LoRA

# Experimental environment: A10# 9GB GPU memoryCUDA_VISIBLE_DEVICES=0 swift sft \--model_type minicpm_v_v2 \--dataset coco-mini-en-2

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

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


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

https://github.com/modelscope/swift/blob/main/docs/source/Multi-Modal/llava%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.md#%E5%BE%AE%E8%B0%83


微调后推理脚本: (这里的ckpt_dir需要修改为训练生成的checkpoint文件夹)

CUDA_VISIBLE_DEVICES=0 swift infer \--ckpt_dir output/minicpm-v-v2/vx-xxx/checkpoint-xxx \--load_dataset_config true \


训练loss图:


训练后生成样例:


<AI>[OUTPUT]A large airplane that is hanging from theceiling.</s>[LABELS]People walking in a museum with a airplane hanging from the celing.

<AI>[OUTPUT]A bowl of fruit and a cup ofcoffee.</s>[LABELS]a bowl of fruit and pastry on a table


资源占用

微调


推理




推荐新闻
RAG系列04:使用ReRank进行重排序
本文介绍了重排序的原理和两种主流的重排序方法:基于重排模型和基于 LLM。文章指出,重排序是对检索到的上下文进行再次筛选的过程,类似于排序过程中的粗排和精排。在检索增强生成中,精排的术语就叫重排序。文章还介绍了使用 Cohere 提供的在线模型、bge-reranker-base 和 bge-reranker-large 等开源模型以及 LLM 实现重排序的方法。最后,文章得出结论:使用重排模型的方法轻量级、开销较小;而使用 LLM 的方法在多个基准测试上表现良好,但成本较高,且只有在使用 ChatGPT 和 GPT-4 时表现良好,如使用其他开源模型,如 FLAN-T5 和 Vicuna-13B 时,其性能就不那么理想。因此,在实际项目中,需要做出特定的权衡。
LangGPT论文:面向大语言模型的自然语言编程框架(中文版)
大语言模型 (Large Language Models, LLMs) 在不同领域都表现出了优异的性能。然而,对于非AI专家来说,制定高质量的提示来引导 LLMs 是目前AI应用领域的一项重要挑战。
第三篇:要真正入门AI,OpenAI的官方Prompt工程指南肯定还不够,您必须了解的强大方法论和框架!!!
自从ChatGPT(全名:Chat Generative Pre-trained Transformer)于2022年11月30日发布以来,一个新兴的行业突然兴起,那就是提示工程(Prompt engineering),可谓如日冲天。从简单的文章扩写,到RAG,ChatGPT展现了前所未有的惊人能力。
(三)12个RAG痛点及其解决方案
痛点9:结构化数据QA 痛点10:从复杂 PDF 中提取数据 痛点11:后备模型 痛点12:LLM安全
(二)12个RAG痛点及其解决方案
痛点5:格式错误 痛点6:不正确的特异性 痛点7:不完整 痛点8:数据摄取可扩展性

联系我们

售前咨询
186 6662 7370
产品演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询