共计 1596 个字符,预计需要花费 4 分钟才能阅读完成。
从 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,荣誉证书、定制礼品享不停。