从 LLM 火爆以来,社区已经出现了非常多优秀的模型,当然他们最大的特点就是体积大,最近为了让大模型可以在更低端的设备上运行,社区做了非常多的工作, gptq 实现了将模型进行低比特量化,因此降低了运行大模型对CPU内存,GPU显存的要求,llama.cpp 实现了在本地 CPU/GPU 上就可以运行大模型,并且步骤非常简单,replit-code-v1-3b 用更小的模型实现了更智能的 code 生成。可以看到模型的小型化和轻量部署也是一个大模型的发展方向。

鉴于此,MegEngine 团队开发了 InferLLM 工程,主要目的有两个:

  • 提供一个比 llama.cpp 更简单更容易上手的本地部署框架,供大家学习和讨论
  • 让 LLM 模型在本地或者端上部署成为可能,未来可以用在一些实际的生产环境中

相比 llama.cpp 工程,InferLLM 结构更简单,对一些通用组件进行了重构,避免将所有逻辑代码和 kernel 代码放在一个文件中,避免在 Kernel 中引入过多的宏影响代码阅读和开发,llama.cpp 对于学习和二次开发不是很友好,InferLLM 也是主要借鉴 llama.cpp,如:使用 llama.cpp 的模型格式,以及 copy 了一些计算的 code,同时 InferLLM 对其进行了重构,使得代码更简单直接,非常容易上手,框架代码和 kernel 代码分开,其实在大模型推理中,真正需要优化的 kernel 是远远小于 CNN 的 kernel 的。

另外 InferLLM 也可以用在生产中,因为它可以将 LLM 量化的模型在一个性能一般的手机上流畅的运行,可以进行流畅的进行人机对话,目前在手机上运行一个 llama 7b 4bit 的模型,只需要 4G 左右内存,这个内存是现在大多数手机都能满足的。相信在不久之后会出现很多大模型中的轻量化模型,可以直接在端上进行部署和推理,毕竟目前手机是大家最容易获得的计算资源,没有理由浪费如此庞大的计算集群。

下面是在 xiaomi9,Qualcomm SM8150 Snapdragon 855 上使用 4 线程运行中文 alpaca 7b 4bit 量化模型的情况:

InferLLM 主要由几部分组成

  • Model:主要负责输入的 tokenizer,词汇表管理,存储一些历史的 token 以及 Decoder 之后的采样等。
  • Graph/Op:负责创建整个模型,包括模型的中 Op 直接的连接关系,Op 的执行,以及 Op 输入输出等内存资源的管理
  • Kernel:提供不同后端优化的 Kernel,目前包括 x86,Arm,naive,当 x86 和 Arm 中没有优化的 Kernel,会直接 fallback 到 naive 中进行运行

InferLLM 主要支持以下功能:

  • 支持每个 Op 执行前准备资源,每个 Op 执行前都需要调用 pre_execute,执行之后调用 end_execute。这样可以方便在内存不足的设备上,在执行前从磁盘中间权重读取到 RAM 中,执行完成之后将权重存回磁盘中,也可以直接使用 mmap,让操作系统自动处理这些逻辑
  • 支持每一个 Multi-Head Attention 的 KV cache,每次计算出来的 Key 和 Value 都保存在 KVStorage 中,KVStorage 支持通过 token 的 id 索引,另外如果 KV 的 cache 过大时,还支持将其 swap 出去
  • 支持 CPU 上多线程,SIMD,量化,float16计算等加速方式,多线程是通过自己实现的一个类似 OpenMP 静态调度的逻辑,使用无锁的线程池来进行多线程之间的同步
  • 可以兼容多种模型格式,目前仅仅支持了 llama 类似的模型,未来将支持更多的模型结构

欢迎大家试用 InferLLM

附:

更多 MegEngine 信息获取,您可以:查看文档和 GitHub 项目,或加入 MegEngine 用户交流 QQ 群:1029741705。欢迎参与 MegEngine 社区贡献,成为 Awesome MegEngineer,荣誉证书、定制礼品享不停。

