实战精选|树莓派跑 LLM 难上手?也许你可以试试 Intel 哪吒开发板

2024/12/04 09:00
阅读数 65

点击蓝字

关注我们,让开发变得更有趣


OpenVINO™


大型语言模型(LLM)通过其卓越的文本理解与生成能力,为机器智能带来了革命性的进步。然而,这些模型的运行通常需要消耗大量的计算资源,因此它们主要部署在性能强大的服务器上。


随着技术的发展和边缘计算的兴起,现在有潜力在更小巧、便携的设备上部署这些模型。例如,Raspberry Pi 树莓派和 Intel 哪吒开发套件等单片机。尽管体积小巧,但它们具备足够的能力运行某些精简版本的模型。本文就两款单片机上运行LLM做一个对比,先尝试在 Raspberry Pi 4B 运行大模型,然后将该方案在 Intel 哪吒开发板重建


OpenVINO™


Raspberry Pi4 上运行大模型 Qwen2 0.5B


一般情况下,模型需要两倍内存大小才能正常运行。因此,本方案使用的 8GB 的 Raspberry Pi4 4B 来做推理。


1.1 环境部署

#部署虚拟环境 sudo apt update && sudo apt install git mkdir my_project cd my_projectpython -m venv env source env/bin/activate #下载依赖库 python3 -m pip install torch numpy sentencepiece sudo apt install g++ build-essential #下载llama.cpp代码库 git clone https://github.com/ggerganov/llama.cpp #编译环境 cd llama.cpp make

1.2 模型下载

树莓派 4b 的 8GB RAM,即使树莓派5,都不太适合做模型的量化。只能在PC机上做好量化后,再把量化后的模型文件拷贝到树莓派上部署。具体方式是使 用 LLaMA.cpp 中的 convert-hf-to-gguf.py 将原模型转化成 GGUF 格式。


鉴于 Raspberry Pi 只有 CPU,我们需要优先考虑可以在 CPU 上运行的模型。本次选择的大模型是 Qwen2 0.5B。


Qwen2 0.5B 是阿里云开源的新一代大语言模型,模型规模为 0.49B 参数,支持最长达 32K tokens 的上下文长度,在多个评测基准上表现优异,超越了 Meta 的 Llama-3-70B。


这里我们直接从魔搭社区魔搭社区下载已经量化过的 GGUF 模型文件。

#模型下载 wget https://www.modelscope.cn/models/qwen/Qwen2-0.5B-Instruct-GGUF/resolve/master/qwen2-0_5b-instruct-q5_k_m.gguf


1.3 模型运行

大模型推理引擎使用的是 llama.cpp,实现模型推理对话。

./llama-cli -m /home/pi/qwen2-0_5b-instruct-q5_k_m.gguf -n 512 -co -i -if -f ../../prompts/chat-with-qwen.txt --in-prefix "<|im_start|>user\n" --in-suffix "<|im_end|>\n<|im_start|>assistant\n" -ngl 24 -fa


1.4 总结


经过一番折腾,配置环境和编译,耗去了几天时间,树莓派终于成功运行大模型了。虽然可以,但比较吃力。看了网上其他人的尝试,即使换用具有更强大处理能力的树莓派5,运行作为资源有限设备设计的 Phi-2-Q4(27亿参数),由于没有 GPU 支撑,所以速度也只有5.13 tokens/s。


所以说,树莓派5在处理速度上相较于4B有了显著提升,但在处理大型 LLM 时仍受到诸多限制。总结树莓派跑大模型的痛点:一是它无法做模型量化,要么在本地PC机上做好量化再拷贝过来,要么直接下载使用 GGUF 模型文件。二是它只有 CPU,计算能力的提升空间基本被锁死了。如果要在树莓派上跑模型,只能选用内存占用较小且仅在 CPU 上运行的模型。


