[模型部署] 3. 性能优化
👋 你好!这里有实用干货与深度分享✨✨ 若有帮助,欢迎:
👍 点赞 | ⭐ 收藏 | 💬 评论 | ➕ 关注 ,解锁更多精彩!
📁 收藏专栏即可第一时间获取最新推送🔔。
📖后续我将持续带来更多优质内容,期待与你一同探索知识,携手前行,共同进步🚀。
性能优化
本文介绍深度学习模型部署中的性能优化方法,包括模型量化、模型剪枝、模型蒸馏、混合精度训练和TensorRT加速等技术,以及具体的实现方法和最佳实践,帮助你在部署阶段获得更高的推理效率和更低的资源消耗。
1. 模型量化
量化类型 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
静态量化 | - 精度损失小 - 推理速度快 - 内存占用小 | - 需要校准数据 - 实现复杂 | - 对精度要求高 - 资源受限设备 |
动态量化 | - 实现简单 - 无需校准数据 - 灵活性高 | - 精度损失较大 - 加速效果有限 | - 快速部署 - RNN/LSTM模型 |
量化感知训练 | - 精度最高 - 模型适应量化 | - 需要重新训练 - 开发成本高 | - 高精度要求 - 大规模部署 |
1.1 PyTorch静态量化
静态量化在模型推理前完成权重量化,适用于对精度要求较高的场景,需提供校准数据。
import torch
from torch.quantization import get_default_qconfig
from torch.quantization.quantize_fx import prepare_fx, convert_fxdef quantize_model(model, calibration_data):# 设置量化配置(fbgemm用于x86架构,qnnpack用于ARM架构)qconfig = get_default_qconfig('fbgemm') qconfig_dict = {"":qconfig}# 准备量化(插入观察节点)model_prepared = prepare_fx(model, qconfig_dict)# 校准(收集激活值的分布信息)for data in calibration_data:model_prepared(data)# 转换为量化模型(替换浮点运算为整数运算)model_quantized = convert_fx(model_prepared)return model_quantized# 使用示例
model = YourModel()
model.eval() # 量化前必须设置为评估模式
calibration_data = get_calibration_data() # 获取校准数据
quantized_model = quantize_model(model, calibration_data)# 保存量化模型
torch.jit.save(torch.jit.script(quantized_model), "quantized_model.pt")
1.2 动态量化
动态量化在推理过程中动态计算激活值的量化参数,操作简单,特别适用于线性层和RNN。
import torch
import torch.quantizationdef dynamic_quantize(model):# 应用动态量化(仅量化权重,激活值在运行时量化)quantized_model = torch.quantization.quantize_dynamic(model,{torch.nn.Linear, torch.nn.LSTM, torch.nn.GRU}, # 量化的层类型dtype=torch.qint8 # 量化数据类型)return quantized_model# 验证量化效果
def verify_quantization(original_model, quantized_model, test_input):# 比较输出结果with torch.no_grad():original_output = original_model(test_input)quantized_output = quantized_model(test_input)# 计算误差error = torch.abs(original_output - quantized_output).mean()print(f"平均误差: {error.item()}")# 比较模型大小original_size = get_model_size_mb(original_model)quantized_size = get_model_size_mb(quantized_model)print(f"原始模型大小: {original_size:.2f} MB")print(f"量化模型大小: {quantized_size:.2f} MB")print(f"压缩比: {original_size/quantized_size:.2f}x")return error.item()# 获取模型大小(MB)
def get_model_size_mb(model):torch.save(model.state_dict(), "temp.p")size_mb = os.path.getsize("temp.p") / (1024 * 1024)os.remove("temp.p")return size_mb
1.3 量化感知训练
量化感知训练在训练过程中模拟量化效果,使模型适应量化带来的精度损失。
import torch
from torch.quantization import get_default_qat_qconfig
from torch.quantization.quantize_fx import prepare_qat_fx, convert_fxdef quantization_aware_training(model, train_loader, epochs=5):# 设置量化感知训练配置qconfig = get_default_qat_qconfig('fbgemm')qconfig_dict = {"":qconfig}# 准备量化感知训练model_prepared = prepare_qat_fx(model, qconfig_dict)# 训练optimizer = torch.optim.Adam(model_prepared.parameters())criterion = torch.nn.CrossEntropyLoss()for epoch in range(epochs):for inputs, targets in train_loader:optimizer.zero_grad()outputs = model_prepared(inputs)loss = criterion(outputs, targets)loss.backward()optimizer.step()# 转换为量化模型model_quantized = convert_fx(model_prepared)return model_quantized
2. 模型剪枝
剪枝类型 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
结构化剪枝 | - 硬件友好 - 实际加速效果好 - 易于实现 | - 精度损失较大 - 压缩率有限 | - 计算密集型模型 - 需要实际加速 |
非结构化剪枝 | - 高压缩率 - 精度损失小 - 灵活性高 | - 需要特殊硬件/库支持 - 实际加速有限 | - 存储受限场景 - 可接受稀疏计算 |
2.1 结构化剪枝
结构化剪枝移除整个卷积核或通道,可直接减少模型参数量和计算量,提升推理速度。
import torch
import torch.nn.utils.prune as prunedef structured_pruning(model, amount=0.5):# 按通道剪枝for name, module in model.named_modules():if isinstance(module, torch.nn.Conv2d):prune.ln_structured(module,name='weight',amount=amount, # 剪枝比例n=2, # L2范数dim=0 # 按输出通道剪枝)return modeldef fine_tune_pruned_model(model, train_loader, epochs=5):# 剪枝后微调恢复精度optimizer = torch.optim.Adam(model.parameters())criterion = torch.nn.CrossEntropyLoss()for epoch in range(epochs):for inputs, targets in train_loader:optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, targets)loss.backward()optimizer.step()return modeldef remove_pruning(model):# 移除剪枝,使权重永久化for name, module in model.named_modules():if isinstance(module, torch.nn.Conv2d):prune.remove(module, 'weight')return model
2.2 非结构化剪枝
非结构化剪枝(细粒度剪枝)可获得更高稀疏率,但对硬件加速支持有限。
def fine_grained_pruning(model, threshold=0.1):# 按权重大小剪枝for name, module in model.named_modules():if isinstance(module, torch.nn.Conv2d) or isinstance(module, torch.nn.Linear):# 创建掩码:保留绝对值大于阈值的权重mask = torch.abs(module.weight.data) > threshold# 应用掩码module.weight.data *= maskreturn model# 评估剪枝效果
def evaluate_sparsity(model):total_params = 0zero_params = 0for name, param in model.named_parameters():if 'weight' in name: # 只考虑权重参数total_params += param.numel()zero_params += (param == 0).sum().item()sparsity = zero_params / total_paramsprint(f"模型稀疏度: {sparsity:.2%}")print(f"非零参数数量: {total_params - zero_params:,}")print(f"总参数数量: {total_params:,}")return sparsity
3. 模型蒸馏
蒸馏类型 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
响应蒸馏 | - 实现简单 - 效果稳定 | - 信息损失 - 依赖教师质量 | - 分类任务 - 小型模型训练 |
特征蒸馏 | - 传递更多信息 - 效果更好 | - 实现复杂 - 需要匹配特征 | - 复杂任务 - 深层网络 |
关系蒸馏 | - 保留样本关系 - 泛化性好 | - 计算开销大 | - 度量学习 - 表示学习 |
3.1 知识蒸馏
通过教师模型指导学生模型训练,实现模型压缩和加速。
import torch
import torch.nn as nn
import torch.nn.functional as Fclass DistillationLoss(nn.Module):def __init__(self, temperature=4.0, alpha=0.5):super().__init__()self.temperature = temperature # 温度参数控制软标签的平滑程度self.alpha = alpha # 平衡硬标签和软标签的权重self.ce_loss = nn.CrossEntropyLoss()self.kl_loss = nn.KLDivLoss(reduction='batchmean')def forward(self, student_logits, teacher_logits, labels):# 硬标签损失(学生模型与真实标签)ce_loss = self.ce_loss(student_logits, labels)# 软标签损失(学生模型与教师模型输出)soft_teacher = F.softmax(teacher_logits / self.temperature, dim=1)soft_student = F.log_softmax(student_logits / self.temperature, dim=1)kd_loss = self.kl_loss(soft_student, soft_teacher)# 总损失 = (1-α)·硬标签损失 + α·软标签损失total_loss = (1 - self.alpha) * ce_loss + \self.alpha * (self.temperature ** 2) * kd_lossreturn total_lossdef train_with_distillation(teacher_model, student_model, train_loader, epochs=10):teacher_model.eval() # 教师模型设为评估模式student_model.train() # 学生模型设为训练模式criterion = DistillationLoss(temperature=4.0, alpha=0.5)optimizer = torch.optim.Adam(student_model.parameters(), lr=1e-3)for epoch in range(epochs):total_loss = 0for data, labels in train_loader:optimizer.zero_grad()# 教师模型推理(不计算梯度)with torch.no_grad():teacher_logits = teacher_model(data)# 学生模型前向传播student_logits = student_model(data)# 计算蒸馏损失loss = criterion(student_logits, teacher_logits, labels)loss.backward()optimizer.step()total_loss += loss.item()print(f"Epoch {epoch+1}/{epochs}, Loss: {total_loss/len(train_loader):.4f}")return student_model
3.2 特征蒸馏
特征蒸馏通过匹配中间层特征,传递更丰富的知识。
class FeatureDistillationLoss(nn.Module):def __init__(self, alpha=0.5):super().__init__()self.alpha = alphaself.ce_loss = nn.CrossEntropyLoss()self.mse_loss = nn.MSELoss()def forward(self, student_logits, teacher_logits, student_features, teacher_features, labels):# 分类损失ce_loss = self.ce_loss(student_logits, labels)# 特征匹配损失feature_loss = 0for sf, tf in zip(student_features, teacher_features):# 可能需要调整特征维度if sf.shape != tf.shape:sf = F.adaptive_avg_pool2d(sf, tf.shape[2:])feature_loss += self.mse_loss(sf, tf)# 总损失total_loss = (1 - self.alpha) * ce_loss + self.alpha * feature_lossreturn total_loss
4. 混合精度训练与推理
混合精度使用FP16和FP32混合计算,在保持精度的同时提升性能。
# 混合精度训练
import torch
from torch.cuda.amp import autocast, GradScalerdef train_with_mixed_precision(model, train_loader, epochs=10):optimizer = torch.optim.Adam(model.parameters())criterion = torch.nn.CrossEntropyLoss()scaler = GradScaler() # 梯度缩放器,防止FP16下溢for epoch in range(epochs):for inputs, targets in train_loader:inputs, targets = inputs.cuda(), targets.cuda()optimizer.zero_grad()# 使用自动混合精度with autocast():outputs = model(inputs)loss = criterion(outputs, targets)# 缩放梯度以防止下溢scaler.scale(loss).backward()scaler.step(optimizer)scaler.update()return model# 混合精度推理
def inference_with_mixed_precision(model, test_loader):model.eval()results = []with torch.no_grad():with autocast():for inputs in test_loader:inputs = inputs.cuda()outputs = model(inputs)results.append(outputs)return results
5. TensorRT优化
TensorRT可极大提升NVIDIA GPU上的推理速度。
import tensorrt as trt
import numpy as np
import pycuda.driver as cuda
import pycuda.autoinitdef build_engine(onnx_path, engine_path, precision='fp16'):logger = trt.Logger(trt.Logger.WARNING)builder = trt.Builder(logger)network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))parser = trt.OnnxParser(network, logger)# 解析ONNX模型with open(onnx_path, 'rb') as model:if not parser.parse(model.read()):for error in range(parser.num_errors):print(parser.get_error(error))return None# 配置构建器config = builder.create_builder_config()config.max_workspace_size = 1 << 30 # 1GB# 设置精度模式if precision == 'fp16' and builder.platform_has_fast_fp16:config.set_flag(trt.BuilderFlag.FP16)elif precision == 'int8' and builder.platform_has_fast_int8:config.set_flag(trt.BuilderFlag.INT8)# 需要提供校准器进行INT8量化# config.int8_calibrator = ...# 构建引擎engine = builder.build_engine(network, config)# 保存引擎with open(engine_path, 'wb') as f:f.write(engine.serialize())print(f"TensorRT引擎已保存到: {engine_path}")return enginedef inference_with_tensorrt(engine_path, input_data):logger = trt.Logger(trt.Logger.WARNING)# 加载引擎with open(engine_path, 'rb') as f:runtime = trt.Runtime(logger)engine = runtime.deserialize_cuda_engine(f.read())# 创建执行上下文context = engine.create_execution_context()# 获取输入输出绑定信息input_binding_idx = engine.get_binding_index("input")output_binding_idx = engine.get_binding_index("output")# 分配GPU内存input_shape = engine.get_binding_shape(input_binding_idx)output_shape = engine.get_binding_shape(output_binding_idx)input_size = trt.volume(input_shape) * engine.get_binding_dtype(input_binding_idx).itemsizeoutput_size = trt.volume(output_shape) * engine.get_binding_dtype(output_binding_idx).itemsize# 分配设备内存d_input = cuda.mem_alloc(input_size)d_output = cuda.mem_alloc(output_size)# 创建输出数组h_output = cuda.pagelocked_empty(trt.volume(output_shape), dtype=np.float32)# 将输入数据复制到GPUh_input = np.ascontiguousarray(input_data.astype(np.float32).ravel())cuda.memcpy_htod(d_input, h_input)# 执行推理bindings = [int(d_input), int(d_output)]context.execute_v2(bindings)# 将结果复制回CPUcuda.memcpy_dtoh(h_output, d_output)# 重塑输出为正确的形状output = h_output.reshape(output_shape)return output
6. 最佳实践
6.1 量化策略选择
- 静态量化:精度高,需校准数据,适合CNN模型
- 动态量化:实现简单,适合RNN/LSTM/Transformer模型
- 量化感知训练:精度最高,但需要重新训练
- 选择建议:先尝试动态量化,如精度不满足再使用静态量化或量化感知训练
6.2 剪枝方法选择
- 结构化剪枝:规则性好,加速效果明显,适合计算受限场景
- 非结构化剪枝:压缩率高,但需要特殊硬件支持,适合存储受限场景
- 选择建议:优先考虑结构化剪枝,除非对模型大小有极高要求
6.3 蒸馏技巧
- 选择合适的教师模型:教师模型应比学生模型性能显著更好
- 调整温度参数:较高温度(4~10)使知识更软化,有助于传递类间关系
- 平衡硬标签和软标签损失:通常软标签权重0.5~0.9效果较好
- 特征匹配:对于深层网络,匹配中间层特征效果更佳
6.4 混合精度优化
- 训练时使用AMP:自动混合精度可显著加速训练
- 推理时选择合适精度:根据硬件和精度要求选择FP32/FP16/INT8
- 注意数值稳定性:某些操作(如归一化层)保持FP32精度
6.5 部署优化
- 使用TensorRT等推理引擎加速:可获得2~5倍性能提升
- 优化内存访问和批处理大小:根据硬件特性调整
- 模型融合:合并连续操作减少内存访问
- 量化与剪枝结合:先剪枝再量化通常效果更好
6.6 评估和监控
- 全面评估指标:不仅关注精度,还要测量延迟、吞吐量和内存占用
- 测量真实设备性能:在目标部署环境测试,而非仅在开发环境
- 监控资源使用:CPU/GPU利用率、内存占用、功耗等
- 建立性能基准:记录优化前后的各项指标,量化优化效果
6.7 优化流程建议
- 建立基准:记录原始模型性能指标
- 分析瓶颈:识别计算密集或内存密集操作
- 选择策略:根据瓶颈和部署环境选择优化方法
- 渐进优化:从简单到复杂,逐步应用优化技术
- 持续评估:每步优化后评估性能和精度变化
- 权衡取舍:根据应用需求平衡精度和性能
📌 感谢阅读!若文章对你有用,别吝啬互动~
👍 点个赞 | ⭐ 收藏备用 | 💬 留下你的想法 ,关注我,更多干货持续更新!
相关文章:
[模型部署] 3. 性能优化
👋 你好!这里有实用干货与深度分享✨✨ 若有帮助,欢迎: 👍 点赞 | ⭐ 收藏 | 💬 评论 | ➕ 关注 ,解锁更多精彩! 📁 收藏专栏即可第一时间获取最新推送🔔…...
使用 LSTM/GRU 预测设备异常的模型
LSTM(Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,旨在解决传统 RNN 在处理长序列数据时的梯度消失和梯度爆炸问题。它通过引入门控机制和单元状态来更好地控制信息的流动,使得网络能够学习到长期依赖关系。以下是其主要特点: 门控机制:包括遗忘门、输…...
八股文--JVM(1)
⭐️⭐️JVM内存模型 程序计数器:可以看作是当前线程所执行的字节码的行号指示器,用于存储当前线程正在执行的 Java 方法的 JVM 指令地址。如果线程执行的是 Native 方法,计数器值为 null。是唯一一个在 Java 虚拟机规范中没有规定任何 OutOf…...
BM25 算法与关键词提取在向量数据库中的实践优化
BM25 算法与关键词提取在向量数据库中的实践优化 在实际构建问答系统或语义检索场景中,向量数据库(如 Weaviate)提供了基于语义匹配的检索能力,然而我们发现 BM25 关键词检索效果不理想,甚至出现了召回率过低、查询必…...
济南超算研究所面试问题
1.自我介绍 2.java抽象类与接口的区别 3.抽象类能否实例化 4.在项目中用的抽象类偏多还是接口偏多 5.抽象类用的场景介绍一下 6.java中数据结构有哪些 7.数据的基本类型 8.引用类型,包装类型 9.是一个场景题,在查询数据库中的数据时,…...
“多维像素”可赋能具身智能非凡感知力——昱感微参加2025松山湖中国IC创新高峰论坛
5月13日,由中国半导体行业协会集成电路设计分会、芯原微电子(上海)股份有限公司联合主办的第十五届松山湖中国IC创新高峰论坛在东莞松山湖举行。本届松山湖论坛以“面向‘具身智慧机器人’的创新IC新品推介”为主题,吸引了许多知名…...
解决CLion控制台不能及时显示输出的问题
CLion 2025版本可以免费用于非商业用途了,下载来试用了一下,与JB的其它 IDE一样的资源占用比较大,流畅度不及VSCode。 在Windows下创建了一个简单的控制台应用程序,使用printf和std::cout输出字符串,发现CLion的控制台…...
多尺度对比度调整
一、背景介绍 受到了前面锐化算法实现的启发,对高频层做增强是锐化,那么对中低频一起做增强,就应该能有局域对比度增强效果。 直接暴力实现了个基本版本,确实有对比度增强效果。然后搜了下关键字,还真找到了已经有人这…...
虹桥前湾印象城MEGA品牌大会灵感迸发,共绘湾系生活新章
前言:当千年水韵流淌至上海前湾,当苏州河的生态肌理转化为商业空间的呼吸脉络……上海虹桥前湾印象城MEGA“漫漫而来”。 5月15-16日,以“灵感新章 Wave of Megagination”为主题的虹桥前湾印象城MEGA品牌大会成功举办,正式掀开长…...
新京东,正在成为一种生活方式
出品|何玺排版|叶媛 一个新京东,正在从“心”诞生。 2025年2月11日之前,如果问京东是做什么的,相信大多数人会回答京东是电商平台,卖家电数码日用百货的。现在,如果问京东是做什么的,相信大家的回答不在是…...
读论文alexnet:ImageNet Classification with Deep Convolutional Neural Networks
https://zhuanlan.zhihu.com/p/13694329885 1, 公式 卷积层输出尺寸: o ⌊(i 2p - k) / s⌋ 1 式中,i:输入尺寸;o:输出尺寸;p:padding;k: kernel_size;s: stride。⌊…⌋表示向下取整。 2, 推导过程 …...
操作系统|| 虚拟内存页置换算法
题目 写一个程序来实现 FIFO 和 LRU 页置换算法。首先,产生一个随机的页面引用序列,页面数从 0~9。将这个序列应用到每个算法并记录发生的页错误的次数。实现这个算法时要将页帧的数量设为可变。假设使用请求调页。可以参考所示的抽象类。 抽象类&…...
AGI大模型(19):下载模型到本地之ModelScope(魔搭社区)
1 安装模块 魔塔社区提供了下载的模块,如下: pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple 2 模型下载 from modelscope import snapshot_download model_dirsnapshot_download(LLM-Research/Meta-Llama-3-8B,cache_dirrD:\…...
常见面试题
1.stringbuffer和stringbuilder的区别,stringbuffer是通过什么实现线程安全的? StringBuffer 和 StringBuilder 都是用于处理可变字符串的类,但它们的主要区别在于 线程安全性。 StringBuffer 的线程安全是通过方法加锁(synchronized&…...
【视觉任务】深度估计(Depth Estimation)介绍(2025年更新)
文章目录 1. 任务定义与意义2. 按输入类型的分类2.1 单目深度估计(Monocular Depth Estimation)2.2 双目与多视图深度估计(Stereo / Multi-view)2.3 深度相机输入(RGB-D)2.4 主动与被动方法 3. 核心方法概述…...
Python 在Excel单元格中应用多种字体样式
文在数据处理和报表生成场景中,Excel 文件的格式设置至关重要。合理的字体格式不仅能提升表格的可读性,还能突出关键数据。本文将详细介绍如何使用免费库Free Spire.XLS for Python,在 Excel 单元格中灵活应用多种字体格式,包括字…...
C++:字符串操作函数
strcpy() 功能:把一个字符串复制到另一个字符串。 #include <iostream> #include <cstring> using namespace std;int main() {char src[] "Hello";char dest[10];strcpy(dest, src);cout << "Copied string: " << …...
Spark,SparkSQL操作Mysql, 创建数据库和表
SparkSQL操作Mysql 1.查看系统内是否有mysql [roothadoop100 ~]# rpm -aq | grep mariadb mariadb-libs-5.5.68-1.el7.x86_64 2.想我上面输出了有结果的即证明有,使用下列命令删除即可 [roothadoop100 ~]# rpm -e --nodeps mariadb-libs 3.进入我们常用存放压缩包…...
降低学习成本,1 天掌握 Java 开发核心技能
在当今数字化浪潮中,Java 编程语言凭借其卓越的跨平台性与稳定性,在企业级系统搭建、移动端应用开发以及大数据处理等领域占据着举足轻重的地位。但不可忽视的是,Java 开发链条冗长,从需求剖析到代码落地的全流程充满挑战…...
类模板的简单实例
author: hjjdebug date: 2025年 05月 16日 星期五 15:06:00 CST description: 类模板的简单实例 文章目录 1.实例代码:2. 模板类写法2.1 模板类的构造函数.2.2 模板类中的语句 3. 模板类的实例化过程.3.1 实例化的进一步试验. 4. 怎样调试constexpr 修饰的函数? 类模…...
描述性统计图表
一、核心图表类型与用途 1、直方图(Histogram) (1)定义:用连续矩形表示数据分布,横轴为数据区间,纵轴为频数或频率。 (2)用途:展示数据分布形态(对称、偏态)、识别离群值。 (3)适用场景:分析连续型变量的分布特征,如收入分布、考试成绩分布。 2、箱线图(Box P…...
【Golang笔记01】Goland基础语法规则
Golang笔记:快速学习Golang基础语法规则 一、基础语法 1.1、环境安装 第一步需要安装go的运行环境,从官网下载安装包:https://golang.google.cn/dl/。 第二步需要安装go的开发工具,可以使用vscode、goland。这里推荐使用golan…...
STM32 ADC+DMA+TIM触发采样实战:避坑指南与源码解析
知识点1【TRGO的介绍】 1、TRGO的概述 TRGO:Trigger Output(触发输出),是定时器的一种功能。 它可以作为外设的启动信号,比如ADC转换,DAC输出,DMA请求等。 对于ADC来说,可以通过…...
Gmsh 读取自定义轮廓并划分网格:深入解析与实践指南
一、Gmsh 简介 (一)Gmsh 是什么 Gmsh 是一款功能强大的开源有限元网格生成器,广泛应用于工程仿真、数值模拟以及计算机图形学等领域。它为用户提供了从几何建模到网格划分的一整套解决方案,能够有效处理复杂几何形状,生成高质量的二维和三维网格,满足多种数值方法的需求…...
Elasticsearch/OpenSearch 中doc_values的作用
目录 1. 核心作用 2. 适用场景 3. 与 index 参数的对比 4. 典型配置示例 场景 1:仅用于聚合,禁止搜索 场景 2:优化大字段存储 5. 性能调优建议 6. 底层原理 doc_values 是 Elasticsearch/OpenSearch 中用于优化查询和聚合的列式存储结…...
如何在 Windows 10 或 11 上使用命令提示符安装 PHP
我们可以在 Windows 上从其官方网站下载并安装 PHP 的可执行文件,但使用命令提示符或 PowerShell 更方便。 PHP 并不是一种新的或不为人知的脚本语言,它已经存在并被全球数千名网络开发人员使用。它以开源许可并分发,广泛用于 LAMP 堆栈中。然而,与 Linux 相比,它在 Wind…...
SZU 编译原理
总结自 深圳大学《编译原理》课程所学相关知识。 文章目录 文法语法分析自顶向下的语法分析递归下降分析LL(1) 预测分析法FIRST 集合FOLLOW 集合 文法 乔姆斯基形式语言理论: 表达能力:0型文法 > 1型文法 > 2型文法 > 3型文法。 0 型文法&am…...
灌区量测水自动化监测解决方案
一、方案背景 随着社会发展和人口增长,水资源需求不断增大。我国水资源总量虽然丰富,但时空分布不均,加之农业用水占比大且效率偏低,使得水资源短缺问题日益凸显。农业用水一直是我国的耗水大户,占全部耗水总量的60%以…...
CVE-2017-8046 漏洞深度分析
漏洞概述 CVE-2017-8046 是 Spring Data REST 框架中的一个高危远程代码执行漏洞,影响版本包括 Spring Data REST < 2.5.12、2.6.7、3.0 RC3 及关联的 Spring Boot 和 Spring Data 旧版本。攻击者通过构造包含恶意 SpEL(Spring Expression Language&…...
1基·2台·3空间·6主体——蓝象智联解码可信数据空间的“数智密码”
近日,由全国数据标准化技术委员会编制的《可信数据空间 技术架构》技术文件正式发布,标志着我国数据要素流通体系向标准化、规范化迈出关键一步。该文件从技术功能、业务流程、安全要求三大维度对可信数据空间进行系统性规范,为地方、行业及企…...
MySQL的存储过程
这一部分比较重要,加油!!!部分代码忘记保存了,嘻嘻,练习代码在最后,大家共勉!!! 通俗来讲,视图是死的,但是这个可以根据传入的参数不同…...
spring学习->sprintboot
spring IoC(控制翻转): 控制:资源的控制权(资源的创建,获取,销毁等) 反转:和传统方式不一样(用上面new什么),不用new让ioc来发现你用什么,然后我来给什么 DI:(依赖注入) 依赖:组件的依赖关系。如newsController依赖NewsServi…...
如何排查阻塞语句
文章目录 文档用途详细信息 文档用途 查询阻塞当前sql的语句,并结束阻塞语句。 详细信息 1、通过pg_stat_activity视图和pg_blocking_pids函数查找阻塞sql。 highgo# select pid,pg_blocking_pids(pid),wait_event_type,wait_event,query from pg_stat_activity…...
TIP-2021《SRGAT: Single Image Super-Resolution With Graph Attention Network》
推荐深蓝学院的《深度神经网络加速:cuDNN 与 TensorRT》,课程面向就业,细致讲解CUDA运算的理论支撑与实践,学完可以系统化掌握CUDA基础编程知识以及TensorRT实战,并且能够利用GPU开发高性能、高并发的软件系统…...
【AI学习】AI大模型技术发展研究月报的生成提示词
AI大模型技术发展研究月报生成提示词 请输出AI大模型技术发展研究月报,要求如下: —————————— 任务目标 在今天({{today}})往前连续 30 天内,检索已正式公开发表的、与AI大模型(参数量 ≥10B&am…...
深入理解 Git 分支操作的底层原理
在软件开发的世界里,Git 已经成为了版本控制的标配工具。而 Git 分支功能,更是极大地提升了团队协作和项目开发的效率。我们在日常开发中频繁地创建、切换和合并分支,但是这些操作背后的底层原理是怎样的呢?在之前的博客探秘Git底…...
泰迪杯特等奖案例深度解析:基于多模态融合与小样本学习的工业产品表面缺陷智能检测系统
(第九届泰迪杯数据挖掘挑战赛特等奖案例全流程拆解) 一、案例背景与核心挑战 1.1 工业质检痛点分析 在3C电子、汽车零部件等高端制造领域,产品表面缺陷(划痕、凹陷、氧化等)检测是质量控制的核心环节。传统人工目检存在效率低(平均检测速度3秒/件)、漏检率高(约15%)…...
Go语言爬虫系列教程 实战项目JS逆向实现CSDN文章导出教程
爬虫实战:JS逆向实现CSDN文章导出教程 在这篇教程中,我将带领大家实现一个实用的爬虫项目:导出你在CSDN上发布的所有文章。通过分析CSDN的API请求签名机制,我们将绕过平台限制,获取自己的所有文章内容,并以…...
轨道炮--范围得遍历,map巧统计
1.思路很难想,但代码一看一下就明白了,就是模拟时间,map存起来遍历也不受10*6影响 2.每次先统计点对应的直线,再动这个点,map一遍历实时更新ma统计max,AC!!!! https://www.luogu.com.cn/problem/P8695 #i…...
python中集合的操作
Python中的集合(Set)是一种无序、可变且元素唯一的数据结构,主要用于去重和数学运算。以下是核心操作分类: 1. 集合创建 大括号创建:s {1, 2, 3}(空集合必须用set())构造函数:…...
常见激活函数——作用、意义、特点及实现
文章目录 激活函数的意义常见激活函数及其特点1. Sigmoid(Logistic 函数、S型函数)2. Tanh(双曲正切函数)3. ReLU(Rectified Linear Unit修正线性单元)4. Softmax5. Swish(Google 提出ÿ…...
FC7300 Trigger MCAL配置引导
FC7300包含4个触发器选择(TRGSELs)。详细的连接信息将在章节中描述。Trigger Select (TRGSEL)源。TRGSEL模块允许软件为外设选择触发器源。 TRGSEL提供了一种极其灵活的机制,用于将各种触发器源连接到多个引脚/外设。 在TRGSEL中,每个控制寄存器最多支持4个输出触…...
组件导航 (HMRouter)+flutter项目搭建-混合开发+分栏效果
组件导航 (Navigation)flutter项目搭建 接上一章flutter项目的环境变量配置并运行flutter 1.flutter创建项目并运行 flutter create fluter_hmrouter 进入ohos目录打开编辑器先自动签名 编译项目-生成签名包 flutter build hap --debug 运行项目 HMRouter搭建安装 1.安…...
WAS和Tomcat的对比
一、WAS和Tomcat的对比 WebSphere Application Server (WAS) 和 Apache Tomcat 是两款常用的 Java 应用服务器,但它们有许多显著的区别。在企业级应用中,它们扮演不同的角色,各自有其特点和适用场景。以下是它们在多个维度上的详细对比&…...
GPU Runtime Suspend 调试与验证:从 sysfs 到 perf 分析
选题背景:在基于 NXP i.MX8MP 平台调试 GPU 时,常常需要确认 Vivante GPU2D/ Vivante GPU2D/\uGPU3D 是否已经进入 runtime suspend ,以降为一篇完整的验证和分析步骤,适合用于实战调试与面试表达。 一、什么是 Runtime Suspend&a…...
响应式布局
布局方式 固定宽度布局:主流的宽度有960px/980px/1190px/1210px等。移动端用户需要缩放查看页面内容 流式布局:百分比设置相对宽度。在不同设备上都能完整显示。兼容性一般,可能发生错位 响应式布局:一套代码自动适配不同终端。检测设备信息,根据设备调整布局。用户体验最…...
简单入门RabbitMQ
本章将带大家来写一个简单的程序,使用 Java 创建RabbitMQ 的生产者和消费者 依赖引入 在 Maven 仓库中输入 amqp-client: 找到第一个 RabbitMQ Java Client ,点击进去找到一个合适的版本然后将依赖引入到我们项目中的 pom.xml 文件中。 …...
金属加工液展|切削液展|2025上海金属加工液展览会
2025上海金属加工液展览会 时间:2025年12月2-4日 地点:上海新国际博览中心 2025上海金属加工液展规划30000平方米展览规模,预设展位1200个,将为国内外加工液产业提供一个集“展示、合作、交易、发展”于一体的综合性平台&#…...
前端实现流式输出《后端返回Markdown格式文本,前端输出类似于打字的那种》
一、使用插件 插件名称:marked 版本:15.0.11 安装插件:npm install marked15.0.11 作用:marked 是一个用于将 Markdown 语法转换为 HTML 的 JavaScript 库 插件2名称:dompurify 版本:3.2.5 安装插件&…...
Python字符串常用方法详解
文章目录 Python字符串常用方法详解一、字符串大小写转换方法(常用)1. 基础大小写转换2. 案例:验证码检查(不区分大小写) 二、字符串查找与替换方法1. 查找相关方法2. 替换相关方法 三、字符串判断方法1. 内容判断方法 四、字符串分割与连接方…...