大模型训练优化器从SGD到AdamW:方向、步长与权重衰减详解
一聊到大模型训练大家最先想到的总是网络结构、数据规模、算力卡数这些“大件”但真正决定训练顺不顺的往往是那个被当成“默认项”的优化器。优化器就是每一轮参数更新的方向盘和油门在动辄几千亿次参数更新的训练里它哪怕偏一点点累积起来的差别也会大得吓人。这篇是“大模型训练”系列的第二篇围绕 SGD、EMA、Momentum、RMSProp、Adam 与 AdamW 这条主线把优化器的基础逻辑一次讲透。这篇文章适合三类人一是刚从图像分类、目标检测这类任务转到生成式大模型训练的同学想搞明白为什么现在一上来就选 AdamW而不是教科书里那个经典的 SGD二是已经在跑训练但只会“用”不会“调”的工程师想彻底理解 lr、beta1、beta2、weight decay 这些参数到底在干吗改哪个最见效三是准备自己写训练框架、做分布式底层优化的朋友需要知道优化器状态量对显存和通信的影响。读完你至少能回答几个实际问题Momentum 到底解决了 SGD 的什么毛病RMSProp 的自适应步长是怎么来的Adam 和 AdamW 差的那个 weight decay 为什么重要出现 loss 震荡、NaN、收敛缓慢时应该先动哪个旋钮1. 没你想的那么玄优化器在大模型训练里的真实地位1.1 为什么大模型比小模型更吃优化器配置以前训一个几十层的分类模型SGD 跑得动Adam 也能跑差别只是收敛快慢和最终精度差一两个点。但大模型一上来情况完全变了。参数量动辄几十亿、上百亿训练预算以“万卡时”计算loss 要稳定下降成千上万步任何一个小环节出问题浪费的算力成本都是真金白银。优化器这时候不再只是“加速收敛”的助推器它要同时扛下三件事。第一控制参数更新的方向和步长。梯度只是告诉我们哪个方向下降最快但步子迈多大、要不要参考历史梯度都由优化器决定。大模型 loss 曲面比小模型复杂得多局部鞍点、陡峭峡谷到处都是单靠原始梯度很容易被困住或者震荡。第二缓和梯度噪声。大模型训练几乎都是 mini-batchbatch 里的样本分布天然带来噪声优化器需要把这种噪声尽量平滑掉让更新方向更稳定。第三保持数值稳定。混合精度训练下梯度可能上下溢出、更新量可能被下溢出吞掉优化器内部的 EMA 状态如果设计不当很容易变成 NaN 的源头。我自己踩过的一个小教训早期调小模型lr 从 1e-3 调到 1e-2loss 照样能降换到十亿参数模型lr 从 3e-4 调到 6e-4loss 直接原地起飞梯度 norm 和 update norm 爆到离谱。这说明大模型对优化器配置的敏感度比想象中高得多。1.2 优化器选型背后的三层核心矛盾理解优化器别只背公式要看它解决了哪一层矛盾。我习惯把优化器要解决的难题拆成三层。更新方向怎么定用当前梯度还是结合历史梯度的“动量”更新步长怎么定所有参数用一个固定学习率还是每个参数按历史梯度大小自动调整参数约束怎么加如何防止参数在训练中无限增大让泛化更稳SGD 只解决最基础的方向问题Momentum 在方向上加入历史信息RMSProp 把步长从“全局固定”变成“逐参数自适应”Adam 把方向自适应的 Momentum 和步长自适应的 RMSProp 合在一起AdamW 又补上了第三层把权重衰减从梯度里“解耦”出来。这个大框架就是整篇文章的骨架。很多新手一开始就跳到 AdamW反而看不懂每个超参数的语义。我建议先按这个顺序把五个优化器过一遍再回过头看 AdamW会发现它其实就是几个成熟组件的拼装。2. 从 SGD 到 AdamW 的五个关键阶梯2.1 SGD最朴素的基准线也是理解一切的起点随机梯度下降的更新规则只有一行θ_{t1} θ_t - lr * g_t其中 g_t 是当前 batch 的梯度lr 是学习率。它的特点非常鲜明每一步都沿着当前梯度的反方向走不参考历史信息。优点是简单、省显存、泛化性出奇得好。尤其在小 batch 场景下SGD 的解常常落在比较“平缓”的极小值点测试误差并不差。很多经典论文里都有“SGD 虽然慢但最终效果并不比自适应优化器差”的结论。缺点也很致命在大模型场景下梯度噪声大、地形复杂SGD 很容易在峡谷两侧来回震荡收敛很慢。还有一个现实问题它对学习率极其敏感lr 稍微大一点就发散稍微小一点就半天不动。在大模型训练里SGD 几乎不会作为首选但它是最重要的参照系。后面所有优化器都可以看成“在 SGD 上加了什么东西”。我也建议大家在调试自定义优化器时先把 SGD 的 loss 曲线跑出来当基线否则你没法判断新优化器到底是变好还是变差。2.2 EMA被当成“优化器”的平滑技术其实有两副面孔EMA 全称是 Exponential Moving Average指数移动平均。它不是一个完整的优化器但经常出现在优化器相关的讨论里原因是它有两个完全不同的使用位置。第一个位置作为优化器内部的状态量。Adam 里的一阶矩 m_t 和二阶矩 v_t本质都是 EMA。只是在 Adam 的语境下大家叫它“动量估计”或者“梯度平方的滑动平均”不直接叫 EMA。第二个位置作为参数本身的后处理。训练过程中除了维护正常训出来的参数 θ我们还同步维护一份参数的 EMA 副本比如 λ_t β * λ_{t-1} (1-β) * θ_t。这个副本在训练结束时往往比 θ_t 本身表现更好因为它在时间维上做了平滑减轻了后期梯度噪声带来的抖动。现在很多开源大模型和图像生成模型最终发布或评测用的都是这种 EMA 权重而不是最后一步的原始权重。EMA 的 β 值通常取 0.99 或 0.999越接近 1平均窗口越长对近期变化越不敏感。实际使用时要注意初始的冷启动问题前几步 λ 几乎等于 0所以一般建议做偏差修正把 λ_t 除以 1 - β^t这在 Adam 里也一样。我自己在训练早期经常忘了区分这两个 EMA导致看代码时很困惑为什么优化器里有 EMAcheckpoint 里又有 EMA 权重搞清楚之后再去看 Adam 的公式就轻松了大半。2.3 Momentum让梯度更新带上“惯性”Momentum 解决的是 SGD 震荡问题。想象一个小球从山顶滚下来如果每一步都只跟着当前坡面方向走遇到小坑就会来回弹但如果小球有速度它就能冲过小坑沿大方向继续滚。数学上Momentum 引入一个速度项 m_tm_t β1 * m_{t-1} (1-β1) * g_t θ_{t1} θ_t - lr * m_tm_t 就是前几步梯度的加权平均。当连续几步梯度方向一致时m_t 较大更新加速当梯度方向来回变幻时m_t 相互抵消更新放缓相当于自动过滤高频噪声。β1 一般取 0.9意思是新梯度只占 1/10 权重历史梯度占 9/10 的惯性。这里有个细节有的教材写成 m_t β1 * m_{t-1} g_t这两种写法系数不同但本质等价只是最终有效学习率差一个 (1-β1) 的因子。看代码时不要被系数差异吓到先确认它有没有做重缩放。Momentum 还有一个变体叫 Nesterov Momentum。它比标准 Momentum 多做一步先沿着当前的动量方向“预瞄”一下再计算那个位置的梯度并更新。在小模型和部分计算机视觉任务上表现更好但在大模型里大家几乎都直接用 Adam 或 AdamWNesterov 反而少见。2.4 RMSProp给每个参数单独配一把“尺子”SGD 全家桶都是一个全局学习率管所有参数但大模型不同位置的参数梯度尺度可以差好几个数量级。比如 embedding 层和最后的分类头梯度可能很大有些深层模块梯度又很小。如果只有一个全局 lr就会顾此失彼。RMSProp 的核心思路是用每个参数的历史梯度平方的 EMA来衡量这个参数的梯度大小然后按比例缩放学习率。v_t β2 * v_{t-1} (1-β2) * g_t^2 θ_{t1} θ_t - lr * g_t / (sqrt(v_t) ε)这里的 v_t 是梯度平方的滑动平均开根号之后近似等于梯度的 RMS 值。当某个参数历史梯度很大时v_t 很大分母大更新变小当历史梯度很小时更新变大。这样一来每个参数都拥有了自己的自适应步长近乎天然处理稀疏特征和不同尺度的梯度。RMSProp 相比更早的 AdaGrad进步在于没有把历史梯度平方无限累积下去而是用滑动平均所以不会出现学习率过早衰减到零的问题。这个机制的代价也很明显额外增加一份与参数等大的 v 状态显存开销翻倍。在大模型时代RMSProp 单独出现的频率不高但它的“逐参数缩放”思想是整个 Adam 家族的核心。你去看任何一篇大模型训练相关的优化器改进论文十有八九都在改这个 v_t 的计算方式。2.5 Adam/AdamW把两个成熟思路组装成默认选择Adam 就是 Momentum 和 RMSProp 的组合体。它同时维护 m_t 和 v_t并且都做偏差修正避免训练初期估计偏离。Adam 的更新公式m_t β1 * m_{t-1} (1-β1) * g_t v_t β2 * v_{t-1} (1-β2) * g_t^2 m_hat m_t / (1 - β1^t) v_hat v_t / (1 - β2^t) θ_{t1} θ_t - lr * m_hat / (sqrt(v_hat) ε)它一方面有了动量带来的方向平滑另一方面有了自适应步长带来的参数级缩放所以在很多任务上都是“开箱即用”的默认优化器。早期的 GPT、BERT 类模型基本都是 Adam。但 Adam 有一个隐藏问题它把 L2 正则权重衰减直接加到了梯度里。在普通 SGD 里L2 正则是“梯度减去一个和参数成比例的项”效果是把权重朝零拉。但在 Adam 里梯度会被 v_t 归一化结果 L2 这一项也被归一化了导致实际正则效果被“稀释”和期望的 weight decay 不一致。AdamW 的修改看起来很小把 weight decay 从梯度中拆出来不参与 Adam 的自适应缩放而是在 Adam 更新完之后直接对参数做一步线性衰减θ_{t1} θ_t - lr * (m_hat / (sqrt(v_hat) ε) wd * θ_t)这里 wd 就是 weight decay 系数。它和 L2 正则的差别在大模型场景下非常明显。你如果从 Adam 切到 AdamW通常会发现 loss 下降更稳定最终泛化更好。这也是为什么现在几乎所有开源大模型训练代码第一行写的就是 AdamW。它不是一个多么高深的改动但把“方向自适应、步长自适应、参数约束”这三层问题完整地解耦出来非常适合大模型这种参数规模巨大、训练极其漫长的场景。3. 大模型训练里怎么选、怎么配参数与策略细节3.1 为什么大模型训练几乎默认 AdamW而不是原生 Adam这个问题被问过很多次。除了上面说的 weight decay 解耦之外还有一个很实际的原因AdamW 和现代 learning rate schedule、混合精度训练的配合更稳定。在原生 Adam 里如果你既想加正则又想用大 lrweight decay 项会随着 lr 一起被放大造成过强的隐式正则模型可能出现欠拟合。AdamW 把两者解耦后你可以在比较大的 lr 下训练同时独立控制权重衰减强度这在预训练阶段尤其关键因为预训练往往要跑几十万步正则不均衡的累计效应非常大。我也见过一些团队在微调阶段用原生 Adam结果也还行毕竟微调步数短、lr 小。但只要是上百亿参数、全量预训练我的建议是无脑 AdamW别在优化器选型上给自己加戏。3.2 必须搞懂的六个关键超参数我把最常用的超参数整理成一张速查表基于我实际训练经验大模型场景下的典型取值如下参数常见范围说明lr1e-4 ~ 3e-4大模型常用 1e-4 到 3e-4过高会发散过低收敛慢beta10.9Adam 的一阶矩衰减几乎不用改beta20.95 ~ 0.999控制二阶矩滑动窗口大 batch 场景常调低到 0.95 或 0.98eps1e-6 ~ 1e-8防止除零也影响数值稳定混合精度下建议 1e-6 以上weight_decay0.01 ~ 0.1控制参数衰减强度常见 0.01 或 0.1warmup_steps总步数的 1%~2%前一段线性把 lr 从 0 升到目标值避免早期梯度爆炸beta2 是我在调试时最喜欢动的参数。理论上 beta2 越大对梯度平方的估计越长程更新越稳定但大模型 batch 通常很大梯度本来就比较平稳再用 0.999 反而让自适应步长反应迟钝。很多团队直接把 beta2 设成 0.95效果反而更好。eps 在混合精度训练里尤其重要。你如果在 fp16 下把 eps 设成 1e-8sqrt(v_hat) 可能被舍入成 0导致更新量异常。我自己习惯在 fp16/bf16 训练里用 eps1e-6stability 明显改善。3.3 和 learning rate schedule 的配合方式优化器和 lr schedule 是绑在一起看的单谈“AdamW 用多少 lr”没有意义。常见做法是 warmup 加 cosine decay。原因很简单训练初期模型参数完全随机梯度很大如果一开始就用大 lr参数会被冲到奇怪的位置。warmup 阶段让 lr 从 0 逐步升到目标值相当于给模型一个“热身”时间。之后用 cosine 把 lr 平滑降到接近 0帮助模型在 loss 曲面底部稳定落地。warmup 步数一般取总步数的 1% 到 2%比如 10 万步训练warmup 设 1000 到 2000 步。有的做法是固定 warmup比如 2000 步在总步数较短时也够用。还有一个经验法则如果你的总 batch size 变大了lr 可以按比例往上调但不要超过一个阈值。比如原来 batch 512、lr 1e-4batch 加到 4096通常 lr 可以升到 2e-4 到 3e-4而不是直接乘 8因为梯度估计变好之后最优 lr 的上升幅度是亚线性的。3.4 weight decay 在 AdamW 里到底怎么解耦的很多人看公式看到 wd 就以为自己懂了但实际写代码时容易搞错顺序。重点在于weight decay 不参与 v_t 的归一化否则就会被“除”掉。我这里放一个简化的伪代码顺序# 1. 计算梯度 g_t # 2. 更新一阶矩和二阶矩 m_t beta1 * m_t (1 - beta1) * g_t v_t beta2 * v_t (1 - beta2) * g_t^2 # 3. 偏差修正 m_hat m_t / (1 - beta1^t) v_hat v_t / (1 - beta2^t) # 4. 先按优化器方向更新 theta_t theta_t - lr * m_hat / (sqrt(v_hat) eps) # 5. 再独立做 weight decay theta_t theta_t - lr * wd * theta_t第 5 步的顺序有些实现是放在第 4 步之前差别不大核心是它没被包进那个除法里面。如果你把 wd 加到梯度里再一起归一化那就是原生 Adam 的 L2 正则效果完全不同。实操中还有一个坑不同框架对 weight_decay 的系数定义可能不一样。PyTorch 的 AdamW 里 weight_decay 会乘到 lr 上有些框架直接对参数乘 (1 - wd)不乘 lr。你在看 loss 曲线时如果发现模型发散或者参数范数异常先检查框架里 weight decay 的语义而不是盲目调数值。4. 实操复盘从 Adam 切到 AdamW以及混合精度排障4.1 一个典型的十亿级参数训练配置我在这里给出一份“基于常见实践补充”的训练配置不是唯一答案但可以作为一个起点。假设你在训练一个 1B~3B 参数的 decoder-only 模型使用 bf16 混合精度总 batch size 1024序列长度 2048训练步数 20 万步。配置项取值说明optimizerAdamW首选解耦权重衰减lr2e-4常见范围内偏中上配合 warmup 使用beta10.9默认beta20.95大 batch 下更灵活eps1e-6bf16 下保证稳定weight_decay0.1看正则需求常用 0.01~0.1warmup2000 步总步数 1%schedulecosine降到接近 0grad clip1.0按全局梯度 norm 裁剪这个配置能跑通大多数中小型大模型实验。如果你发现 loss 很快下降但后期不稳优先把 weight_decay 调低如果 loss 一直不降先检查 lr 是不是太大再检查 warmup 是不是太短。4.2 从 Adam 切到 AdamW 时最容易踩的两个问题第一个问题切换后 loss 曲线明显变差。原因多半是 wd 被错误地当成 L2 来理解或者 wd 设得过大。AdamW 的 weight_decay 效果比原生 Adam 更强同样是 0.1原生 Adam 被归一化掉一部分AdamW 是实打实的参数衰减。我建议从 0.01 起步再慢慢往上试。第二个问题切换后参数范数快速缩小导致层输出分布漂移。这种情况在 attention 层和 MLP 层最容易出现。解决办法是把 wd 降到 0.01或者检查是否把 weight_decay 应用到了 bias、LayerNorm 等不打 L2 正则的参数上。很多时候不应该对 bias 和 norm 类的参数做 weight decay。4.3 混合精度训练下优化器怎么和数值稳定共存bf16 训练越来越普及它的好处是动态范围大不容易溢出但精度低。优化器状态在这种环境下可能有“精度截断”问题。我常用的几个检查点二次矩 v_t 用 fp32 保存不要用 bf16否则长时间累积误差会偏大。参数的 master weight 通常要保留 fp32 副本优化器更新也放到 fp32 里做不能直接在 bf16 参数上做加减小量更新误差容易被吃掉。eps 不要小于 1e-6梯度很小时sqrt(v_hat) 可能下溢出。如果你的框架允许给 m_t 和 v_t 开启 per-tensor 压缩能省不少显存但要小心长时间训练里的误差累积。我在一次训练里遇到过诡异现象前 5 万步 loss 正常第 6 万步突然出现一串 NaN排查后发现是 v_t 里的一个极小数在 fp16 下被截断成 0更新量直接爆炸。后来把优化器状态都改成 fp32问题消失。这个经验后来一直被我写进新框架检查清单里。4.4 优化器状态到底吃了多少显存很多人低估了优化器状态占的显存。以 AdamW 为例每个参数至少需要保存 fp32 的 m_t 和 v_t这就相当于每个参数 8 字节。一个 20B 参数的模型光优化器状态就是 160GB。这还不算 fp32 的 master weight 和梯度本身。这也是为什么大模型训练里经常看到量化优化器、Adafactor、8-bit Adam 这些方案出现。它们的基本思路都一样在不显著影响收敛的前提下砍掉一部分优化器状态精度。比如 v_t 可以用动态指数编码压缩m_t 可以保留 fp16显存能省一半以上。如果你在搭分布式训练要提前把这些开销算进显存规划里否则很容易出现“模型能放得下优化器一初始化就 OOM”的尴尬情况。5. 常见问题与排查速查表症状可能原因检查方式调整方向loss 发散或冲高lr 太大、warmup 太短看 loss 前 100 步的变化趋势降低 lr、延长 warmuploss 不降lr 太小、model 初始化有问题看梯度 norm 是否接近 0适当增大 lr检查初始化训练中后期 loss 震荡grad clip 阈值过大、batch 噪声大对比训练与 eval loss降低 lr增大 beta2出现 NaN/Inf除零、eps 太小、混合精度下梯度溢出开启 NaN 检测定位第一个 NaN 层提升 eps 到 1e-6、梯度裁剪、fp32 优化器状态参数范数增长过快weight_decay 过小定期记录参数 norm提高 wd或对 norm、bias 排除 wd评测效果差、训练 loss 正常EMA 权重没用上 / 过拟合对比 EMA 权重和原始权重的评测结果使用 EMA 权重评估检查 EMA decay还有一个经常被忽视的检查项记录 update_norm 和 param_norm 的比值。通常这个比值在 1e-3 到 1e-4 量级比较健康。如果比值过大说明更新量相对于参数变化太猛容易导致 loss 震荡如果比值长时间过小说明模型在“原地磨”几乎没有有效更新。我在实际项目里会把这几个量做成训练日志的一部分每隔几百步打一次loss、grad_norm、update_norm、param_norm、lr 当前值。这样一旦出问题能快速回看是哪个环节异常而不是靠猜。另外如果在检查点恢复训练时发现 loss 出现跳变先检查优化器状态有没有完整加载。AdamW 的 m_t 和 v_t 不同步恢复会让训练曲线瞬间崩掉这属于“看起来是优化器问题其实是 checkpoint 管理问题”的高频坑。我个人实际操作的体会是优化器选型不要追求花哨先固定一个 AdamW把 lr、beta2、weight_decay 这三个旋钮调明白比试遍所有优化器都管用。遇到复杂问题再回到这个基础框架里找原因绝大多数训练不稳定都能追溯到某个超参数上一两个数量级的偏差。最后再分享一个常用小技巧在大模型训练中尽量让优化器状态和参数状态分开保存方便做对比实验。我习惯在检查点里同时存“原始权重”和“EMA权重”评测时优先用 EMA 权重如果发现它明显比原始权重好说明后段训练噪声确实比较重可以考虑提前降低 lr 或者延长训练。这个习惯在很多开源项目里也成了默认操作值得你直接抄走。