看网上有高人设想了一些解决方案,比如:


  1. 将树莓派上的小 GPU 用起来。树莓派5有个 VideoCore GPU,支持 Vulkan 编程,而 llama.cpp 也有 Vulkan 后端,理论上是有可能的。但运行上有些问题,包括死锁、输出乱码等,推测可能和 shader 有关,还需要进一步研究。


  2. 用类似 T-MAC 的方法,加速树莓派 CPU 的推理。T-MAC 提出用 look-up table (LUT) 代替计算,对于低比特量化的模型会很有帮助。例如 4-bit 相乘,只需要一个16x16的表就能预存所有可能的结果,把乘法变成了查表。


  3. 采用新的更高效的模型架构,例如RWKV?
    但这些方法都还只是停留在理论设想阶段,没有落地实践,那为什么不直接试下 Intel 哪吒呢


OpenVINO™


Intel 哪吒开发套件上运行大模型 Qwen 2.5


Intel 哪吒开发套件搭载了英特尔N97处理器(3.6GHz),配备64GB eMMC存储和8GB LPDDR5内存。英特尔N97处理器属于 Intel Alder Lake-N 系列,采用仅 E-Core 的设计,专为轻量级办公、教育设备和超低功耗笔记本电脑设计,成本和功耗更低,更适合嵌入式设备。



关键点来了!Intel 哪吒最大的优势就是自带集成显卡,Intel UHD Graphics,我们可以在 iGPU 上使用 OpenVINO™ 来运行大模型。


说干就干!


2.1 安装 OpenVINO™ 配置环境

2.1.1 安装 OpenVINO™

从 OpenVINO™ 官网下载 linux 版本的压缩包,再解压,安装依赖,配置环境变量。

#解压 tar -zxvf l_openvino_toolkit_ubuntu22_2024.3.0.16041.1e3b88e4e3f_x86_64.tgz #安装依赖包 cd l_openvino_toolkit_ubuntu22_2024.3.0.16041.1e3b88e4e3f_x86_64/ sudo -E ./install_dependencies/install_openvino_dependencies.sh #配置环境变量 source ./setupvars.sh


2.1.2 安装 OpenCL runtime packages

既然我们要充分发挥 Intel 哪吒的集成显卡优势,就还要另外安装 OpenCL runtime packages 来把模型部署到iGPU上。具体参考官方文档,Configurations for Intel® Processor Graphics (GPU) with OpenVINO™ — OpenVINO™ documentation参考网上经验,我使用deb包的方式进行安装,从 https://github.com/intel/compute-runtime/releases/tag/24.35.30872.22  先下载11个 deb 包到开发板上,然后再 dpkg 安装。

#Create temporary directorymkdir neo#Download all *.deb packagescd neowget https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17537.20/intel-igc-core_1.0.17537.20_amd64.debwget https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17537.20/intel-igc-opencl_1.0.17537.20_amd64.debwget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-level-zero-gpu-dbgsym_1.3.30872.22_amd64.ddebwget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-level-zero-gpu-legacy1-dbgsym_1.3.30872.22_amd64.ddebwget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-level-zero-gpu-legacy1_1.3.30872.22_amd64.debwget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-level-zero-gpu_1.3.30872.22_amd64.debwget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-opencl-icd-dbgsym_24.35.30872.22_amd64.ddebwget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-opencl-icd-legacy1-dbgsym_24.35.30872.22_amd64.ddebwget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-opencl-icd-legacy1_24.35.30872.22_amd64.debwget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/intel-opencl-icd_24.35.30872.22_amd64.debwget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/libigdgmm12_22.5.0_amd64.deb #Verify sha256 sums for packageswget https://github.com/intel/compute-runtime/releases/download/24.35.30872.22/ww35.sumsha256sum -c ww35.sum #install required dependenciesapt install ocl-icd-libopencl1 #Install all packages as rootsudo dpkg -i *.deb



2.2 模型下载和转换量化

2.2.1 模型下载

本次采用的大模型是 Qwen 2.5-0.5B。Qwen2.5 是阿里通义团队近期最新发布的文本生成系列模型,基于更富的语料数据集训练,相较于 Qwen2,Qwen2.5 获得了显著更多的知识(MMLU:85+),并在编程能力(HumanEval 85+)和数学能力(MATH 80+)方面有了大幅提升。此外,新模型在指令执行、生成长文本(超过 8K 标记)、理解结构化数据(例如表格)以及生成结构化输出特别是 JSON 方面取得了显著改进。Qwen2.5 模型总体上对各种 system prompt 更具适应性,增强了角色扮演实现和聊天机器人的条件设置功能。Qwen2.5 语言模型支持高达 128K tokens,并能生成最多 8K tokens 的内容。本次使用的是指令调优的0.5B模型,其特点如下:


