大模型最新面试题系列:微调篇之微调框架(一)
一. 在DeepSpeed中配置零冗余优化(ZeRO)实现显存优化的步骤
核心原理
ZeRO通过分片(Sharding)技术将模型参数、梯度和优化器状态分布到多卡,消除冗余存储。三个阶段逐步减少显存占用:
- Stage 1:分片优化器状态(如Adam的动量、方差)
- Stage 2:分片优化器状态+梯度
- Stage 3:分片优化器状态+梯度+模型参数
配置步骤
- 创建DeepSpeed配置文件(以Stage 2为例):
{"zero_optimization": {"stage": 2, // 启用Stage 2"overlap_comm": true,// 计算与通信重叠加速"contiguous_gradients": true, // 减少梯度碎片"reduce_bucket_size": "auto" // 自动优化通信块大小},"bf16": {"enabled": "auto"} // 自动启用混合精度
}
- 启动脚本配置:
accelerate launch \--use_deepspeed \--deepspeed_config_file stage2.conf \--deepspeed_multinode_launcher standard \train.py \--model_name_or_path google/gemma-2-2b \--per_device_train_batch_size 1 \--gradient_accumulation_steps 2
实战对比
- 1.5B参数模型:Stage1将单卡显存从18GB降至2.25GB
- 10B参数模型:Stage2配合32张V100可完成训练
二. DeepSpeed三种并行策略(DP/MP/PP)微调配置对比
策略 | 分片对象 | 显存占用 | 通信开销 | 适用场景 | 配置重点 |
---|---|---|---|---|---|
数据并行(DP) | 优化器状态 | 高 | 低 | 中小模型 | --deepspeed --zero_optimization |
模型并行(MP) | 模型参数 | 中 | 中 | 单卡无法容纳的模型 | --model_parallel_size |
流水线并行(PP) | 计算阶段 | 低 | 高 | 超深网络 | --num_layers + 阶段划分 |
关键差异
- DP通过分片优化器状态减少冗余
- MP通过纵向切分模型层实现并行
- PP通过时间流水化隐藏通信延迟
三. vllm的PagedAttention机制解析
背景与挑战
在LLM推理中,KV缓存(Key-Value Cache)用于存储历史Token的注意力键值对,以避免重复计算。传统方法采用连续内存分配,但存在以下问题:
- 内存碎片:不同请求的序列长度动态变化,导致内存空洞。
- 预分配浪费:需预留大块连续内存,利用率低(如LLaMA-2 7B在序列长度44K时,内存占用超100GB)。
- 算术强度低:Attention计算为矩阵乘向量,Memory Bound特性显著。
PagedAttention核心机制
受操作系统虚拟内存分页技术启发,PagedAttention通过以下创新优化内存管理:
- 分块存储(Paged Memory)
- 将KV缓存分割为固定大小的页块(如256KB),允许非连续存储。
- 每个页块通过**页表(Lookup Table)**映射物理地址,支持动态分配与回收。
- 动态分页管理
- 按需分配:仅为当前生成的Token分配页块,无需预分配连续内存。
- 碎片回收:请求结束后,自动释放页块并加入空闲池。
- 跨请求共享
- 不同请求可共享相同的KV页块(如相同前缀的上下文),减少冗余存储。
- 对并行采样(如Beam Search)友好,共享基础KV数据。
技术优势
指标 | 传统方法 | PagedAttention | 提升效果 |
---|---|---|---|
内存利用率 | 仅4%~20%有效使用 | 96%以上 | 降低内存浪费96% |
批处理能力 | 受限于连续内存分配 | 支持更大Batch Size | 吞吐量提升30倍(Vicuna案例) |
KV缓存大小(GQA场景) | 全量存储 | 按需分配 | 减少75%(如8 KV Head场景) |
实现细节
-
CUDA内核优化
- 采用定制化CUDA内核处理分页逻辑,降低页表访问开销。
- 结合Tensor Core优化矩阵运算(需匹配页块大小,如16x16对齐)。
-
与GQA的协同优化
- GQA通过减少KV Head数量(如8个KV Head)降低缓存体积。
- PagedAttention进一步动态管理GQA的KV块,避免连续存储限制。
-
页表与内存布局
# 伪代码示例:页表映射 class PageTable:def __init__(self):self.page_map = {} # 逻辑页号 → 物理页地址self.free_pages = [] # 空闲页池def allocate_page(self):if self.free_pages:return self.free_pages.pop()else:return new_physical_page()def free_page(self, page_id):self.free_pages.append(page_id)
实际应用与性能验证
- vLLM框架集成:通过
PagedAttention
类实现,支持Hugging Face模型(如Llama-2、Mistral)。 - 吞吐量对比:
- 单A100 GPU处理Llama-2 7B,传统方法吞吐量15 tokens/s,PagedAttention提升至450 tokens/s。
- 内存节省:在序列长度16K时,内存占用从120GB降至25GB。
四. llama-factory自定义微调流水线构建步骤
1、环境准备与安装
克隆仓库
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
创建虚拟环境
conda create -n llama_factory python=3.10
conda activate llama_factory
安装依赖
pip install -e ".(torch,metrics)"
pip install modelscope -U # 国内用户推荐
2、数据集准备
数据格式规范
需遵循alpaca_zh_demo.json
格式,示例如下:
[{"instruction": "写一个Python函数计算斐波那契数列","input": "","output": "def fibonacci(n):\n if n <= 0:\n return []\n elif n == 1:\n return [0]\n ..."}
]
注册数据集
在dataset_info.json
中添加自定义数据集信息:
{"guihua_ner": {"path": "data/guihua_ner.json","instruction_column": "instruction","input_column": "input","output_column": "output"}
}
3、模型下载与校验
国内镜像下载(推荐)
from modelscope import snapshot_download
model_dir = snapshot_download("LLM-Research/Meta-Llama-3-8B-Instruct", cache_dir="models/")
模型可用性验证
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained(model_dir)
model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="cuda:0")
text = tokenizer("你好!", return_tensors="pt").to("cuda")
output = model.generate(**text, max_new_tokens=50)
print(tokenizer.decode(output[0], skip_special_tokens=True))
4、自定义训练配置
命令行训练(示例)
llamafactory-cli train \--stage sft \--model_name_or_path qwen/Qwen2.5-7B-Instruct \--dataset alpaca_zh_demo \--finetuning_type lora \--lora_rank 8 \--learning_rate 5e-5 \--per_device_train_batch_size 2 \--gradient_accumulation_steps 8 \--output_dir saves/custom_model \--bf16 True
YAML配置文件(以qwen2.5-7B-ner.yaml
为例)
### model
model_name_or_path: qwen/Qwen2.5-7B-Instruct### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: query_key_value### dataset
dataset: guihua_ner
template: qwen
cutoff_len: 2048### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 16
5、训练与监控
启动Web UI
llamafactory-cli webui
- 在浏览器中访问
http://localhost:7860
,通过可视化界面管理数据集、配置训练参数并监控进度。
关键参数说明
参数 | 说明 |
---|---|
lora_rank | LoRA低秩矩阵的秩,控制参数量(推荐8-16) |
learning_rate | 学习率(通常5e-5~1e-4) |
cutoff_len | 截断序列长度,避免内存溢出(建议2048~4096) |
gradient_checkpointing | 启用梯度检查点,节省显存(推荐开启) |
6、模型推理与合并
加载LoRA模型
from peft import PeftModel
model = PeftModel.from_pretrained(base_model, "saves/custom_model/lora")
动态合并权重(可选)
llamafactory-cli merge_lora \--base_model_path qwen/Qwen2.5-7B-Instruct \--lora_path saves/custom_model/lora \--output_path saves/merged_model
7、部署与测试
启动API服务
llamafactory-cli serve \--model_name_or_path saves/merged_model \--device cuda:0 \--port 8080
性能评估
llamafactory-cli evaluate \--model_name_or_path saves/merged_model \--benchmark datasets/gsm8k \--output_file results.json
五. Unsloth与Text-Generation-Inference部署微调模型的性能差异
核心差异对比
维度 | Unsloth | Text-Generation-Inference |
---|---|---|
训练速度 | 提升2-5倍(如Llama-3/Qwen2等模型) | 传统微调速度,无显著加速优化 |
显存占用 | 减少70%,支持4位预量化模型 | 依赖标准FP16/FP32,显存占用较高 |
硬件兼容性 | 支持Nvidia/H100、AMD、Intel GPU | 主要适配Nvidia GPU |
内存优化 | 智能权重上投技术(减少QLoRA冗余) | 常规内存管理策略 |
实战场景
在H100集群上微调13B模型时,Unsloth通过动态内存分配和4位量化,可在显存限制下同时训练2个实例,而Text-Generation-Inference因显存不足只能单实例运行。
六. DeepSpeed断点续训实现方法
流程图
核心原理
DeepSpeed 通过保存检查点(Checkpoint)实现断点续训,包含以下关键组件:
模型参数:所有可训练参数的状态
优化器状态:梯度累积、动量等信息
训练元数据:当前轮次、学习率、迭代次数等
实现过程:
配置检查点保存
- 基本参数设置
deepspeed --deepspeed_checkpoint_interval=100 \--deepspeed_checkpoint_path=./checkpoints \--deepspeed \train.py
- 高级配置(示例)
# deepspeed_config.json
{"checkpoint": {"enable": true,"saving_interval": 100,"path": "./checkpoints","type": "all","max_to_keep": 5},"gradient_clipping": 1.0
}
恢复训练流程
- 标准恢复命令
deepspeed --deepspeed_restore=./checkpoints/global_step1000/ \--deepspeed \train.py
- 动态恢复逻辑
# 训练脚本检测
if args.deepspeed_restore:model, optimizer, _, _ = deepspeed.initialize(args=args,model=model,optimizer=optimizer,model_parameters=model.parameters(),restore=args.deepspeed_restore)
else:model, optimizer, _, _ = deepspeed.initialize(args=args,model=model,optimizer=optimizer,model_parameters=model.parameters())
关键验证方法
- 检查点完整性验证
# 加载验证脚本
from deepspeed.checkpoint_management import CheckpointLoadercheckpoint = CheckpointLoader.load_checkpoint(ckpt_dir=args.deepspeed_restore,client_state={'epoch': 0}
)
- 状态参数对比表 |
检查项 | 验证方法 |
---|---|
模型参数一致性 | torch.allclose(model.state_dict(), checkpoint['module']) |
优化器状态连续性 | torch.allclose(optimizer.state_dict()['state'], checkpoint['optimizer']) |
训练进度匹配 | checkpoint['epoch'] == last_epoch |
分布式训练注意事项
4. 多节点同步策略
# 使用NFS共享存储
deepspeed --checkpoint_path=/nfs/checkpoints \--hostfile hosts.txt \train.py
- 混合精度训练兼容
deepspeed --bf16 \--deepspeed_checkpoint_path=./bf16_checkpoints \train.py
常见问题解决方案
- 检查点损坏修复
# 单卡修复模式
deepspeed --deepspeed_restore=./corrupted_ckpt/ \--repair \train.py
- 版本兼容性处理
# 向下兼容配置
model, optimizer, _, _ = deepspeed.initialize(args=args,model=model,optimizer=optimizer,load_optimizer_states=False,load_lr_scheduler_states=False
)
性能优化建议
- 存储优化策略
# 使用SSD存储
"checkpoint": {"io_config": {"type": "LocalIO","path": "/ssd/checkpoints"}
}
- 增量保存配置
deepspeed --deepspeed_checkpoint_type=incremental \--deepspeed_checkpoint_interval=50 \train.py
七. VLLM异步推理架构解析
架构示意图
VLLM 架构解析解读
VLLM(High-Throughput Large Language Model Serving)架构旨在优化大语言模型推理服务的性能,其核心组件及交互逻辑如下:
Scheduler(调度器)
- 作为架构的“总控中心”,负责协调任务分配,将推理任务分发给多个 Worker 节点,实现任务的高效调度与资源分配,确保系统整体运行的有序性。
KV Cache Manager(键值缓存管理器)
- 管理大语言模型推理关键的 KV 缓存(用于存储注意力机制中的键值对),通过 Block tables(块表) 组织缓存块,记录缓存块的使用状态。
- 对接 CPU Block Allocator 和 GPU Block Allocator,根据内存资源情况,灵活分配 CPU/GPU 内存块,优化缓存的存储与访问效率,减少重复计算。
Worker 节点
- 包含多个 Worker(如 Worker 0、Worker 1 至 Worker N-1),每个 Worker 负责模型分片(Model Shard)的推理计算,实现模型并行。
- 内置 Cache Engine,用于处理 KV 缓存的读写,配合 KV Cache Manager 完成缓存管理,提升推理过程中数据访问的速度。
CPU/GPU Block Allocator(内存块分配器)
- 分别负责 CPU 和 GPU 内存块的分配与管理,根据 KV Cache Manager 的指令,动态分配内存资源,确保缓存块合理存储,提升内存利用率。
架构核心优势
- 通过 Scheduler 的任务调度、KV Cache Manager 的缓存优化,结合 Worker 节点的模型分片并行计算,VLLM 实现了推理任务的高效调度、内存资源的精细化管理,以及模型推理的并行加速,最终提升大语言模型服务的吞吐量与性能。
吞吐量提升原理
- 请求批处理:将多个请求合并推理(类似批处理Batching)
- 动态显存复用:利用K/V Cache共享机制减少内存占用
- 非阻塞IO:请求处理与数据传输异步进行
- 优先级调度:高优先级请求优先分配资源
性能对比
在A100上部署Llama2-70B时,VLLM异步推理吞吐量达320tokens/s,比同步推理提升4.2倍。
八. LoRA增量训练LLaMA2实践指南
实施步骤
- 参数冻结
for param in model.parameters():param.requires_grad = False
- 插入LoRA模块
from peft import LoraConfig, get_peft_modelconfig = LoraConfig(r=8,lora_alpha=32,target_modules=["q_proj", "v_proj"],lora_dropout=0.1
)
model = get_peft_model(model, config)
- 训练配置
training_args = TrainingArguments(output_dir="./lora_llama2",per_device_train_batch_size=4,gradient_accumulation_steps=4,learning_rate=2e-4,fp16=True
)
关键优势
- 显存占用减少90%(70B模型仅需32GB显存)
- 训练速度提升3倍(因参数更新量减少)
- 支持动态Rank调整(
adaptive_rank=True
)
九. 微调框架API设计对比
核心特性对比
特性 | Hugging Face Trainer | DeepSpeed |
---|---|---|
易用性 | 高度封装,适合快速实验 | 灵活配置,适合深度优化 |
分布式支持 | 自动数据并行(DDP) | 混合并行(ZeRO/TP/PP) |
内存优化 | 基础梯度累积 | 优化内存优化(ZeRO Stage3) |
Checkpoint机制 | 保存完整模型/优化器状态 | 增量保存差异参数 |
回调扩展 | 插件式设计(CallbackHandler) | 自定义钩子(Hook System) |
实战建议
- 快速验证场景:优先使用Hugging Face Trainer
- 资源受限场景:选择DeepSpeed ZeRO-3
- 混合精度需求:两者均支持,但DeepSpeed提供更细粒度控制
十. 如何在unsloth中配置模型量化(如INT8)来加速推理,具体配置方法是什么?
量化核心优势
- 速度提升:INT8推理速度比FP16快2-3倍(实测A100加速2.8倍)
- 显存节省:模型大小减少50%(如70B模型从140GB→70GB)
- 精度保持:通过混合量化策略(INT8+FP16),精度损失<1%
动态量化配置(推荐)
from unsloth import QuantizedModel# 加载原始模型(如LLaMA-2-13B)
model = AutoModelForCausalLM.from_pretrained("llama-2-13b")# 配置动态INT8量化
quant_config = {"bits": 8,"group_size": 128, # 分组大小影响精度,越大越接近原始精度"dtype": torch.int8,"exclude_modules": ["lm_head"] # 输出层通常保留FP32
}# 生成量化模型
quant_model = QuantizedModel(model, config=quant_config)# 推理验证
input_ids = tokenizer("你好,世界", return_tensors="pt").input_ids
output = quant_model.generate(input_ids, max_new_tokens=50)
静态量化配置(高精度需求)
# 准备校准数据集(500-1000条代表性样本)
calibration_dataset = load_calibration_data()# 静态量化配置
quant_config = {"method": "static","calibration_samples": calibration_dataset,"calibration_batch_size": 8,"per_channel": True # 通道级量化更精细
}# 生成静态量化模型
quant_model = QuantizedModel(model, config=quant_config)
关键参数解析
参数名称 | 作用说明 | 推荐值范围 |
---|---|---|
bits | 量化位数(支持4/8) | 8(平衡速度与精度) |
group_size | 量化分组大小(越大精度损失越小) | 64-256 |
exclude_modules | 需跳过量化的模块(如输出层、嵌入层) | [“lm_head”, “embed”] |
calibration_samples | 静态量化所需校准样本数量 | 500-1000 |
性能优化技巧
-
混合精度量化
quant_config = {"modules_to_keep_fp16": ["query", "value"] # 保留关键层FP16 }
-
推理加速配置
inference_config = {"max_batch_size": 32,"max_tokens": 2048,"use_cuda_graph": True # 加速重复推理模式 }
验证与调优
-
速度测试
from unsloth import benchmark# 测量吞吐量(tokens/s) throughput = benchmark(quant_model, batch_size=16, max_tokens=1024) print(f"INT8 Throughput: {throughput} tokens/s")
-
精度对比
from evaluate import loadmetric = load("accuracy") results = metric.compute(predictions=quant_model_outputs,references=ground_truth )
典型案例对比
模型 | 量化方式 | 显存占用(A100) | 推理延迟(ms/样本) | BLEU得分 |
---|---|---|---|---|
LLaMA2-7B | FP16 | 28GB | 12.3 | 32.1 |
LLaMA2-7B | INT8 | 14GB | 5.8 | 31.9 |
Qwen-14B | FP16 | 56GB | 25.7 | 34.5 |
Qwen-14B | INT8 | 28GB | 10.2 | 34.2 |
相关文章:
大模型最新面试题系列:微调篇之微调框架(一)
一. 在DeepSpeed中配置零冗余优化(ZeRO)实现显存优化的步骤 核心原理 ZeRO通过分片(Sharding)技术将模型参数、梯度和优化器状态分布到多卡,消除冗余存储。三个阶段逐步减少显存占用: Stage 1࿱…...
windows第十三章 GDI绘图技术
文章目录 GDI绘图函数介绍设备上下文函数m_hDC GDI对象画笔画刷位图字体区域 案例分享 GDI绘图函数介绍 绘图函数在CDC类里 设备上下文 DC:device context 设备上下文,显卡驱动程序,控制硬件,每个厂商的都不同,操作系统层面&am…...
使用 Nginx 进行前端灰度发布的策略与实践
1. 引言 灰度发布的概念 灰度发布,也称为金丝雀发布,是一种软件发布策略,通过向一小部分用户群体逐步推出新版本,收集反馈并监控性能,以确保新版本在大规模部署前不会出现问题。这种方法可以有效降低发布风险&#x…...
有了大语言模型还需要 RAG 做什么
一、百炼平台简介 阿里云的百炼平台就像是一个超级智能的大厨房,专门为那些想要做出美味AI大餐的企业和个人厨师准备的。你不需要从头开始做每一道菜,因为这个厨房已经为你准备了很多预制食材(预训练模型),你可以根据…...
pytest快速入门 - 目录:半天掌握pytest
1 pytest快速入门 - 目录 本系列文章将快速的带领用户进入pytest领域,通过阅读本专栏,用户将可以熟练掌握pytest的基本用法,同时对测试前置条件的构造、后置条件的清理等有较深入的了解,特别是后置条件的执行完备度有一个认识。 …...
2.4 python网络编程
在当今数字化的时代,网络连接着世界的每一个角落。从简单的网页浏览到复杂的分布式系统,网络编程无处不在。Python 作为一种功能强大且易于学习的编程语言,在网络编程领域占据着重要的地位。它丰富的库和简洁的语法使得开发者能够高效地构建各…...
网络变压器的主要电性参数与测试方法(4)
Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(4).. 今天我们继续来看看网络变压器的2个重要电性参数与它的测试方法: 1.反射损耗(Return loss&…...
【Springboot知识】开发属于自己的中间件健康监测HealthIndicate
文章目录 **一、技术栈****二、项目结构****三、依赖配置 (pom.xml)****四、配置文件 (application.yml)****五、自定义健康检查实现****1. Redis健康检查****2. Elasticsearch健康检查****3. Kafka健康检查****4. MySQL健康检查** **六、自定义健康检查接口 (可选)****七、测试…...
蓝桥杯备赛-二分-技能升级
问题描述 小蓝最近正在玩一款 RPG 游戏。他的角色一共有 NN 个可以加攻击力的技能。 其中第 ii 个技能首次升级可以提升 AiAi 点攻击力, 以后每次升级增加的点数 都会减少 Bi。「AiBi⌉Bi。「BiAi⌉ (上取整) 次之后, 再升级该技能将不会改变攻击力。 现在小蓝可以…...
【GPT入门】第18课 langchain介绍与API初步体验
【GPT入门】langchain第一课 langchain介绍与API初步体验 1. langchain介绍定义特点1. 模块化与灵活性2. 链式调用机制3. 数据连接能力4. 记忆管理功能5. 提示工程支持6. 可扩展性 2.langchain核心组件架构图3. 最简单的helloworld入门 1. langchain介绍 LangChain 是一个用于…...
Django部署Filemanagement
Pycharm搭建项目安装虚拟环境 mysqlclient对mysql的安装,配置有要求 pymsql伪装成mysqlclient,pymysql可以操纵mysql pip install pymysql操作sql5.7 mysql8.0会出现与pycharm不兼容问题,会报错,所以降到5.7 # 进入mysql 需要…...
Python的types库学习记录
types 库是 Python 标准库中的一部分,它提供了与 Python 对象类型相关的工具和常量,有助于在运行时处理和操作不同类型的对象。 以下是对 types 库的详细介绍: 主要用途 • 类型检查:在运行时判断对象的类型。 • 动态创建和操作…...
C# 表达式树详解
总目录 前言 在 C# 中,表达式树(Expression Trees)是一种强大的特性,允许开发者将代码表示为数据结构。这使得我们可以在运行时动态地创建和操作代码逻辑,广泛应用于 LINQ 查询、动态方法生成以及反射等领域。本文将深…...
分别用树型和UML结构展示java集合框架常见接口和类
树型结构展示java集合框架常见接口和类 Java 集合框架中的接口和子类关系可以用树形结构来展示。以下是一个简化的树形结构,展示了主要的接口和一些重要的实现类: java.util.Collection ├── java.util.List │ ├── java.util.ArrayList │ ├…...
蓝桥杯备赛-二分-青蛙过河
问题描述 小青蛙住在一条河边, 它想到河对岸的学校去学习。小青蛙打算经过河里 的石头跳到对岸。 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上。 不过, 每块石头有一个高度, 每次小青蛙从一块石头起跳, 这块石头的高度就 会下降 1 , 当石头的高度下降…...
uniapp+微信小程序+最简单局部下拉刷新实现
直接上代码 <scroll-view style"height: 27vh;" :scroll-top"scrollTop" scroll-y"true"scrolltolower"onScrollToLower1" lower-threshold"50"refresher-enabled"true" refresherrefresh"onRefresherR…...
Spring Boot 3.x 中 @NotNull 与 @NonNull 的深度解析
在 Java 开发领域,尤其是在 Spring Boot 生态系统中,空指针异常(NPEs)始终是一个顽固的挑战。这些运行时错误可能导致应用程序崩溃、数据不一致以及糟糕的用户体验。为了应对这一问题,Java 社区开发了各种空安全机制&a…...
SQLark 实战 | 如何从Excel、csv、txt等外部文件进行数据导入
数据导入导出是应用开发者在平时开发中最常用的操作之一,SQLark 里提供了方便的图形化界面来完成导入导出。本文先和大家分享如何从 Excel、csv、txt 等外部文件导入数据到数据库表中。 👉 前往 SQLark 官网:www.sqlark.com 下载全功能免费版…...
MATLAB中envelope函数使用
目录 说明 示例 chirp 的解析包络 使用滤波器计算多通道信号的解析包络 录音信号的移动 RMS 包络 语音信号的峰值包络 不对称序列的包络 envelope函数的功能是提取信号的包络。 语法 [yupper,ylower] envelope(x) [yupper,ylower] envelope(x,fl,analytic) [yupper,…...
ES搭建详细指南+常见错误解决方法
Elasticsearch(ES)是一款开源的、分布式的、RESTful风格的搜索和数据分析引擎。它用于全文搜索、结构化搜索、分析等场景。以下是Elasticsearch的搭建步骤以及处理常见错误的方法。 Elasticsearch搭建步骤: 1.环境准备: 确保你的…...
Unity 封装一个依赖于MonoBehaviour的计时器(上) 基本功能
灵感来自下面这本书的协程部分,因此我就自己尝试写了一个 我的新书Unity3D游戏开发(第3版) | 雨松MOMO程序研究院 如果你不知道什么是协程:unity保姆级教程之协同程序_unity协同-CSDN博客 一句话概括:协程就是单线程的异步操作,其作用于Unity的主线程 1…...
PostgreSQL数据库版本支持策略
PostgreSQL数据库版本支持策略 主要版本会进行复杂的更改,因此无法以向后兼容的方式维护数据目录的内容。重大升级需要转储/重新加载数据库或使用pg_upgrade应用程序。我们还建议您阅读您计划升级到的主要版本的升级部分。您可以从一个主要版本升级到另一个…...
应用层之网络应用模型,HTTP/HTTPS协议
应用层是网络协议栈的最顶层,直接为应用程序提供通信服务,定义了不同主机间应用进程交互的规则,包括报文类型、语法、语义及通信时序 一、网络应用模型 1.定义及特点 模型定义核心特点典型应用场景C/S客户端向服务器发起请求,服…...
(七)Spring Boot学习——Redis使用
有部分内容是常用的,为了避免每次都查询数据库,将部分数据存入Redis。 一、 下载并安装 Redis Windows 版的 Redis 官方已不再维护,你可以使用 微软提供的 Redis for Windows 版本 或者 使用 WSL(Windows Subsystem for Linux&a…...
11 | 给 Gin 服务器添加中间件
提示: 所有体系课见专栏:Go 项目开发极速入门实战课;欢迎加入 云原生 AI 实战 星球,12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力(聚焦于 Go、云原生、AI Infra);本节课最终…...
selenium等待
通常代码执行的速度⽐页⾯渲染的速度要快,如果避免因为渲染过慢出现的⾃动化误报的问题呢?可以使⽤selenium中提供的三种等待⽅法: 1. 隐式等待(Implicit Wait) 隐式等待适用于全局,它告诉 WebDriver 在查找元素时等待一定的时间,直到元素出现。 如果超时,WebDriver 不…...
为什么List、Set集合无法在遍历的时候修改内部元素
以常用集合ArrayList为例,ArrayList 在遍历过程中无法直接修改内部元素的结构(例如通过 remove() 或 add() 方法修改元素),是因为 遍历的过程中修改结构 可能会导致 不一致的行为、并发修改异常 或 逻辑错误。 注意:和…...
使用 Elasticsearch 构建多模式 RAG 系统:哥谭市的故事
作者:来自 Elastic Alex Salgado 学习如何构建一个多模态检索增强生成 (RAG) 系统,该系统集成文本、音频、视频和图像数据,以提供更丰富的、具有上下文的信息检索。 在这篇博客中,你将学习如何使用 Elasticsearch 构建一个多模态 …...
单一责任原则在Java设计模式中的深度解析
在软件开发中,设计模式提供了一种解决特定问题的思路。在众多的设计原则中,单一责任原则(Single Responsibility Principle,SRP)是一个非常重要的概念。它主要强调一个类应该只有一个责任,也就是说…...
设计模式学习记录
设计模式23种 创建型抽象工厂模式工厂模式生成器模式原型模式单例模式 结构型适配器模式桥接模式组合模式装饰模式外观模式享元模式代理模式 行为型责任链模式命令模式解释器模式迭代器模式中介者模式备忘录模式观察者模式状态模式策略模式模版方法模式访问者模式 创建型 与对…...
set_clock_groups
一、命令参数与工具处理逻辑 核心参数定义 参数定义工具行为工具兼容性-asynchronous完全异步时钟组,无任何相位或频率关系(如独立晶振、不同时钟树)工具完全禁用组间路径的时序分析,但需用户自行处理跨时钟域(CDC&a…...
QT创建项目(项目模板、构建系统、选择类、构建套件)
1. 项目模版 项目类型界面技术适用场景核心依赖模块开发语言Qt Widget ApplicationC Widgets传统桌面应用(复杂控件)Qt WidgetsCQt Console Application无 GUI命令行工具、服务Qt CoreCQt Quick ApplicationQML/Quick现代跨平台应用(动画/触…...
麒麟系统利用pycharm生成deb文件
在麒麟系统(Kylin OS)上使用 PyCharm 进行 Python 开发并生成 .deb 可安装软件包,可以按照以下步骤进行操作: 1. 准备工作 安装 PyCharm:确保已经在麒麟系统上安装了 PyCharm,可以使用官方提供的安装包进…...
超声重建,3D重建 超声三维重建,三维可视化平台 UR 3D Reconstruction
1. 超声波3D重建技术的实现方法与算法 技术概述 3D超声重建是一种基于2D超声图像生成3D体积数据的技术,广泛应用于医学影像领域。通过重建和可视化三维结构,3D超声能够显著提高诊断精度和效率,同时减少医生的脑力负担。本技术文档将详细阐述…...
Qt 信号与槽
目录 Qt信号和槽 connect函数 connect使用方法 自定义信号 与 自定义槽 Qt界面化工具自动生成的槽 自定义信号 带参数的信号和槽 信号与槽的断开 Qt信号和槽 谈到信号,设计3个要素 信号源:谁发出了信号 信号触发条件:哪个控件的哪个…...
卷积神经网络 - 卷积的变种、数学性质
本文我们来学习卷积的变种和相关的数学性质,为后面学习卷积神经网络做准备,有些概念可能不好理解,可以先了解其概念,然后慢慢理解、逐步深入。 在卷积的标准定义基础上,还可以引入卷积核的滑动步长和零填充来增加卷积…...
ubuntu 和 RV1126 交叉编译Mosqutiio-1.6.9
最近需要交叉编译mosquitto,遇到一些小问题记录一下。 1.众所周知使用它自带的Makefile编译的时候,只需要在编译前,指定它config.mk中的变量:CFLAGS头文件路径 和 LDFLAGS库文件路径就ok,例子如下: expor…...
从零开始学习机器人---如何高效学习机械原理
如何高效学习机械原理 1. 理解课程的核心概念2. 结合图形和模型学习3. 掌握公式和计算方法4. 理论与实践相结合5. 总结和复习6. 保持好奇心和探索精神 总结 机械原理是一门理论性和实践性都很强的课程,涉及到机械系统的运动、动力传递、机构设计等内容。快速学习机械…...
STM32 RS232通信开发全解析 | 零基础入门STM32第五十九步
主题内容教学目的/扩展视频RS232串口电路原理,跳线设置,驱动程序。与超级终端通信。了解电路原理和RS232协议。 师从洋桃电子,杜洋老师 📑文章目录 一、RS232通信系统架构二、RS232核心原理与硬件设计2.1 电气特性对比2.2 典型电路…...
文献分享: 对ColBERT段落多向量的剪枝——基于学习的方法
原论文 1. 导论 & \textbf{\&} &方法 1️⃣要干啥:在 ColBERT \text{ColBERT} ColBERT方法中,限制每个段落要保留的 Token \text{Token} Token的数量,或者说对段落 Token \text{Token} Token进行剪枝 2️⃣怎么干:注…...
(已解决)aws 上 部署Splunk 负载均衡unhealthy
在AWS 部署Splunk 服务,instance 是后端的EC2, 我把splunk 服务起好后,发现port : 8000 是listening: #netstat -an | grep 80 tcp 0 0 127.0.0.1:8065 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:8089 0.0.0.0:* …...
C# 异步编程
概述 同步:指必须等待前一个操作完成,后续操作才能继续。同步操作会阻塞线程直到任务完成。 异步:异步操作不会阻塞线程,允许程序在等待某个任务完成的同时,继续执行其他任务。 异步编程适用场景: 1、从…...
缓存之美:Guava Cache 相比于 Caffeine 差在哪里?
大家好,我是 方圆。本文将结合 Guava Cache 的源码来分析它的实现原理,并阐述它相比于 Caffeine Cache 在性能上的劣势。为了让大家对 Guava Cache 理解起来更容易,我们还是在开篇介绍它的原理: Guava Cache 通过分段(…...
Go string 字符串底层逻辑
在 Go 语言中,string 类型的底层结构是一个结构体,包含两个字段:一个指向字节数组的指针和该字节数组的长度。以下是其在 Go 源码中的大致定义:type stringStruct struct {str unsafe.Pointerlen int } str:这是一个指…...
高效集成聚水潭采购退货数据到MySQL的最佳实践
聚水潭数据集成到MySQL:采购退货单的高效对接方案 在企业的数据管理和分析过程中,数据的准确性和实时性至关重要。本文将分享一个具体的系统对接集成案例:如何通过轻易云数据集成平台,将聚水潭中的采购退货单数据高效地集成到MyS…...
STM32步进电机S型与T型加减速算法
目录 一、基本原理 二、常见类型 三、算法详解 四、应用场合 五、代码实现 1、main...
centos操作系统上传和下载百度网盘内容
探序基因 整理 进入百度网盘官网百度网盘 客户端下载 下载linux的rpm格式的安装包 在linux命令行中输入:rpm -ivh baidunetdisk_4.17.7_x86_64.rpm 出现报错: 错误:依赖检测失败: libXScrnSaver 被 baidunetdisk-4.17.7-1.x8…...
深入 Python 网络爬虫开发:从入门到实战
一、为什么需要爬虫? 在数据驱动的时代,网络爬虫是获取公开数据的重要工具。它可以帮助我们: 监控电商价格变化抓取学术文献构建数据分析样本自动化信息收集 二、基础环境搭建 1. 核心库安装 pip install requests beautifulsoup4 lxml …...
网络爬虫【简介】
我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲爬虫 一、网络爬虫的定义 网络爬虫(Web Crawler),又称为网络蜘蛛、网络机器人等,是一种按照一定规则自动抓取互联网信息的程序或脚本。它…...
Linux:Ubuntu server 24.02 上搭建 ollama + dify
一、安装Ubuntu 具体的安装过程可以参见此链接:链接:Ubuntu Server 20.04详细安装教程,这里主要记录一下过程中遇到的问题。 安装时subnet如何填写 在Ubuntu中subnet填写255.255.255.0是错误的,其格式为 xx.xx.xx.xx/yy &#…...