当前位置: 首页 > news >正文

[模型部署] 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 优化流程建议

  1. 建立基准:记录原始模型性能指标
  2. 分析瓶颈:识别计算密集或内存密集操作
  3. 选择策略:根据瓶颈和部署环境选择优化方法
  4. 渐进优化:从简单到复杂,逐步应用优化技术
  5. 持续评估:每步优化后评估性能和精度变化
  6. 权衡取舍:根据应用需求平衡精度和性能




📌 感谢阅读!若文章对你有用,别吝啬互动~​
👍 点个赞 | ⭐ 收藏备用 | 💬 留下你的想法 ,关注我,更多干货持续更新!

相关文章:

[模型部署] 3. 性能优化

&#x1f44b; 你好&#xff01;这里有实用干货与深度分享✨✨ 若有帮助&#xff0c;欢迎&#xff1a;​ &#x1f44d; 点赞 | ⭐ 收藏 | &#x1f4ac; 评论 | ➕ 关注 &#xff0c;解锁更多精彩&#xff01;​ &#x1f4c1; 收藏专栏即可第一时间获取最新推送&#x1f514;…...

使用 LSTM/GRU 预测设备异常的模型

LSTM(Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,旨在解决传统 RNN 在处理长序列数据时的梯度消失和梯度爆炸问题。它通过引入门控机制和单元状态来更好地控制信息的流动,使得网络能够学习到长期依赖关系。以下是其主要特点: 门控机制:包括遗忘门、输…...

八股文--JVM(1)

⭐️⭐️JVM内存模型 程序计数器&#xff1a;可以看作是当前线程所执行的字节码的行号指示器&#xff0c;用于存储当前线程正在执行的 Java 方法的 JVM 指令地址。如果线程执行的是 Native 方法&#xff0c;计数器值为 null。是唯一一个在 Java 虚拟机规范中没有规定任何 OutOf…...

BM25 算法与关键词提取在向量数据库中的实践优化

BM25 算法与关键词提取在向量数据库中的实践优化 在实际构建问答系统或语义检索场景中&#xff0c;向量数据库&#xff08;如 Weaviate&#xff09;提供了基于语义匹配的检索能力&#xff0c;然而我们发现 BM25 关键词检索效果不理想&#xff0c;甚至出现了召回率过低、查询必…...

济南超算研究所面试问题

1.自我介绍 2.java抽象类与接口的区别 3.抽象类能否实例化 4.在项目中用的抽象类偏多还是接口偏多 5.抽象类用的场景介绍一下 6.java中数据结构有哪些 7.数据的基本类型 8.引用类型&#xff0c;包装类型 9.是一个场景题&#xff0c;在查询数据库中的数据时&#xff0c;…...

“多维像素”可赋能具身智能非凡感知力——昱感微参加2025松山湖中国IC创新高峰论坛

5月13日&#xff0c;由中国半导体行业协会集成电路设计分会、芯原微电子&#xff08;上海&#xff09;股份有限公司联合主办的第十五届松山湖中国IC创新高峰论坛在东莞松山湖举行。本届松山湖论坛以“面向‘具身智慧机器人’的创新IC新品推介”为主题&#xff0c;吸引了许多知名…...

解决CLion控制台不能及时显示输出的问题

CLion 2025版本可以免费用于非商业用途了&#xff0c;下载来试用了一下&#xff0c;与JB的其它 IDE一样的资源占用比较大&#xff0c;流畅度不及VSCode。 在Windows下创建了一个简单的控制台应用程序&#xff0c;使用printf和std::cout输出字符串&#xff0c;发现CLion的控制台…...

多尺度对比度调整

一、背景介绍 受到了前面锐化算法实现的启发&#xff0c;对高频层做增强是锐化&#xff0c;那么对中低频一起做增强&#xff0c;就应该能有局域对比度增强效果。 直接暴力实现了个基本版本&#xff0c;确实有对比度增强效果。然后搜了下关键字&#xff0c;还真找到了已经有人这…...

虹桥前湾印象城MEGA品牌大会灵感迸发,共绘湾系生活新章

前言&#xff1a;当千年水韵流淌至上海前湾&#xff0c;当苏州河的生态肌理转化为商业空间的呼吸脉络……上海虹桥前湾印象城MEGA“漫漫而来”。 5月15-16日&#xff0c;以“灵感新章 Wave of Megagination”为主题的虹桥前湾印象城MEGA品牌大会成功举办&#xff0c;正式掀开长…...

新京东,正在成为一种生活方式

出品|何玺排版|叶媛 一个新京东&#xff0c;正在从“心”诞生。 2025年2月11日之前&#xff0c;如果问京东是做什么的&#xff0c;相信大多数人会回答京东是电商平台&#xff0c;卖家电数码日用百货的。现在&#xff0c;如果问京东是做什么的&#xff0c;相信大家的回答不在是…...

读论文alexnet:ImageNet Classification with Deep Convolutional Neural Networks

https://zhuanlan.zhihu.com/p/13694329885 1, 公式 卷积层输出尺寸&#xff1a; o ⌊(i 2p - k) / s⌋ 1 式中&#xff0c;i:输入尺寸&#xff1b;o:输出尺寸&#xff1b;p:padding&#xff1b;k: kernel_size&#xff1b;s: stride。⌊…⌋表示向下取整。 2, 推导过程 …...

操作系统|| 虚拟内存页置换算法

题目 写一个程序来实现 FIFO 和 LRU 页置换算法。首先&#xff0c;产生一个随机的页面引用序列&#xff0c;页面数从 0~9。将这个序列应用到每个算法并记录发生的页错误的次数。实现这个算法时要将页帧的数量设为可变。假设使用请求调页。可以参考所示的抽象类。 抽象类&…...

AGI大模型(19):下载模型到本地之ModelScope(魔搭社区)

1 安装模块 魔塔社区提供了下载的模块&#xff0c;如下&#xff1a; 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的区别&#xff0c;stringbuffer是通过什么实现线程安全的? StringBuffer 和 StringBuilder 都是用于处理可变字符串的类&#xff0c;但它们的主要区别在于 线程安全性。 StringBuffer 的线程安全是通过方法加锁&#xff08;synchronized&…...

【视觉任务】深度估计(Depth Estimation)介绍(2025年更新)

文章目录 1. 任务定义与意义2. 按输入类型的分类2.1 单目深度估计&#xff08;Monocular Depth Estimation&#xff09;2.2 双目与多视图深度估计&#xff08;Stereo / Multi-view&#xff09;2.3 深度相机输入&#xff08;RGB-D&#xff09;2.4 主动与被动方法 3. 核心方法概述…...

Python 在Excel单元格中应用多种字体样式

文在数据处理和报表生成场景中&#xff0c;Excel 文件的格式设置至关重要。合理的字体格式不仅能提升表格的可读性&#xff0c;还能突出关键数据。本文将详细介绍如何使用免费库Free Spire.XLS for Python&#xff0c;在 Excel 单元格中灵活应用多种字体格式&#xff0c;包括字…...

C++:字符串操作函数

strcpy() 功能&#xff1a;把一个字符串复制到另一个字符串。 #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.想我上面输出了有结果的即证明有&#xff0c;使用下列命令删除即可 [roothadoop100 ~]# rpm -e --nodeps mariadb-libs 3.进入我们常用存放压缩包…...

降低学习成本,1 天掌握 Java 开发核心技能

在当今数字化浪潮中&#xff0c;Java 编程语言凭借其卓越的跨平台性与稳定性&#xff0c;在企业级系统搭建、移动端应用开发以及大数据处理等领域占据着举足轻重的地位。但不可忽视的是&#xff0c;Java 开发链条冗长&#xff0c;从需求剖析到代码落地的全流程充满挑战&#xf…...

类模板的简单实例

author: hjjdebug date: 2025年 05月 16日 星期五 15:06:00 CST description: 类模板的简单实例 文章目录 1.实例代码:2. 模板类写法2.1 模板类的构造函数.2.2 模板类中的语句 3. 模板类的实例化过程.3.1 实例化的进一步试验. 4. 怎样调试constexpr 修饰的函数&#xff1f; 类模…...

描述性统计图表

一、核心图表类型与用途 1、直方图(Histogram) (1)定义:用连续矩形表示数据分布,横轴为数据区间,纵轴为频数或频率。 (2)用途:展示数据分布形态(对称、偏态)、识别离群值。 (3)适用场景:分析连续型变量的分布特征,如收入分布、考试成绩分布。 2、箱线图(Box P…...

【Golang笔记01】Goland基础语法规则

Golang笔记&#xff1a;快速学习Golang基础语法规则 一、基础语法 1.1、环境安装 第一步需要安装go的运行环境&#xff0c;从官网下载安装包&#xff1a;https://golang.google.cn/dl/。 第二步需要安装go的开发工具&#xff0c;可以使用vscode、goland。这里推荐使用golan…...

STM32 ADC+DMA+TIM触发采样实战:避坑指南与源码解析

知识点1【TRGO的介绍】 1、TRGO的概述 TRGO&#xff1a;Trigger Output&#xff08;触发输出&#xff09;&#xff0c;是定时器的一种功能。 它可以作为外设的启动信号&#xff0c;比如ADC转换&#xff0c;DAC输出&#xff0c;DMA请求等。 对于ADC来说&#xff0c;可以通过…...

Gmsh 读取自定义轮廓并划分网格:深入解析与实践指南

一、Gmsh 简介 (一)Gmsh 是什么 Gmsh 是一款功能强大的开源有限元网格生成器,广泛应用于工程仿真、数值模拟以及计算机图形学等领域。它为用户提供了从几何建模到网格划分的一整套解决方案,能够有效处理复杂几何形状,生成高质量的二维和三维网格,满足多种数值方法的需求…...

Elasticsearch/OpenSearch 中doc_values的作用

目录 1. 核心作用 2. 适用场景 3. 与 index 参数的对比 4. 典型配置示例 场景 1&#xff1a;仅用于聚合&#xff0c;禁止搜索 场景 2&#xff1a;优化大字段存储 5. 性能调优建议 6. 底层原理 doc_values 是 Elasticsearch/OpenSearch 中用于优化查询和聚合的列式存储结…...

如何在 Windows 10 或 11 上使用命令提示符安装 PHP

我们可以在 Windows 上从其官方网站下载并安装 PHP 的可执行文件,但使用命令提示符或 PowerShell 更方便。 PHP 并不是一种新的或不为人知的脚本语言,它已经存在并被全球数千名网络开发人员使用。它以开源许可并分发,广泛用于 LAMP 堆栈中。然而,与 Linux 相比,它在 Wind…...

SZU 编译原理

总结自 深圳大学《编译原理》课程所学相关知识。 文章目录 文法语法分析自顶向下的语法分析递归下降分析LL(1) 预测分析法FIRST 集合FOLLOW 集合 文法 乔姆斯基形式语言理论&#xff1a; 表达能力&#xff1a;0型文法 > 1型文法 > 2型文法 > 3型文法。 0 型文法&am…...

灌区量测水自动化监测解决方案

一、方案背景 随着社会发展和人口增长&#xff0c;水资源需求不断增大。我国水资源总量虽然丰富&#xff0c;但时空分布不均&#xff0c;加之农业用水占比大且效率偏低&#xff0c;使得水资源短缺问题日益凸显。农业用水一直是我国的耗水大户&#xff0c;占全部耗水总量的60%以…...

CVE-2017-8046 漏洞深度分析

漏洞概述 CVE-2017-8046 是 Spring Data REST 框架中的一个高危远程代码执行漏洞&#xff0c;影响版本包括 Spring Data REST < 2.5.12、2.6.7、3.0 RC3 及关联的 Spring Boot 和 Spring Data 旧版本。攻击者通过构造包含恶意 SpEL&#xff08;Spring Expression Language&…...

1基·2台·3空间·6主体——蓝象智联解码可信数据空间的“数智密码”

近日&#xff0c;由全国数据标准化技术委员会编制的《可信数据空间 技术架构》技术文件正式发布&#xff0c;标志着我国数据要素流通体系向标准化、规范化迈出关键一步。该文件从技术功能、业务流程、安全要求三大维度对可信数据空间进行系统性规范&#xff0c;为地方、行业及企…...

MySQL的存储过程

这一部分比较重要&#xff0c;加油&#xff01;&#xff01;&#xff01;部分代码忘记保存了&#xff0c;嘻嘻&#xff0c;练习代码在最后&#xff0c;大家共勉&#xff01;&#xff01;&#xff01; 通俗来讲&#xff0c;视图是死的&#xff0c;但是这个可以根据传入的参数不同…...

spring学习->sprintboot

spring IoC(控制翻转): 控制:资源的控制权(资源的创建&#xff0c;获取&#xff0c;销毁等) 反转:和传统方式不一样(用上面new什么)&#xff0c;不用new让ioc来发现你用什么&#xff0c;然后我来给什么 DI:(依赖注入) 依赖:组件的依赖关系。如newsController依赖NewsServi…...

如何排查阻塞语句

文章目录 文档用途详细信息 文档用途 查询阻塞当前sql的语句&#xff0c;并结束阻塞语句。 详细信息 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》

推荐深蓝学院的《深度神经网络加速&#xff1a;cuDNN 与 TensorRT》&#xff0c;课程面向就业&#xff0c;细致讲解CUDA运算的理论支撑与实践&#xff0c;学完可以系统化掌握CUDA基础编程知识以及TensorRT实战&#xff0c;并且能够利用GPU开发高性能、高并发的软件系统&#xf…...

【AI学习】AI大模型技术发展研究月报的生成提示词

AI大模型技术发展研究月报生成提示词 请输出AI大模型技术发展研究月报&#xff0c;要求如下&#xff1a; —————————— 任务目标 在今天&#xff08;{{today}}&#xff09;往前连续 30 天内&#xff0c;检索已正式公开发表的、与AI大模型&#xff08;参数量 ≥10B&am…...

深入理解 Git 分支操作的底层原理

在软件开发的世界里&#xff0c;Git 已经成为了版本控制的标配工具。而 Git 分支功能&#xff0c;更是极大地提升了团队协作和项目开发的效率。我们在日常开发中频繁地创建、切换和合并分支&#xff0c;但是这些操作背后的底层原理是怎样的呢&#xff1f;在之前的博客探秘Git底…...

泰迪杯特等奖案例深度解析:基于多模态融合与小样本学习的工业产品表面缺陷智能检测系统

(第九届泰迪杯数据挖掘挑战赛特等奖案例全流程拆解) 一、案例背景与核心挑战 1.1 工业质检痛点分析 在3C电子、汽车零部件等高端制造领域,产品表面缺陷(划痕、凹陷、氧化等)检测是质量控制的核心环节。传统人工目检存在效率低(平均检测速度3秒/件)、漏检率高(约15%)…...

Go语言爬虫系列教程 实战项目JS逆向实现CSDN文章导出教程

爬虫实战&#xff1a;JS逆向实现CSDN文章导出教程 在这篇教程中&#xff0c;我将带领大家实现一个实用的爬虫项目&#xff1a;导出你在CSDN上发布的所有文章。通过分析CSDN的API请求签名机制&#xff0c;我们将绕过平台限制&#xff0c;获取自己的所有文章内容&#xff0c;并以…...

轨道炮--范围得遍历,map巧统计

1.思路很难想&#xff0c;但代码一看一下就明白了&#xff0c;就是模拟时间&#xff0c;map存起来遍历也不受10*6影响 2.每次先统计点对应的直线&#xff0c;再动这个点&#xff0c;map一遍历实时更新ma统计max&#xff0c;AC!!!! https://www.luogu.com.cn/problem/P8695 #i…...

python中集合的操作

Python中的集合&#xff08;Set&#xff09;是一种无序、可变且元素唯一的数据结构&#xff0c;主要用于去重和数学运算。以下是核心操作分类&#xff1a; ‌1. 集合创建‌ 大括号创建&#xff1a;s {1, 2, 3}&#xff08;空集合必须用set()&#xff09;构造函数&#xff1a…...

常见激活函数——作用、意义、特点及实现

文章目录 激活函数的意义常见激活函数及其特点1. Sigmoid&#xff08;Logistic 函数、S型函数&#xff09;2. Tanh&#xff08;双曲正切函数&#xff09;3. ReLU&#xff08;Rectified Linear Unit修正线性单元&#xff09;4. Softmax5. Swish&#xff08;Google 提出&#xff…...

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 应用服务器&#xff0c;但它们有许多显著的区别。在企业级应用中&#xff0c;它们扮演不同的角色&#xff0c;各自有其特点和适用场景。以下是它们在多个维度上的详细对比&…...

GPU Runtime Suspend 调试与验证:从 sysfs 到 perf 分析

选题背景&#xff1a;在基于 NXP i.MX8MP 平台调试 GPU 时&#xff0c;常常需要确认 Vivante GPU2D/ Vivante GPU2D/\uGPU3D 是否已经进入 runtime suspend &#xff0c;以降为一篇完整的验证和分析步骤&#xff0c;适合用于实战调试与面试表达。 一、什么是 Runtime Suspend&a…...

响应式布局

布局方式 固定宽度布局:主流的宽度有960px/980px/1190px/1210px等。移动端用户需要缩放查看页面内容 流式布局:百分比设置相对宽度。在不同设备上都能完整显示。兼容性一般,可能发生错位 响应式布局:一套代码自动适配不同终端。检测设备信息,根据设备调整布局。用户体验最…...

简单入门RabbitMQ

本章将带大家来写一个简单的程序&#xff0c;使用 Java 创建RabbitMQ 的生产者和消费者 依赖引入 在 Maven 仓库中输入 amqp-client&#xff1a; 找到第一个 RabbitMQ Java Client &#xff0c;点击进去找到一个合适的版本然后将依赖引入到我们项目中的 pom.xml 文件中。 …...

金属加工液展|切削液展|2025上海金属加工液展览会

2025上海金属加工液展览会 时间&#xff1a;2025年12月2-4日 地点&#xff1a;上海新国际博览中心 2025上海金属加工液展规划30000平方米展览规模&#xff0c;预设展位1200个&#xff0c;将为国内外加工液产业提供一个集“展示、合作、交易、发展”于一体的综合性平台&#…...

前端实现流式输出《后端返回Markdown格式文本,前端输出类似于打字的那种》

一、使用插件 插件名称&#xff1a;marked 版本&#xff1a;15.0.11 安装插件&#xff1a;npm install marked15.0.11 作用&#xff1a;marked 是一个用于将 Markdown 语法转换为 HTML 的 JavaScript 库 插件2名称&#xff1a;dompurify 版本&#xff1a;3.2.5 安装插件&…...

Python字符串常用方法详解

文章目录 Python字符串常用方法详解一、字符串大小写转换方法(常用)1. 基础大小写转换2. 案例&#xff1a;验证码检查&#xff08;不区分大小写&#xff09; 二、字符串查找与替换方法1. 查找相关方法2. 替换相关方法 三、字符串判断方法1. 内容判断方法 四、字符串分割与连接方…...