深度学习————模型保存与部署
第一部分:模型保存基础
什么是模型保存?
当你训练好一个深度学习模型后,它会拥有“学习到的参数”,这些参数(权重、偏置等)构成了模型的“知识”。如果不保存这些参数,那么训练好的模型在关闭程序后就会丢失。
所以,模型保存就是将训练好的参数(或整个模型)保存到磁盘上,供之后加载使用或部署。
两种主要保存方式(以 PyTorch 为例)
-
保存模型参数(推荐)
-
只保存模型的状态字典(
state_dict
),这是最推荐的方法。 -
更轻便,适合部署、版本管理。
-
加载时需要重新构建模型结构,然后加载参数。
-
-
保存整个模型结构与参数(不推荐)
-
使用
torch.save(model)
直接保存整个模型对象。 -
不可跨 Python 版本或环境,不利于调试与迁移。
-
常见保存格式
框架 | 推荐保存格式 | 说明 |
---|---|---|
PyTorch | .pth / .pt | .pth 一般用于 state_dict |
TensorFlow | .ckpt / .pb / SavedModel | SavedModel 用于部署 |
ONNX | .onnx | 便于跨框架、跨平台部署 |
保存路径与命名建议
-
路径统一、版本可控,如:
checkpoints/ ├── model_v1_2025-05-01.pth ├── model_best_val.pth └── model_latest.pth
-
可使用时间戳 + 性能指标命名,便于后续追踪:
model_acc87.4_epoch15.pth
版本管理建议
-
使用日志系统(如 TensorBoard、WandB)记录对应版本表现。
-
每次训练完成后保存多个模型:如最优验证集模型(best)、最后模型(last)。
-
大项目建议结合 Git 和 DVC(Data Version Control)管理模型文件。
第二部分:PyTorch 中的模型保存与加载实战
PyTorch 提供了非常灵活和强大的模型保存与加载机制,主要通过 state_dict
(模型参数字典)进行操作。下面我们详细讲解每一步并提供示例代码。
一、什么是 state_dict
?
state_dict
是一个 Python 字典,保存了模型中每一层的参数(权重和偏置等)。它的格式大致如下:
{'layer1.weight': tensor(...),'layer1.bias': tensor(...),...
}
每个模块(如 nn.Linear
, nn.Conv2d
)都将其参数注册在 state_dict
中。
🔹 二、保存模型参数(推荐)
保存代码:
import torch# 假设你有一个模型实例 model
torch.save(model.state_dict(), 'model.pth')
注意事项:
-
model.pth
只是文件名,扩展名可以是.pt
或.pth
,没有区别。 -
只保存参数,不包含模型结构,因此加载时需要手动定义结构。
三、加载模型参数
加载步骤分两步走:
-
重新定义模型结构;
-
加载参数到模型中。
# 1. 定义模型结构(必须与保存时一致) model = MyModel()# 2. 加载参数 model.load_state_dict(torch.load('model.pth'))# 3. 切换到评估模式(部署时必须) model.eval()
🔹 四、保存整个模型(不推荐)
torch.save(model, 'entire_model.pth')
然后加载:
model = torch.load('entire_model.pth')
model.eval()
缺点:
-
依赖于模型的类定义和 Python 环境;
-
一旦结构变动,加载可能出错;
-
不适合跨平台部署。
五、训练状态一起保存(含优化器)
训练中断后可恢复继续训练,需要同时保存模型和优化器状态。
# 保存
torch.save({'epoch': epoch,'model_state_dict': model.state_dict(),'optimizer_state_dict': optimizer.state_dict(),'loss': loss,
}, 'checkpoint.pth')
加载时:
checkpoint = torch.load('checkpoint.pth')
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
epoch = checkpoint['epoch']
loss = checkpoint['loss']
六、保存和加载到指定设备(如 GPU)
# 保存时无关设备
torch.save(model.state_dict(), 'model.pth')# 加载到 CPU
model.load_state_dict(torch.load('model.pth', map_location='cpu'))# 加载到 GPU
device = torch.device('cuda')
model.load_state_dict(torch.load('model.pth', map_location=device))
七、完整示例(含模型结构)
import torch
import torch.nn as nn# 模型定义
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc = nn.Linear(10, 2)def forward(self, x):return self.fc(x)# 初始化模型与优化器
model = MyModel()
optimizer = torch.optim.Adam(model.parameters())# 保存
torch.save({'model_state_dict': model.state_dict(),'optimizer_state_dict': optimizer.state_dict(),
}, 'model_checkpoint.pth')# 加载
model2 = MyModel()
optimizer2 = torch.optim.Adam(model2.parameters())
checkpoint = torch.load('model_checkpoint.pth')
model2.load_state_dict(checkpoint['model_state_dict'])
optimizer2.load_state_dict(checkpoint['optimizer_state_dict'])
第三部分:模型部署基础概念
模型训练完成后,并不是终点。部署模型的目的,是将它放到现实世界中,为用户或系统提供服务。比如:
-
智能客服系统:用户发送一条消息,模型给出回复;
-
医疗图像诊断:上传CT图像,模型输出预测结果;
-
教学系统:上传作业照片,模型识别题目并自动评分。
本部分将介绍部署的核心概念及常见方式。
一、为什么需要部署?
目标 | 说明 |
---|---|
模型服务化 | 把训练好的模型变成一个可以实时调用的服务(如 API) |
多用户访问 | 支持多个用户、多个终端访问(Web、App等) |
实时推理 | 对输入进行实时预测,如语音识别、图像识别 |
系统集成 | 将模型集成进现有的软件系统、产品或平台 |
规模扩展 | 支持大规模并发调用,进行推理加速、负载均衡等 |
二、部署分类与对比
我们按部署场景将常见方式进行分类总结:
部署方式 | 描述 | 适合场景 | 优点 | 缺点 |
---|---|---|---|---|
本地部署 | 模型运行在本地电脑或服务器上 | 开发测试、小项目 | 简单易操作,无需网络 | 不易扩展,不适合多人使用 |
Web 服务部署 | 封装成 HTTP API / Web UI | 实际产品,后台系统 | 可远程访问,适合用户使用 | 部署较复杂,对安全性有要求 |
云端部署 | 部署到云服务器(如阿里云、AWS) | 大型项目、商业部署 | 可弹性伸缩,服务稳定 | 成本高,涉及 DevOps 知识 |
移动端部署 | 模型打包到手机或嵌入式设备 | 移动AI、边缘设备 | 离线可用,低延迟 | 受限于算力、平台兼容性 |
服务器集群部署 | 结合容器与负载均衡器部署多个模型 | 高并发、高可用场景 | 可自动扩缩、容错性好 | 依赖 Docker/K8s,配置复杂 |
三、部署方式常用工具和框架
场景 | 工具/平台示例 | 简述 |
---|---|---|
本地部署 | Flask、Gradio、Streamlit | 简单封装模型为 API 或 Web 界面 |
Web 后端部署 | FastAPI、Flask + Gunicorn | 可高性能提供 REST 接口 |
云服务部署 | HuggingFace Spaces、阿里云 ECS | 快速上线,适合演示和产品原型 |
模型导出与推理加速 | TorchScript、ONNX、TensorRT | 优化模型结构,提高推理速度 |
多模型管理 | MLflow、TorchServe、NVIDIA Triton | 模型托管、版本管理与部署平台 |
四、常见部署架构图示意(文字版)
用户 -> 浏览器 / App|V[ Web 前端 ] ←(Gradio / React + Flask 等)|V[ Web 后端 API ]|V[ 推理服务(模型加载) ]|V[ 模型参数 / 权重文件 ]
五、从训练到部署流程总览
-
训练模型:在本地或服务器完成训练;
-
保存模型:保存为
.pth
或.onnx
文件; -
封装接口:使用 Flask / Gradio / FastAPI 编写服务;
-
构建前端(可选):使用 HTML / React / Gradio 交互;
-
部署上线:本地测试通过后部署到服务器或平台;
-
用户使用:通过网页、App 等方式访问部署的服务。
第四部分:模型导出为部署格式(TorchScript 和 ONNX)
训练好的 PyTorch 模型需要导出成标准格式,才能跨平台、跨框架、高效地部署。TorchScript 和 ONNX 是 PyTorch 中最常用的导出格式。
本部分将详细讲解两者的概念、区别、导出方式及使用场景。
一、为什么要导出模型?
虽然 .pth
格式在 PyTorch 内部很方便使用,但部署时常常需要:
-
加快推理速度
-
在没有 Python 的环境中运行
-
与其他框架(如 TensorFlow、C++、移动端)兼容
-
更稳定、更可控的模型格式
这时就需要导出为中间格式,如 TorchScript 或 ONNX。
TorchScript 模型导出
什么是 TorchScript?
TorchScript 是 PyTorch 的一个中间表示,它允许模型以静态图的形式保存并运行。这使得:
-
可脱离 Python 环境运行
-
可通过
C++ API
部署 -
支持推理优化(如
torch.jit.optimize_for_inference
)
TorchScript 两种转换方式
1. 追踪法(Tracing)
适合无条件分支的模型。
import torch# 假设 model 是你训练好的模型
model.eval()example_input = torch.randn(1, 3, 224, 224)
traced_model = torch.jit.trace(model, example_input)# 保存
traced_model.save("model_traced.pt")
2. 脚本法(Scripting)
适合包含 if/else、循环等逻辑的模型。
scripted_model = torch.jit.script(model)
scripted_model.save("model_scripted.pt")
💡 TorchScript 加载与推理
import torchmodel = torch.jit.load("model_traced.pt")
model.eval()output = model(torch.randn(1, 3, 224, 224))
ONNX 模型导出
什么是 ONNX?
ONNX(Open Neural Network Exchange)是一种通用模型格式,由微软和 Facebook 发起,支持多种深度学习框架,如:
-
PyTorch
-
TensorFlow
-
MXNet
-
OpenCV DNN
-
ONNX Runtime
-
TensorRT
PyTorch 转 ONNX 示例
import torchmodel.eval()
dummy_input = torch.randn(1, 3, 224, 224)torch.onnx.export(model, dummy_input,"model.onnx",input_names=["input"],output_names=["output"],dynamic_axes={"input": {0: "batch"}, "output": {0: "batch"}},opset_version=11
)
ONNX 模型验证
你可以用 onnx
包验证导出是否成功:
import onnxonnx_model = onnx.load("model.onnx")
onnx.checker.check_model(onnx_model) # 抛出异常说明有问题
推理:ONNX Runtime
import onnxruntime as ort
import numpy as npsession = ort.InferenceSession("model.onnx")
input_name = session.get_inputs()[0].name
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)output = session.run(None, {input_name: input_data})
TorchScript vs ONNX 对比总结
特性 | TorchScript | ONNX |
---|---|---|
支持框架 | PyTorch 本身 + C++ | 多框架(TensorRT、ONNX RT等) |
性能优化支持 | 是(官方提供优化接口) | 是(ONNX Runtime / TensorRT) |
转换复杂度 | 简单 | 稍复杂,需要注意版本/OP集 |
支持 Python 控制流 | 是 | 否(静态图模型) |
移植性 | 中(依赖 PyTorch 环境) | 强(适合工业部署) |
推荐场景 | 内部 PyTorch 部署 | 跨平台、商业部署 |
第五部分:模型部署方式详解(Gradio、Flask、ONNX Runtime等)
在本部分,我们将从实用角度出发,逐一讲解几种常用部署方式,并配合完整代码模板,帮助你快速上手部署一个推理服务。
方式一:使用 Gradio 快速构建 Web 界面
Gradio 是一个非常流行的 Python 库,用于快速构建交互式 Web 应用,适合演示、测试和初步上线。
1. 安装 Gradio
pip install gradio
2. 代码示例:图像分类模型部署(TorchScript)
import gradio as gr
import torch
from torchvision import transforms
from PIL import Image# 加载 TorchScript 模型
model = torch.jit.load("model_traced.pt")
model.eval()# 图像预处理函数
preprocess = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor()
])# 推理函数
def predict(img):img = preprocess(img).unsqueeze(0)with torch.no_grad():output = model(img)probs = torch.nn.functional.softmax(output[0], dim=0)return {f"Class {i}": float(p) for i, p in enumerate(probs)}# 创建界面
iface = gr.Interface(fn=predict, inputs="image", outputs="label")
iface.launch()
启动后会自动打开浏览器访问地址,如:http://127.0.0.1:7860
方式二:使用 Flask 构建 RESTful 接口(API)
Flask 是 Python 中常用的 Web 框架,可以把模型封装成一个 HTTP 接口供前端或其他服务调用。
1. 安装 Flask
pip install flask
2. API 接口部署模板(适合 ONNX)
from flask import Flask, request, jsonify
import onnxruntime as ort
import numpy as npapp = Flask(__name__)# 初始化 ONNX 推理器
session = ort.InferenceSession("model.onnx")
input_name = session.get_inputs()[0].name@app.route("/predict", methods=["POST"])
def predict():data = request.json["input"] # 输入是嵌套 listinput_array = np.array(data).astype(np.float32)output = session.run(None, {input_name: input_array})return jsonify({"output": output[0].tolist()})if __name__ == '__main__':app.run(debug=True, port=5000)
前端可以通过 POST
请求向 /predict
发送数据,返回 JSON 格式的模型输出。
方式三:部署到 HuggingFace Spaces(在线部署平台)
HuggingFace 提供免费的部署平台,支持 Gradio/Streamlit 应用的在线托管。
步骤:
-
在 https://huggingface.co/spaces 创建一个新的 Space;
-
选择 Gradio 模板;
-
上传你的代码文件(如
app.py
)和requirements.txt
; -
提交后等待构建,即可访问。
示例
gradio
torch
torchvision
方式四:ONNX Runtime + FastAPI + Docker(工业部署)
适合构建高性能、可扩展的 API 服务。
-
使用 FastAPI 替代 Flask(性能更高);
-
使用 Docker 打包(环境一致性);
-
使用 ONNX Runtime(加速推理);
若你感兴趣,我可以提供该方式的完整项目结构与部署脚本。
常见部署注意事项
问题/注意点 | 说明 |
---|---|
模型文件太大 | 可用 torch.quantization 压缩模型 |
GPU/CPU 版本不一致 | 部署前明确目标环境是否支持 CUDA |
接口响应慢 | 用 FastAPI + Uvicorn 替代 Flask |
高并发请求处理困难 | 使用 Gunicorn 或 Docker + Kubernetes |
数据预处理慢 | 把预处理逻辑也放在服务端完成 |
服务崩溃/异常退出 | 加入异常处理与日志记录系统 |
第六部分:高级部署与优化技巧(模型压缩、推理加速、Docker 打包、前端集成)
当你完成了模型部署的基本流程,进一步优化部署效果(速度、稳定性、易用性)就很关键了。下面我们从多个方面介绍进阶技巧。
一、模型压缩与推理加速
部署模型时,常常遇到模型太大、推理太慢、占用资源高等问题。可以通过以下几种方式进行模型压缩和推理加速。
1. 模型量化(Quantization)
将浮点数权重压缩成更小的数据类型(如 float16
或 int8
),大幅降低模型大小和推理耗时。
静态量化(Post-training)示例:
import torch.quantizationmodel_fp32 = ... # 已训练模型
model_fp32.eval()# 准备量化配置
model_fp32.qconfig = torch.quantization.get_default_qconfig('fbgemm')
torch.quantization.prepare(model_fp32, inplace=True)# 运行一次推理(用于收集统计信息)
_ = model_fp32(torch.randn(1, 3, 224, 224))# 转换为量化模型
quantized_model = torch.quantization.convert(model_fp32, inplace=False)# 保存
torch.jit.script(quantized_model).save("model_quant.pt")
注意:部分模块(如
BatchNorm
)不支持直接量化,需使用QuantStub
包装。
2. 使用 Torch-TensorRT(NVIDIA GPU 加速)
Torch-TensorRT 是 NVIDIA 供的一个库,可将 TorchScript 模型转换为 TensorRT 引擎
pip install torch-tensorrt -U
简单使用:
import torch_tensorrttrt_model = torch_tensorrt.compile(model, inputs=[torch.randn(1, 3, 224, 224).to("cuda")], enabled_precisions={torch.float16})
✅ 二、Docker 化部署(推荐生产环境使用)
Docker 可以把你的服务打包成镜像,确保环境一致性、可移植性。
1. 创建项目目录结构
deploy_app/
├── app.py # Flask / Gradio 应用
├── model.onnx # 导出的模型
├── requirements.txt # 所需 Python 包
└── Dockerfile # Docker 构建脚本
2. Dockerfile 示例
FROM python:3.10WORKDIR /appCOPY requirements.txt .
RUN pip install -r requirements.txtCOPY . .CMD ["python", "app.py"]
3. 构建并运行容器
docker build -t my_model_app .
docker run -p 5000:5000 my_model_app
若部署到云端(如阿里云、AWS),推荐结合 Nginx 反向代理与容器编排(如 docker-compose 或 Kubernetes)。
三、前端集成与美化建议
技术 | 优点 | 示例用途 |
---|---|---|
Gradio | 快速搭建交互界面 | 原型演示、测试用 |
Streamlit | 数据可视化友好 | 图像/表格/图表展示等 |
HTML + JS | 适合自定义界面、美化展示 | 嵌入 Web 系统、企业平台 |
React/Vue | 高度定制、适合商用产品 | 构建完整 Web 应用 |
四、完整部署案例:PyTorch → ONNX → Gradio → Docker → HuggingFace Spaces
总结与建议
部分 | 内容概览 |
---|---|
第一部分 | 模型保存格式(权重、结构、完整模型) |
第二部分 | 加载与恢复模型的多种方式 |
第三部分 | 部署的基本概念与分类 |
第四部分 | 模型导出为 TorchScript / ONNX |
第五部分 | 使用 Gradio / Flask / ONNX Runtime 部署 |
第六部分 | 模型压缩、推理加速、Docker 化、高级部署建议 |
相关文章:
深度学习————模型保存与部署
第一部分:模型保存基础 什么是模型保存? 当你训练好一个深度学习模型后,它会拥有“学习到的参数”,这些参数(权重、偏置等)构成了模型的“知识”。如果不保存这些参数,那么训练好的模型在关闭…...
5G金融互联:迈向未来金融服务的极速与智能新时代
5G金融互联:迈向未来金融服务的极速与智能新时代 大家好,我是Echo_Wish,今天咱们聊聊一个大家都十分关心的话题:5G网络在金融服务中的应用。咱们平时可能觉得5G只是打个电话、刷个视频更流畅了,但在金融服务领域,5G的低延时、大带宽和高可靠性正在悄然改变整个游戏规则。…...
交易所开发:构建功能完备的金融基础设施全流程指南
交易所开发:构建功能完备的金融基础设施全流程指南 ——从技术架构到合规安全的系统性解决方案 一、开发流程:从需求分析到运维优化 开发一款功能完备的交易所需要遵循全生命周期管理理念,涵盖市场定位、技术实现、安全防护和持续迭代四大阶…...
Icecream Video Editor:简单易用的视频编辑软件,轻松打造专业视频
Icecream Video Editor 是一款简单易用的视频编辑软件,专为希望快速、高效编辑视频的用户设计。它提供了丰富的功能,包括视频剪辑、效果应用、音频处理和视频导出,满足用户在不同场景下的需求。无论是视频新手还是有一定基础的创作者…...
论文阅读--Logical quantum processor based on reconfigurable atom arrays
论文主要内容 研究背景与目标: 论文提出了一种基于可重构中性原子阵列的逻辑量子处理器,旨在通过量子纠错(QEC)和逻辑量子比特编码,解决物理量子比特的噪声限制问题。该处理器结合高保真度逻辑门操作、任意连接性和实时…...
安防综合管理系统EasyCVR视频融合平台安防知识:门禁系统与视频监控系统如何联动?
在现代安防体系中,视频监控与门禁系统是两大核心。前者实时记录画面,为安全事件追溯提供依据;后者精准管控人员出入。二者联动可提升安防智能化水平,实现门禁点图像抓拍与实时监视,在安全事件发生时快速整合信息&#…...
微机系统第二章-题目整理
80x86标志寄存器中ZF位等于1,说明( )。 A A.运算结果等于0 B. 运算结果大于0 C. 运算结果不等于0 D.运算结果溢出 8086CPU由哪两大部分组成?简述它们的主要功能。 总线接口部件BIU跟执行部件EU。 总线接口部件(BIU&…...
w~自动驾驶合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12371169 #世界模型和DriveGPT这类大模型到底能给自动驾驶带来什么ne 以下分享大模型与自动驾驶结合的相关工作9篇论 1、ADAPT ADAPT: Action-aware Driving Caption Transformer(ICRA2023) AD…...
嵌入式学习的第二十三天-数据结构-树+哈希表+内核链表
一、树(一对多) 1.树的定义 树:n(n>0)个结点的有限集合。n 0 ,空树。 2.在任意一个非空树中, (1),有且仅有一个特定的根结点 (2),当n>1 时,其余结点可分为m个…...
互联网大厂Java求职面试:Spring AI与大模型交互的高级模式与自定义开发
互联网大厂Java求职面试:Spring AI与大模型交互的高级模式与自定义开发 在当今技术领域,随着AI和大模型技术的广泛应用,如何在复杂的系统架构中高效地集成这些技术成为了各大互联网公司关注的重点。本文将通过一场模拟的面试对话,…...
Ansible模块——主机名设置和用户/用户组管理
设置主机名 ansible.builtin.hostname: name:要设置的主机名 use:更新主机名的方式(默认会自动选择,不指定的话,物理机一般不会有问题,容器可能会有问题,一般是让它默认选择) syst…...
lowcoder数据库操作1:链接目标数据库
比如我使用的是PostgreSQL,要链接到数据库。 步骤1,Data Sources 步骤2, New data source 步骤3,选择PostgreSQL 步骤4,输入各种信息 命名,数据库所在的IP,端口,库名,用户密码。 步…...
R9打卡——RNN实现阿尔茨海默病诊断(优化特征选择版)
🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 1.检查GPU import numpy as np import pandas as pd import torch from torch import nn import torch.nn.functional as F import seaborn as sns#设置GPU训…...
Label Studio:开源标注神器
目录 一、Label Studio 是什么? 二、核心功能大揭秘 2.1 多类型数据全兼容 2.2 个性化定制随心配 2.3 团队协作超给力 2.4 机器学习巧集成 三、上手实操超简单 3.1 安装部署不头疼 3.1.1 Docker安装 3.1.2 pip安装 3.1.3 Anaconda安装 3.2 快速开启标注…...
flow-两种SharingStarted策略的区别示例
一 代码示例 viewModel.kt:// 上游数据源 - 模拟温度传感器 private val temperatureSource flow {var temp 20while(true) {emit(temp)delay(1000)println("上游发射温度: $temp") // 日志观察发射} }// WhileSubscribed - 有订阅者才收集 val temperature1 tem…...
零基础设计模式——设计模式入门
第一部分:设计模式入门 欢迎来到设计模式的世界!别担心,这听起来可能很“高大上”,但我们会用最生活化的例子来帮助你理解。 1. 什么是设计模式? 想象一下,你是个大厨,每天都要做很多菜。有些…...
通过vcpkg交叉编译grpc:构建Arm64平台的Docker化开发环境
一、引言 在现代软件开发中,交叉编译是构建跨平台应用程序的关键技术。本文将详细介绍如何使用Docker容器和vcpkg包管理器为Arm64架构交叉编译gRPC库。这种方法特别适用于需要在x86开发机上为ARM服务器或嵌入式设备构建高性能RPC服务的场景。 二、配置Docker交叉编…...
Nginx基础知识
Nginx是什么? Nginx 是一款高性能的 Web 服务器、反向代理服务器和负载均衡器,以其高并发处理能力和低内存消耗著称。以下是 Nginx 的基础知识和常见配置示例: 1. 核心概念 • 配置文件位置:通常为 /etc/nginx/nginx.conf 或 /us…...
【计算机主板架构】ITX架构
一、引言 在计算机硬件的广阔领域中,主板架构犹如大厦的基石,对整个计算机系统的性能、功能和扩展性起着至关重要的作用。其中,ITX架构以其小巧、灵活和独特的设计理念,在特定的应用场景中脱颖而出。从家庭媒体中心到小型办公电脑…...
ubuntu 20.04 运行和编译LOAM_Velodyne
摘要:创建工作空间-->src下克隆代码(https://github.com/laboshinl/loam_velodyne)-->修改四处代码(找到src/loam_velodyne路径下的CMakeLists.txt文件,注释掉35行代码和将/LOAM/src/loam_velodyne/src/lib文件夹…...
云计算简介:从“水电”到“数字引擎”的技术革命
云计算简介:从“水电”到“数字引擎”的技术革命 在当今数字化浪潮中,云计算早已从一个技术概念演变为支撑现代社会运转的核心基础设施。无论是你手机里的天气预报、电商购物的推荐系统,还是企业内部的ERP系统,背后都离不开云计算…...
femap许可与多用户共享
随着电磁仿真技术的发展,Femap作为一款领先的工具,在多个领域中发挥着不可替代的作用。然而,对于许多团队和企业来说,如何高效、经济地管理和使用Femap许可证成为了一个亟待解决的问题。本文将探讨Femap许可与多用户共享的概念、优…...
spring中yml配置上下文与tomcat等外部容器不一致问题
结论:外部优先级大于内部 在 application.yml 中配置了: server:port: 8080servlet:context-path: /demo这表示你的 Spring Boot 应用的上下文路径(context-path)是 /demo,即访问你的服务时,URL 必须以 /d…...
网络I/O学习-poll(三)
一、为什么要用Poll 由于select参数太多,较于复杂,调用起来较为麻烦;poll对其进行了优化 二、poll机制 poll也是一个系统调用,每次调用都会将所有客户端的fd拷贝到内核空间,然后进行轮询,判断IO是否就绪…...
云原生攻防2(Docker基础补充)
Docker基础入门 容器介绍 Docker是什么 Docker是基于Linux内核实现,最早是采用了 LXC技术,后来Docker自己研发了runc技术运行容器。 它基于Google Go语言实现,采用客户端/服务端架构,使用API来管理和创建容器。 虚拟机 VS Docker Namespace 内核命名空间属于容器非常核…...
【C++模板与泛型编程】实例化
目录 一、模板实例化的基本概念 1.1 什么是模板实例化? 1.2 实例化的触发条件 1.3 实例化的类型 二、隐式实例化 2.1 隐式实例化的工作原理 2.2 类模板的隐式实例化 2.3 隐式实例化的局限性 三、显式实例化 3.1 显式实例化声明(extern templat…...
CI/CD 实践:实现可灰度、可监控、可回滚的现代部署体系
CI/CD 实践:实现可灰度、可监控、可回滚的现代部署体系 一、背景 随着微服务架构、云原生技术的普及,传统的手动部署方式已难以满足现代业务快速迭代、高可用的需求。CI/CD(持续集成/持续交付)作为现代 DevOps 的核心环节&#…...
后退的风景
后退的风景 前言回退的景色 前言 坐在高铁的窗边,这是一趟回程的旅途,所有的树木、铁塔、石碑向后涌去,一如从前。 所谓风景正是如此,无非是看到了一段触动内心的感受,这段感受可能是伤心,亦或是欣喜。这…...
腾讯云安装halo博客
腾讯云安装halo博客 如果网站已经配置好可以直接使用的,可以直接跳转到《6》进行1panel的安装, 如果跳过之后安装出现问题,可以看看前面步骤 从《6》开始的安装视频 我估计是网站默认放开的端口和他返代理应用的端口冲突了,重装…...
Excel宏和VBA的详细分步指南
Excel宏和VBA的详细分步指南 一、宏录制与代码分析(超详细版)1. 启用开发工具2. 录制宏 二、VBA核心语法(深入详解)1. 变量与数据类型2. 循环结构3. 条件判断2. Worksheet对象3. Range对象的高级操作 四、实用案例扩展1. 数据清洗…...
第十六届蓝桥杯复盘
文章目录 1.数位倍数2.IPv63.变换数组4.最大数字5.小说6.01串7.甘蔗8.原料采购 省赛过去一段时间了,现在复盘下,省赛报完名后一直没准备所以没打算参赛,直到比赛前两天才决定参加,赛前两天匆匆忙忙下载安装了比赛要用的编译器ecli…...
深度学习---模型预热(Model Warm-Up)
一、基本概念与核心定义 模型预热是指在机器学习模型正式训练或推理前,通过特定技术手段使模型参数、计算图或运行环境提前进入稳定状态的过程。其本质是通过预处理操作降低初始阶段的不稳定性,从而提升后续任务的效率、精度或性能。 核心目标…...
python:pymysql概念、基本操作和注入问题讲解
python:pymysql分享目录 一、概念二、数据准备三、安装pymysql四、pymysql使用(一)使用步骤(二)查询操作(三)增(四)改(五)删 五、关于pymysql注入…...
科普:极简的AI乱战江湖
本文无图。 大模型 2022年2月,文生图应用的鼻祖Midjourney上线。 2022年8月,开源版的Midjourney,也就是Stable Diffusion上线。 2022年11月30日,OpenAI正式发布ChatGPT-3.5。 此后,不断有【大模型】面世&…...
养生指南:解锁健康生活新方式
一、饮食:精准搭配,科学滋养 饮食以 “少加工、多天然” 为核心。早餐选择希腊酸奶搭配蓝莓与一把混合坚果,富含蛋白质与抗氧化成分;午餐用藜麦饭搭配香煎龙利鱼和彩椒炒芦笋,营养全面且低脂;晚餐则是山药…...
Dolphinscheduler执行工作流失败,后台报duplicate key错误
背景 现场童鞋发来一张图如下 我很懵逼,不知道出了啥问题,在聊天工具上聊了10m还不知道啥,干脆就搞个腾讯会议(在此感谢腾讯爸爸免费会议)。哦,现场临时搭建了dolphinscheduler,然后导入工作流…...
【Vue】路由2——编程式路由导航、 两个新的生命周期钩子 以及 路由守卫、路由器的两种工作模式
目录 一、路由的push 与 replace切换 二、编程式路由导航 三、缓存路由组件 四、新增的两个生命周期钩子 五、路由守卫 5.1 前置路由守卫 5.2 后置路由守卫 5.3 独立路由守卫 5.4 组件内 路由守卫 六、路由器的两种工作模式 6.1 hash模式 6.2 history模式 6.3 V…...
VDC、SMC、MCU怎么协同工作的?
华为视频会议系统中,VDC(终端控制)、SMC(会话管理)、MCU(媒体处理) 通过分层协作实现端到端会议管理,其协同工作机制可总结为以下清晰架构: 1. 角色分工 组件核心职责类…...
ETL数据集成产品选型需要关注哪些方面?
ETL(Extract,Transform,Load)工具作为数据仓库和数据分析流程中的关键环节,其选型对于企业的数据战略实施有着深远的影响。谷云科技在 ETL 领域耕耘多年,通过自身产品的实践应用,对 ETL 产品选型…...
DriveGenVLM:基于视觉-语言模型的自动驾驶真实世界视频生成
《DriveGenVLM: Real-world Video Generation for Vision Language Model based Autonomous Driving》2024年8月发表,来自哥伦比亚大学的论文。 自动驾驶技术的进步需要越来越复杂的方法来理解和预测现实世界的场景。视觉语言模型(VLM)正在成…...
【达梦数据库】过程、函数、包头和包体详解零基础
目录 背景参考链接解释包头包体 背景 最近遇到关于包头和包体的问题,学习并记录 参考链接 参考链接: oracle的过程、函数、包头和包体详解零基础 解释 包头主要用于定义接口,包体主要用以实现包体中声明的存储过程、函数等。 包头 包体...
HarmonyOS开发样式布局
个人简介 👨💻个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…...
SpringCloud——EureKa
目录 1.前言 1.微服务拆分及远程调用 3.EureKa注册中心 远程调用的问题 eureka原理 搭建EureKaServer 服务注册 服务发现 1.前言 分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为服务。 优点: 降…...
【力扣刷题】LeetCode763-划分字母区间
文章目录 1. LeetCode763_划分字母区间 1. LeetCode763_划分字母区间 题目链接🔗 🐧解题思路: 区间合并 题目中这句话很关键“我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。” 你这句话你可以理解为 把…...
使用for循环和字典功能,统计字符出现在一个英文句子中的次数(python)
本题目要求写出一段代码实现输入一个英文句子后,统计句子中各个字符(不区分大小写,包含空格和标点符号)出现的次数。 输入格式: 请例如:输入 Life is short,we need Python. 。 输出格式: 对每一个字符输出对应的出现次数&…...
带你搞懂@Valid和@Validated的区别
前言 有参数传递的地方都少不了参数校验。在实际开发过程中,参数校验是保证程序健壮性的重要环节,前端的参数校验是为了用户体验,后端的参数校验是为了安全。试想一下,如果在 Controller 层中没有经过任何校验的参数通过 Service层…...
大数据hadoop小文件处理方案
Hadoop处理小文件问题的解决方案可分为存储优化、处理优化和架构优化三个维度,以下是综合技术方案及实施要点: 一、存储层优化方案 1.文件合并技术 离线合并:使用hadoop fs -getmerge命令将多个小文件合并为大文件并重新上传; MapReduce合并:开发专用MR…...
安装NASM
安装NASM 注意:这篇文章在librdkafka安装系列,不需要参考,仅为了记录而写,请不要参考,后续编译openssl的时候,可以使用参数no-asm,不影响整个的编译步骤。这里主要作为记录帖子。 本篇是Windows系统编译Qt使用的kafka(librdkafka)系列可以不参考的一篇,编译librdkaf…...
RabbitMQ-高级
RabbitMQ-高级 文章目录 RabbitMQ-高级前言:消息可靠性问题1.生产者可靠性1.生产者重连2.生产者确认机制3.生产者代码实现原理 2.MQ的可靠性1.数据持久化2.LazyQueue 3.消费者可靠性1.消费者确认机制1.确认机制2.确认功能 2.失败重试机制1.开启失败重试机制2.多次失…...
深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务
深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务 引言 在现代微服务架构中,消息队列扮演着至关重要的角色,而Apache Kafka凭借其高吞吐量、低延迟和可扩展性,成为了许多企业的首选。本文将详细介绍如何在Spring Boot应用…...