相关新闻

Matlab概率分布与分位数实战:从拟合到异常检测

Matlab概率分布与分位数实战:从拟合到异常检测

1. 概率分布与分位数到底在解决什么问题做数据分析的人迟早会撞上一堵墙:手里攥着一堆样本数据,想判断某个值算不算“异常”,想估算某个事件发生的概率区间,想给一组测量结果划定置信范围。这些问题表面上看是统计问题&#xff0c…

2026/10/14 22:23:49 阅读更多 →
高分错误频发?用RCP为RAG检索上下文建立可计算验收边界

高分错误频发?用RCP为RAG检索上下文建立可计算验收边界

去年年底,我们接手了一个企业内部知识库问答系统的优化需求,客户反馈里有一句话特别扎眼:“向量检索明明显示相似度 0.87,怎么答案跟问题完全不沾边?”这句话几乎成了后来复盘时反复引用的样板。企业 RAG 里“排序高分…

2026/10/14 22:23:49 阅读更多 →
C++11魔法静态变量:手把手实现线程安全单例模板

C++11魔法静态变量:手把手实现线程安全单例模板

单例模式大概是设计模式里写法最多、争议也最多的一个,尤其在 C 里,没有统一的内存模型保障时,线程安全全靠手写。前些年我接一个遗留模块,线上日志系统里出现过诡异现象:两个线程各自调用同一个单例方法,拿…

