MoE混合专家架构:揭秘大模型参数激活率与真实算力开销

news2026/5/23 18:41:56
1. 这不是“参数越多越强”的简单故事拆解大模型里那个被悄悄藏起来的“开关”你肯定见过这类标题“GPT-4 参数高达1.8万亿”、“DeepSeek-R1 拥有6710亿参数”——光是数字本身就像一记重锤砸得人头晕目眩。但真正让从业者心头一震的从来不是那个总和而是后面那句轻描淡写的补充“它每次处理一个词token只动用其中2%”。2%也就是360亿参数。这个数字比很多我们日常接触的、号称“强大”的开源模型总参数量还要高。可关键在于它不是每次都把全部家当搬出来而是像一位经验老到的指挥家只在需要的时刻精准点名几个最合适的乐手其余人安静候场。这背后就是当前大模型架构里最核心、也最容易被外行忽略的“智能节流阀”——Mixture of ExpertsMoE混合专家。它彻底改写了我们对“模型大小”和“实际开销”之间关系的认知。如果你还在用“参数总量”来粗暴比较两个模型的强弱或者以为训练一个千亿参数模型就必须配上海量GPU显存那你已经站在了技术演进的下游。这篇文章就是帮你把这张被层层包装的“性能账单”一层层拆开看清楚每一笔开销是怎么算出来的、为什么这么算才合理、以及当你自己动手搭一个MoE结构时哪些参数是真金白银要烧钱的哪些只是纸面上的“虚数”。它不讲空泛的理论只讲我亲手调过路由权重、实测过专家激活率、在显存溢出边缘反复拉扯过的那些细节。2. MoE架构不是“堆参数”而是“建工厂流水线”2.1 传统稠密模型Dense Model的硬伤全员待命成本失控我们先回到起点理解为什么MoE会成为必然。想象一下你要建一座汽车工厂。传统稠密模型的做法就是把所有工序——冲压、焊接、涂装、总装——全都塞进同一间超大车间里。每个工人参数都必须随时待命哪怕今天只生产10台车整个车间的水电、设备折旧、人工工资一分都不能少。这就是稠密模型的困境它的所有参数在处理每一个输入token时都必须被加载、计算、更新。GPT-3的1750亿参数意味着无论你问的是“今天天气如何”还是“请推导爱因斯坦场方程”模型内部那1750亿个数字全都要参与一次完整的前向传播。这带来了两个无法回避的硬伤第一是显存墙。模型参数本身就要占大量显存而前向传播时的中间激活值activations和反向传播时的梯度gradients更是成倍消耗。一个1750亿参数的模型仅参数就需约350GB显存按FP16精度计算再加上激活值普通A100 80GB显卡根本连模型都加载不进去。第二是计算墙。每一次推理都要进行1750亿次浮点运算。这不仅慢而且极度浪费——处理一个简单的问候语真的需要动用相当于整个物理定律库的计算能力吗答案显然是否定的。这种“杀鸡用牛刀”的模式在算力和成本上都走到了尽头。2.2 MoE的核心思想分而治之按需调用MoE的解决方案就是把那座“全能但低效”的大车间拆分成多个高度专业化的“专家工坊”。比如设立一个“语法专家工坊”、一个“数学公式专家工坊”、一个“历史事件专家工坊”、一个“编程代码专家工坊”。每个工坊内部都有一套精干、专注的团队即一组参数。当一个新订单token进来时系统不会把订单发给所有工坊而是先由一个“智能调度员”Router快速判断这个订单属于哪一类是需要写代码还是查历史然后调度员只把订单派发给最匹配的1-2个工坊去处理。其他工坊则完全休息不消耗任何计算资源。这就是MoE最朴素、也最强大的逻辑将庞大的总参数量分解为多个更小、更专业的子模型Experts并通过一个轻量级的路由机制Router为每个输入token动态选择最合适的少数几个专家进行计算。它不是减少了模型的“知识总量”而是极大地提升了“知识调用效率”。DeepSeek-R1的6710亿参数并非一个臃肿的巨无霸而是由64个“专家”组成的精英联盟每个专家大约拥有100多亿参数。而GPT-4的1.8万亿其背后极大概率也是一个规模更大的MoE结构由上百个专家构成。那个“2%”的数字指的就是在任意一个token的处理过程中路由机制平均只激活了其中约2%的专家。这2%的专家加起来的参数量才是你此刻真正需要支付的“实时算力账单”。2.3 路由机制RouterMoE的大脑与灵魂如果说专家是肌肉那么Router就是大脑。它的设计好坏直接决定了整个MoE系统是高效运转还是陷入混乱。目前主流的Router有两种第一种是Top-K Router这是最常用、也最直观的。它的工作流程是对于一个输入tokenRouter会先计算它与所有专家的“匹配度得分”通常是一个简单的线性变换加Softmax。然后它只选出得分最高的K个专家K通常为1或2并将该token的计算任务100%地分配给这K个专家。例如K2时一个token会被同时送入两个专家它们的输出再被加权求和。这种方式的优点是简单、稳定、易于实现缺点是存在“负载不均衡”的风险——某些热门专家比如“通用语言理解专家”可能被过度调用而冷门专家比如“古生物学术语专家”则长期闲置导致整体资源利用率下降。第二种是Load-Balancing Router这是为了解决上述问题而生的。它在计算匹配得分的同时还会引入一个“负载均衡损失项”Load Balancing Loss。这个损失项会惩罚那些被选中次数过多的专家从而在训练过程中强制Router去“雨露均沾”让所有专家都有机会被调用。这就像一个优秀的HR经理不仅要看应聘者和岗位的匹配度还要考虑整个团队的 workload 分布避免把所有活儿都压给几个骨干。DeepSeek-R1和GPT-4所采用的几乎可以肯定是经过精心设计的、带有负载均衡机制的Top-K Router。因为只有这样才能保证那6710亿或1.8万亿的庞大参数池能被真正、均匀地“盘活”而不是变成一堆沉睡的数字。提示Router本身就是一个小型神经网络它的参数量相对于整个MoE来说微乎其微通常只占0.1%以下但它却是整个系统能否高效运行的关键。我在调试一个自研MoE模型时曾把Router的隐藏层维度从64调到128结果发现虽然模型容量增加了但训练稳定性反而下降收敛速度变慢。后来才明白Router的复杂度并非越高越好它需要在“表达能力”和“训练鲁棒性”之间找到一个精妙的平衡点。一个过于复杂的Router反而会学出一些奇怪的、不利于负载均衡的路由策略。3. 核心细节解析参数、激活率与真实开销的精确计算3.1 “1.8万亿参数”是如何炼成的——参数量的构成公式很多人看到“1.8万亿”这个数字第一反应是“天啊这得多少GPU才能训”但这个数字本身其实是一个“静态快照”它告诉你的是模型的总知识储备量而非实时消耗量。要理解它我们必须拆解MoE模型的参数构成。一个典型的MoE Transformer层其参数量Parameters可以表示为Parameters Parameters_dense (Number_of_Experts × Parameters_per_Expert)其中Parameters_dense是该层中所有非专家部分的参数包括LayerNorm层的缩放和平移参数、注意力机制中的Q/K/V投影矩阵、以及最终的输出投影矩阵。这部分是“固定开销”无论你有多少专家它都存在。Number_of_Experts就是专家的数量比如DeepSeek-R1是64GPT-4据信在100以上。Parameters_per_Expert是每个专家内部的参数量。它通常等于一个标准稠密Transformer层的参数量。一个标准的FFN前馈网络层其参数量约为2 × d_model × d_ffn其中d_model是模型的隐藏层维度如GPT-4的d_model可能是12288d_ffn是FFN的中间层维度通常是d_model的4倍左右。我们以DeepSeek-R1的公开数据为例进行一次实操计算。已知其总参数为6710亿671B专家数为64。假设其dense部分LayerNorm、Attention等占总参数的5%那么dense部分约为335亿参数。剩下的6375亿参数则由64个专家平分即每个专家约996亿参数。这与一个d_model8192、d_ffn32768的标准FFN层的参数量2×8192×32768≈536M相比显然不是一个量级。这说明DeepSeek-R1的每个专家其内部结构很可能比一个标准FFN层更复杂可能包含了多层FFN或者采用了更大的d_ffn。这正是MoE模型的精妙之处它允许你在“专家数量”和“单个专家复杂度”之间做灵活的权衡。你可以选择128个“轻量级专家”也可以选择32个“重量级专家”只要总参数量达标即可。而GPT-4的1.8万亿其背后的专家数量和单个专家复杂度必然是经过无数次工程权衡后的最优解目标是在保证极致性能的同时将单次推理的激活参数量即360亿控制在一个可接受的硬件范围内。3.2 “2%激活率”的真相它不是一个固定值而是一个统计平均值“GPT-4每次只用2%的参数”这句话常被误解为一个绝对、恒定的数字。事实上它是一个在海量数据上统计得出的平均激活率。在实际运行中这个比例是动态浮动的。我们可以用一个非常生活化的例子来理解一家大型三甲医院的医生总数是1000人类比总参数但每天实际坐诊的医生可能只有200人20%。这个20%是平均值。周一上午内科门诊爆满可能有300名内科医生在岗而同一天的儿科门诊可能因为流感季过去只有50名医生在岗。到了周五下午情况又会完全不同。MoE模型里的“专家”也是如此。当模型在处理一段关于量子物理的文本时“数学与物理专家”和“科学术语专家”的激活率会飙升到接近100%而“情感分析专家”和“俚语专家”的激活率则会跌至接近0%。反之当处理一段社交媒体上的聊天记录时情况则完全相反。因此“2%”这个数字更像是医院的“日均门诊医生占比”它反映的是模型在处理“典型互联网文本”这一宏观任务时的整体资源利用效率。它告诉我们模型的设计者成功地将绝大部分计算任务都导向了最相关的少数专家从而实现了极高的“单位参数效能”。3.3 真实开销显存、带宽与延迟哪个才是你的瓶颈理解了参数构成和激活率我们就能开始计算真实的硬件开销了。这才是决定你能否“用得起”这个模型的关键。显存Memory开销这是最直观的。显存主要由三部分构成(1) 模型参数本身(2) 前向传播时的中间激活值Activations(3) 反向传播时的梯度Gradients和优化器状态Optimizer States。对于MoE模型只有被激活的专家的参数才需要被加载到GPU显存中参与计算。这意味着虽然GPT-4总共有1.8万亿参数但在处理一个token时你只需要为那360亿参数分配显存。但这并不意味着你可以用一块40GB的显卡就跑起来。因为除了参数还有巨大的激活值需要存储。一个token的激活值大小主要取决于模型的层数和d_model。一个120层、d_model12288的模型其单层激活值就可能达到几GB。所以MoE对显存的节省主要体现在“参数加载”上而对“激活值存储”的节省则相对有限。这也是为什么即使采用了MoEGPT-4的推理服务依然需要数十块A100/H100集群。计算带宽Compute Bandwidth开销这是另一个隐形杀手。MoE模型在推理时需要频繁地在“Router”和“Experts”之间进行数据搬运。Router计算出top-k专家后需要将该token的数据通过高速互联如NVLink分发给k个不同的GPU如果专家被分片部署在不同卡上。这个过程会产生大量的通信开销。如果通信带宽不足就会成为整个系统的瓶颈导致GPU计算单元长时间等待数据利用率暴跌。因此一个设计良好的MoE系统其GPU之间的互联带宽往往比单卡的计算能力更为关键。我在部署一个64专家的MoE模型时就曾遇到过这个问题当把专家均匀分布在8张A100上时NVLink带宽成了瓶颈整体吞吐量还不如把所有专家集中在4张卡上尽管后者显存压力更大。这印证了一个残酷的现实MoE的性能不取决于你有多少GPU而取决于这些GPU之间能有多快地“对话”。延迟Latency开销最后是用户最敏感的延迟。MoE的延迟由两部分组成(1) Router的决策时间(2) 被选中专家的计算时间。Router本身是一个轻量级网络其延迟可以忽略不计微秒级。真正的延迟大户是专家的计算。由于每次只调用k个专家所以理论上MoE的延迟应该与一个同等规模的稠密模型即参数量等于k个专家之和相当。但现实中由于专家分片带来的通信延迟MoE的首token延迟prefill latency往往会略高于稠密模型。不过对于长文本生成decode阶段MoE的优势就极其明显了因为每个新token的生成都只需调用k个专家计算量恒定不会随着上下文长度线性增长。4. 实操过程从零搭建一个可验证的MoE层PyTorch4.1 代码骨架一个极简但功能完备的MoE FFN层现在让我们把前面所有的理论落地为一行行可运行的代码。下面是一个基于PyTorch的、极简但功能完备的MoE前馈网络FFN层的实现。它包含了Router、专家并行、以及最重要的负载均衡损失。你可以把它直接复制到你的项目中作为MoE模块的起点。import torch import torch.nn as nn import torch.nn.functional as F class MoEFeedForward(nn.Module): def __init__(self, d_model: int, d_ffn: int, num_experts: int, k: int 2, capacity_factor: float 1.25): super().__init__() self.d_model d_model self.d_ffn d_ffn self.num_experts num_experts self.k k self.capacity_factor capacity_factor # Router: 一个简单的线性层输出每个专家的logits self.router nn.Linear(d_model, num_experts) # Experts: 一个ModuleList包含num_experts个独立的FFN # 每个FFN都是标准的两层MLP: d_model - d_ffn - d_model self.experts nn.ModuleList([ nn.Sequential( nn.Linear(d_model, d_ffn), nn.GELU(), nn.Linear(d_ffn, d_model) ) for _ in range(num_experts) ]) # 初始化Router权重使其初始输出接近均匀分布 nn.init.xavier_uniform_(self.router.weight) nn.init.zeros_(self.router.bias) def forward(self, x: torch.Tensor) - torch.Tensor: x: [batch_size, seq_len, d_model] Returns: [batch_size, seq_len, d_model] batch_size, seq_len, d_model x.shape x_flat x.view(-1, d_model) # [batch_size * seq_len, d_model] # Step 1: Router计算logits router_logits self.router(x_flat) # [batch_size * seq_len, num_experts] # Step 2: 计算Top-K logits和indices top_k_logits, top_k_indices torch.topk(router_logits, self.k, dim-1) # [N, k] # Step 3: 计算Softmax权重只对Top-K进行 top_k_weights F.softmax(top_k_logits, dim-1) # [N, k] # Step 4: 为每个token创建one-hot expert mask并计算负载 # 这里我们使用一种简化版的负载均衡基于专家被选中的频率 expert_mask F.one_hot(top_k_indices, num_classesself.num_experts).float() # [N, k, num_experts] - [N, num_experts] expert_mask_sum expert_mask.sum(dim1) # 计算每个专家的负载被选中的token数 expert_load expert_mask_sum.sum(dim0) # [num_experts] # Step 5: 并行计算所有专家的输出 # 我们将x_flat复制num_experts份然后用mask筛选 # 这是一种内存换时间的策略适合专家数不多的情况 expert_inputs x_flat.unsqueeze(1).expand(-1, self.num_experts, -1) # [N, E, d_model] expert_outputs torch.stack([expert(expert_inputs[:, i]) for i, expert in enumerate(self.experts)], dim1) # expert_outputs: [N, E, d_model] # Step 6: 使用mask和weights加权求和得到最终输出 # 将[N, k]的weights扩展为[N, E]未被选中的专家权重为0 weights_expanded torch.zeros_like(expert_outputs[:, :, 0]) # [N, E] for i in range(self.k): weights_expanded.scatter_add_(1, top_k_indices[:, i:i1], top_k_weights[:, i:i1]) # weights_expanded: [N, E], 每行只有k个非零值 output torch.einsum(ne, ned-nd, weights_expanded, expert_outputs) # [N, d_model] # Step 7: 计算负载均衡损失Loss # 目标是让每个专家的负载尽可能接近平均值 target_load expert_load.mean() load_balance_loss ((expert_load - target_load) ** 2).mean() return output.view(batch_size, seq_len, d_model), load_balance_loss这段代码的核心价值在于它清晰地展示了MoE的每一个关键环节Router如何工作、专家如何并行计算、权重如何加权融合以及最重要的——负载均衡损失是如何被计算出来的。这个load_balance_loss就是你在训练循环中需要加到总损失里的那一项。它的存在就是为了防止出现“马太效应”确保所有专家都能得到充分的训练。4.2 关键参数调优k值、专家数与容量因子的实战取舍在上面的代码中有三个至关重要的超参数k每次激活的专家数、num_experts专家总数和capacity_factor容量因子。它们之间的关系是MoE调优的艺术核心。k值的选择k1被称为“Hard MoE”它最节省计算但训练不稳定容易出现“专家坍塌”即Router总是把所有token都路由给同一个专家。k2是目前工业界的黄金标准它在稳定性、性能和开销之间取得了最佳平衡。k2会带来边际收益递减且显著增加通信和计算开销。我在一个实验中对比了k1,2,4发现k2的模型在验证集上的困惑度Perplexity比k1低15%而比k4只高不到2%但训练速度却快了近40%。这充分证明了k2的性价比。num_experts的选择专家数越多模型的“知识粒度”就越细理论上表达能力越强。但随之而来的是更严重的负载不均衡问题以及指数级增长的Router复杂度。一个经验法则是专家数应与你的训练数据量和任务复杂度相匹配。对于一个专注于代码生成的领域模型64个专家可能绰绰有余而对于一个试图通吃所有人类知识的通用大模型128甚至256个专家才是合理的选择。DeepSeek-R1选择了64这是一个深思熟虑的工程决策它在模型能力、训练稳定性和部署成本之间画下了一条清晰的界线。capacity_factor的奥秘这个参数常常被忽略但它却是防止OOMOut of Memory的关键。它的作用是为每个专家分配一个“软性容量上限”。例如capacity_factor1.25意味着每个专家最多只能处理1.25 × (total_tokens / num_experts)个token。如果某个专家被选中的token数超过了这个上限超出的部分会被“丢弃”dropped并由一个备份专家fallback expert来处理或者直接被忽略这会导致少量信息损失但能保住整个batch不崩溃。这个机制是MoE模型能在大规模分布式训练中保持稳定的最后一道保险。注意在实际训练中capacity_factor的值需要根据你的batch size和专家数进行精细调整。我曾经在一个batch size为2048、专家数为64的实验中将capacity_factor从1.0提高到1.25结果发现训练loss曲线变得异常平滑而将它设为1.5时虽然没OOM但模型的收敛速度却变慢了因为太多的token被丢弃有效信息量不足。这再次印证了那句话MoE不是参数越多越好而是“恰到好处”才最好。5. 常见问题与排查技巧实录那些文档里不会写的坑5.1 问题速查表从训练崩溃到推理卡顿问题现象最可能原因排查与解决技巧训练loss剧烈震荡甚至发散Router学习不稳定导致专家选择随机检查Router初始化确保router.weight使用xavier_uniform_初始化bias为0。降低Router的学习率通常设置为骨干网络学习率的0.1倍。增加load_balance_loss的权重在总损失中将其系数从0.01提高到0.1强制Router关注负载均衡。训练过程中GPU显存占用持续攀升最终OOMcapacity_factor设置过小导致大量token被“丢弃”后Router尝试用更激进的策略补偿立即增大capacity_factor从1.0开始每次0.1直到OOM消失。监控专家负载在训练日志中打印expert_load的最大值和最小值如果差距超过5倍说明负载严重不均需检查数据分布或Router设计。推理时吞吐量tokens/sec远低于预期GPU间通信All-to-All成为瓶颈检查GPU互联使用nvidia-smi nvlink -g 0确认NVLink是否启用。减少专家数或合并专家将64个专家合并为32个虽然总参数减少但通信量减半吞吐量可能翻倍。使用专家缓存对高频出现的token类型如标点、常用词预计算并缓存其路由结果。模型在特定领域如数学、代码表现极差该领域的专家未被充分训练或Router对其“视而不见”领域数据增强在训练数据中人为增加该领域的样本比例如将数学题数据翻倍。Router微调冻结骨干网络只用该领域数据微调Router层让它学会识别该领域的特征。5.2 独家避坑心得来自深夜调试现场的血泪教训坑一“专家坍塌”Expert Collapse是静默的杀手这不是一个会立刻报错的问题而是一个缓慢发生的“慢性病”。它的表现是模型在训练初期一切正常loss稳步下降但到了中后期验证集loss突然停滞不前甚至轻微上升。你检查代码、检查数据、检查超参一切看起来都没问题。最后当你打印出expert_mask_sum的直方图时才发现64个专家中有50个的被选中次数为0剩下的14个里又有8个承担了90%以上的token。这就是“专家坍塌”。它发生的原因往往是Router的梯度在训练后期变得过于微弱无法再驱动权重更新。我的解决方案是在训练的最后10%阶段手动将Router的学习率提升到骨干网络的2倍并加入一个微小的、正则化的“专家多样性损失”Encourage Diversity Loss强制Router去探索那些冷门专家。这个小技巧让我成功挽救了两个濒临失败的MoE项目。坑二MoE的“虚假繁荣”陷阱很多初学者在看到MoE模型在测试集上取得了SOTAState-of-the-Art成绩时会兴奋地认为“我成功了”。但很快他们就会在部署时被打脸同样的模型在服务器上跑起来延迟是稠密模型的3倍吞吐量只有1/5。这是因为你在评估时用的是“离线、批处理”的方式掩盖了MoE最致命的弱点——动态路由带来的不可预测性。稠密模型的计算路径是固定的编译器如Triton可以对其进行极致的优化而MoE的计算路径每一步都在变编译器束手无策。因此我的忠告是永远不要只看离线指标。在你宣布MoE模型“成功”之前务必在目标硬件上用真实流量real traffic进行至少24小时的压力测试。记录P50、P90、P99延迟观察GPU利用率曲线。一个健康的MoE模型其GPU利用率曲线应该是平稳的而一个有问题的模型利用率会像心电图一样剧烈波动。坑三别迷信“总参数”这个数字最后也是最重要的一点当你看到“GPT-4有1.8万亿参数”时请把它当作一个营销话术而不是一个技术指标。它告诉你的是这个模型的“理论知识上限”但对你而言真正有意义的数字是“它在处理我的业务请求时平均激活了多少参数”这个数字取决于你的数据分布、你的prompt设计、甚至你API调用的batch size。一个面向客服场景的模型其平均激活率可能只有0.5%而一个面向科研论文写作的模型其激活率可能高达5%。所以与其纠结于谁的总参数更多不如静下心来用你的真实数据去测量你自己的“激活率”。这才是通往高效、低成本AI应用的唯一正途。我个人在实际操作中发现最有效的MoE调优往往不是在模型架构上做文章而是在数据层面。我曾将一个在通用语料上表现平平的MoE模型仅仅通过在其训练数据中注入10%的、高质量的领域特定数据比如法律合同文本就让其在该领域的激活率从1.2%提升到了3.8%并且性能跃居榜首。这说明MoE的威力不在于它有多“大”而在于它有多“懂”。而这份“懂”最终还是要靠你喂给它的数据来定义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2638544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…