类型:因果语言模型
训练阶段:预训练与后训练
架构:使用 RoPE、SwiGLU、RMSNorm、注意力 QKV偏置和绑定词嵌入的 transformers
参数数量:0.49亿
非嵌入参数数量:0.36亿
层数:24
注意力头数(GQA):查询14个,键值对2个
上下文长度:完整32,768token,生成最多8192token


下载模型首选魔搭社区,直接下载到 Intel 哪吒开发板上。

#安装lfsgit lfs install#下载模型git clone https://www.modelscope.cn/qwen/Qwen2.5-0.5B-Instruct.git


2.2.2 模型转换量化

在部署模型之前,我们首先需要将原始的 PyTorch 模型转换为 OpenVINO™ 的 IR 静态图格式,并对其进行压缩,以实现更轻量化的部署和最佳的性能表现。


(1)环境配置

新建一个虚拟环境,安装依赖。

python3 -m venv openvino_env source openvino_env/bin/activate python3 -m pip install --upgrade pip pip install wheel setuptools pip install -r requirements.txt


(2)转换和量化

通过 Optimum 提供的命令行工具 optimum-cli,我们可以一键完成模型的格式转换和权重量化任务。

optimum-cli export openvino --model './local_dir' --task text-generation-with-past --weight-format int4 --group-size 128 --ratio 0.8  Qwen2.5-0.5B-Instruct-int4-ov


我们也可以根据模型的输出结果,调整其中的量化参数,包括:


--weight-format:量化精度,可以选择fp32,fp16,int8,int4,int4_sym_g128,int4_asym_g128,int4_sym_g64,int4_asym_g64
--group-size:权重里共享量化参数的通道数量
--ratio:int4/int8 权重比例,默认为1.0,0.6表示60%的权重以 int4 表,40%以 int8 表示
--sym:是否开启对称量化



经过一个稍微漫长的等待,终于,转换成功! 



2.2.3 模型部署

OpenVINO™ 目前提供两种针对大语言模型的部署方案,一种是基于 Python 接口的 Optimum-intel 工具来进行部署,可以直接用 Transformers 库的接口来部署模型;另一种是 GenAI API 方式,它同时支持 Python 和 C++ 两种编程语言,安装容量不到200MB,提供更极致的性能和轻量化的部署方式,更适合边缘设备上部署大模型。


本文采用的是后者,即 GenAI API 方式。GenAI API 提供了 chat 模式的构建方法,通过声明  pipe.start_chat() 以及 pipe.finish_chat(),多轮聊天中的历史数据将被以 kvcache 的形态,在内存中进行管理,从而提升运行效率。


1.创建一个 python 文件。命名为chat_genai.py

import argparseimport openvino_genai

def streamer(subword): print(subword, end='', flush=True) return False
if __name__ == "__main__": parser = argparse.ArgumentParser(add_help=False) parser.add_argument('-h', '--help', action='help', help='Show this help message and exit.') parser.add_argument('-m', '--model_path', required=True, type=str, help='Required. model path') parser.add_argument('-l', '--max_sequence_length', default=256, required=False, type=int, help='Required. maximun length of output') parser.add_argument('-d', '--device', default='CPU', required=False, type=str, help='Required. device for inference') args = parser.parse_args() pipe = openvino_genai.LLMPipeline(args.model_path, args.device)
config = openvino_genai.GenerationConfig() config.max_new_tokens = args.max_sequence_length
pipe.start_chat() while True: try: prompt = input('question:\n') except EOFError: break pipe.generate(prompt, config, streamer) print('\n----------') pipe.finish_chat()


2.运行流式聊天机器人

python3 chat_genai.py --model_path {your_path}/Qwen2.5-0.5B-Instruct-ov --max_sequence_length 4096 --device GPU

--model_path - OpenVINO IR 模型所在目录的路径。

--max_sequence_length - 输出标记的最大大小。

