从零构建大模型推理引擎:KV缓存、算子融合与量化优化实战

news2026/5/12 20:24:31
1. 项目概述从零理解大模型推理引擎如果你正在关注大语言模型LLM的实际应用特别是如何让这些动辄数百亿参数的“庞然大物”在你的本地机器或服务器上高效地跑起来那么你很可能已经听说过“推理引擎”这个词。aniketmaurya/llm-inference这个项目就是一个旨在帮助开发者深入理解并动手实践大模型推理核心技术的开源仓库。它不是另一个封装好的、让你直接调用的API库而更像是一本“开源教科书”或一个“解剖实验室”带你从最底层开始亲手搭建和优化一个LLM的推理流程。简单来说这个项目解决的核心问题是如何将训练好的大语言模型比如一个.bin或.safetensors格式的模型权重文件变成一个能够接收用户输入Prompt并生成连贯文本Completion的在线服务并且要尽可能地快、尽可能地省资源。这听起来像是云服务商做的事情但理解其内部机制对于任何想在AI领域深耕的工程师、研究者乃至技术决策者都至关重要。它让你摆脱对黑盒API的依赖真正掌握模型部署的主动权无论是为了成本控制、数据隐私、定制化优化还是纯粹的技术好奇心。这个项目适合所有对LLM技术栈有基本了解并希望向更深处探索的开发者。你可能已经用过transformers库的pipeline函数感觉推理很简单但当你面临生产环境中的高并发、低延迟、高吞吐需求时或者当你需要将模型部署到资源受限的边缘设备时底层推理引擎的每一个设计选择都将决定成败。llm-inference项目正是带你穿越这层抽象直面KV缓存、注意力计算、算子融合、量化等硬核主题。2. 核心架构与设计哲学拆解一个高效的大模型推理引擎远不止是加载权重然后执行前向传播那么简单。它需要应对模型的自回归生成特性即每次生成一个token词元这个token又会作为下一次生成的输入形成循环。这种模式带来了巨大的计算和内存挑战。llm-inference项目的设计正是围绕解决这些挑战展开的。2.1 自回归生成与KV缓存的根本矛盾大语言模型推理的核心瓶颈在于其自回归生成过程。对于拥有多层Transformer结构的模型其计算开销最大的部分是注意力机制。在标准的注意力计算中为了生成当前时刻的token模型需要查看之前所有时刻的token信息即序列中的所有历史token。如果每次生成都重新计算整个历史序列的注意力其计算复杂度会随着生成长度呈平方级增长这在实际中是绝对无法接受的。解决方案就是KV缓存Key-Value Cache。其核心思想是在生成第t个token时模型前面t-1个token已经计算完毕它们在每一层注意力模块中对应的Key向量和Value向量可以被保存下来。当计算第t个token的注意力时我们只需要计算当前token的QQuery向量然后让它去和缓存中所有历史K向量计算注意力分数再与缓存的V向量加权求和即可。这样每一层、每一步生成只需要计算当前token的Q、K、V并将新的K、V追加到缓存中。计算复杂度从O(n^2)降到了O(n)。llm-inference项目会引导你亲手实现这个缓存机制。你需要理解并管理一个形状为[batch_size, num_heads, seq_len, head_dim]的缓存张量。这里的一个关键细节是内存布局为了高效的内存访问缓存通常采用连续存储并在序列维度上动态扩展。这涉及到预分配内存和滑动窗口等高级优化技巧。2.2 计算图优化与算子融合在像PyTorch这样的动态图框架中每一个操作如矩阵乘、激活函数都会产生一个微小的内核启动开销。对于LLM推理这种由大量小型、规律性操作组成的计算过程这些开销累积起来会非常可观。因此现代推理引擎的一个核心优化手段是算子融合。例如在一个Transformer层中紧随矩阵乘法之后的往往是偏置相加、层归一化或激活函数如SiLU。在原生实现中这是多个独立的GPU内核调用。通过算子融合我们可以将这些连续的操作合并成一个自定义的CUDA内核在一次内核启动中完成从而显著减少内核启动开销和全局内存的读写次数。llm-inference项目可能会引导你接触或理解类似FlashAttention这样的革命性工作。FlashAttention不仅仅是一个更快的注意力实现它通过一种名为“平铺”的技术在计算注意力时巧妙地将数据在GPU的高速SRAM共享内存和HBM高带宽内存之间移动从而避免将巨大的注意力矩阵[seq_len, seq_len]写回HBM极大地降低了内存带宽需求。实现或集成这样的优化是构建高性能推理引擎的必经之路。2.3 服务化与批处理策略当从单次推理转向服务多个用户请求时我们需要一个服务化框架。这里最大的挑战是动态批处理。用户的请求是随机到达的输入的提示词长度各异请求的生成长度也不同。一个朴素的想法是收集多个请求将它们填充到相同的长度然后组成一个批次进行前向传播。但这会造成大量的计算浪费因为填充的部分是无效计算。高效的推理引擎会实现连续批处理或称为“迭代级调度”。在这种策略下批次不是在请求开始时静态确定的而是在每个生成步骤动态变化的。当一个请求生成完毕时它可以立即离开批次释放资源新的请求可以随时加入批次中“空闲”的位置。这要求引擎能够高效地管理多个具有不同序列长度的请求的KV缓存并动态地重组计算图。llm-inference项目可能会通过一个简化的调度器来揭示这些概念让你理解诸如vLLM项目中PagedAttention这类技术背后的动机——将KV缓存视为非连续的内存“页”来管理以极致地优化内存利用率和吞吐量。3. 关键技术组件深度解析3.1 模型加载与权重格式处理第一步是将训练好的模型加载到内存中。目前社区常见的格式有PyTorch的.pt/.pth、Hugging Face Transformers的默认格式、以及更安全高效的.safetensors格式。llm-inference项目通常会从.safetensors开始因为它只存储模型权重张量不包含任意代码安全性更高。加载权重的关键在于正确映射权重名称和模型参数。例如一个典型的LLaMA模型的某一层权重可能被命名为model.layers.0.self_attn.q_proj.weight。你的代码需要解析这个字符串并将其加载到模型中对应层的q_proj.weight参数上。这个过程需要你深刻理解你所实现模型的结构定义。一个常见的技巧是编写一个权重名称映射字典来处理不同来源如原始Meta检查点、Hugging Face转换后的命名差异。注意对于超大规模模型无法一次性加载到GPU内存。这时需要实现分层加载或动态加载即仅将当前计算所需的层保留在GPU其他层暂存于CPU或磁盘。这需要精细的内存管理和数据传输流水线。3.2 注意力机制的高效实现注意力机制是推理的绝对热点。我们以单头注意力为例拆解其高效实现的要点。假设当前序列长度为seq_len头维度为head_dim。我们有缓存的K、V形状为[seq_len, head_dim]和当前token的Q形状为[1, head_dim]。计算注意力分数scores Q K.T。结果形状为[1, seq_len]。这里的一个优化点是使用混合精度如FP16或BF16进行计算以提升计算速度和减少内存占用。应用掩码与缩放对于因果语言模型需要应用一个上三角掩码确保当前位置只能看到之前的位置。然后进行缩放scores scores / sqrt(head_dim)。Softmax对scores在最后一个维度序列维度上执行Softmax得到注意力权重attn_weights。Softmax的数值稳定性是关键通常实现会减去最大值max后再计算。加权求和context attn_weights V。得到形状为[1, head_dim]的上下文向量。在多头注意力中上述过程在每个头上独立进行最后将结果拼接并经过一个输出投影层。llm-inference项目的价值在于它迫使你脱离torch.nn.MultiheadAttention这样的高级抽象从张量操作层面实现上述流程并在此过程中思考如何组织KV缓存。3.3 采样策略的实现模型的前向传播输出的是每个词在词汇表上的对数概率logits。如何从这些logits中选择下一个token就是采样策略。这是控制生成文本多样性、创造性和确定性的关键。贪心搜索直接选择概率最高的token。实现简单但容易导致重复、枯燥的文本。next_token_id torch.argmax(logits, dim-1)Top-k采样从概率最高的k个token中随机选取一个。这增加了多样性。topk_probs, topk_indices torch.topk(logits, k, dim-1) # 对topk概率重新归一化 sampled_index torch.multinomial(topk_probs, 1) next_token_id topk_indices.gather(-1, sampled_index)Top-p核采样从累积概率超过p的最小token集合中随机选取。这能动态调整候选集的大小比固定的Top-k更灵活。温度调节在计算Softmax之前将logits除以一个温度参数T。T 1 平滑分布更随机T 1 锐化分布更确定。scaled_logits logits / temperature probs torch.softmax(scaled_logits, dim-1)在llm-inference的实现中你需要将这些采样策略封装成可配置的组件并与主推理循环集成。一个高级技巧是对多个候选序列同时进行批量采样以提升吞吐量。3.4 量化与低精度推理量化是将模型权重和激活值从高精度如FP32转换为低精度如INT8、INT4的过程目的是大幅减少内存占用和加速计算尤其对于内存带宽受限的推理场景。权重仅量化这是最简单的形式仅对权重进行量化前向传播时反量化为FP16进行计算。这能减少模型加载的内存但对计算加速有限。动态量化在前向传播时动态计算激活值的缩放因子对权重和激活都进行量化。这需要量化感知的算子实现。GPTQ/AWQ等后训练量化这是当前的主流实践。通过在少量校准数据上微调找到对模型精度损失最小的量化参数缩放因子和零点。llm-inference项目可能会引导你集成类似bitsandbytes或GPTQ-for-LLaMA的库或者实现一个简单的对称量化/反量化过程def quantize_tensor(tensor, bits8): # 对称量化 max_val tensor.abs().max() scale max_val / (2**(bits-1) - 1) quantized torch.clamp(torch.round(tensor / scale), -2**(bits-1), 2**(bits-1)-1) return quantized.to(torch.int8), scale def dequantize_tensor(quantized_tensor, scale): return quantized_tensor.to(torch.float32) * scale实现量化推理时最大的挑战是处理矩阵乘法。例如INT8的矩阵乘需要先将INT8数据反量化为FP16再计算或者直接使用支持INT8计算的硬件指令如CUDA的DP4A指令。更先进的量化方案如AWQ会识别出对模型性能影响大的“重要权重”并保持其高精度从而在极低的比特数如INT4下仍能保持较好的模型能力。4. 从零搭建推理引擎的实操步骤假设我们要为一个类似LLaMA架构的模型实现一个最简化的推理引擎。以下是核心步骤的拆解。4.1 步骤一定义模型结构首先你需要用PyTorch的模块定义模型的所有层。这包括嵌入层将token ID映射为向量。RMSNormLLaMA使用的层归一化变体。旋转位置编码将绝对位置信息注入到注意力计算中。自注意力层实现带KV缓存的多头注意力。前馈网络通常是带有门控的MLP如SwiGLU。输出层将隐藏状态投影到词汇表大小的logits。在定义注意力层时就要预留出KV缓存的数据结构。通常我们会在__init__中初始化缓存为None在forward方法中根据输入的序列长度来分配或更新缓存。4.2 步骤二实现前向传播与生成循环模型的前向传播需要支持两种模式预填充和自回归生成。预填充处理用户的输入提示词prompt。此时序列长度可能较长需要计算所有位置的KV并填充缓存。自回归生成在提示词之后逐个生成token。每次只处理一个新token并更新缓存。生成循环的伪代码如下def generate(model, prompt_token_ids, max_new_tokens, sampler): # 1. 预填充阶段 logits, kvcache model.forward(prompt_token_ids) # 初始前向传播填充KV缓存 next_token sampler(logits[:, -1, :]) # 获取提示词后的第一个token output_token_ids [next_token] # 2. 自回归生成循环 for _ in range(max_new_tokens - 1): # 仅使用上一个生成的token作为输入 logits, kvcache model.forward(next_token.unsqueeze(0), use_cacheTrue, past_key_valueskvcache) next_token sampler(logits[:, -1, :]) output_token_ids.append(next_token) if next_token eos_token_id: # 遇到终止符则停止 break return output_token_ids4.3 步骤三集成采样与停止条件将上一节提到的采样策略贪心、top-k、top-p封装成一个Sampler类。在生成循环中调用它。同时需要处理停止条件最大长度限制达到max_new_tokens后停止。结束符当生成的token是预定义的结束符如eos时停止。自定义停止词当生成的文本包含某些特定字符串时停止。这需要维护一个字符串缓冲区并实时解码检查。4.4 步骤四添加基础服务化接口为了提供HTTP服务可以使用轻量级框架如FastAPI。创建一个简单的/generate端点from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class GenerationRequest(BaseModel): prompt: str max_tokens: int 100 temperature: float 0.8 app.post(/generate) async def generate_text(request: GenerationRequest): token_ids tokenizer.encode(request.prompt) output_ids inference_engine.generate(token_ids, request.max_tokens, temperaturerequest.temperature) text tokenizer.decode(output_ids) return {generated_text: text}这个基础版本是单请求顺序处理的。要支持并发你需要引入一个任务队列和后台工作线程或者使用支持异步并发的推理运行时。5. 性能优化实战与避坑指南当你有了一个能跑通的推理引擎后下一步就是让它跑得更快、更省资源。以下是一些关键的优化方向和实战中容易踩的坑。5.1 内存瓶颈分析与KV缓存优化问题现象生成较长文本时速度越来越慢甚至出现内存不足OOM错误。根因分析KV缓存随着生成步数线性增长。对于一个70B参数、层数80、头数64、头维度128的模型每生成一个tokenKV缓存需要增加的内存约为2 * 80 * 64 * 128 * sizeof(dtype)字节。以FP162字节为例约增加2.5 MB。生成1000个token就需要额外2.5 GB的GPU内存这还没算激活值的内存。优化策略分页注意力借鉴虚拟内存的思想将KV缓存划分为固定大小的“页”。不同序列的KV可以非连续地存储在这些页中。当一个序列生成完毕其占用的页可以被回收复用。这极大地减少了内存碎片提升了内存利用率。vLLM的核心正是此技术。窗口注意力只缓存最近N个token的KV丢弃更早的历史。这对需要超长上下文但近期信息更重要的场景如聊天很有效能显著控制内存增长。量化KV缓存将KV缓存以INT8甚至INT4精度存储。在注意力计算前反量化回计算精度。这能直接减半或更多缓存内存但会引入额外的反量化开销和精度损失需要仔细权衡。实操心得在实现KV缓存时最初很容易使用list来存储每一层的K和V。这在原型阶段没问题但在性能测试中会发现在每一步生成时从Python列表中提取张量会产生巨大开销。正确的做法是预分配一个足够大的连续张量作为缓存池并通过偏移指针来管理不同序列的缓存区域。这要求你深入到底层的内存管理逻辑。5.2 计算瓶颈与算子融合问题现象GPU利用率低nvidia-smi显示Volatile GPU Utilization波动大但计算时间仍然很长。根因分析大量时间花在了内核启动、小矩阵乘法、以及内存读写上而非纯粹的计算。优化策略使用编译后的算子利用PyTorch的torch.compilePyTorch 2.0对模型的前向传播图进行编译优化。它会自动进行算子融合、内核选择等优化。对于自定义的注意力层确保其是torch.compile友好的。手动内核融合对于频繁出现的模式如Linear - SiLUSwiGLU中的一部分可以编写一个融合的CUDA内核。这需要较高的CUDA编程技能。社区项目如flash-attention和xformers提供了优化后的注意力内核直接集成是更实际的选择。调整计算顺序例如在多层感知机中将大的矩阵乘放在前面有助于更好地利用GPU的并行计算能力。5.3 批处理与吞吐量优化问题现象单个请求延迟尚可但总体吞吐量上不去无法充分利用GPU。根因分析未实现有效的批处理GPU计算资源被闲置。优化策略实现连续批处理这是吞吐量优化的“银弹”。你需要维护一个全局的调度器管理所有活跃请求的状态输入长度、生成长度、KV缓存位置等。在每个解码步调度器决定哪些请求需要被计算并将它们的输入token和缓存索引打包成一个批次。请求完成后及时清理其缓存。优化填充策略对于静态批处理使用更聪明的填充策略如“桶排序”。将长度相近的请求分到同一个桶中统一填充到桶的最大长度减少填充浪费。内存与计算重叠当使用分页缓存时可以在当前批次计算的同时在后台为下一个批次预取所需的KV缓存页到GPU显存中隐藏内存传输延迟。5.4 常见问题排查清单下表列出了一些典型问题及其排查思路问题现象可能原因排查步骤生成文本乱码或重复1. 采样温度过低趋近0导致确定性过高。2. Top-k或Top-p值设置过小限制了多样性。3. 模型权重加载错误层或权重名不匹配。4. 位置编码实现有误导致长序列后语义混乱。1. 调高温度如0.7-1.0或尝试Top-p采样。2. 检查权重加载日志确认每一层都成功加载。3. 对短序列和长序列分别测试验证位置编码的正确性。推理速度慢GPU利用率低1. 未启用KV缓存每次都在计算全序列注意力。2. 批次大小始终为1未做批处理。3. 大量小算子未融合内核启动开销大。4. 使用了动态形状阻碍了图编译优化。1. 确认past_key_values参数在生成循环中被正确传递和更新。2. 使用性能分析工具如PyTorch Profiler, Nsight Systems定位热点函数。3. 尝试使用torch.compile并设置dynamicFalse进行静态图优化。生成长文本时内存溢出1. KV缓存无限增长未做任何内存回收。2. 激活值内存未及时释放尤其在梯度计算被意外启用时。1. 监控每一步生成后的GPU显存占用确认增长源是KV缓存。2. 实现分页缓存或窗口缓存。3. 确保在推理模式下model.eval()和torch.no_grad()上下文内运行。量化后精度严重下降1. 量化参数缩放因子校准不充分或方法错误。2. 对敏感层如注意力输出投影层进行了过激的量化。3. 反量化操作未放在正确的位置导致计算图精度断裂。1. 使用更有代表性的校准数据集。2. 尝试混合精度量化对敏感层保留FP16。3. 逐层对比量化模型与原始模型的输出定位精度损失最大的层。6. 进阶方向与生态集成当你掌握了自制推理引擎的核心后可以朝着以下几个方向深化并将其融入更广阔的AI生态。方向一硬件特定优化针对不同的部署硬件进行优化。例如在NVIDIA GPU上深入使用CUDA、TensorRT在苹果芯片上使用Metal Performance Shaders和Core ML在手机端使用TFLite和神经处理单元NPU的委托。这需要你深入了解特定硬件的计算特性和内存层次结构。方向二与现有生态集成你的推理引擎可以作为一个后端集成到更上层的服务框架中。例如实现OpenAI兼容的API接口这样任何兼容OpenAI SDK的客户端都能直接调用你的服务。作为LangChain的自定义LLM类让基于LangChain构建的应用能无缝切换到你优化的引擎上。支持GGUF模型格式这是社区围绕llama.cpp形成的一种流行的量化模型格式拥有丰富的模型库。方向三探索新兴推理范式推测解码使用一个小的“草稿模型”快速生成多个候选token然后用大模型一次性验证它们从而大幅提升解码速度。这需要协调两个模型的运行。条件生成与约束解码实现复杂的生成约束如强制生成包含某些关键词、遵循特定的JSON格式等。这需要在采样阶段引入额外的逻辑。构建一个完整的推理引擎是一项系统工程aniketmaurya/llm-inference这样的项目提供了一个绝佳的起点。它剥离了商业产品的复杂性让你能聚焦于最核心的技术原理。通过亲手实现一遍你会对KV缓存、注意力计算、量化、批处理这些概念有肌肉记忆般的理解。这种理解不会过时因为它触及的是大模型推理的本质。当你再使用vLLM、TGI或TensorRT-LLM这些工业级引擎时你看到的将不再是魔法而是一系列精妙设计选择的结果并且你将有能力根据自身需求去调整、优化甚至创新。

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