当前位置: 首页 > article >正文

大模型训练实战:分布式训练、显存优化与知识蒸馏全解析!

全景路线图我们将按模块逐步展开每个模块都是最终搭建完整平台的一块拼图之前的章节参考我之前写的文章G. 分布式训练篇大模型训练的工程实践 – 学习在多卡多机环境下训练大模型的方法包括数据并行、张量并行、流水线并行、ZeRO优化了解通信瓶颈、检查点保存、实验可复现性与训练过程监控。H. 显存优化篇显存占用与OOM问题解析 – 拆解训练和推理时显存的构成提供排查OOM的方法和显存优化清单梯度检查点、混合精度、梯度累积、量化、缓存策略等帮助在有限GPU资源下跑大模型。I. 蒸馏篇大模型压缩与传承 – 阐述知识蒸馏的重要性介绍如何通过Logits蒸馏、指令蒸馏、偏好蒸馏等手段将大型模型的能力迁移给小模型以及建立蒸馏效果的验收体系。G. 分布式训练篇让多GPU协同作战1. 数据并行 (DP)简单划分数据复制模型数据并行是最常用的分布式训练策略。原理很简单每张GPU放一份完整的模型拷贝各自处理不同的训练数据子集然后在每个小批次计算完梯度后将所有GPU的梯度汇总平均All-Reduce再每个GPU同步更新模型参数 。类比来说数据并行就像多个人抄书每人抄不同的章节抄完后对内容核对纠错合并梯度确保大家手里的书都一致然后再继续下一轮抄写。这样可近似线性加速训练因为多个人GPU同时工作完成整本书的时间大大缩短。DP的优点是实现容易在PyTorch中用DistributedDataParallel(DDP)模块就能把模型包装起来自动处理通信。但缺点是每卡都保存全模型参数当模型非常大时可能单卡放不下。这就是为什么有张量并行等其他方法的必要。在计算方面DP每步通信要做AllReduce聚合梯度通信量与模型参数量成正比。对于上亿参数模型这一通信开销显著。此外当节点数很多时网络延迟和带宽会影响聚合效率。不过由于AllReduce是高度优化的集体通信操作在一个机架内的GPU通过NVLink/NVSwitch等高带宽连接DP可以扩展到几十甚至上百GPU前提是global batch size按比例增大否则通信/计算比变差效率降低。2. 张量并行 (TP)拆分矩阵分摊计算当模型太大导致单GPU显存装不下完整模型时可以考虑张量并行。它将模型内部的矩阵运算拆分到多个GPU上进行 。典型做法例如把每层的权重矩阵按列或行分块每块放在不同GPU上各GPU只计算自己那部分的GEMM然后通过通信得到完整输出 。以最常见的张量模型并行Tensor Model Parallel为例假设一个全连接层 weight W 是 [in_dim, out_dim] 矩阵我们把 out_dim 划分给2块GPU每GPU负责 out_dim/2 列。前向计算时每GPU拿到输入X后计算 X乘它那半边W得到输出的一部分然后两个GPU交换彼此结果拼接成完整输出 。反向梯度同理需要通信。Transformer的Attention和FFN层都可以这样平行化。例如多头注意力的头可以平分到不同GPUFFN扩展后的隐层也可切分计算 。Megatron-LM等库实现了高度优化的张量并行 。优点是单模型分布到多卡突破单卡显存限制缺点是实现复杂而且通信频繁每层每一步都有张量通信如AllGather, ReduceScatter。通信模式主要在模型层内通常通信数据量也和参数量差不多。不过因为数据并行的AllReduce发生在反向末期张量并行则每层都在同步通信频率更高对网络要求严苛。通常张量并行规模不会太大GPT-3用8-way张量并行175B参数 8卡上计算一份模型 。太多分块收益递减且网络难撑。NVLink等高速链路在8-16 GPU内可以很好支持张量并行而跨节点依赖InfiniBand会增加延迟。3. 流水线并行 (PP)分层给GPU分批次流水流水线并行是另一种思路把模型不同层分给不同GPU每个GPU负责计算一段层序列 。这样每个显存只需放下对应层参数。第一批数据从GPU0计算前几层后传到GPU1算中间层…以此类推像传送带一样。但如果只是这样除了能装下模型外并没有加速因为各GPU串行工作还引入通信开销。真正的PipeParallel通过同时处理多个微批次以提高利用率 。比如4张GPU模型切4段。将全局batch拆成4个micro-batchmicro1进GPU0算完1段传GPU1同时micro2进入GPU0开始算段1。micro1在GPU1算段2micro2在GPU0算段1micro3进入GPU0…这样各GPU都在忙只是处理不同micro-batch的不同阶段 。这就像工厂流水线第一件产品从工位A到B时第二件已在A加工不浪费工位。这种1F1B调度forward 1 micro then backward 1 micro在GPipe等系统中实现 。需要注意 pipeline bubble开始时第一个样本要等流水线填满结束时清空流水线也有空转部分 。通过增加 micro-batch 数可以摊薄bubble但 micro太多单次grad更新就需要累积。优点解决极大模型的内存问题比如100层网络4卡每卡25层也可一定程度并行计算提高吞吐。缺点实现复杂反向传播跨设备需要存储激活用于梯度计算通信量不小。另外 pipeline并行会导致训练不完全同步不同micro-batch梯度延后应用虽然GPipe等用到了“虚拟批次”使其等效但仍需谨慎处理顺序问题以避免精度下降。通常流水线并行和张量并行可以组合例如 4卡 pipeline管道每层内部又 2卡张量并行这样8卡总共。实战中facebook在OPT-175B上用的是 pipeline张量数据三管齐下 。4. 混合并行与3D并行在真正的大规模训练成百上千GPU中往往多种并行结合使用称为3D并行 。比如Megatron-LM提出张量并行数据并行双重后来又加入流水线并行成为3D 。每种并行负责一个“维度”数据并行维度N个模型副本每副本独立训练不同数据张量并行维度每副本内部有M个GPU协作完成模型计算流水线并行维度模型被拆分成L阶段每阶段由张量组完成这种组合需要良好设计通信组确保AllReduce只在数据并行的每组内做张量并行只在组内交换等 。DeepSpeed pipeline也可以和 ZeRO搭配实现类似效果 。混合并行的拓扑很讲究一般在单机多卡上用张量并行多机间用数据并行。流水线用于跨节点很多层的情形比如超大模型。不当组合会导致通信瓶颈抵消并行收益。例如如果跨机做张量并行各层每步都AllReduce across nodes会非常慢。更优的是分区通信保持张量并行组在同一节点或同一NVSwitch域内跨节点主要走数据并行AllReduce这样可以利用Hierarchical AllReduce优化先机内归约再机间。谷歌的TPU Pod和NVIDIA DGX SuperPod都有专门网络拓扑优化以支撑这种多维并行。总之3D并行配置需要根据集群拓扑来选择 optimal grouping。5. ZeRO与内存优化突破单卡显存的另一利器除了并行还有一套专门为大模型显存优化的技术——ZeRO (Zero Redundant Optimizer)由DeepSpeed团队提出 。它的核心思想是在数据并行训练中不需要每张卡都完整保存优化器状态和梯度等能否把它们也像张量并行那样分块存储ZeRO分阶段ZeRO-1优化器状态例如Adam的m和v矩阵均分到不同GPU各卡只保存自己负责的参数的optimizer状态 。这样内存占用降低近似1/world_size。ZeRO-2在ZeRO-1基础上梯度也划分存每卡只保存部分梯度 。AllReduce改为AllGather-Compute方式。ZeRO-3更进一步模型参数也只在需要时才Gather到某卡其余时刻分散存储 。也就是模型也被shard了各GPU分别持有参数子集。ZeRO-3实现了全状态分片Fully Sharded Data Parallel, FSDP理论上将冗余复制降低为0显存利用极大提升。Facebook的FullyShardedDataParallel正是ZeRO-3的实现之一。ZeRO的代价是频繁的通信尤其ZeRO-3每次前向/反向都要AllGather当前层参数到多卡计算再Scatter回去。深度模型下通信量不小。不过ZeRO可以和Pipeline并行结合使得通信与计算重叠部分进行减小等待。ZeRO优点突出当模型大到必须数据并行多机训练时不用NVMe offload也能把模型状态均摊到所有显存中突破单卡限制。它让GPT-3等训练成为可能早期没有ZeRO-3的时代GPT-3 opt用了混合并行巨大张量并行才行后来Bloom等用ZeRO-3在多机上更方便地训练了176B模型。使用ZeRO也需注意检查点因为参数是分片的保存模型需要Gather完整参数到一处或各GPU分别存自己部分然后集中。DeepSpeed封装了checkpoint机制不过加载模型花时间多一些。6. 通信瓶颈与优化分布式训练的通信可以占用大量时间。常见优化包括通讯/计算重叠利用PyTorch的torch.cuda.Stream或DeepSpeed的调度让梯度计算和上一层梯度AllReduce同时进行。这需要划分梯度粒度把反向算和reduce穿插。一般库都实现了这个。压缩通信对梯度或参数进行压缩再发送如8-bit量化梯度或Top-k稀疏通信在网络慢环境下可换时间。但压缩解压也耗时且可能影响收敛。调优网络比如NCCL参数调节大Batch情况甚至需要调整GPU拓扑上的环通信算法。NVLink/NVSwitch环境和InfiniBand环境NCCL调度不同可通过NCCL树/环算法配置改善。混合精度FP16梯度通信量是一半FP32这也是why全精度训练代价大。现代训练几乎都Mixed Precision以减少通信和存储。通信模式替换AllReduce并非唯一有时可以AllGatherCompute代替。还有梯度累积(gradient accumulation)可以减少AllReduce次数每N步聚合一次但会影响freshness酌情用。对超大规模多机通信还可能引入分级通信比如1000张卡先每机内16卡reduce然后16机为单位reduce…这样树状减少通信风暴。Horovod等框架提供了一些分层AllReduce功能。7. 检查点与复现训练超大模型往往需要跑几天甚至几周因此中途容错和复现非常重要周期性Checkpoint比如每隔1小时或每1000 step保存一次模型参数和优化器状态。如果作业中断可以从最近checkpoint重启最多损失一点进度。开源Transformer框架几乎都提供resume机制但要确保把LR调度器等状态也恢复。断点续练不仅模型dataloader读到哪里了也要知道不然续跑时数据不同顺序可能影响收敛。常用方法是在checkpoint保存当前epoch索引和dataset随机状态。或者干脆每次epoch都shuffle一个种子以保证resume也按种子顺序来。随机种子为确保实验可复现需要固定随机种子PyTorch、numpy、cuda卷积算法等都要设多GPU情况下可能每GPU序列也要偏移种子避免重复。但注意floating point的不确定性还是可能导致微小差别。一般来说有相同种子同样并行配置训练loss曲线应基本重现。ZeRO-3这类在通信调度上有不确定性的要更多测试验证复现性。日志记录保留训练日志loss、eval指标随时间如果复现时曲线走位不同可通过比较日志判断何处出问题。最好使用TensorBoard或自定义logger记录关键指标和超参数。版本控制大模型实验涉及代码、配置众多要用git等管理版本。出问题回滚否则改动后很难说清差异来源。规模变化影响要注意一个现象同样模型不同GPU并行策略训练结果可能有微小差别。这因为并行导致浮点加和顺序变化FP32下或大精度下微小差别。如果发现缩放后收敛变坏可考虑grad clipping调节或者使用更高精度累积DeepSpeed有Lamb优化器的帮助MixedPrecision权衡。8. 团队协作与流程虽然偏离技术但值得一提在企业里搞大模型训练不仅是技术问题还有多人协作流程数据组准备数据 - 模型组设计网络和配置 - 平台组编写分布式脚本/作业配置提交集群 - 训练中有人值班监控loss异常时和平台组一起排查是数据错了还是显存oom。定期里程碑评测例如跑每1/4训练数据时对模型做一次评估召集相关人review结果决定是否调整lr或清洗数据等。Checkpoint管理哪个checkpoint准备拿去微调下游哪个供产品试用这些要有标记和文档不然一堆文件容易混淆。失败回滚若某版模型在对齐或评测发现坏bug也许得滚回旧checkpoint重新训练不同方向。所以存储这些中间版本很有价值虽然占空间但比重新训练划算。工程具体模块方面在大公司会开发/借助分布式训练Launch工具类似DeepSpeed launch or SLURM script。GPU监控Dashboards异常(如loss Nan, GPU hang)自动告警。数据管道转换服务大数据集导入并行高效读取dataloader。Eval框架每隔若干steps对标准任务跑评测出报告。这些都需要团队不同角色配合才能驾驭训练一个上百亿参数模型全流程。H. 显存优化篇直面OOM问题的解决之道1. 显存占用组成谁吃掉了GPU内存当你运行大模型时显存主要被以下几部分占据模型参数存储模型的权重值。这部分在训练时通常是FP16半精度或BF16推理也可用INT8/4等。参数大小 参数数量 × 每参数字节数。例如13亿参数FP16约 13e8 × 2 bytes ≈ 2.6GB。值得注意多GPU数据并行下每卡仍有一份完整参数所以参数占用不会因为GPU多就减少除非用ZeRO-3那种分片。优化器状态如Adam需要维护与参数同形状的m和v两个矩阵动量和二次动量再加上参数本身这三份总共将近3倍参数内存 。SGD只有一份动量则2倍。新型优化器如Lion只需两个瞬时张量和Adam类似2倍。内存大的场景常考虑减少优化器状态占用比如用AdamWCPU offload或换AdaFactor等。梯度反向传播计算出的每个参数的梯度。形状同参数也是一倍参数大小。一般在optimizer.step后梯度就释放但在这之前梯度也算占显存一部分。激活(Activation)前向计算中每层输出需要暂存以供反向时计算梯度。这些激活加起来可能比参数量还大尤其在batch大、序列长时。比如一个Transformer层输出 (batch, seq, hidden) 若 (16, 512, 1024) 就有8M元素FP16即16MB一层16MB几十层下来就是GB级别。激活也是导致训练时显存峰值远高于模型大小的主要原因 。临时张量一些算子在前后向中会产生临时workspace比如矩阵乘法的临时缓冲区、layernorm的中间结果等。这些通常短暂存在很快释放但如果Ops没写好也可能滞留。Profiling工具可检查这些临时分配。CUDA上下文等GPU运行需要的runtime开销通常几百MB包括CuDNN/CuBLAS的handle和优化算法选用的一些buffer。这个比较固定不随模型变除非使用特定大算法如FFT卷积会临时占比较多。推理时没有梯度和优化器但KV缓存会占内存长度L上下文、每层Heads2(dim per head)的K和V缓存。例如一个12层、12头、每头64维的模型如果L1024, batch1, K/V每层大小 1024*64 (float16) * 12 heads ~0.75M元素乘12层9M约18MB。不算太大但批量和多并发对缓存线性放大。比如batch8, L1024 - ~144MB。这在多请求并发、长上下文场景下不可忽视要有淘汰策略或用完即释放。简而言之训练显存占用约 5~6倍参数量参数梯度优化器 激活 其他。推理显存 模型权重 KV缓存 buffer。这个粗估帮助你判断显存绰绰有余还是逼近危险。2. OOM排查找出内存耗尽的罪魁祸首发生OOMOut Of Memory错误常见于训练刚开始的第一步说明模型或batch超出显存承载。某一步骤开始反向时OOM可能是激活太多导致反向算时顶不住。随训练进行OOM可能是内存泄漏或优化器状态增长。排查方法减少配置测试先将batch_size减小一半或seq_length减小看问题是否消失。如果消失则基本确定OOM因大batch或长序列导致激活过多所致。如果依然OOM则可能是模型参数超限或其他固定开销。模拟推理把模型.eval()只跑前向看占用。如果前向没问题反向OOM那大概率激活的问题或优化器问题。查看CUDA显存使用PyTorch的torch.cuda.memory_summary()或NVIDIA Nsight Systems查看显存分配快照。PyTorchLightning等也有内存logger。观察Peak memory和碎片。PyTorch的分配器会有fragmentation偶尔OOM其实不是总占满而是找不到连续块可用。分步执行手动分阶段运行模型部分检查哪个阶段增幅最大。例如先只embedding层loss看占用再加Transformer部分…这样定位是embedding初始化太大还是后面attention层。Profile工具使用PyTorch Profiler或Nsight Systems对模型进行内存profile 。Profiler能记录每个操作显存alloc和释放可在trace里看到哪些op分配了大量tensor、peak在哪。监控iter级内存写一个小循环执行若干训练steps每步后用torch.cuda.memory_allocated()记录。如果逐步增长而不回落可能有内存泄漏比如某些Tensor没detach导致grad graph累积或Python对象引用GPU Tensor导致没释放。此时需要检查代码常见漏detach或者日志里append了tensor。通过以上手段一般可以定位OOM原因是模型优化器太大还是batch太大还是代码bug。例如如果profile发现embedding输出保存后没释放那你是不是在保存loss.item()之外还保留整个loss tensor? 这种属于代码问题要改。3. 优化清单1梯度检查点—用时间换空间梯度检查点 (Activation Checkpointing) 是应对激活占用的一大利器。原理是在前向过程中不保存某些中间激活值等反向需要时再重新计算。因为反向算某层梯度需要该层的输入/输出如果我们前向没存就得前向再算一次得到它。这样做牺牲了一些计算量但省了内存。常用做法是把模型按层分块每隔几层存一个检查点其余层输出不存 。反向时遇到断点就从上一个检查点重新跑前向到当前层再继续反向。PyTorch有torch.utils.checkpoint自动实现这个逻辑将你传入的模块前向包装使其不保存中间结果而在backward时重算。激活内存随batch和序列线性增长而重算成本通常低于显存宝贵程度特别在显存不足时极其值得。Checkpoints使你用2倍时间换取接近1/2激活内存理想状况下。实践中常能减少20-40%显存。要注意重算增加额外前向算力对长序列模型(计算重)特别明显。但对于典型Transformer重算一次损耗还可以接受。不能checkpoint会变的状态如dropout随机mask在重算时要保持一致PyTorch checkpoint自动处理seed确保一致。Checkpoint粒度可调更多小检查点更少存储更多重算。要权衡设置一般按模块块。不要checkpoint太小模块不然调度开销也变大。通常以Transformer block为单位是合理的。大模型训练几乎都会开启checkpointing因为稍微浪费点算力比买更多显卡划算。目前Transformer框架DeepSpeed, FairScale等很多默认集成了。用时只要wrap模块即可实现简单有效。4. 优化清单2混合精度与BF16/FP16Mixed Precision Training已经成为大模型训练标配。它通过使用FP16或BFloat16存储和计算大部分张量将显存占用和带宽需求减半 。现代GPU有Tensor Core对FP16/BF16运算提速所以还带来计算速度提升。FP16需要额外注意loss scale避免下溢但框架一般自动管理(loss scaling)。BF16不需要loss scaling范围大但精度略低Bit上也是很好的选择。Ampere架构及以后GPU都支持BF16高效计算。通常参数、激活、梯度都用FP16/BF16只有优化器内部累加用FP32保持精度DeepSpeed Zero可以将optimizer也用FP16补偿但复杂。FP16会有一些小问题如梯度NaN但已经成熟解决方式。有些场景BN或LayerNorm在FP16下精度损失大可设定这些在FP32。PyTorch的autocast可以方便指定。推理场景也可用FP16/INT8让模型加载占用降低。GPU上FP16推理基本不会影响模型效果太多极少数场合像生成长数字串需要全精度。INT8有量化误差但使用量化感知或GPTQ方法可减轻损失。结论除非特别需要一律用混合精度。使用时monitor一下loss scaling没有反复回退就OK。BF16甚至更省心不需要scale但Apex Amp直到PyTorch2.0才稳定支持BF16所以以前FP16用多些。5. 优化清单3梯度累积—化整为零Gradient Accumulation(Grad Accum)通过将大batch逻辑上拆成多次小batch计算累积梯度后再更新实现用较小显存完成等效大batch训练 。如果你想要batch1024效果但显存只能放128样本那就跑8步每步batch128累加梯度不update等8步后再optimizer.step然后清梯度。这样优化器看到的总梯度相当于1024批次但每次只需算128的显存。缺点是训练更慢了因为你等8个mini-batch才更新一次相当于有效batch时间长度变长。学习率等要按总batch考虑调整。Grad Accum特别适合小模型大数据场景保证收敛稳定也用于大模型显存不够时逼不得已凑batch。如果accum太多步一次update间隔太久可能影响训练动态但通常在10步以内影响不大。DeepSpeed之类常和ZeRO配合grad_accumZeRO Stage 2/3甚至可以让AllReduce等延后到accum结束再做以减少通信次数 。自己实现时记得对optimizer调用.step()和.zero_grad()逻辑变化。6. 优化清单4更省内存的优化器与技术换优化器Adam超流行但内存3倍AdaFactor是个选项尤其在大模型在低精度embedding上尝试AdaFactor可把v矩阵近似为分解形式存储节省很多。这在transformer中用在embedding或大矩阵可以OpenAI GPT-3在前半训练阶段就用了AdaFactor减状态占用。新近的Lion优化器(莫比乌斯提出)类似Adam但无二阶矩也只有两份状态参数动量内存2倍。而且Lion据称收敛快。Facebook报道在LLaMA上Lion也可值得一试 。冻结部分参数如果某些层不训练则不需存梯度和优化器状态省下部分内存。比如冻结embedding层或部分低层在下游微调常见。不过在预训练阶段一般不冻结。Static vs Dynamic GraphPyTorch是动态图每次分配释放比较灵活但稍有碎片。使用TorchScript转静态或用更低级库(ONNXRuntime, TRT)训练可以有更稳定内存占用和优化。但一般收益不明显框架胶水cost还大不主流。Flash Attention是针对Self-Attention计算的一种优化算法 。它通过重新排列计算和内存访问避免显式构造巨大attention矩阵从而大幅降低内存占用和提升缓存命中率。对长序列尤其显著。FlashAttention V2等可以减90%显存的QKV-attention临时空间让你训练2K序列也不OOM。许多模型库现在集成flash attn kernel这属于算子级优化。原理上没有数值差异但要求GPU Sm80A100以上和支持软件。当然这些内核起作用你要确保模型代码调用的是合适接口比如HF Transformers需要use_flash_attentionTrue。半精度embeddingembedding通常用FP32怕精度损失但其实BF16embedding效果也OK还省显存2x。OpenAI GPT-3最初embedding就是FP16存的 。embedding参数占GPT-3总参数约7%倒不算大头但也能省一些主要embedding表较大tokenizer多达5万词甚至更多。IO优化大模型训练时数据loader也可能占显存GPU decode或IO缓冲。尽量把数据准备放CPU并PinMemory然后GPU上只留计算tensor。Lightning /Accelerate之类方法可以help。另外不加载用不着的东西如embedding层如果是one-hot lookup不要真的展开embedding矩阵为one-hot有人可能为了方便做embedding * onehot矩阵乘这是极浪费内存的。7. 推理场景特化优化推理时主要就是模型权重占用。可考虑:Module级别加载/卸载如果模型有模块化结构不用的部分不加载。例如只用解码器就不加载编码器参数。多Batch顺序推理如果GPU显存能放下模型权重但不能并行多个实例那就串行执行多个请求把计算资源充分利用时间上调度代价是单请求稍慢但总吞吐上去了。缓存 reuse多个请求用了相同的前缀Prompt可共用prefill结果省去重复计算。可以设计cache pool以prefix hash为键存某层激活。这样能节省计算也稍省显存因为reuse而不是重复存。微软的DeepSpeed inference有类似prefix-bloom优化。剪枝/蒸馏通过移除部分模型结构减小参数量也是可选。蒸馏出小模型部署更省内存。例如把13B蒸馏到2.7B学生那内存直降4-5倍。不过生成类任务蒸馏不易保持质量属于研发问题需要投入做。多模型共存若同GPU跑多个模型实例每实例显存减少peak但总内存和peak其实更高占因为并行peak可能叠加。所以一般隔离模型在不同GPU以免OOM相互拖累。Swap到CPU可将不常用的模型搬移到CPU或磁盘冷启动时加载。比如工具型模型闲置时卸载有调用了再加载这样GPU内存空出来别的任务能用。场景更多模型而GPU少时考虑但频繁load大模型也是负担大多在系统层调度保证互斥使用而非真并发。显存泄漏排查推理服务跑久了显存慢慢涨通常不是模型本身问题而是预处理/后处理创建tensor忘了挪到CPU或者没释放。如果Torch的CUDA内存占用无故增加检查应用逻辑有无缓存没清、list.append(tensor)等问题。8. KV缓存管理在聊天机器人服务中KV缓存虽然加速了推理但也占内存。关键缓存何时释放如果一个对话完结了要把KV cache释放否则越攒越多。PyTorch generate不自动清需要手动处理CarlI. 可以将past_key_values None赋值表示不用cache也可del变量或者写服务逻辑释放。LRU策略若并发用户多总缓存size并发数 × L × hidden维 × 2 ×层数。给定显存可容纳上限Session数N。如果超了要淘汰最近最久不用的session缓存或者转到CPU。库如vLLM提供自己内存池管理KV并支持跨请求合并。但手写服务简单方法限定max_sessions比如100个同时对话超出就警告或移除最老的会话。压缩KVKV通常float16是否可以int8一般不行因为Attention对精度敏感但有尝试blow-to-int8(牺牲质量)不常用。拆分长上下文引导用户不要一直累积上下文长达上万token否则每次推理KV非常大。可以引入滚动窗口或摘要前面历史以缩短context长度。这既减少显存也加快推理。注意: KV缓存属于计算图之外的数据PyTorch不会在Model state_dict里包含它所以不用担心checkpoint它只在一次对话推理临时存在。管好生命周期就行。I. 蒸馏篇大模型“小型化”的艺术1. 为什么蒸馏小模型的大收益大模型上亿参数效果好但推理代价高占用大量内存、延迟较大、不适合在移动端或实时场景。而小模型几千万参数虽然速度快、部署灵活却常常性能不如大模型。知识蒸馏(Knowledge Distillation)试图弥合两者差距通过让小模型模仿大模型的输出行为把大模型的“知识”压缩进小模型从而获得远超直接训练小模型的效果。通俗比喻让一位名师大模型手把手教一位新进老师小模型如何授课回答问题。新人按名师示范改进自身水平大涨。最终虽不及名师但远胜原来水平。OpenAI早期就用模型蒸馏将一个12层的模型压缩到6层推理加快而性能只略降。近期很多社区模型如Alpaca-LoRA 7B微调ChatGPT也被蒸馏到更小模型以便在手机上运行。蒸馏往往能让10倍参数差距的模型达到较接近性能70-90%这是非常划算的。2. Logits蒸馏让学生学会老师的“思考分布”最经典的蒸馏方法是由Hinton等提出的logits蒸馏 。它把老师模型输出的概率分布当作训练监督而不是仅仅用标准one-hot标签。具体做法准备训练样本 (x, y) 例如x为一个prompty为参考答案。先用老师模型对x计算输出logits得到对每个可能答案的概率分布(soft targets)。训练学生模型时使用老师的概率分布作为目标让学生的输出分布尽可能接近老师。这通常通过最小化KL散度或交叉熵实现 。为什么有效One-hot标签只有正误对模型约束少而老师分布包含了丰富信息例如老师认为选项A 80%正确B 15%C 5%。学生通过拟合这种软分布不仅学会判断正确答案还了解错误选项的相对可能性从而获得更平滑的决策边界。对LLM来说logits蒸馏可以在语言模型困惑度上帮学生逼近老师。如果老师对下一个词分布很尖锐学生就应该也自信如果老师分布很平滑学生则知道多种词都合理。这避免学生过度自信或完全错乱。训练时一般引入温度T调节老师分布的平滑度 。高温度会使分布更均匀让学生更关注老师细微的预期概率关系。logits蒸馏通常用于预训练阶段或语言建模场景因为需要完整分布。它要求老师和学生有相同词表和任务定义。效果指标是**学生模型困惑度(PPL)**能接近老师。3. 指令/任务蒸馏学老师的回答另一种直观的蒸馏是问答式的即让学生模型学习老师在特定任务上的输出。称之为任务蒸馏或回答蒸馏。挑选一系列提示(prompt)可以涵盖各种任务或特定领域。用老师模型生成这些prompt对应的回答老师的输出作为伪标签。用得到的 (prompt, teacher_answer) 对来监督训练学生模型。这种方法就像把老师当作标注者给出许多问答示范供学生模仿。它特别适合对话、代码生成等场景的蒸馏因为我们关心最终回答质量。比如你有一个表现好的13B对话模型想蒸馏到2.7B则可以让13B模型对上万用户问题作答然后用这些问答对finetune 2.7B模型。著名的Vicuna-7B就是通过从ChatGPT分享对话中蒸馏而来 。关键是数据质量老师回答如果有偏差学生也会学到。因此通常选择老师比较可靠的任务输出或者对老师输出做一定筛选如过滤明显错误的、有毒的内容。同时为了让学生泛化蒸馏数据应尽量覆盖多样的输入类型。可以基于现有指令数据增强也可以人工设计一些难题让老师解。一个例子Stanford Alpaca用OpenAI text-davinci生成52k指令跟答训练7B模型 。这就是大模型ChatGPT→小模型LLaMA的指令蒸馏实现了小模型跟随指令的能力质变。4. 偏好蒸馏对齐行为的传承当老师模型已经经过RLHF对齐如ChatGPT具有良好礼貌和拒答行为我们希望学生也具备这些对齐特性。这可以通过偏好蒸馏来实现准备一些场景输入例如要求模型讲个不适宜笑话老师会拒绝或提醒违规。让老师模型产生带有价值观的响应如拒绝、不提供违法细节等。训练学生按这些示范输出回复。偏好蒸馏可以看作任务蒸馏的一种只是侧重于安全/偏好方面的任务比如有害内容、道德困境等。对于老师曾通过人类反馈学到的不成文规则学生只有看过足够例子才能学会。举个例子老师ChatGPT知道不会给出如何制炸弹的步骤会礼貌拒绝。那么我们收集类似敏感请求让老师回答拒绝学生学后也会拒绝。如果没有这个蒸馏学生模型可能就傻傻地胡编步骤缺少对齐训练。实际实现可能将老师的隐式知识显式化。OpenAI在InstructGPT论文中也提到可以用蒸馏使较小模型习得一定安全规则从而减少直接RLHF成本 。不过偏好蒸馏很难100%转移对极端情况小模型可能仍失控所以最终产品若用学生模型也需要重新RLHF或至少审查输出。5. 蒸馏数据的组织与避坑构造蒸馏训练集需要考虑覆盖面尽量多样避免学生学得“单调”。如果老师在某些类型输入上出错学生过度模仿会继承错误。所以要覆盖不同领域、难度的问答让学生学通用模式。去除噪声老师输出不完美要筛掉明显的问题。例如老师偶尔胡编引用这种最好不让学生学可以通过正则或评估发现。也可将多老师/多样本投票融合减少单一老师的偏差。数据规模蒸馏通常需要相当量数据但也不宜过少否则学生容易过拟合老师句式而缺乏创造。实践中上万到几十万条蒸馏对常见。Alpaca用52kVicuna用70k用户对话等。可根据学生大小调整模型越小可能需要更多示例强化。保留知识老师具备的知识点小模型要学得尽量多。但用问答蒸馏时如果老师没被问到某知识它不会教学生。所以蒸馏无法凭空增加学生知识仅能压缩已有知识表现形式。因此如果对知识覆盖有要求最好准备一些知识问答让老师解答再教给学生。防止泄露如果老师输出里包含训练集中没有的隐私、敏感内容要审查。学生可能完美记忆老师输出。OpenAI在GPT-2蒸馏曾遇到模型背书场景。内存/时间成本蒸馏要求大量推理老师模型产生训练数据这也需要算力。好在推理可以分批异步进行不影响最终训练。不少开源项目借助社区力量生成蒸馏数据来弥补算力不足也是办法之一。6. 蒸馏效果验收如何知道学生够格蒸馏训练完成后需要评估学生模型是否成功掌握老师精华。可以从几方面任务性能在若干benchmark上比较学生和老师。例如问答准确率、翻译质量、逻辑推理题正确率等。如果学生指标接近老师90%以上蒸馏很成功。如明显低太多说明学生可能容量不够或训练不足。困惑度(PPL)对一套语言模型评测数据计算困惑度学生PPL若大幅高于老师表示语言拟合能力丢失了部分。比如老师PPL 10学生30则差距明显。人工偏好测试给人看学生和老师对同一指令的回答做盲选。如果大多数人觉得两者差不多好那么学生通过。如果明显更差就要改进。Vicuña就是通过GPT-4作为判官打分发现其7B学生可达GPT-4水平的约90% 。安全性检查如果偏好蒸馏需测试学生在敏感问题上的行为。可对一系列对抗性prompt检查学生是否如老师般拒答或安全应对。也检查是否出现没教过的不当行为。效率测试别忘了蒸馏的初衷——加速。测一下学生模型推理速度/内存与老师对比确认达到预期如参数1/5速度提升3倍等。有时学生太小性能达标但也许失去一些长上下文记忆能力等需要视应用权衡。过拟合检查确保学生没只是死记硬背老师答案而能举一反三。可以略改prompt词序或提供新prompt看学生能否合理应对而不是答非所问。举例假设老师模型在TruthfulQA(一个知识问答集)得80分学生训练后测得75分尚可。如果只有50那蒸馏损失太大不满足要求。再比如对100个有害请求老师拒答率95%学生达到90%也算不错若只有60%说明安全知识没学好要补相关蒸馏。可能需要反复调整蒸馏数据和过程来提升指标。比如发现某知识弱就加入更多那方面问答再训发现学生语言质量差就多蒸馏一些open-ended写作示例。7. 蒸馏的现实边界需要指出并非所有能力都能容易蒸馏。大模型一些隐 emergent 能力如复杂算术、多跳推理学生若参数太少可能学不来不管教多少例子。蒸馏也不能突破模型架构限制比如学生层数少它能表达的深度就有限。就像再聪明的小学生也很难完全掌握大学教授的学识范围。因此选取学生模型大小需折中太小性能损失难恢复太大又失去压缩意义。实践中通常压缩比例在4~10倍仍可接受性能。超过10倍往往难以蒸馏好。若需求特别苛刻可以考虑多重蒸馏先从100B - 10B再10B - 1B分阶段让中间模型做老师逐步逼近。然而多次蒸馏会有累积误差而且费时。最后一点蒸馏依赖老师质量上限。如果老师有偏见或错误学生也许更差因为小模型拟合能力弱容易放大错误模式。所以理想情况下老师尽可能完善对学生才公平。01什么是AI大模型应用开发工程师如果说AI大模型是蕴藏着巨大能量的“后台超级能力”那么AI大模型应用开发工程师就是将这种能量转化为实用工具的执行者。AI大模型应用开发工程师是基于AI大模型设计开发落地业务的应用工程师。这个职业的核心价值在于打破技术与用户之间的壁垒把普通人难以理解的算法逻辑、模型参数转化为人人都能轻松操作的产品形态。无论是日常写作时用到的AI文案生成器、修图软件里的智能美化功能还是办公场景中的自动记账工具、会议记录用的语音转文字APP这些看似简单的应用背后都是应用开发工程师在默默搭建技术与需求之间的桥梁。他们不追求创造全新的大模型而是专注于让已有的大模型“听懂”业务需求“学会”解决具体问题最终形成可落地、可使用的产品。CSDN粉丝独家福利给大家整理了一份AI大模型全套学习资料这份完整版的 AI 大模型学习资料已经上传CSDN朋友们如果需要可以扫描下方二维码点击下方CSDN官方认证链接免费领取【保证100%免费】02AI大模型应用开发工程师的核心职责需求分析与拆解是工作的起点也是确保开发不偏离方向的关键。应用开发工程师需要直接对接业务方深入理解其核心诉求——不仅要明确“要做什么”更要厘清“为什么要做”以及“做到什么程度算合格”。在此基础上他们会将模糊的业务需求拆解为具体的技术任务明确每个环节的执行标准并评估技术实现的可行性同时定义清晰的核心指标为后续开发、测试提供依据。这一步就像建筑前的图纸设计若出现偏差后续所有工作都可能白费。技术选型与适配是衔接需求与开发的核心环节。工程师需要根据业务场景的特点选择合适的基础大模型、开发框架和工具——不同的业务对模型的响应速度、精度、成本要求不同选型的合理性直接影响最终产品的表现。同时他们还要对行业相关数据进行预处理通过提示词工程优化模型输出或在必要时进行轻量化微调让基础模型更好地适配具体业务。此外设计合理的上下文管理规则确保模型理解连贯需求建立敏感信息过滤机制保障数据安全也是这一环节的重要内容。应用开发与对接则是将方案转化为产品的实操阶段。工程师会利用选定的开发框架构建应用的核心功能同时联动各类外部系统——比如将AI模型与企业现有的客户管理系统、数据存储系统打通确保数据流转顺畅。在这一过程中他们还需要配合设计团队打磨前端交互界面让技术功能以简洁易懂的方式呈现给用户实现从技术方案到产品形态的转化。测试与优化是保障产品质量的关键步骤。工程师会开展全面的功能测试找出并修复开发过程中出现的漏洞同时针对模型的响应速度、稳定性等性能指标进行优化。安全合规性也是测试的重点需要确保应用符合数据保护、隐私安全等相关规定。此外他们还会收集用户反馈通过调整模型参数、优化提示词等方式持续提升产品体验让应用更贴合用户实际使用需求。部署运维与迭代则贯穿产品的整个生命周期。工程师会通过云服务器或私有服务器将应用部署上线并实时监控运行状态及时处理突发故障确保应用稳定运行。随着业务需求的变化他们还需要对应用功能进行迭代更新同时编写完善的开发文档和使用手册为后续的维护和交接提供支持。03薪资情况与职业价值市场对这一职业的高度认可直接体现在薪资待遇上。据猎聘最新在招岗位数据显示AI大模型应用开发工程师的月薪最高可达60k。在AI技术加速落地的当下这种“技术业务”的复合型能力尤为稀缺让该职业成为当下极具吸引力的就业选择。AI大模型应用开发工程师是AI技术落地的关键桥梁。他们用专业能力将抽象的技术转化为具体的产品让大模型的价值真正渗透到各行各业。随着AI场景化应用的不断深化这一职业的重要性将更加凸显也必将吸引更多人才投身其中推动AI技术更好地服务于社会发展。CSDN粉丝独家福利给大家整理了一份AI大模型全套学习资料这份完整版的 AI 大模型学习资料已经上传CSDN朋友们如果需要可以扫描下方二维码点击下方CSDN官方认证链接免费领取【保证100%免费】

相关文章:

大模型训练实战:分布式训练、显存优化与知识蒸馏全解析!

全景路线图: 我们将按模块逐步展开,每个模块都是最终搭建完整平台的一块拼图:之前的章节参考我之前写的文章;G. 分布式训练篇:大模型训练的工程实践 – 学习在多卡多机环境下训练大模型的方法,包括数据并行…...

性能分析定界(OpenHarmony平台)指南

性能分析定界指南 前置条件 OpenHarmony Next系统前台运行Flutter页面分析工具 DevEco Studio Profiler SmartPerf Flutter线程介绍 Flutter 使用多个线程来完成其必要的工作,图层中仅展示了其中两个线程。你写的所有 Dart 代码都在 UI 线程上运行。尽管你没有直…...

Kuikly动态化跨端框架的多维特性与选型实践

Kuikly,是指基于Kotlin MultiPlatform(KMP)构建的跨端开发框架,利用KMP的逻辑跨平台能力,抽象通用跨平台UI渲染接口,复用平台UI组件,实现UI跨平台,具备轻量、高性能、可动态化优势;其核心特点是…...

STM32启动流程解析与嵌入式开发实践

1. STM32启动流程深度解析作为一名嵌入式开发者,我经常需要深入理解MCU的启动机制。今天我想分享STM32启动流程的详细分析,这是每个嵌入式工程师都应该掌握的核心知识。STM32的启动过程看似简单,实则包含了许多精妙的设计。理解这个过程不仅能…...

企业级AI Agent Harness工程落地的5个核心步骤与关键里程碑

企业级AI Agent Harness工程落地的5个核心步骤与关键里程碑 开篇:从「大模型玩具」到「生产级生产力工具」的鸿沟 各位技术同仁、架构师、企业数字化负责人,下午好!欢迎来到我的「AI工程化落地指南」专栏——这是我们的第17篇原创深度文章。 过去18个月里,我作为全球TOP3…...

新能源汽车,车载充电机仿真模型(基于PWM整流器)。输出功率3.3kw,前级PFC采用双闭环控制,电流畸变率小。后级采用移相全桥开环控制。 运行环境有matlab_simulink和plecs

新能源汽车,车载充电机仿真模型(基于PWM整流器)。输出功率3.3kw,前级PFC采用双闭环控制,电流畸变率小。后级采用移相全桥开环控制。 运行环境有matlab/simulink和plecs针对新能源汽车车载充电机(OBC&#x…...

告别熬夜!揭秘CSDNer私藏的PPT生成神器

一、PPT 制作之痛:传统与现状在日常的工作与学习中,PPT(PowerPoint)演示文稿已然成为信息展示和沟通的重要工具。无论是商务汇报、学术演讲,还是课堂教学,一份制作精良的 PPT 都能极大地提升信息传递的效果…...

基于dlib+OpenCV的人脸疲劳检测 + 年龄性别识别实战

一、前言在计算机视觉领域,人脸相关技术一直是热门方向,从人脸检测、关键点定位到疲劳检测、年龄性别识别,都有着广泛的应用场景,比如驾驶员疲劳监测、智能门禁、人机交互等。本文将基于dlib和OpenCV,从零实现两个经典…...

OpenClaw对话日志分析:千问3.5-35B-A3B-FP8任务执行效率提升技巧

OpenClaw对话日志分析:千问3.5-35B-A3B-FP8任务执行效率提升技巧 1. 从8分钟到3分钟的优化之旅 上个月,当我第一次用OpenClaw对接千问3.5-35B-A3B-FP8模型执行自动化任务时,一个简单的"资料收集摘要生成"流程平均需要8分钟才能完…...

基于S7-200 PLC和组态王矿井通风控制

基于S7-200 PLC和组态王矿井通风控制矿井通风系统的自动化控制对安全生产太重要了。老张上次下井巡检时说:"现在这通风系统比二十年前强多了,以前手动调风门得拿命赌操作工的手速。"今天咱们就聊聊怎么用S7-200 PLC和组态王搞矿井通风控制&…...

RAG大模型“外挂“揭秘:3步解锁私有数据问答,秒变“开卷学霸“!

什么是 RAG?一文搞懂大模型时代最火技术 🎯 当AI遇到"失忆症":RAG来拯救 相信用过 ChatGPT 的朋友都遇到过这种尴尬: 你问它最新新闻,它回答"我的知识截止到2023年"你问公司内部政策,它…...

ai辅助开发:让快马智能生成win11安装openclaw的交互式诊断助手

最近在折腾Win11系统上安装OpenClaw这个工具时,发现手动安装过程特别容易踩坑。从依赖版本冲突到权限问题,稍不注意就会卡住。后来尝试用InsCode(快马)平台的AI辅助功能,意外发现它能生成一个智能安装助手,把整个流程变得特别顺畅…...

如何在 Laravel Eloquent 中准确检测两个日期时间范围是否重叠

本文详解 laravel 中判断预约时间区间是否重叠的正确逻辑与实现,纠正常见边界条件误判问题,提供简洁可靠的数据库查询方案及完整代码示例。 本文详解 laravel 中判断预约时间区间是否重叠的正确逻辑与实现,纠正常见边界条件误判问题&…...

Docker TLS 证书一键生成脚本(安全加密远程访问)

Docker TLS 证书一键生成脚本(安全加密远程访问) 这是一键自动生成 Docker TLS 加密证书的 Shell 脚本,无需手动输入复杂命令,自动生成 CA 证书、服务端证书、客户端证书,配置好权限,直接复制就能用&#x…...

ESXi 8.0U3I 硬盘直通(PCIe/RDM)完全解决方案:从原理、配置到故障排错全攻略

在 ESXi 8.0U3I 环境中,硬盘直通(含 PCIe 控制器直通 与 RDM 裸设备映射)是实现虚拟机直接访问物理硬盘、最大化存储性能与兼容性的核心技术,但 8.0U3I 对消费级硬件、SATA/NVMe 控制器、驱动签名的管控更严格,极易出现无法开启直通、直通后硬…...

2026.4.7总结

工作日精进:这个月在心声上看到许多离职的帖子,估计是有很多拿完年终奖离职的。看到别人写的离职感悟,我多少有些共情。当有一天,我离职的时候,我也要写一篇长篇大论。早上HR跟入职一两年的人解读了esop相关政策。这政…...

VCF 部署不踩坑!ESXi 主机 SSL 指纹怎么拿、怎么用?一文简单了解

在部署 VMware Cloud Foundation(VCF)9.0 时,很多人会卡在 “ESXi 主机指纹验证” 这一步 —— 自动部署时 JSON 文件缺了它会失败,手动确认又怕输错。其实这就是主机的 “安全身份证”,用来验证连接的真实性。本文用通俗的语言解释 SSL 指纹…...

PyTorch3D在Windows上安装总报错?试试这个绕过源码编译的Pip直装方案(适配PyTorch 2.0.1 + CUDA 11.7)

PyTorch3D在Windows上安装总报错?试试这个绕过源码编译的Pip直装方案(适配PyTorch 2.0.1 CUDA 11.7) 如果你是一名在Windows平台上进行3D视觉研究的开发者,想必对PyTorch3D这个强大的3D深度学习库并不陌生。然而,官方…...

MacOS极简部署OpenClaw:5分钟连接Phi-3-vision-128k-instruct模型

MacOS极简部署OpenClaw:5分钟连接Phi-3-vision-128k-instruct模型 1. 为什么选择OpenClawPhi-3组合 去年第一次听说AI能直接操作我的电脑时,我本能地感到不安——让一个云端模型控制本地文件系统?这听起来就像把家门钥匙交给陌生人。直到发…...

STM32堆栈原理与内存管理实践指南

1. 堆栈基础概念解析在嵌入式系统开发中,堆栈(Stack)是最基础也是最重要的内存管理机制之一。简单来说,堆栈就是一块特殊组织方式的内存区域,采用"后进先出"(LIFO)的原则进行数据存取。理解堆栈的工作原理对于STM32开发至关重要&am…...

基于粒子群算法的IEEE33节点配电网无功优化及其结果分析

基于粒子群算法的配电网无功优化 基于IEEE33节点配电网,以无功补偿器的接入位置和容量作为优化变量,以牛拉法进行潮流计算,以配电网网损最小为优化目标,通过优化求解,得到最佳接入位置和容量,优化结果如下所…...

恒压供水系统:维纶通屏与S7 - 200程序的奇妙组合

恒压供水,维纶通屏+s7 200程序在自动化控制领域,恒压供水系统一直是一个经典应用。今天咱就来唠唠如何用维纶通屏搭配S7 - 200程序实现恒压供水。 一、恒压供水原理简介 恒压供水简单来说,就是不管用水量怎么变化,都能…...

OpenAI 把 Codex 接进 Claude Code,这件事比你想的更“工程化”

目录这次到底发生了什么为什么说这是一次“反常识”的动作插件能力拆解:三个命令背后的工程价值Claude Code Codex 的真实工作流长什么样技术实现拆解:它到底怎么接进去的对开发者意味着什么变化一些容易被忽略的坑一、这次到底发生了什么最近一个比较有…...

新手入门指南:基于快马平台构建静电地板施工交互学习系统

作为一名刚接触机房建设的新手,第一次看到"静电地板施工"这个词时,整个人都是懵的。直到我在InsCode(快马)平台上尝试做了一个交互式学习系统,才发现原来掌握这项技能可以这么简单。下面分享下我的学习心得和系统构建过程。 为什么…...

三步生成炫酷3D魔鬼面具:用快马AI快速构建交互式视觉原型

今天想和大家分享一个超实用的技巧——如何用InsCode(快马)平台快速生成3D魔鬼面具的交互式原型。作为一个经常需要做创意展示的设计师,这个工具真的帮我省去了大量开发时间。 从创意到原型的极速转换 以前做3D展示需要先建模再写代码,现在只需要在快马平…...

IceC:面向嵌入式平台的轻量级ICE兼容中间件

1. IceC:面向资源受限嵌入式平台的轻量级ZeroC ICE兼容中间件 1.1 设计定位与工程必要性 IceC并非ZeroC ICE的全功能移植,而是在AVR(如ATmega328P)和ESP8266等典型资源受限平台约束下,对ICE通信模型进行深度裁剪与重构…...

高效跨平台喜马拉雅音频下载器:Go+Qt5技术架构深度解析

高效跨平台喜马拉雅音频下载器:GoQt5技术架构深度解析 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 喜马拉雅FM作为国…...

CSS定位如何实现模态框垂直居中_使用负边距或transform

transform: translate(-50%, -50%) 是最稳的居中方式,配合 position: absolute 或 fixed 及 top: 50%、left: 50%,可无视元素尺寸变化实现精准居中,且兼容滚动与响应式场景。用 transform: translate(-50%, -50%) 是最稳的居中方式绝对定位 …...

mysql如何限制查询结果_mysqllimit语句使用示例

LIMIT 必须放在整个 SELECT 语句的最后,严格位于 ORDER BY 和 GROUP BY 之后、WHERE 之后;写在 WHERE 或 ORDER BY 中间会报错。MySQL 的 LIMIT 用在 WHERE 之后还是 ORDER BY 之后?LIMIT 必须放在整个 SELECT 语句的最后,且严格位…...

解密KV Cache:为什么它能提升大模型推理速度3倍以上?

KV Cache技术深度解析:如何让大模型推理速度飞跃提升? 在自然语言处理领域,大模型推理速度一直是开发者关注的焦点。想象一下,当你向AI助手提问时,如果每次响应都需要等待数秒甚至更久,用户体验将大打折扣。…...