就在前几天,也就是2024年2月21日,谷歌发布了号称“全球性能最强大、轻量级”的开源大模型Gemma,中文意思是“宝石”。
谷歌的Gemma 大模型有两个尺寸版本, 分为2B版本(2 Billion,20亿个参数)和7B( 7 Billion, 70亿个参数)版本, 根据谷歌自己的测试, Gemma 模型在18个语言理解、推理、数学等关键基准测试中, 基准测试平均得分为56.4, 超过Meta Llama-13B、Mistral-7B等模型, 是目前最为强大的开放语言大模型。
谷歌的Gemma 模型除了性能强大之外, 还有支持多种框架工具,跨设备兼容性强等特点, 这一点尤其值得称道。 谷歌Gemma 模型可以运行在例如笔记本,台式机, IoT, 移动设备和云等多种流行的设备之上, 为AI的兼容性提供了很好的支持。
在上一篇文章中,我们体会了在我们的笔记本上运行Gemma,在这里, 我们来实验一下如何把Gemma运行在树莓派, 这里用到的设备是树莓派4b, 8G 版本。
这里的树莓派4b是我之前购买的,树莓派4b CPU的参数为: 4核 64为 ARM Cortex-A72 架构。吃灰了小半年时间, 现在拿出来实验一下Gemma吧。
技术栈:Rust+Wasm= AI无处不在为什么会选用Rust + Wasm这一套技术栈呢?
首先是因为我们想在IoT 设备上运行大语言模型,在物联网世界中, 树莓派成名已久,得到了广泛的使用, 但是树莓派本身的性能还是比较有限, 为了最大限度的发挥树莓派本身的计算能力, 首先就需要选择那些能最大程度发挥硬件本身能力的语言,这里面的首选WebAssembly技术栈, 具体来说是Rust + Wasm, 和大语言模型交互部分的代码部分采用Rust 编写, 编译成wasm 代码后, 再由Web Assembly 的运行时WasmEdge 来执行。
为什么要选择Rust+Wasm呢, 这就是Rust 本身的高性能的原因了, Rust 编译的程序有着C++的本地性能, 而且语言本身内存安全, 因此选择Rust 是毫不奇怪的。这里没有选择Python, 尽管Python在人工智能的研究者当中有着广泛的应用, 但是, 就Python的执行效率来说, 跟Rust 比起来的话,还是得很远。
说Python 执行速度很慢是有根据的, 这里不得不提一个人,Chris Lattner, 这个人可能很多人不太了解, 毕竟是专攻计算机行业最底层,编译器这个方向的, 论名气他不是很显著,但是听听下面的简历,就知道这哥们有多牛了: 计算机编译器行业公认的大佬, LLVM创始人之一, Clang编译器的作者, 苹果公司Swift语言的创始人。
书归正传,Chris Lattner就认为, Python 语言是解释性语言, 执行效率简直弱爆了, 跟他最近发明的Mojo 语言(一门专门面向AI的编译性语言)相比, Python的执行速度要慢35000倍!注意,不是35倍,也不是3500倍,而是35000倍!
由于Python 这种糟糕的执行速度, 迫使更多的AI 行业的开发人员选择了能执行本地代码编译的语言, 例如C, C++, Rust 等。 这方面看一看AI 行业最近流行的项目, llama.cpp, whisper.cpp, llama2.c 等等, 都没有选择Python。
而Rust, 则是编程界冉冉升起的明星语言!关于Rust 连续8年荣任最受开发者喜欢的语言啊, 微软又有什么项目选择使用Rust 啊,这些故事这里就不讲了, 总而言之, 对性能和安全性有着比较高的要求的项目,选择Rust 就对了!
而Web Assembly作为一个基于堆栈式虚拟机的二进制语言指令格式, 具有接近本地代码的高性能、跨平台、多语言的支持, 编译后的wasm代码,体积小,指令执行效率高,既可以在浏览器端运行,也可以在云原生的容器环境里运行, 最近更是在AI 开发领域崭露头角, 被多家大公司所采用。
毕竟, Rust 写的代码做不到跨平台, 可是编译成wasm 代码就可以了啊! 又高效又跨平台, 一个功能只写一遍, 就可以既在浏览器里运行, 还可以在云环境中执行, 我们这里还即将展现wasm 在物联网设备中的应用。
好了, 技术选型这块就讲到这里了, 下面具体来看一下怎么执行吧。
环境配置与软件安装我的树莓派选择的操作系统是Ubuntu 20.04, 之前安装Raspberry Pi OS 的时候, 有些软件是安装不成功, 因此后续基于Ubuntu 20.04 。
安装LlamaEdgeLlamaEdge就是前面所说的Rust+Wasm的技术栈, 按照其官方介绍, LlamaEdge 是目前在本地运行的最简单、最小和最快的大语言模型(LLM)运行时和基于LLM的API Server。
LlamaEdge 官网的内容,关键点就这么几个字: 快!简单! 小!轻量级!跨设备!这些就不用多说了。
简单安装一下:
curl -sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash -s -- --plugin wasi_nn-ggml留意⚠️,最后面的--plugin 不要漏掉,这是WebAssembly的系统运行接口(WASI) 和大模型交互的关键模块!后续慢慢再讲这些细节。
在树莓派上开始安装:
下载的过程有点慢, 好在最后顺利安装完成。
安装完成之后, 剩下的工作就是下载大模型和执行wasm 代码。
为了对LlamaEdge有一个清楚的认识, 先来看看LlamaEdge的整体架构。
LlamaEdge 整体架构LlamaEdge 本身是开源的, 整体上是架构在WasmEdge之上的:
WasmEdge 是什么,可能有些人还不太知道。这里插播一下。
按照WasmEdge 官网的定义:
WasmEdge 是一个轻量级、高性能且可扩展的 WebAssembly 运行时,适用于云原生、边缘和去中心化应用程序。 它为无服务器应用程序、嵌入式功能、微服务、智能合约和物联网设备提供支持。
因此, WasmEdge 首先是一个独立的wasm 代码的运行时(runtime), 简单理解就跟Node.js 一样,可以直接执行wasm 代码。
回顾一下, wasm 有三种运行环境, WasmEdge就属于第一种的运行时, 不过WasmEdge 属于CNCF云原生基金会支持的sandbox 项目,项目设计之初的目标环境是云原生和边缘设备。
在LlamaEdge 项目中, WasmEdge 是作为底层的运行时而存在的, WasmEdge 又通过WASI-NN 插件中的API, 和大模型进行交互,根据用户的输入构建Prompt, 同时把大模型的回复返回给接口层。
其交互过程如下:
下载模型LlamaEdge所需要的大模型文件, 格式为GGUF, 目前需要手动从huggingface网站下载, 这也就是为什么在LlamaEdge 的介绍图片上,都有huggingface的存在。 huggingface 作为一个model hub ,为了大模型开发者、研究者的共享提供了便利。
在huggingface的网站上,可以看到, LlamaEdge 目前支持的大模型有53种, 还是很丰富的。
在这里,我们需要下载Google的Gemma 模型,下载模型是很容易的,执行下面的语句:
curl -LO https://huggingface.co/second-state/Gemma-7b-it-GGUF/resolve/main/gemma-7b-it-Q5_K_M.ggufcurl -LO https://huggingface.co/second-state/Gemma-2b-it-GGUF/resolve/main/gemma-2b-it-Q5_K_M.gguf谷歌Gemma 模型有两个系列,我们这里的运行环境是树莓派,因此选择2b
感觉LlamaEdge 的好处在于,模型文件是可以单独下载的, 这样就不受限于网络, 如果下载的比较慢, 可以直接从别处复制,本文用到的文件我已经转存到百度网盘(https://pan.baidu.com/s/1aUcMhcvuGReM3WpLc46Qbg), 有需要的留言获取密码。
下载命令行聊天bot有了模型之后,下一步就是使用LlamaEdge提供的聊天程序,对大模型进行提问。目前LlamaEdge 有两个Bot, 基于命令行的和基于Web 页面的。
对于树莓派而言,我们先使用命令行的bot, 下载:
curl -LO https://github.com/LlamaEdge/LlamaEdge/releases/latest/download/llama-chat.wasm值得称道的是, 这个命令行bot也是开源的,你可以到这里参考源代码(https://github.com/second-state/llama-utils/tree/main/chat)
下载完wasm 之后,下一步就是执行这个wasm 代码,同时指定要访问的大模型文件:
wasmedge --dir .:. --nn-preload default:GGML:AUTO:gemma-2b-it-Q5_K_M.gguf llama-chat.wasm -p gemma-instruct -c 4096因为这个程序是使用Rust 开发的,因此语法可能稍微有些奇特, 不用理会, 来看效果:
这个视频中,我先提问了一个问题: 为什么天空是蓝色的, 默认的回答是英语。
然后,我在命令行中, 提示Gemma 把刚才的回答翻译成中文:
总结通过上面的两个例子可以看出, 谷歌Gemma 大模型已经成功在树莓派上开始执行, 尽管速度有点慢, 这个也是为了展现Rust+Wasm技术栈的能力。
使用LlamaEdge 这一个技术, 如果换用树莓派5b 8G 内存的那一款,按照树莓派5b的处理性能增强2~3倍来估算, Gemma的响应速度应该还可以继续提升, 树莓派上运行大模型也是可行的, 对于一些边缘计算的场景, 例如一些需要智能处理的项目,这个也是可以值得考虑的方案之一。
这也印证了标题的那句话:
Rust+Wasm= AI无处不在!