LlamaPi展示了一个在树莓派上运行的大模型语音交互机器人,用户能够用语音聊天的方式控制小机械臂,执行一些简单的动作。项目的特点包括:
本地运行Llama-3.1 8B,也支持云端大模型
本地运行语音识别(ASR)
本地运行语音合成(TTS)
大模型会根据对话的上下文,生成相应的机械臂动作,例如当用户打招呼时,会执行一个“greet”动作
LlamaPi项目地址:https://github.com/zhoupingjay/LlamaPi
LlamaPi硬件使用了一个8GB内存的树莓派5,一个6自由度的玩具机械臂(PWM伺服),用树莓派的PWM伺服扩展板驱动。
LlamaPi的交互模式是类似对讲机的push-to-talk,用GPIO接了一个2-pin按钮来控制,用户按下按钮讲话,讲完后放开按钮,完成语音输入。输入的语音通过ASR转成文字,由大模型处理生成回答和机械臂命令,回答的部分由TTS合成成语音播放,机械臂命令则翻译成I2C指令,驱动机械臂完成动作。
大模型推理引擎使用的是llama.cpp,Llama-3.1 8B经过4-bit量化后,参数大约4.7GB,能够在8GB的设备上运行。
一些针对语音交互的优化,例如让大模型生成适合口语的回答,生成短的句子等。使用云端大模型的版本可以用更复杂的提示词,因此也有更多这方面的优化。
LlamaPi最大的挑战,是在树莓派5上本地运行Llama-3.1 8B大模型。经过4-bit量化后,8B模型能够在8GB内存里运行,但目前的生成速度只有1.8 token/s。为此LlamaPi采取了一些措施来缓解其对用户体验的影响:
限制系统提示词的长度
限制回答长度(让大模型将回答限制在30字以内)
本地运行时,将对话历史限制在1轮,以缩短prefill时间
启动时预热,将系统prompt的KV Cache提前算好
采用streaming方式生成,每生成一句句子,就马上用TTS合成语音播放,而不是等所有句子都生成完再合成,这样可以让用户更早的听到语音回答
这些措施对缓解生成速度带来的影响有一定帮助,但并不能真正解决问题。要真正让大模型在树莓派这类端侧设备上运行起来,还有很多工作需要做。几个可能的方向:
1. 将树莓派上的小GPU用起来。树莓派5有个VideoCore GPU,支持Vulkan编程,而llama.cpp也有Vulkan后端,理论上是有可能的。根据目前的试验,Llama-3.1 8B可以卸载20层到VideoCore上(一共32层),但运行还有些问题,包括死锁、输出乱码等,推测可能和shader有关,还需要进一步研究。
2. 用类似T-MAC的方法,加速树莓派CPU的推理。T-MAC提出用look-up table (LUT) 代替计算,对于低比特量化的模型会很有帮助。例如4-bit相乘,只需要一个16x16的表就能预存所有可能的结果,把乘法变成了查表。这个方向感觉也值得进一步探索。
3. 采用新的更高效的模型架构,例如RWKV?
总的来说,LlamaPi是一个将大模型、语音和机器人在端侧设备结合起来的一个尝试,展示了端侧大模型+机器人的潜力。同时也可以看到,端侧大模型还有很多工作需要做。