GPU显存与性能估算工具gpu_poor:大模型部署前的可行性分析

news2026/5/14 1:31:44
1. 项目概述你的显卡能跑动大模型吗每次看到一个新发布的大语言模型心里总是痒痒的想拉下来跑跑看。但点开下载按钮前那个灵魂拷问总会浮现“我这块显卡到底带不带得动” 尤其是当我们手头只有消费级显卡或者还在用几年前的老伙计时这个问题就更加现实。模型参数动辄70亿、130亿显存动辄要求16G、24G看一眼自己的显卡再查一下钱包瞬间就陷入了“算力贫困”的焦虑。这正是gpu_poor这个工具要解决的核心痛点。它不是一个复杂的性能测试套件而是一个极其务实的“计算器”。你不需要下载任何模型甚至不需要打开Python环境只需在网页上输入几个关键参数——比如模型规模7B, 13B、你的显卡型号RTX 3060 12G, RTX 4090 24G、你想要的上下文长度Context Length以及计划使用的量化精度比如4-bit, 8-bit——它就能立刻给你算出来运行这个模型到底需要多少显存在我的硬件上推理速度大概能达到每秒多少个TokenToken/s如果我想微调每次迭代大概要花多少时间对于所有在有限算力条件下折腾大模型的朋友来说这相当于在动手之前先拿到了一份详尽的“可行性研究报告”。它能帮你避免那种“下载了十几个G的模型文件结果torch.cuda.out_of_memory报错扑面而来”的绝望时刻也能让你在选购显卡或云服务器时心里更有谱。2. 核心功能与使用场景拆解gpu_poor的功能界面非常直观主要围绕三个核心计算展开显存需求估算、推理速度预估和微调耗时估算。理解这些功能背后的使用场景能让你更好地利用这个工具。2.1 显存需求计算你的“内存预算表”这是最基础也是最关键的功能。大模型运行时的显存占用远不止模型参数本身那么简单。gpu_poor会帮你把总显存占用拆解成几个部分让你一眼看清“钱都花在哪了”。1. 模型参数Model Weights这是最直观的部分就是你的.bin或.safetensors文件大小。如果你使用量化这部分会显著减小。例如一个FP1616位浮点数的7B模型参数大约占14GB因为每个参数2字节。如果使用4-bit量化如GGUF Q4_K_M模型大小会降到大约4GB左右。工具会自动根据你选择的量化方式如bitsandbytes的 int8, int4或llama.cpp的 GGUF Q4, Q8来折算这部分大小。2. KV缓存KV Cache这是推理尤其是生成文本时的“内存杀手”。为了高效生成下一个token模型需要缓存当前序列中所有先前token的Key和Value向量。这部分内存开销与**上下文长度Context Length和批次大小Batch Size**成正比。公式大致是2 * 序列长度 * 隐藏层维度 * 层数 * 批次大小 * 每个元素字节数。工具会考虑不同推理后端如原始Hugging Face、vLLM、llama.cpp对KV缓存实现的优化程度给出不同的估算值。注意KV缓存只在推理特别是自回归生成时需要。在训练时因为是一次性处理整个序列不需要缓存所以这部分内存开销为0。3. 激活值内存Activation Memory这部分主要在训练和梯度计算时占用显存。在前向传播过程中为了后续能进行反向传播计算梯度许多中间计算结果激活值需要被临时保存下来。在LLM中每一层都有大量的这类中间张量。对于使用LoRA或QLoRA的微调由于大部分参数被冻结优化器状态很小激活值内存就成了主要的显存消耗者。gpu_poor会估算在给定批次大小和序列长度下保存这些激活值所需的内存。4. 梯度与优化器状态Grad Optimizer States在全参数训练Full Fine-tuning时这部分是显存大户。每个可训练参数都需要存储其梯度通常与参数同精度如FP16此外优化器如Adam还会为每个参数维护额外的状态例如一阶矩和二阶矩的移动平均。对于FP16参数使用Adam优化器时每个参数大约需要消耗16字节参数2字节 梯度2字节 优化器状态12字节。这就是为什么全量微调一个7B模型可能需要超过40GB显存的原因。工具会根据你选择的训练方式全量、LoRA、QLoRA来动态计算这部分开销。5. CUDA及其他开销CUDA Other Overhead这是一个常被忽略但确实存在的部分。CUDA内核、上下文、内存池、框架本身如PyTorch的运行时开销以及使用某些量化库如bitsandbytes引入的额外内存都会占用几百MB到1GB不等的显存。gpu_poor在计算中预设了一个基础开销例如650MB使估算更接近实际情况。使用场景示例假设你有一块RTX 4060 Ti 16G显卡想用QLoRA微调一个7B的模型上下文长度设为1024批次大小为1。你可以在工具中选择相应配置它会立刻告诉你总显存需求是否超过16G并展示各部分占比。如果超了你可以尝试降低批次大小、缩短上下文长度或使用更激进的量化如4-bit然后实时看到显存占用的变化直到找到能在你显卡上运行的配置。2.2 推理速度估算你的“性能预期器”除了“能不能跑”下一个问题就是“跑得快不快”。gpu_poor提供的Token/s估算能让你对模型的响应速度有一个大致的预期。这个估算基于一个核心概念内存带宽限制Memory-Bound vs 计算限制Compute-Bound。内存带宽限制对于大多数推理场景尤其是使用消费级显卡运行参数量较大的模型时性能瓶颈往往不在GPU的计算核心CUDA Cores上而在从显存中读取模型权重和数据到计算单元的速度上。这受限于显卡的显存带宽如RTX 4090是1008 GB/sRTX 3060 12G是360 GB/s。在这种情况下Token/s的速度主要与模型的“内存访问量”和你的显存带宽有关。计算限制只有当模型非常小或者你的显卡计算能力相对很弱时才可能成为计算瓶颈。对于现代LLM推理这种情况较少。工具会根据你选择的模型大小、量化精度这影响了每次推理需要从显存读取的数据量以及你显卡的显存带宽估算出一个大致的Token/s数值。它还会告诉你在当前配置下系统是“内存限制”还是“计算限制”。输出示例解读{ Token per second: 42.5, ms per token: 23.5, Prompt process time (s): 1.8, memory or compute bound?: Memory }Token per second: 预估每秒能生成的token数这里是42.5个。对于对话应用这个速度基本可以接受。ms per token: 生成每个token所需的毫秒数约23.5毫秒。Prompt process time (s): 处理你的输入提示Prompt所需的时间这里假设提示有100个token处理完需要1.8秒。这是因为处理提示时是并行计算速度很快但生成是串行的。memory or compute bound?: 明确指出了当前瓶颈是“内存带宽”。这意味着即使你换用计算能力更强但显存带宽相同的显卡提升也可能很有限。2.3 微调耗时估算你的“时间规划师”如果你打算微调模型除了显存时间成本也是重要的考量因素。gpu_poor可以估算每次训练迭代一个前向传播反向传播所需的大致时间毫秒。这个估算同样基于内存带宽和计算能力的分析。对于微调尤其是使用QLoRA时由于大部分参数被冻结且量化计算量相对较小但前向和反向传播过程中仍然需要频繁访问显存中的适配器Adapter权重和激活值。工具会综合考虑你的硬件算力如FP16 TFLOPS、显存带宽以及模型的计算图复杂度给出一个迭代时间的近似值。有了每次迭代的时间你就可以大致推算出完成整个训练数据集所需的总时间。例如如果你的数据集有10,000条样本批次大小为4那么一个Epoch需要2500次迭代。如果每次迭代需要100毫秒那么一个Epoch就需要大约250秒4分多钟。这能帮助你合理规划训练任务和资源。3. 工具背后的原理与计算逻辑知其然更要知其所以然。gpu_poor的估算并非魔法而是基于一系列公开的模型架构知识和硬件性能参数建立的数学模型。了解这些你不仅能更信任其结果还能在工具估算不准确时自己进行手动复核或调整思路。3.1 模型参数的精确估算工具内置了一个常见开源大模型如Llama、Mistral、Qwen系列的配置数据库。当你输入“7B”时它并不是简单地用7 * 2 14GB来计算FP16大小。它会查找对应模型的具体配置隐藏层维度Hidden Size 如Llama-2-7B是4096。中间层维度Intermediate Size 如Llama-2-7B是11008。层数Number of Layers 如Llama-2-7B是32。注意力头数Number of Heads 如Llama-2-7B是32。词汇表大小Vocabulary Size 通常是32000或更大的数。总参数量有一个近似公式Params ≈ (2 * hidden_size * intermediate_size hidden_size * hidden_size * 3) * num_layers vocab_size * hidden_size。对于Llama-2-7B这个计算结果是6.74B加上一些其他参数四舍五入为7B。然后根据精度计算大小FP16 Size ≈ Params * 2 bytes。对于量化模型计算方式如下8-bit (e.g., bitsandbytes int8):Size ≈ Params * 1 byte4-bit (e.g., QLoRA NF4):Size ≈ Params * 0.5 bytes(实际上由于量化分组和额外数据会略大于这个值)GGUF Q4_K_M: 这是一种混合精度量化平均下来每个参数约0.55字节所以Size ≈ Params * 0.55 bytes3.2 KV缓存内存的详细拆解这是估算中最容易出错的部分。KV缓存的大小取决于模型架构、推理框架和生成策略。基础公式以FP16为例对于一个批次batch_size1单层的KV缓存大小为KV_cache_per_layer 2 * (seq_len * hidden_size) * 2 bytes * 2解释第一个2 代表Key和Value两个矩阵。seq_len * hidden_size 每个token对应的Key或Value向量的维度。2 bytes FP16精度下每个元素占2字节。第二个2这是最容易混淆的点。在原始的Transformer解码器中为了计算注意力分数QK^TKey和Value通常被投影到不同的维度head_dim。但为了高效实现很多框架如Hugging Face的默认实现会存储投影前和/或投影后的状态导致实际缓存大小是理论值的两倍。这也是为什么gpu_poor会区分“Hugging Face”和“vLLM/llama.cpp”等优化后端的原因。因此总KV缓存 KV_cache_per_layer * num_layers * batch_size。对于Hugging FaceLlamaForCausalLM可能接近2 * 2 * seq_len * hidden_size * num_layers * 2 bytes。对于高度优化的推理引擎如vLLM它实现了PagedAttention能非常高效地管理和复用KV缓存实际内存占用可能只有Hugging Face默认实现的1/2甚至更少。llama.cpp同样有出色的内存管理。工具在计算时会根据你选择的“推理后端”来应用不同的系数。3.3 激活值内存的实践经验值激活值内存的精确计算极其复杂因为它依赖于模型计算图中每一个需要保留梯度的操作。gpu_poor采用了一种基于经验的近似方法。在Transformer的一层中主要需要保存的激活值包括注意力模块中的查询Q、键K、值V投影后的输出。注意力分数Softmax前/后。注意力输出经过投影后。前馈网络FFN中多个线性层的输出。层归一化LayerNorm的输入/输出。一个常见的经验法则是对于批次大小为1、序列长度为S的训练激活值内存大约在(10 ~ 20) * S * hidden_size * num_layers * 2 bytes这个范围。gpu_poor的作者通过实测为不同模型架构设定了一个合理的乘数例如15从而进行估算。对于QLoRA由于只训练极少量参数大部分激活值来自被冻结的基座模型这个估算仍然适用。3.4 性能估算的基准FLOPS与带宽Token/s和迭代时间的估算核心是判断任务受限于计算还是内存带宽并应用相应的“屋顶线模型Roofline Model”。1. 计算你的硬件理论峰值理论计算能力TFLOPS 以RTX 4090为例其FP16Tensor Core理论算力约为 330 TFLOPS。公式大致为核心频率 * CUDA核心数 * 2 (FMA乘加算两次操作) / 10^12。理论显存带宽GB/s RTX 4090为1008 GB/s。2. 估算模型操作的计算强度Arithmetic Intensity计算强度 所需的总计算操作数FLOPs / 所需的内存访问字节数Bytes。对于大矩阵乘法如LLM中的线性层计算强度很高理想情况下应受限于计算能力。但是在推理和训练中由于模型参数巨大每次计算都需要从显存中加载权重而权重的重用性有限尤其是生成任务每次只生成一个token导致有效计算强度变得很低。此时性能瓶颈就从计算转移到了内存带宽。3. 应用屋顶线模型如果任务的计算强度低于某个临界值硬件峰值算力 / 硬件峰值带宽那么它就是内存带宽限制的。此时最大性能 ≈ 内存带宽 * 计算强度。gpu_poor根据模型大小、量化精度和操作类型估算出每次生成token或每次迭代所需的“内存访问量Bytes per Token/Iteration”。然后用你的显卡带宽除以这个内存访问量就得到了理论最大Token/s或迭代速度。由于软件开销、内核启动延迟等因素实际速度会低于这个理论值工具会乘以一个经验性的效率系数例如0.6-0.8来给出更现实的估算。4. 实操指南从估算到真实部署工具给了你一个蓝图但真正把模型跑起来还需要一些实操技巧。这里结合gpu_poor的估算结果分享一些部署和微调过程中的关键步骤和避坑经验。4.1 如何利用估算结果选择模型与配置假设你的目标是部署一个用于本地文档问答的7B模型显卡是RTX 3060 12G。第一步确定核心需求。你需要至少4K的上下文长度来处理长文档推理速度最好能达到20 Token/s以上以保证交互体验。第二步在gpu_poor中进行“可行性扫描”。模型选择Llama-2-7B上下文长度4096批次大小1。先试FP16无量化。工具会显示总显存需求可能超过14GBKV缓存占了大头你的12G显卡显然不够。切换到GGUF Q4_K_M量化。工具显示模型大小降至约4GB总显存需求可能在8-9GB左右Token/s估算为~35。结论可行第三步选择推理框架。工具显示使用llama.cpp后端比默认Hugging Face能节省近1GB的KV缓存内存。因此你应该优先选择llama.cpp或基于它的GUI如Ollama、LM Studio来部署。第四步下载与运行。去Hugging Face寻找Llama-2-7B-GGUF格式的模型文件选择Q4_K_M版本。使用llama.cpp的命令行或Ollama加载指定上下文长度-c 4096。实操心得对于消费级显卡GGUF格式的量化模型几乎是唯一现实的选择。Q4_K_M是精度和速度的一个很好平衡点。Q8虽然精度更高但模型体积翻倍显存占用和加载速度都会受影响在12G卡上跑4K上下文可能就比较极限了。4.2 微调配置的实战调整现在你想用QLoRA在你的领域数据上微调一个7B模型显卡是RTX 4060 Ti 16G。在工具中模拟配置模型Mistral-7B-v0.1训练方式QLoRA (4-bit)上下文长度1024批次大小4。解读结果工具可能显示总显存需求约为14.5GB其中“激活值内存”占了很大一部分迭代时间估算为 ~120ms。这表明你的16G显卡刚好够用但几乎没有余量。调整策略降低批次大小将批次大小从4降到2或1。这会显著减少激活值内存几乎成比例减少总显存需求可能降到12GB以下。代价是训练可能更不稳定需要更小的学习率或更多的梯度累积步数。使用梯度检查点Gradient Checkpointing这是一个以时间换空间的经典技术。它在前向传播时不保存所有中间激活值而是在反向传播时重新计算一部分。这可以将激活值内存减少到原来的1/10甚至更多但会使每次迭代的时间增加30%左右。在gpu_poor中这体现为“激活值内存”大幅降低但“ms per iteration”会增加。你需要在transformers库的训练脚本中启用这个功能。尝试更激进的优化器对于QLoRA由于可训练参数量很少通常不到1%使用像SGD这样的简单优化器它没有像Adam那样需要保存大量状态可以进一步节省一点显存但可能会影响收敛效果。4.3 常见问题与排查技巧实录即使做了万全的估算实际运行中仍可能遇到问题。下面是一些典型场景和排查思路。问题1工具估算需要10GB但我实际运行却爆了12GB的显存。可能原因1系统显存占用。你的操作系统、桌面环境、其他应用程序尤其是浏览器可能已经占用了1-2GB的显存。在运行模型前尽量关闭不必要的图形化程序。在Linux服务器上可以通过nvidia-smi命令查看当前空闲显存。可能原因2框架和库的额外开销。gpu_poor估算的CUDA开销~650MB是一个平均值。不同的PyTorch版本、CUDA版本、以及你安装的其他科学计算库可能会带来额外的内存开销。尝试创建一个干净的虚拟环境只安装必要的包。可能原因3输入数据超出预期。你实际输入的文本长度可能超过了你在工具中设置的“上下文长度”。或者你的数据预处理环节如tokenizer产生了比预期更多的token。排查方法使用torch.cuda.memory_summary()或nvidia-smi -l 1实时监控显存占用。观察是在模型加载时爆显存还是在处理数据时爆显存这能帮你定位问题。问题2实际推理速度远低于工具估算的Token/s。可能原因1CPU瓶颈。如果你的系统CPU较弱或者你在使用llama.cpp时没有正确配置线程数数据预处理和任务调度可能成为瓶颈。尤其是在生成第一个token之前提示处理阶段如果CPU太慢会拖累整体速度。可能原因2没有使用最优后端。你用的是Hugging Face的.generate()原生接口而不是经过高度优化的vLLM或llama.cpp的-nglGPU层数参数。对于长上下文生成优化后的KV缓存管理对速度影响巨大。可能原因3量化模型加载慢。首次加载GGUF等量化模型时需要将模型解量化到GPU这个过程可能较慢影响“首token延迟”。但后续生成速度应该稳定。确保你使用的是支持GPU推理的llama.cpp版本并且将足够的层-ngl参数放到GPU上。排查方法分别测量“提示处理时间”和“生成时间”。如果提示处理时间过长可能是CPU或tokenizer问题。如果生成阶段每个token时间不稳定或过长检查是否使用了正确的推理后端和配置。问题3QLoRA训练时损失Loss不下降或出现NaN。可能原因1学习率过大。QLoRA的训练非常敏感。由于大部分模型被冻结且量化梯度流经的路径很窄过大的学习率容易导致训练不稳定。通常需要设置比全量微调小一个数量级的学习率例如1e-4到5e-5。可能原因2批次大小太小。为了节省显存我们可能将批次大小设为1。这会导致梯度噪声非常大。解决方法是使用梯度累积Gradient Accumulation。例如设置batch_size1, gradient_accumulation_steps4这在效果上等同于batch_size4但显存占用只相当于batch_size1。可能原因3精度问题。在4-bit量化基础上进行训练数值精度较低。确保你使用的训练库如peft和bitsandbytes是最新版本它们包含了对低精度训练的稳定性改进。也可以尝试使用bnb_4bit_use_double_quant双重量化和bnb_4bit_quant_type‘nf4’来获得更好的稳定性。排查方法始终从一个非常小的数据集如100条样本和一个极小的学习率开始进行快速过拟合测试。如果模型能在小数据集上快速过拟合损失降到接近0说明训练流程基本正确然后再逐步调整到真实数据集和更大的学习率。问题速查表现象可能原因排查与解决思路CUDA Out of Memory1. 系统/其他程序占用显存。2. 实际配置超出工具估算。3. 框架额外开销大。1. 关闭无关程序nvidia-smi查占用。2. 核对实际序列长度、批次大小。3. 使用更优后端vLLM/llama.cpp启用梯度检查点。推理速度慢1. CPU成为瓶颈。2. 使用未优化的推理后端。3. 模型未完全加载至GPU。1. 检查CPU使用率优化tokenizer或预处理。2. 切换到vLLM或正确配置llama.cpp的-ngl参数。3. 确保模型文件在本地SSD且GPU层数设置正确。训练Loss不稳定/NaN1. 学习率过大。2. 批次大小太小梯度噪声大。3. 低精度训练数值不稳定。1. 大幅降低学习率如调至1e-5。2. 使用梯度累积模拟大批次。3. 更新bitsandbytes/peft库使用NF4量化类型。生成内容质量差1. 量化损失导致。2. 微调数据或超参有问题。1. 尝试更高精度的量化如Q6_K, Q8。2. 检查数据质量调整LoRA的alpha和rank参数。5. 超越工具高级考量与未来方向gpu_poor是一个强大的起点但真实的模型部署和优化是一个更深的领域。了解这些高级话题能让你在工具给出的基线之上进一步压榨硬件潜力。5.1 工具未覆盖的优化策略1. 模型融合与内核优化像vLLM这样的框架其速度优势不仅来自PagedAttention还来自高度优化的定制CUDA内核。它将多个操作如LayerNorm、线性层、激活函数融合成一个内核执行减少了GPU内核启动的次数和全局内存的访问极大提升了效率。llama.cpp也通过手写的ARM NEON/AVX2指令和自定义内核在CPU和GPU上实现了极致优化。这些优化带来的性能提升是gpu_poor基于通用公式难以精确估算的。2. 动态批处理与持续批处理在服务多个用户的场景下vLLM的持续批处理Continuous Batching技术是革命性的。它不再等待一个请求的生成全部完成再处理下一个而是动态地将不同请求的token计算插入到同一批中极大地提高了GPU利用率。这使总体吞吐量Total Throughput远高于简单的Token/s乘以并发数。gpu_poor目前主要估算单请求的延迟对于服务化部署的吞吐量规划需要结合该工具的结果和动态批处理的效率增益来综合判断。3. 混合精度与TF32在支持Tensor Core的GPU上使用torch.autocast进行混合精度训练/推理可以显著加速计算并节省显存。在Ampere架构及以后的GPU上TF32TensorFloat-32模式可以在几乎不损失精度的情况下大幅加速矩阵运算。这些精度策略的选择会影响实际的计算速度和内存占用是微调时需要考量的因素。5.2 对工具未来功能的期待根据项目作者的TODO列表和社区需求有几个方向值得关注1. 对更多推理框架和量化方法的支持目前对vLLM的Token/s估算还是待办事项。vLLM的性能与模型、调度策略强相关集成其性能模型将极大提升工具在服务部署场景下的实用性。同样对AWQ、GPTQ等训练后量化PTQ方法的支持也能帮助用户在精度和速度之间做出更精细的权衡。2. 多GPU与张量并行估算当单个GPU无法放下模型时张量并行Tensor Parallelism或流水线并行Pipeline Parallelism是必然选择。工具未来如果能估算在2卡、4卡甚至8卡上拆分模型后的显存分布和通信开销将对分布式训练和推理的规划有巨大帮助。3. 更细粒度的硬件数据库目前的硬件性能数据如带宽、TFLOPS可能比较粗略。集成一个更详细的硬件数据库包含不同显卡在不同精度FP16, INT8, INT4下的实际有效算力和带宽而不仅是理论峰值将使估算结果更加准确。特别是对于笔记本移动端GPU或老款显卡其性能特征与桌面卡有较大差异。4. 用户自定义模型架构虽然内置了主流模型但社区中不断有新的架构涌现。提供一个接口让用户可以自定义hidden_size,intermediate_size,num_layers,num_attention_heads,num_key_value_headsGQA支持等关键参数将使工具能适配任何自定义或小众模型。在我自己折腾各种开源模型的过程中gpu_poor这类工具的价值在于它把原本需要大量经验和试错的“猜谜游戏”变成了一个数据驱动的决策过程。它不能替代实际的测试但能让你在测试前就排除掉大量不可能的选项把宝贵的时间和电费花在刀刃上。尤其是在这个模型规模快速膨胀、硬件却跟不上节奏的时代学会精打细算地使用每一兆显存、每一秒算力是我们每个“算力贫困者”的必备生存技能。最后一个小建议是永远不要完全相信工具的估算把它当作一个“保守的参考”在实际部署时仍然要留出10%-20%的显存余量以应对各种意外开销。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2596893.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…