嵌入式AI学习打卡 01

69 阅读3分钟

适合谁看:资深的嵌入式系统底层专家。技能栈(C、SoC、Bootloader、驱动、系统移植、DSP优化、Cache调优、功耗分析)是芯片设计的核心和基础,具备从硬件(SoC)底层固件(ROM Bootloader)再到操作系统层(驱动、RTOS)的全栈知识和实战经验,希望向嵌入式场景的AI部署方向拓展,寻求新的发展空间。


看了一些资料,也做过大模型本地部署;现在看来基本的技术路线就是pytorch/tensorflow等python模型框架+onnxruntime,或者llama+llama.cpp;

两种路径都支持纯CPU部署,不过llama.cpp直接用cpp实现算子,或许要有优势些;不过对用户来说,多数场景下并没有明显的体验差异。

哦,得记一下llama和onnx runtime这两玩意是啥。这两个都是大模型的推理引擎,就是说负责在指定平台上运行训练好的大模型(推理,或者就说部署吧)。但是两个的设计用途不同,onnx早就有了,设计目标就是适配各种框架,就不管你是用什么框架训练的,只要能用onnx文件描述,那就能用onnx runtime推理。

而llama.cpp就专门用来做llama架构的大模型推理,而且面向消费级的平台做优化,所以没有显卡的话,首选这个没错的。


部署流程也类似,onnx方案就把训练好的模型导出成onnx文件,作为onnx runtime的输入,需要用cpp写个调用程序,解析运行onnx描述的模型。

llama的话,从hugging face上下一个gguf格式的文件,作为llama.cpp的输入。

这就涉及到gguf和onnx格式的区别了,这就还得回到模型描述的原理说起

image.png

看上面这个从onnx文档里抠出来的杂草图(想看onnx runtime结果看了半天onnx的文档,服了)。你大概能明白网络呢就是这样的,有很多个节点,不管他们的关系有多么复杂,每个节点都有输入输出的,只要能够说清楚每个节点的输入输出、类型、数量啥的,还有整个网络的输入输出、类型、数量,那描述清楚一整个网络也不是啥问题吧?

onnx就是这样的,它从节点出发,构造图,然后用图构造网络,完事。

推广一下,其它的也类似,就是一种描述网络/模型的规则。gguf是一种更专用的,onnx是一种更通用的。想起来,可以从onnx的名字去理解 Open Neural Network eXchane嘛,开发神经网络交换,就是希望不用把训练那套全提供给其他人,只要拿到onnx这种描述文件就能部署。

emm,从训练结果到onnx文件的过程叫做序列化,这个方法由框架提供,比如pytorch提供一torch.onnx.export方法把训练好的网络序列化成onnx文件。

参考

  1. ONNX Runtime | Models
  2. www.llama.com
  3. huggingface.co/