--device - 运行推理的设备。例如:"CPU","GPU"。


我们来问它一个简单的问题吧,让它自我介绍一下,看看它能不能答出来。 



可以,它对自己有个清晰的认识,阿里巴巴开发的大语言人工智能模型。


OpenVINO™


Intel 哪吒开发套件上运行大模型 Phi-3.5-mini


还不死心,继续上难度,再换一个尺寸更大的模型,看看 Intel 哪吒是否 hold 住?


这次我们选用的是 Phi-3.5-mini,它是微软推出的新一代 AI 模型系列中的轻量级模型,专为资源受限的环境设计,特别适合在资源受限的环境中进行复杂的语言处理任务。该模型具有以下特点:


(1)模型参数和结构:

  • Phi-3.5-mini 拥有38亿参数,是一个密集的仅解码器Transformer模型,使用与Phi-3 Mini相同的分词器。

  • 该模型基于Phi-3的数据集构建,包括合成数据和经过筛选的公开网站数据,重点关注高质量、推理密集的数据。

(2)应用和性能:

  • Phi-3.5-mini 特别适合在嵌入式系统和移动应用中进行快速文本处理和代码生成。

  • 该模型在基准测试中的表现超越了GPT4o、Llama 3.1、Gemini Flash等同类模型,显示出其强大的性能。

(3)设计目标和适用场景:

  • 针对基础快速推理任务设计,适合在内存和算力受限的环境中运行,支持128k上下文长度。

  • 该模型在处理长达128K个token的长上下文方面表现出色,这使其在多种语言处理任务中都非常有效。

(4)技术优势:

  • 经过严格的增强过程,包括监督微调和直接首选项优化,以确保精确地遵循指令和实施可靠的安全措施。

  • 支持多语言处理和多轮对话能力,优化了处理高质量、推理密集数据的能力。


3.1 下载模型

然后输入这次我们偷懒一下,直接下载已经转换好的 IR 文件到 Intel 哪吒开发板上。以下代码,即可自动下载安装所有需要的库。


参数规模 3.8B 的 Phi-3.5-mini,转换成 IR 格式后,模型大小为 2.5G。



3.2 运行流式聊天机器人

继续采用 GenAI API 方式,用 iGPU 推理。

python3 chat_genai.py --model_path {your_path}/Phi-3-mini-4k-instruct-int4-ov --max_sequence_length 4096 --device GPU


这次问它一个难一点的问题,比较一下python和rust两种编程语言的优劣



Phi-3.5 模型真的名不虚传!简直人生开挂了,输出速度目测每秒 10个token,整整持续输出了二十多分钟,共2903字,算上标点符合16285个。 



令人难以想象这是在一个单片机上跑大模型的效果,要么是 Phi-3.5 模型,要么是 Intel 哪吒厉害,要么是微软和英特尔联手特别厉害! 


OpenVINO™


总结与鸣谢备


在 Intel 哪吒开发套件上,配合 OpenVINO™,可以非常快速便捷的离线部署大模型,特别是一些SLM模型,非常适合做智能硬件的开发,很好地赋能创客基于成熟硬件,打造端云协同的AI应用。或者重新定义全新硬件,开发软硬件一体的AI产品。


最后,再次感谢 Intel 组织的这次 2024 Intel®“走近开发者”互动活动让我有机会能试用到哪吒开发套件,也感谢 OpenVINO™ 的实战 workshop,给我们这么好用的大模型工具


参考文档:


1、实战精选 | 5分钟利用 OpenVINO™ 部署 Qwen2.5

2、开发者实战丨如何利用 OpenVINO™ 部署 Phi-3.5 全家桶


OpenVINO™


---------------------------------------

*OpenVINO and the OpenVINO logo are trademarks of Intel Corporation or its subsidiaries.

-----------------------------

 OpenVINO 中文社区 

微信号 : openvinodev

B站:OpenVINO中文社区

“开放、开源、共创”

致力于通过定期举办线上与线下的沙龙、动手实践及开发者交流大会等活动,促进人工智能开发者之间的交流学习。



 点击 “ 在看 让更多人看见

本文分享自微信公众号 - OpenVINO 中文社区(openvinodev)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部