2026/10/14 22:22:48 阅读更多 →

最新新闻

Vold与Rild架构深度对比:Android系统层守护进程的设计精髓

Vold与Rild架构深度对比:Android系统层守护进程的设计精髓

做Android系统层开发这些年,我始终觉得有两个native守护进程是所有做Framework、做系统定制的人都绕不开的:一个是负责存储卷管理的Vold,另一个是负责电话通信的Rild。这本书第8章把这两个东西放到一起讲,初看有点怪——Vold是管文…

2026/10/15 6:06:41 阅读更多 →
Android系统定制必读:Vold与Rild守护进程架构与排障实战

Android系统定制必读:Vold与Rild守护进程架构与排障实战

这章我前后翻了三遍,每次读都有新收获。Vold和Rild这两个名字,凡是做过Android系统定制或者ROM开发的人都不会陌生:一个管存储,一个管电话,看起来八竿子打不着,但都属于“用户空间最接近内核硬件”的那一层…

2026/10/15 6:06:41 阅读更多 →
ATML标准实战解析:基于XML的测试信息模型如何解决ATS接口难题

ATML标准实战解析:基于XML的测试信息模型如何解决ATS接口难题

搞测控系统这些年,我最大的感受就是:方案好写,接口难缠。同一个被测对象,上午在A台架上测完,下午换个台架,程序和配置往往要重写一遍;测试报告想统一归档,各台位导出的格式却五花八门…

