基于Unsloth与LoRA的高效大语言模型微调工程化实践指南

news2026/5/19 8:51:11
1. 项目概述一个为Unsloth优化的AI开发伴侣如果你最近在折腾大语言模型LLM的微调尤其是想在自己的消费级显卡上跑起来那你大概率听说过或者正在用Unsloth。这个开源库通过一系列巧妙的优化比如融合算子、更高效的内存管理让微调Llama、Mistral这类模型的速度提升了数倍同时显存占用还能砍掉一半简直是个人开发者和研究者的福音。但用过一段时间后我发现了一个问题Unsloth本身是个强大的引擎但要把它顺畅地“开”起来从环境配置、数据准备、到训练启动和监控中间有不少琐碎且容易踩坑的环节。每次开始一个新项目我都要重新翻文档、拼凑脚本、处理各种版本冲突和路径问题。就在我琢磨着能不能把这些流程固化下来时我发现了TYH-labs/unsloth-buddy这个项目。顾名思义unsloth-buddy就是 Unsloth 的“伙伴”或“助手”。它不是一个替代 Unsloth 的框架而是一个围绕 Unsloth 构建的、开箱即用的项目脚手架和工具集。它的核心价值在于将基于 Unsloth 进行高效 LLM 微调的最佳实践和常用流程封装成了一套标准化、可复现的工程方案。你不再需要从零开始写训练脚本而是可以基于这个“伙伴”快速搭建起一个包含数据预处理、模型训练、评估乃至简易服务化的完整项目结构。简单来说它解决的是“最后一公里”的问题Unsloth 给了你一辆超跑极速微调而unsloth-buddy则为你准备好了赛道、维修站和导航系统工程化环境让你能更专注在驾驶模型调优本身。它非常适合以下几类人LLM微调初学者希望有一个清晰的、能跑通的范例来理解整个流程。算法工程师/研究者需要快速进行多次实验迭代厌恶重复的工程搭建工作。小团队或个人开发者资源有限需要在单卡或多卡环境下高效、稳定地完成模型定制。接下来我们就深入这个“伙伴”的内部看看它是如何设计的以及如何用它来加速你的AI开发流程。2. 项目核心设计思路与架构解析2.1 核心定位工程化与自动化的粘合剂unsloth-buddy的设计哲学非常务实约定优于配置自动化替代手动。在LLM微调中许多步骤虽然逻辑相似但具体实现时如数据格式转换、训练参数组合、日志记录方式却容易因人而异导致项目难以维护和复现。这个项目试图将这些可变部分标准化。它的核心思路是提供一个预设的、合理的项目骨架Project Scaffolding这个骨架已经集成了经过验证的Unsloth使用模式、常用的训练技巧如梯度检查点、序列长度打包以及实验跟踪组件。开发者克隆项目后大部分时间只需要做两件事准备自己的数据和调整核心的超参数。其余的环境依赖安装、训练循环编写、模型保存与加载等“脏活累活”都交由框架背后的脚本和配置来处理。这种设计极大地降低了认知负担和启动成本。你不需要成为PyTorch、DeepSpeed或Hugging Facetransformers库的专家也能利用Unsloth的高性能特性。2.2 技术栈选型与依赖关系要理解unsloth-buddy得先理清它的技术生态位。它建立在以下几个关键组件之上并充当它们的“协调者”Unsloth (核心加速引擎)这是项目的基石。unsloth-buddy深度集成了Unsloth的API确保能调用其所有的优化特性如自动的算子融合、更快的注意力机制实现以及针对消费级显卡如NVIDIA RTX 4090, 3090的内存优化。PyTorch Hugging Face Transformers (基础框架)训练的本质仍然基于PyTorch模型和分词器来自transformers库。unsloth-buddy封装了它们的初始化过程通常通过Unsloth提供的兼容接口来加载从而无缝获得优化。PEFT (参数高效微调)为了进一步节省显存和加快训练项目强烈建议并支持使用PEFTParameter-Efficient Fine-Tuning方法如LoRA (Low-Rank Adaptation) 或 QLoRA (Quantized LoRA)。这是微调大模型的现代标准实践unsloth-buddy提供了便捷的配置方式来注入LoRA适配器。TRL (Transformer Reinforcement Learning) 或自定义训练循环对于有监督微调SFT项目可能封装了Hugging Face的TRL库中的SFTTrainer因为它提供了对序列长度打包等优化功能的原生支持。对于更简单的需求也可能实现一个轻量化的自定义训练循环。这是提升训练效率的关键一环。辅助工具链包括wandb或tensorboard用于实验跟踪datasets库用于数据加载accelerate用于分布式训练配置等。unsloth-buddy会预设好与这些工具的集成比如自动的日志记录钩子。注意版本兼容性是这类工具链项目的生命线。unsloth-buddy通常会通过一个严格的requirements.txt或pyproject.toml文件来锁定核心依赖的版本以避免因底层库更新导致的API不兼容问题。这是它作为“稳定伙伴”的重要价值。2.3 项目目录结构剖析一个典型的unsloth-buddy项目目录可能如下所示。这个结构清晰地分离了关注点unsloth-buddy-project/ ├── configs/ # 配置文件目录 │ ├── train_config.yaml # 训练超参数、模型路径、数据路径等 │ └── model_config.yaml # 模型结构相关配置如LoRA rank, alpha ├── data/ # 数据目录 │ ├── raw/ # 存放原始数据 │ ├── processed/ # 存放处理后的、模型可读的数据集 │ └── dataset_script.py # 数据预处理和加载脚本 ├── scripts/ # 核心执行脚本 │ ├── prepare_data.py # 数据预处理流水线 │ ├── train.py # 主训练脚本 │ ├── evaluate.py # 模型评估脚本 │ └── export.py # 模型合并与导出脚本如合并LoRA权重 ├── outputs/ # 运行输出目录 │ ├── checkpoints/ # 训练过程中的模型检查点 │ ├── final_model/ # 最终导出的模型 │ └── logs/ # 训练日志、TensorBoard文件 ├── utils/ # 工具函数 │ └── helpers.py # 通用辅助函数如计算指标、保存加载 ├── requirements.txt # Python依赖列表 ├── README.md # 项目详细说明 └── .env.example # 环境变量示例如WandB API Key这种结构的好处是可复现性所有配置都集中在configs/下修改一个yaml文件就能定义一次实验。模块化数据准备、训练、评估逻辑分离易于调试和维护。自动化通过运行scripts/下的脚本可以串联起整个流程。整洁性原始数据、处理数据、输出结果、源代码各归其位。3. 从零开始环境搭建与数据准备实操3.1 基础环境配置详解假设我们在一台搭载了RTX 409024GB显存的Ubuntu 22.04机器上开始。以下是详细的步骤和背后的考量第一步克隆项目并创建虚拟环境git clone https://github.com/TYH-labs/unsloth-buddy.git cd unsloth-buddy python -m venv venv_unsloth # 创建专属虚拟环境避免污染系统Python source venv_unsloth/bin/activate # Linux/Mac激活Windows用 venv_unsloth\Scripts\activate使用虚拟环境是Python项目管理的黄金法则它能确保依赖库的版本隔离。第二步安装依赖pip install -r requirements.txt这是最关键的一步。requirements.txt文件是项目维护者精心编排的兼容性清单。它很可能包含了类似以下的核心依赖torch2.0.0 unsloth[colab] githttps://github.com/unslothai/unsloth.git transformers4.36.0 peft0.7.0 trl0.7.0 accelerate0.24.0 datasets2.14.0 wandb # 用于实验跟踪 bitsandbytes0.41.0 # 用于QLoRA量化注意unsloth的安装方式它通常直接从GitHub仓库安装以确保获得最新且与项目兼容的版本。bitsandbytes是运行QLoRA所必需的。第三步处理可能遇到的安装问题CUDA版本不匹配如果遇到与CUDA相关的错误首先确认你的PyTorch版本是否与系统CUDA版本匹配。可以访问 PyTorch官网 获取正确的安装命令。unsloth-buddy的requirements.txt可能指定了torch版本如果与你CUDA不兼容可以尝试在安装其他依赖后手动安装匹配的PyTorch。bitsandbytes 编译失败在Linux上bitsandbytes可能需要编译。确保已安装nvcc和g。一个更简单的方法是使用预编译的wheel文件例如pip install https://github.com/jllllll/bitsandbytes/releases/download/0.41.0/bitsandbytes-0.41.0-py3-none-any.whl。权限问题如果在公司环境或受限服务器上可能需要使用--user标志安装或联系管理员。3.2 数据预处理标准化流程unsloth-buddy的价值在数据准备阶段就开始体现。它通常不会要求你使用某种特定的原始数据格式但会约定一个最终的、模型可消费的数据格式。典型的数据处理流程以指令微调为例原始数据放置将你的数据可能是JSONL、CSV、TXT放入data/raw/目录。例如data/raw/instructions.jsonl每行是一个JSON对象包含instruction指令、input可选输入、output期望输出字段。运行预处理脚本python scripts/prepare_data.py --config configs/train_config.yaml这个脚本会读取配置文件中的数据路径执行一系列转换模板化将(instruction, input, output)组合成模型训练时使用的对话模板。例如使用ChatML格式|im_start|user\n{instruction}\n{input}|im_end|\n|im_start|assistant\n{output}|im_end|分词使用指定的分词器如Llama 2的tokenizer将文本转换为input_ids、attention_mask和labels。这里有一个关键技巧通常只对output部分即助理的回复计算损失而user部分仅作为上下文。脚本会自动处理labels的掩码。序列长度处理为了高效训练脚本可能会实施“序列长度打包”Sequence Length Packing将多个较短的样本拼接成一个长度接近max_length的序列减少填充Padding带来的计算浪费。这是提升训练吞吐量的重要手段。保存为Arrow格式处理后的数据集通常以Hugging FaceDataset对象的格式Arrow保存到data/processed/train_dataset.arrow加载速度极快。配置文件中的关键数据参数 打开configs/train_config.yaml你会看到类似这样的配置节data: train_file: data/raw/instructions.jsonl val_file: data/raw/instructions_val.jsonl template_name: chatml # 使用的对话模板 max_length: 2048 # 模型最大上下文长度 packing: true # 是否启用序列打包通过修改这个配置文件你可以轻松切换不同的数据集和预处理策略而无需修改代码。实操心得在准备自己的数据时务必仔细检查预处理后的样本。一个常见的坑是模板拼接错误导致模型学习的格式混乱。你可以修改prepare_data.py脚本在保存前打印几个处理后的样本和其解码后的文本确保input_ids和labels的对应关系是正确的。4. 训练配置与核心参数深度解读4.1 模型与优化器配置训练配置是微调的灵魂。unsloth-buddy通过配置文件将繁杂的参数集中管理。我们拆解configs/train_config.yaml中的关键部分model: model_name: unsloth/meta-llama-3-8b # 从Unsloth或HF加载的模型标识 load_in_4bit: true # 使用QLoRA必须开启4位量化 use_gradient_checkpointing: true # 梯度检查点用时间换空间可训练更长序列 use_cache: false # 训练时关闭K/V缓存以节省显存 lora: r: 16 # LoRA的秩rank影响可训练参数量和能力通常8-64 lora_alpha: 32 # LoRA缩放因子通常设为r的2倍 target_modules: [q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj] # 注入LoRA的模块 bias: none # 通常不训练偏置 task_type: CAUSAL_LM training: num_epochs: 3 per_device_train_batch_size: 2 # 根据显存调整4090上8B模型QLoRA可能为2-4 gradient_accumulation_steps: 4 # 模拟更大的批量大小 batch_size * steps warmup_steps: 100 logging_steps: 10 save_steps: 500 learning_rate: 2.0e-4 optimizer: paged_adamw_8bit # Unsloth推荐的8bit优化器更省显存 lr_scheduler_type: cosine max_grad_norm: 0.3 # 梯度裁剪防止梯度爆炸 seed: 42参数选择背后的逻辑per_device_train_batch_size和gradient_accumulation_steps这是控制“有效批量大小”的两个杠杆。假设我们想让有效批量大小达到16但单卡只能放下批量2。那么我们可以设batch_size2,accumulation_steps8。梯度累积意味着每8个前向-反向传播步骤才更新一次权重等效于批量16。这是在小显存上训练大模型的关键技巧。load_in_4bit与optimizerQLoRA要求模型以4位精度加载但优化器状态如Adam的动量和方差如果用32位存储依然很大。paged_adamw_8bit将优化器状态也以8位存储并采用类似虚拟内存的“分页”机制进一步降低显存峰值。lora.r和lora.alphar是低秩矩阵的维度越大则LoRA参数越多拟合能力越强但也可能过拟合。alpha是缩放因子训练时LoRA的输出会乘以alpha/r。通常保持alpha/r为一个固定值如2或1初始尝试时可设r16, alpha32。target_modules指定将LoRA适配器添加到哪些线性层。对于Llama等类GPT模型注意力层的q_proj, k_proj, v_proj, o_proj和MLP层的gate_proj, up_proj, down_proj是常见选择。这覆盖了模型的大部分可学习参数。4.2 启动训练与监控配置妥当后启动训练通常只需一行命令accelerate launch --num_processes1 scripts/train.py --config configs/train_config.yaml这里使用了accelerate launch它统一了单卡、多卡、CPU等各种训练环境的启动方式。--num_processes1表示单卡训练。如果是多卡可以设为GPU数量并确保配置文件中training部分的相关参数如ddp_find_unused_parameters正确。训练过程中的监控要点控制台日志logging_steps控制了打印频率。你会看到损失loss、学习率learning_rate、当前epoch/step等信息。重点关注loss的下降趋势是否平稳如果出现NaN或剧烈震荡可能是学习率过高、数据有问题或梯度爆炸。显存监控使用nvidia-smi -l 1命令实时观察GPU显存使用情况。在使用了QLoRA和梯度检查点后训练一个8B模型在24G显存上通常能留有较大余量。如果显存持续增长直至溢出OOM可能需要减小max_length、关闭packing或减小batch_size。使用Weights Biases (WandB) 进行可视化如果配置中设置了WandB需要提前wandb login所有指标会自动同步到云端看板。你可以清晰地看到训练损失曲线、验证损失曲线如果提供了验证集、梯度范数等。这对于分析模型训练动态和比较不同实验例如不同学习率至关重要。检查点Checkpointsave_steps指定了保存中间模型的步数间隔。这些检查点保存在outputs/checkpoints/step-xxx目录下。定期评估检查点使用scripts/evaluate.py可以帮你选择在验证集上表现最好的模型而不是简单地选择最后一个epoch的模型避免过拟合。5. 模型评估、导出与部署实践5.1 训练后评估与模型选择训练完成后我们得到了一系列检查点和一个最终模型通常保存在outputs/final_model或类似路径。但哪个模型最好这就需要评估。unsloth-buddy项目通常会提供一个evaluate.py脚本。它的评估可能包括生成质量评估定性在预留的测试集或一些标准提示prompt上让模型生成文本人工评判其相关性、连贯性、是否遵循指令等。脚本可能会封装一个简单的生成循环。python scripts/evaluate.py --checkpoint outputs/checkpoints/step-1000 --eval_type “generate”困惑度评估定量在验证集上计算模型的困惑度Perplexity, PPL。PPL越低说明模型对这份数据的预测越有把握通常意味着更好的语言建模能力。这是衡量模型在领域数据上适应程度的常用指标。python scripts/evaluate.py --checkpoint outputs/checkpoints/step-1000 --eval_type “perplexity”如何选择最终模型看验证损失/困惑度曲线选择在验证集上损失最低或困惑度最小的那个检查点。看生成样例如果多个检查点的量化指标相近那么人工检查生成结果就是决定性因素。避免过拟合如果训练损失持续下降但验证损失在某个点后开始上升说明模型开始过拟合训练数据。应该选择验证损失最低的那个点对应的模型。5.2 合并LoRA权重与模型导出使用LoRA微调后我们得到的是一个基础模型冻结的和一组额外的LoRA适配器权重。为了部署和推理我们通常需要将它们合并成一个完整的模型文件这样可以消除推理时加载两个组件的开销并且兼容性更好。unsloth-buddy的scripts/export.py脚本就是干这个的python scripts/export.py \ --base_model_name_or_path “meta-llama/Llama-3-8b” \ --lora_model_path “outputs/final_model” \ --output_dir “outputs/merged_model” \ --save_precision “fp16” # 保存为半精度节省磁盘空间这个过程会加载原始的基础模型。加载训练好的LoRA权重。将LoRA权重按公式W_new W_base (B * A) * (alpha / r)合并到对应的基础权重上。将合并后的完整模型保存为标准的Hugging Face格式包含config.json,pytorch_model.bin,tokenizer.json等。合并后的模型就是一个独立的、可以像任何其他transformers模型一样加载和使用的模型。5.3 简易服务化与推理测试合并后的模型可以很方便地集成到各种服务框架中。这里给出一个使用FastAPI创建极简推理API的示例你可以将其作为一个新的脚本如scripts/api.py添加到项目中# scripts/api.py from fastapi import FastAPI from pydantic import BaseModel from transformers import AutoTokenizer, AutoModelForCausalLM import torch app FastAPI() # 加载合并后的模型和分词器 model_path “outputs/merged_model” tokenizer AutoTokenizer.from_pretrained(model_path) model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.float16, # 半精度加载推理更快 device_map“auto” # 自动分配设备CPU/GPU ) class PromptRequest(BaseModel): text: str max_new_tokens: int 256 app.post(“/generate”) def generate_text(request: PromptRequest): inputs tokenizer(request.text, return_tensors“pt”).to(model.device) with torch.no_grad(): outputs model.generate( **inputs, max_new_tokensrequest.max_new_tokens, temperature0.7, # 控制随机性 do_sampleTrue, top_p0.9, # 核采样 ) generated_text tokenizer.decode(outputs[0], skip_special_tokensTrue) return {“generated_text”: generated_text} if __name__ “__main__”: import uvicorn uvicorn.run(app, host“0.0.0.0”, port8000)运行python scripts/api.py你就可以通过http://localhost:8000/docs访问API文档并进行测试了。这为后续集成到更复杂的应用提供了基础。6. 常见问题排查与实战经验分享即使有了unsloth-buddy这样的好帮手在实际操作中依然会遇到各种问题。下面是我在多次使用中总结的一些典型问题及其解决方案。6.1 环境与依赖问题问题1ImportError: libcudart.so.11.0: cannot open shared object file现象导入torch或unsloth时出现CUDA库找不到的错误。排查这通常是PyTorch版本与系统CUDA驱动版本不匹配。运行nvidia-smi查看CUDA版本如12.2然后运行python -c “import torch; print(torch.version.cuda)”查看PyTorch编译的CUDA版本。解决两者版本应大致兼容PyTorch的CUDA版本 ≤ 系统驱动支持的版本。如果不匹配需要卸载PyTorch并根据系统CUDA版本从PyTorch官网获取正确的安装命令重装。问题2训练时出现RuntimeError: CUDA out of memory现象训练开始不久或中途GPU显存耗尽。排查首先确认是否使用了QLoRA (load_in_4bit: true)。然后检查配置max_length是否设置过大尝试减小。per_device_train_batch_size是否过大尝试减小。是否启用了gradient_checkpointing确保其为true。尝试关闭packing设为false虽然可能降低效率但能减少显存峰值。解决这是一个平衡问题。在24G显存上微调8B模型一个典型的起点配置是max_length1024,batch_size2,gradient_accumulation_steps8, 开启gradient_checkpointing和load_in_4bit。然后逐步调高batch_size或max_length直到接近显存上限。6.2 训练过程问题问题3训练损失Loss不下降或为NaN现象Loss值居高不下或者突然变成NaN。排查与解决学习率过高这是最常见原因。尝试将learning_rate降低一个数量级例如从2e-4降到5e-5或1e-5。数据问题检查预处理后的数据。是否有大量无意义的填充paddinglabels的掩码是否正确确保只在需要模型预测的部分计算损失可以打印几个样本的input_ids和解码后的文本进行验证。梯度爆炸确保max_grad_norm梯度裁剪已启用并设置为一个合理的值如0.3或1.0。观察WandB日志中的梯度范数如果突然变得极大就是梯度爆炸。精度问题在极端情况下混合精度训练可能导致NaN。可以尝试将fp16训练改为bf16如果硬件支持或者在配置中暂时禁用混合精度训练以作排查。问题4模型生成的结果毫无逻辑或重复现象推理时模型输出乱码、重复单词或句子。排查与解决过拟合模型在训练集上表现太好丧失了泛化能力。检查验证集损失是否在后期上升。如果是需要早停Early Stopping使用验证集上最好的检查点或者增加正则化但LoRA本身已有很强的正则化效果。数据质量训练数据中是否有大量重复、低质量或格式错误的样本清洗数据是关键。推理参数生成文本时的temperature和top_p参数很重要。temperature0会导致确定性输出贪婪解码可能显得呆板temperature太高则随机性太强。top_p核采样可以避免从低概率词中采样。尝试调整这些参数如temperature0.7, top_p0.9。6.3 性能调优心得找到你的“甜蜜点”在显存允许的范围内增大batch_size通常比增大gradient_accumulation_steps更能提升训练速度因为更大的并行批量意味着更少的梯度累积步数。优先尝试增加batch_size。序列长度打包是一把双刃剑packingTrue能极大减少填充提升吞吐量。但它可能会将不相关的文本拼在一起理论上可能影响模型学习。如果你的数据样本本身都很长接近max_length或者你对性能不极度敏感可以关闭它以获得最标准的训练行为。监控GPU利用率使用nvtop或nvidia-smi dmon观察GPU利用率。如果利用率长期低于70%可能意味着数据加载DataLoader是瓶颈。可以尝试增加dataloader的num_workers在training配置中或者使用更快的存储如NVMe SSD。实验跟踪至关重要务必使用WandB或TensorBoard。每次实验即使只是调整了学习率都创建一个有清晰名称的Run。记录下所有重要的配置参数。这样当你分析什么参数组合效果最好时就有据可循。unsloth-buddy通常已经集成了这些工具你只需要登录并启用即可。TYH-labs/unsloth-buddy这个项目本质上是一套经过实战检验的“操作手册”和“工具箱”的集合。它并不能替代你对LLM微调原理的理解但它能把你从繁琐的工程细节中解放出来让你更专注于模型、数据和任务本身。从环境搭建、数据流处理、训练循环到模型导出它提供了一条标准化的路径。当你熟悉了这条路径后甚至可以 fork 这个项目根据自己的特定需求比如支持新的模型架构、集成不同的评估指标进行定制化开发让它成为你专属的AI开发伙伴。

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