安卓机上 4G 内存跑 alpaca,欢迎试用轻量级 LLM 模型推理框架 InferLLM的更多相关文章

  1. linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解?

    问: linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解? 每个进程所拥有的4G独立的虚拟内存空间是什么意思?linux系统的虚拟4G空间中,高位的1G是用于系统内核运行的,那 ...

  2. ESXi 强制4G内存解决(VMware ESXi 6.0.0.update02 )

    手上有个性能不太好的机器,想着装一个系统有点浪费,但是4G内存实际识别只有3.7G,到达不了EXSi的最低4G限制,无法安装.最终找到一个解决方法,经过验证适用于ESXi 6.0. 源自于:ESXi ...

  3. 32位Windows 7系统下,显示4G内存3G可用的原因。

    由于32位操作系统只有那么多物理地址可用, 而硬盘.光驱.声卡,显卡,无线网卡等硬件设备也需要分配物理地址才可以使用, 所以系统会把一部分物理地址分配给它们, 剩下的物理地址分配给内存使用, 而剩下的 ...

  4. 基础 - 32位操作系统最多只支持4G内存。

    32位操作系统最多只支持4G内存. CPU能不能直接访问硬盘的数据呢, 不能. 只能通过把硬盘的数据先放到内存里, 然后再从内存里访问硬盘的数据.我们平时玩游戏碰上读图loading 进度条的这个过程 ...

  5. 百杂讲堂之为什么32位系统只能操作4g内存

    百杂讲堂之为什么32位系统只能操作4g内存 计算机内存中很多的单元,每一个单元就是一个字节,一个字节有8位.每一个单元有两种状态:0和1. 所以 两个单元就有4个组合: 3个单元就有8个组合: 依次类 ...

  6. 微信 JS SDK 的 chooseImage 接口在部分安卓机上容易造成页面刷新

    该问题的症状是,当调用 chooseImage 接口并选择拍照,选择照片确定之后,然后从相机返回后,当前web页面就刷新了一次,导致拍照的图片无法选择上传:但是如果直接从相册中选择图片,则不会出现这个 ...

  7. 32位与4G内存限制

    32位有4G内存限制,好像人所共知.但这个32位是指32位的CPU还是32位的操作系统? 答案是,都是.内存限制,是操作系统和硬件(CPU,也许还有内存控制器)共同制约的.CPU对应的是寻址物理地址, ...

  8. 安卓Android的内存管理原理解析

    Android采取了一种有别于Linux的进程管理策略,有别于Linux的在进程活动停止后就结束该进程,Android把这些进程都保留在内存中,直到系统需要更多内存为止.这些保留在内存中的进程通常情况 ...

  9. [No0000154]详解为什么32位系统只能用4G内存.

    既然是详解, 就从最基础的讲起了. 或者1来存储数据的, 所以Bit实际上可以看成存放1个二进制数字的1个位置.也就是说bit只有2种值, 0 或者 1, 所以1个bit能存放1个布尔类型的值(boo ...

  10. 详解为什么32位系统只能用4G内存.

    本文转自:https://www.cnblogs.com/nvd11/archive/2013/04/02/2996784.html,感谢作者的干货 既然是详解, 就从最基础的讲起了. 1. Bit( ...

随机推荐

  1. git的回退以及合并,删除什么的

    有时候不小心合并了别的分支中的commit.我们需要回退某些提交记录.可以通过reset来操作,reset 会回退到指定commit.这种方式会删除记录,我们最好使用revert命令来操作 git r ...

  2. pymysql安装后使用报错处理

    1.django启动报错: Error loading MySQLdb module. Did you install mysqlclient? 原因:初次安装配置pymysql时需要在__init_ ...

  3. PerfDog的使用教程

    一.介绍: 移动全平台iOS/Android性能测试.分析工具平台,快速定位分析性能问题.PerfDog支持移动平台所有应用程序(游戏.APP应用.浏览器.小程序.小游戏.H5.后台系统进程等).An ...

  4. NX二次开发 拔模增量计算工具

    在塑胶模具设计行业拔模增量计算经常都需要用到,平常都是利用计算器工具或者外部的计算工具去算.曾经有一个模具设计的培训老师把拔模增量计算工具称为模具设计的神器,好吧,我也造个神器.-_-! VS2019 ...

  5. 安装单机版k8s

    1.配置yum源,博主使用华为的镜像源 选择不同的系统版本下载使用: 2.安装etcd,kubernetes yum -y install etcd kubernetes 3.修改kubernetes ...

  6. Vue的官方脚手架 Vue-cli 安装使用解析

    ------------恢复内容开始------------ 1.首先什么是vue-cli 可以知道Vue-cli是一个官方提供的脚手架,主要作用是用来快速搭建Vue的项目模板,可以预先定义好项目的结 ...

  7. Linux 基础命令2

    一.输出重定向命令 : > />> 1.ls > 1.txt 把命令返回的结果输出到文件中,会覆盖之前的数据,默认情况命令返回的结果显示在屏幕中: 2.Ls >1.txt ...

  8. vite不能用@做为路径的解决方法

    vite创建vue3后,发现原来用@做为路径的不能用了,报错信息是 Internal server error: Failed to resolve import "@ 在网上查了一下资料, ...

  9. VMware虚拟机迁移至Xen

    1.VMware虚拟机导出OVF文件. 2.从Citrix Xencenter导入OVf文件 3.导入时,检查Local storage disk 下disk是否正确,如果曾导入失败,重复导入会产生多 ...

  10. MFC 与 C++ 类型转换

    C++ 中到的类型转换很多,先记录下来,多了写成一个类 1.CString转int 1 CString cNum="9527"; 2 int iNum = 0; 3 iNum=at ...