2026/10/15 6:06:41 阅读更多 →
Spring AI智能客服流式输出可靠性:事件总线+Redis Pub/Sub+断线补拉

Spring AI智能客服流式输出可靠性:事件总线+Redis Pub/Sub+断线补拉

1. 客服系统上线前夜,我们被三个问题卡住了做过客服系统的人都有一个共识:功能跑通不难,难的是让它敢在真实流量下上线。我们这套基于 Spring AI 的智能客服系统,在测试环境里跑得挺漂亮,单轮问答准确率能到 90% 以上&…

2026/10/15 6:06:41 阅读更多 →
Linux文件IO深度解析:文件描述符、页缓存与排查实战

Linux文件IO深度解析:文件描述符、页缓存与排查实战

1. 先把“文件”这件事看清:描述符与内核对象做Linux开发这几年,我发现自己反复要给新同事讲同一个话题——文件IO。很多人一开始都觉得文件操作嘛,open、read、write、close,API背下来不就行了?但真到线上排查问题&am…

2026/10/15 6:06:41 阅读更多 →
猜数字游戏:从状态机到二分查找的编程实战训练指南

猜数字游戏:从状态机到二分查找的编程实战训练指南

1. 猜数字游戏:一个被低估的编程训练场1.1 为什么我把猜数字当成正式项目来对待很多人觉得猜数字游戏是编程入门第一课的标配,写个随机数、循环读入、判断大小、给出反馈,几十行代码完事。说实话,我最初也是这么想的。直到有一次&…

2026/10/15 6:05:40 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →