本文提出了mllm-NPU,这是第一个有效利用设备上神经处理单元(NPU)卸载的LLM推理系统。mllm-NPU的主要设计目标是减少预填充延迟和能耗。它针对主流的仅解码器的变压器架构的LLM(例如LlaMA、GPT等)。关键思想是最大限度地在移动NPU上执行预填充,以加速整数计算,同时保持在CPU/GPU上执行必要的浮点操作以保持准确性。为了克服上述挑战并提高NPU卸载效率,mllm-NPU在三个层面上重构了提示和模型:(1)在提示层面:mllm-NPU将可变长度的提示分割成多个固定大小的块,同时保持数据依赖性;(2)在张量层面:mllm-NPU识别并提取重要的异常值以在CPU/GPU上运行;(3)在块层面:mllm-NPU根据硬件亲和性和对准确性的敏感度将变压器块调度到CPU/GPU和NPU。
mllm-NPU系统设计概述
mllm-NPU是一个创新的大型语言模型(LLM)推理系统,专为移动设备上的神经处理单元(NPU)优化。该系统的主要设计目标是减少预填充(prefill)阶段的延迟和能耗,同时保持推理精度。mllm-NPU通过在算法和系统设计上的协同优化,有效地解决了LLM架构与现代NPU设计之间的语义差异。
mllm-NPU的工作流程包括准备阶段和执行阶段。在准备阶段,mllm-NPU使用增强的张量级量化算法将LLM量化为W8A8格式,并生成固定长度的分块共享图,以高效处理变长提示。在执行阶段,mllm-NPU将接收到的提示分割成固定大小的块,并按照因果关系处理这些块。这些块图会根据它们的数据格式被分割成子图,并根据硬件亲和性和精度敏感性在CPU/GPU和NPU之间进行调度。
三大创新技术详解
1. 分块共享图
mllm-NPU通过引入分块共享图来应对动态提示长度的挑战。这种方法基于对LLM操作符的两种分类:静态操作符和动态操作符。静态操作符如线性层和层归一化,可以跨不同块共享;而动态操作符如注意力机制,依赖于块长度和序列,不能共享。通过这种方式,mllm-NPU将LLM分解为多个子图,共享子图一次构建和优化,非共享子图则针对不同块单独构建。这种方法显著减少了内存开销,并提高了可扩展性。
2. 影子离群值执行
为了在不牺牲LLM精度的前提下实现NPU友好的张量级激活量化,mllm-NPU采用了影子离群值执行技术。该技术在运行时将具有离群值的激活通道提取到一个更紧凑的张量中,在CPU上执行,并将结果合并回NPU上的原始操作符结果中。这种设计不仅解决了离群值的问题,还优化了内存使用,并减少了CPU和NPU之间的同步开销。
3. 无序子图执行
mllm-NPU采用无序子图执行策略来优化执行效率。通过在块和子图级别进行分区后,LLM子图可以不按块序列顺序执行。这种策略显著扩大了调度空间,最小化了由于CPU/GPU浮点操作引起的执行泡沫。mllm-NPU利用在线启发式算法,在保证正确性的前提下,动态选择执行顺序,从而最大化NPU的利用率并最小化CPU/GPU的工作负载影响。
实现与评估
1. 实现
mllm-NPU的实现涉及多个关键技术,包括分块共享图、阴影异常执行和乱序子图执行。这些技术共同优化了移动NPU的加载效率,显著提高了预填充速度和能效。
2. 评估
mllm-NPU的性能通过与多个基线系统的比较得到验证。实验结果显示,无论是在预填充速度、能耗还是端到端推理延迟方面,mllm-NPU都显著优于现有技术。
性能分析
mllm-NPU的性能优势主要源于其创新的设计和优化策略。通过在移动NPU上最大化整数运算的执行,同时在CPU/GPU上处理必要的浮点运算,mllm-NPU不仅提高了执行速度,还降低了能耗。
总之,mllm-NPU通过一系列创新技术,显著提高了移动设备上大型语言模型的推理性能,为实现高效、低能耗的移动设备端LLM推理提供了有效解决方案。
准确性与内存消耗
1. 准确性保持
mllm-NPU系统在实现高效的NPU卸载的同时,保持了较高的准确性。与FP16相比,准确性损失不到1%,这在实际应用中是可接受的。这得益于其创新的技术,如影子离群值执行(shadow outlier execution),它允许在CPU上以浮点精度处理离群值,从而保持了高准确性。此外,mllm-NPU与其他基线模型相比,在保持准确性的同时,显著提高了执行效率。
2. 内存消耗
尽管mllm-NPU引入了一些额外的内存开销,例如为离群值执行加载的浮点权重,但这些开销相对较小,仅占总内存的0.6%至1%。此外,通过共享图(chunk-sharing graph)技术,mllm-NPU显著减少了内存需求,因为它允许在不同的执行块之间共享静态操作符。这种方法不仅减少了内存占用,还提高了内存使用的效率。
本文转载自,作者: