
1. 端侧大模型部署工程师到底在做什么1.1 这个岗位的真实面貌先把这个岗位拆开来看。端侧大模型部署工程师核心工作只有一句话把训练好的大模型塞进手机、车机、开发板、PC这些终端设备里让它跑得动、跑得快、跑得稳。听起来简单做起来是另一回事。云端部署大模型你有A100/H100集群有几百GB显存随便挥霍推理框架选vLLM或者TensorRT-LLM基本能解决大部分问题。端侧完全不是这个逻辑。一台手机的NPU算力可能只有几TOPS到几十TOPS内存带宽被LPDDR5卡死发热还要控制在几瓦以内。你要在这套约束下让一个几十亿参数的模型跑出可用的体验这才是端侧部署工程师存在的意义。我见过不少从云端推理转过来的工程师第一反应是“把模型量化一下不就行了”。量化只是第一步后面还有算子适配、内存布局优化、KV Cache管理、前后处理流水线设计、多后端调度等一大堆事情。这个岗位本质上是一个交叉工种既要懂模型结构又要懂推理框架还要懂芯片架构和系统级优化。1.2 为什么这个岗位突然被疯抢三个原因叠加在一起。第一模型小型化到了可用的临界点。Qwen、GLM、MiniCPM、DeepSeek这些系列都有端侧可跑的版本2B到8B参数区间的模型在量化后已经能塞进旗舰手机的内存里。以前端侧只能跑BERT级别的模型现在能跑对话模型了应用场景一下子打开。第二芯片厂商在推波助澜。高通、联发科、Intel、AMD、瑞芯微、地平线每一家都在强调自己的NPU算力。硬件有了但能把硬件吃满的人极少。芯片厂商的SDK文档往往只覆盖基础用法真正做产品级部署时遇到的坑文档里根本不写。第三产品侧的需求爆发。手机厂商要做端侧AI助手车厂要做离线语音交互PC厂商要做本地知识库机器人公司要做实时决策。这些场景都有共同的诉求低延迟、离线可用、数据不出端。云端API方案满足不了必须端侧部署。供需严重失衡的结果就是一个能独立完成端侧大模型部署的工程师市场上非常稀缺。我认识几个在这个方向做了两年以上的朋友基本上是被猎头追着跑的状态。1.3 适合谁来转型或入门这个岗位不是纯算法岗也不是纯工程岗。如果你是从以下方向转过来会比较顺移动端/嵌入式开发你已经懂Android NNAPI、Qualcomm QNN、ARM Compute Library这些底层接口补上模型推理的知识就能上手。推理框架开发你熟悉ONNX Runtime、TensorRT、TVM、MNN、NCNN中的至少一个理解图优化和算子融合转到端侧只是换一套约束条件。模型压缩/量化方向你对PTQ、QAT、GPTQ、AWQ这些量化方法有实操经验知道量化误差从哪里来这是端侧部署的核心技能之一。云端推理优化你做过KV Cache优化、Continuous Batching、PagedAttention这些思路在端侧同样适用只是实现方式不同。纯算法背景的同学也能转但需要补的工程知识比较多尤其是C、内存管理、多线程调度这些。纯前端或纯后端转过来难度更大因为端侧部署对系统层理解的要求很高。2. 硬功夫拆解端侧部署的核心技术栈2.1 模型量化不只是把FP16变成INT8量化是端侧部署的第一道关也是最容易踩坑的地方。很多人以为量化就是调个API把权重转成INT8实际远不止。权重量化和激活量化的区别。权重是静态的可以离线量化精度损失相对可控。激活值是动态的每次推理的分布都不一样量化难度大得多。端侧部署中W8A8权重8bit、激活8bit是常见配置但有些模型对激活量化非常敏感可能需要W8A16甚至W4A16。量化粒度的选择。Per-tensor量化最简单一个张量共享一组scale和zero_point。Per-channel量化精度更好但需要硬件支持。Per-group量化比如group_size128在精度和效率之间取平衡GPTQ和AWQ都采用这种方式。你在选量化方案时要先确认目标NPU支持哪种粒度。GPTQ和AWQ的取舍。GPTQ基于二阶信息做逐层量化压缩率高但量化过程慢。AWQ基于激活感知的权重量化认为不是所有权重都同等重要保护关键通道推理精度通常更好。实测下来7B级别的模型用AWQ做4bit量化困惑度损失可以控制在0.2以内GPTQ稍差一点但差距不大。量化校准集的选取。这是最容易被忽视的环节。校准集要和实际使用场景的分布匹配。如果你用通用语料做校准部署到垂直领域比如医疗问答时精度可能崩掉。我的做法是从业务数据里采样500到1000条覆盖主要场景校准效果明显好于随机采样。注意量化后的模型一定要做端到端评测不能只看困惑度。有些模型困惑度没怎么涨但生成质量明显下降尤其是长文本生成和指令遵循能力。2.2 推理框架选型没有银弹端侧推理框架的选择取决于你的目标平台和团队技术栈。我把主流方案列一下框架主要维护方优势劣势适用场景MNN阿里端侧优化深支持多后端大模型支持较新手机App、IoTNCNN腾讯轻量无第三方依赖大模型生态弱嵌入式、移动端ONNX Runtime微软生态好算子全端侧优化一般PC、边缘服务器TensorRTNVIDIA性能极致绑定N卡车载、边缘GPUQNN高通骁龙NPU深度适配绑定高通安卓旗舰机RKNN瑞芯微RK3588等芯片适配好生态封闭开发板、边缘盒子TFLiteGoogle安卓生态好大模型支持有限安卓、微控制器选型的核心逻辑是先看芯片再看框架。你用的是骁龙8 Gen 3那QNN是首选MNN和ONNX Runtime也能跑但吃不满NPU。你用的是RK3588RKNN是唯一选择。你在PC上做原型验证ONNX Runtime最方便。我个人的经验是原型阶段用ONNX Runtime快速验证产品阶段切到芯片厂商的原生SDK。中间会有一段痛苦的迁移期但性能差距值得。2.3 NPU算子适配最耗时的环节NPU和GPU最大的区别在于NPU的算子支持是有限的。GPU上你写个自定义CUDA kernel就能跑NPU不行不支持的算子要么回退到CPU要么自己写算子。常见的不支持算子动态shape相关的操作、复杂的注意力变体、某些激活函数、非标准卷积。大模型里最容易出问题的是RoPE旋转位置编码和GQA分组查询注意力不同NPU的支持程度差异很大。算子回退的代价。一个算子回退到CPU可能拖慢整个推理流程。因为NPU和CPU之间的数据搬运开销很大而且回退会打断NPU的流水线。实测中一个回退算子可能让端到端延迟增加30%以上。算子开发的流程。如果必须自己写算子一般流程是先用Python或C写参考实现验证数值正确性然后用芯片厂商提供的算子开发工具比如高通的Hexagon SDK、瑞芯微的RKNN Toolkit实现最后做精度对齐和性能调优。这个过程很耗时一个复杂算子可能要一两周。实操心得在模型选型阶段就要确认目标NPU的算子支持列表。有些模型结构天生对NPU友好有些则处处是坑。宁可换模型不要硬适配。2.4 内存管理与KV Cache优化端侧设备的内存是硬约束。一个4bit量化的7B模型权重大概占3.5GB加上KV Cache、激活值、框架开销很容易超过手机可用内存。KV Cache的优化手段量化KV Cache把KV Cache从FP16量化到INT8内存直接减半。精度损失通常可接受。分页管理类似PagedAttention的思路按页分配KV Cache减少碎片。滑动窗口只保留最近N个token的KV适合长对话场景。共享KVGQA本身就是在减少KV头数部署时要确保框架正确利用了这一点。内存布局的优化。NPU通常对内存对齐有要求比如16字节或32字节对齐。权重加载时要做好padding否则可能触发未对齐访问性能大幅下降。这个细节在框架文档里往往一笔带过但实际影响很大。3. 从零到一端侧大模型部署的完整实操流程3.1 环境搭建与工具链准备假设你的目标平台是RK3588开发板要部署一个4bit量化的Qwen2.5-3B模型。我把完整流程走一遍。硬件准备RK3588开发板、散热片、串口线、网线、电源。RK3588的NPU算力是6TOPS跑3B模型勉强够用7B会很吃力。软件环境# 宿主机安装RKNN Toolkit2 pip install rknn-toolkit2 # 开发板刷入官方Ubuntu镜像 # 确认NPU驱动版本 cat /sys/kernel/debug/rknpu/version模型准备从HuggingFace下载Qwen2.5-3B-Instruct用AutoAWQ做4bit量化。校准集从业务数据里采样512条。from awq import AutoAWQForCausalLM from transformers import AutoTokenizer model_path Qwen/Qwen2.5-3B-Instruct quant_path qwen2.5-3b-awq model AutoAWQForCausalLM.from_pretrained(model_path) tokenizer AutoTokenizer.from_pretrained(model_path) quant_config {zero_point: True, q_group_size: 128, w_bit: 4, version: GEMM} model.quantize(tokenizer, quant_configquant_config) model.save_quantized(quant_path)3.2 模型转换与图优化RKNN Toolkit2支持从ONNX转换。AWQ量化后的模型需要先导出为ONNX。# 导出ONNX from transformers import AutoModelForCausalLM import torch model AutoModelForCausalLM.from_pretrained(quant_path, torch_dtypetorch.float16) dummy_input torch.randint(0, 32000, (1, 128)) torch.onnx.export(model, dummy_input, qwen2.5-3b.onnx, opset_version14)转换到RKNNfrom rknn.api import RKNN rknn RKNN() rknn.config(target_platformrk3588, mean_values[[0]], std_values[[1]]) rknn.load_onnx(modelqwen2.5-3b.onnx) rknn.build(do_quantizationFalse) # 已经量化过不再量化 rknn.export_rknn(qwen2.5-3b.rknn)图优化的关键点算子融合把LayerNormLinear、AddActivation这类组合融合成单个算子减少调度开销。常量折叠把推理时不变化的计算提前算好减少运行时计算量。内存复用分析张量生命周期让不重叠的张量共享内存。这些优化RKNN Toolkit会自动做一部分但你需要检查优化后的图是否符合预期。用Netron打开ONNX看结构对比优化前后的差异。3.3 板端部署与性能调优把rknn模型推到开发板用RKNN Runtime加载。from rknnlite.api import RKNNLite rknn RKNNLite() rknn.load_rknn(qwen2.5-3b.rknn) rknn.init_runtime(core_maskRKNNLite.NPU_CORE_0_1_2) # 推理 inputs tokenizer(你好, return_tensorspt) outputs rknn.inference(inputs[inputs[input_ids].numpy()])性能调优的实操手段多核调度RK3588有3个NPU核心可以并行跑不同batch或不同层。core_mask设置要实测不是越多越好。CPU亲和性把前后处理绑定到特定CPU核心避免和NPU驱动抢资源。温度控制RK3588满载时发热严重会触发降频。加散热片必要时限制NPU频率。批处理策略端侧通常batch1但prefill阶段可以合并多个请求提高NPU利用率。实测数据Qwen2.5-3B AWQ 4bit在RK3588上prefill速度约30 tokens/sdecode速度约8 tokens/s。这个速度做离线问答够用做实时对话偏慢。3.4 前后处理流水线设计端侧部署不只是模型推理前后处理同样重要。Tokenizer优化HuggingFace的tokenizer在Python里跑速度慢。生产环境建议用C实现或者用fast tokenizer。RKNN官方有提供C的tokenizer示例。采样策略端侧算力有限采样逻辑要轻量。Top-k Top-p的组合比beam search快得多质量损失可接受。温度参数根据场景调问答场景0.1到0.3创作场景0.7到0.9。流式输出用户体验的关键。每生成一个token就推给前端不要等全部生成完。这需要推理框架支持增量解码RKNN的示例里有实现。多轮对话管理KV Cache要跨轮次复用否则每轮都重新prefill延迟爆炸。但KV Cache不能无限增长超过阈值要截断或压缩。4. 踩坑实录与常见问题排查4.1 量化精度崩塌的排查思路现象量化后模型输出乱码或重复。排查步骤检查校准集是否覆盖业务分布。用业务数据重新校准。检查是否有层对量化特别敏感。逐层分析把敏感层保持FP16。检查量化配置。group_size太小会增加开销太大影响精度。128是常用值。检查是否有异常值。用AWQ的scale搜索或者手动clip异常激活值。我的经验Qwen系列对量化比较友好GLM系列稍差MiniCPM在4bit下表现不错。如果精度实在救不回来考虑换模型或者用更高bit。4.2 NPU算子不支持的应急方案现象模型转换时报错提示某个算子不支持。应急方案替换算子比如用标准Attention替换FlashAttention用普通卷积替换深度可分离卷积。CPU回退在RKNN配置里设置custom_op让不支持的算子跑在CPU上。但要注意性能影响。模型剪枝去掉不支持的模块比如某些模型的多模态分支。换框架如果RKNN不支持试试MNN或ONNX Runtime不同框架的算子覆盖不同。注意CPU回退不是长久之计。一个回退算子可能让延迟翻倍产品化阶段必须解决。4.3 内存不足的优化手段现象模型加载失败或者推理过程中OOM。优化手段问题原因解决方案加载失败权重运行时内存超限减小模型、提高量化bit、分片加载推理OOMKV Cache增长过快量化KV Cache、滑动窗口、限制max_length碎片化频繁分配释放预分配内存池、固定shape峰值过高中间激活值大算子融合、内存复用、分块计算实测技巧用/proc/meminfo和npu-smi监控内存和NPU使用率。RK3588的NPU内存和系统内存共享要留足余量给系统。4.4 性能不达标的调优清单现象推理速度慢延迟高。调优清单确认NPU真的在工作。用npu-smi看NPU利用率如果很低说明大部分算子在CPU上跑。检查输入shape。动态shape会导致NPU反复编译固定shape能大幅提升性能。检查内存对齐。权重和激活值要对齐到NPU要求的边界。检查线程配置。前后处理和推理的线程数要匹配避免互相阻塞。检查散热。温度过高会降频加散热或限制频率。检查框架版本。NPU驱动和推理框架的版本要匹配版本不对可能性能减半。一个真实案例我在RK3588上部署时decode速度只有3 tokens/s。排查发现是KV Cache没有复用每步都重新计算。改成增量解码后速度提升到8 tokens/s。4.5 常见问题速查表问题可能原因快速排查输出乱码量化精度损失换校准集、提高bit推理报错算子不支持看日志、换算子速度慢NPU未充分利用查NPU利用率、固定shape内存OOMKV Cache过大量化KV、限制长度发热降频散热不足加散热、限频多轮对话卡顿KV未复用实现增量解码首次推理慢模型加载编译预热、缓存编译结果5. 这个岗位的成长路径与技能树5.1 从入门到独立的三个阶段第一阶段跑通Demo。能按照官方文档把模型跑起来理解基本流程。这个阶段大概需要1到2个月关键是动手不要只看文档。第二阶段解决实际问题。能处理量化精度、算子适配、性能调优这些具体问题。这个阶段需要6个月到1年关键是积累踩坑经验。每个坑都要记录形成自己的知识库。第三阶段方案设计。能根据产品需求选择模型、框架、硬件设计完整的部署方案。这个阶段需要2年以上关键是视野要了解不同芯片和框架的优劣。5.2 必须掌握的硬技能C端侧部署的主力语言必须熟练。尤其是内存管理、多线程、性能分析。Python模型转换、量化、评测用够用就行。推理框架至少精通一个了解两到三个。芯片架构理解NPU、GPU、CPU的区别知道各自的约束。模型结构Transformer是基础还要了解MoE、GQA、RoPE这些变体。量化理论PTQ、QAT、GPTQ、AWQ知道原理和适用场景。性能分析会用perf、nsight、芯片厂商的profiler工具。5.3 软技能同样重要端侧部署工程师经常要和算法团队、硬件团队、产品团队打交道。算法团队觉得模型精度不够硬件团队觉得你优化不到位产品团队觉得速度太慢。你需要有能力协调各方找到平衡点。另外文档能力很重要。端侧部署的坑太多不写文档根本记不住。我习惯用Markdown记录每个问题的现象、原因、解决方案积累了几百条换工作时直接带走。6. 一些个人体会这个方向变化很快。去年还在讨论7B模型能不能上手机今年已经在讨论端侧MoE了。芯片厂商的SDK半年一个大版本推理框架的算子支持列表每个月都在变。保持学习是必须的但更重要的是掌握底层原理。框架会变芯片会变但量化的数学原理、内存管理的逻辑、性能优化的思路这些是相对稳定的。另外不要只盯着一个平台。我见过只做高通的工程师换到瑞芯微平台后完全不会。多接触不同芯片和框架理解它们的共性和差异才能形成自己的方法论。最后端侧部署的终极目标是让用户感觉不到“端侧”的存在。模型跑在本地但体验要和云端一样流畅。这个目标还很远但每一年都在靠近。