前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >本地运行面壁智能的“贺岁模型”:MiniCPM 2B

本地运行面壁智能的“贺岁模型”:MiniCPM 2B

原创
作者头像
soulteary
发布2024-02-02 21:01:40
7300
发布2024-02-02 21:01:40
举报

简单聊聊可以在端侧运行的 Mini CPM 2B SFT / DPO 版本的模型。

写在前面

模型是好是坏,其实不用看公众号们的营销,小马过河问题,自己试试就知道了。当然,2B 参数量的模型,适合的场景肯定不是 34B / 70B 所擅长的,审视标准应该是不同的。

去年年末的闭门分享会,听到面壁联创大海老师的分享,对其“不刷分不打榜”,以及“产品价值还是服务价值” 的观点记忆深刻。所以,朋友圈看到铺天盖地的“小钢炮”的发布介绍时,第一时间就下手运行了一把,还顺带修正了一些 vllm 运行过程中的问题。

这篇文章,暂且不提耗时时间比较长的 vllm 高效运行的准备过程,先简单聊聊如何快速的在本地运行这个“贺岁模型”。

准备工作

和往常一样,准备工作只有两件事:“准备模型的运行环境”和“下载 CPM 模型”。

准备容器环境

我个人比较倾向使用 Docker 作为运行环境,在投入很少额外资源的情况下,能够快速获得纯净、可复现的一致性非常棒的环境。

如果你选择 Docker 路线,不论你的设备是否有显卡,都可以根据自己的操作系统喜好,参考这两篇来完成基础环境的配置《基于 Docker 的深度学习环境:Windows 篇》、《基于 Docker 的深度学习环境:入门篇》。当然,使用 Docker 之后,你还可以做很多事情,比如:之前几十篇有关 Docker 的实践,在此就不赘述啦。

除此之外,为了高效运行模型,我推荐使用 Nvidia 官方的容器镜像(nvcr.io/nvidia/pytorch:24.01-py3),以及 HuggingFace 出品的 Transformers 工具包,和快速完成模型 Web UI 界面搭建的 Gradio,以及既能做模型加速推理,又能做多卡分布式加速推理的 Accelerate 工具包。

我们可以基于上面的内容,快速折腾一个干净、高效的基础运行环境。

考虑到我们可能会将模型应用运行在不同的环境,比如云主机和服务器,它们的网络环境可能有所不同。

当我们本地进行 Docker 镜像构建的时候,配置软件镜像来加速可以大幅改善开发者体验。所以,稍加调整,我们可以得到下面的 Dockerfile 文件:

将上面的内容保存为 Dockerfile,然后执行下面的命令,可以进行镜像构建:

稍等片刻,等命令执行完毕,基础镜像就构建好了,我们的准备工作也就完成一半啦。

下载模型

接下来,我们来完成镜像准备之外的 50% 的准备工作,下载模型。

你可以根据你的实际网络情况,来选择到底是从 HuggingFace 下载模型还是从 ModelScope 来下载模型。当然,今年国内开发者有了一个新的选项WiseModel。你可以根据你的网络情况,来选择最适合你的模型下载或者在线推理平台。

虽然官方一口气推出了很多版本,不过在小参数量模型的能力和效果验证上,我个人的观点是尽可能先下载尺寸最大的,比如 dpo-fp32、sft-fp32 两个版本的模型,来规避数据转换带来的测试结果的干扰。

模型下载完毕后,确保目录结构类似下面这样:

不论你从哪里获取模型,都建议你在得到模型后进行文件 Hash 验证。

下面是 DPO 模型的 Hash:

以及 SFT 模型的 Hash:

编写推理程序

我们基于官方项目中的推理程序进行简单调整,让它能够支持在容器中运行,并且能够支持用模型原始数据类型进行推理,尽量避免数据转换带来不必要的测试干扰问题。

我们将上面的内容保存为 app.py,然后启动 Docker 容器,接着,将程序挂载和模型挂载到容器内,就可以开始体验模型了。

如果你和我一样,将模型下载到了 models 目录中,并且保持了上文提到的模型目录结构,那么可以运行下面的命令,来启动一个 MiniCPM-2B 模型的实例:

你可以将上面命令中的 ./models/OpenBMB/MiniCPM-「具体模型型号」,需要替换为真实的地址,比如这样:

官方程序默认逻辑中,使用的是 bfloat16 来进行模型推理,如果你下载的也是 float32 版本的模型,我们可以在启动的时候,额外增加一个参数 --torch_dtype=float32,来避免模型数据类型转换:

当命令执行完毕后,我们可以看到下面的日志输出:

日志输出内容中出现 Running on local URL: http://0.0.0.0:7860 时,我们访问浏览器地址 http://容器IP地址:7860,就能够来体验 SFT 或者 DPO 版本的小钢炮模型啦。

默认的 WebUI 界面
默认的 WebUI 界面

接下来,就是随便的进行测试啦。

简单测试

关于模型的体验,我之前在这篇知乎帖子中回答过。为了客观和真实性,我们不妨再做几次测试。

首先,测试下基础的“命题作文”的能力:

“知乎故事”小达人
“知乎故事”小达人

接着,问问条件有限的情况下的“料理”:

做饭辅助回答
做饭辅助回答

这里的回答如果能够结合“下厨房的 API”,应该会更靠谱一些,虽然乍一看是符合要求的食谱方案,但是仔细一看是没有遵循指令的,要求中的食材是没有用到的。

继续顺便问问经典的“螺丝帽料理”话题:

“做饭”小达人
“做饭”小达人

不正经的做饭倒是回答的不错,先叠甲规避责任,然后放飞自我的生成内容,最后加一句“仅供娱乐,不推荐食用”。

当然,也可以问问“为什么伟大的音乐家没有再继续谱曲”:

“知识区”小达人
“知识区”小达人

这里的回复准确度是有问题的,月光不是莫扎特的,得用官方推荐的 RAG 方式来做准确内容的生成。

当然,模型还有很多问题,除了想要得到答案,需要反复的 Roll 来 Roll 去外,也会出现怎么都刷不出来自己想要的答案的情况,比如这个(还是相对好的状态):

“对联”就达人不起来了
“对联”就达人不起来了

在生成对联的过程中,最容易出现的是重复内容的生成,虽然可能和其他的模型一样,通过添加 repetition_penalty 重复惩罚相关的参数,并设置比较大的数值来减少一些情况的发生,但可能最好的方案还是给这个小模型附加一个“知识库”,避免完全进入知识不足的“局部最优解”的死循环中。

最后

这篇文章先写到这里,关于本篇文章挖的一个坑,如何在安装了最新版本 CUDA 、Torch 等软件版本的容器环境中,使用 vllm 来高效运行模型,下一篇相关的文章再聊。

--EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾、彼此坦诚相待的小伙伴。

我们在里面会一起聊聊软硬件、HomeLab、编程上、生活里以及职场中的一些问题,偶尔也在群里不定期的分享一些技术资料。

关于交友的标准,请参考下面的文章:

苏洋:致新朋友:为生活投票,不断寻找更好的朋友

当然,通过下面这篇文章添加好友时,请备注实名和公司或学校、注明来源和目的,珍惜彼此的时间 :D

苏洋:关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2024年02月02日

统计字数: 14180字

阅读时间: 29分钟阅读

本文链接: https://soulteary.com/2024/02/02/locally-run-modelbest-mini-cpm-2b.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 准备工作
    • 准备容器环境
    • 下载模型
    • 编写推理程序
    • 简单测试
    • 最后
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档