大语言模型微调实战:从LoRA到QLoRA,一站式开源框架详解

news2026/5/16 22:50:36
1. 项目概述与核心价值如果你正在寻找一个能够一站式搞定主流大语言模型微调的开源项目那么ssbuild/llm_finetuning绝对值得你花时间深入研究。这个项目本质上是一个基于 PyTorch 和 Hugging Face Transformers 生态的、高度工程化的微调框架。它最大的魅力在于其“纯粹而干净”的设计哲学以及它对开发者真实需求的深刻理解——不是简单地堆砌功能而是提供一套清晰、可复现、且能应对多种微调场景的完整解决方案。简单来说这个项目能帮你做什么假设你手头有一个预训练好的大模型比如 Qwen、Llama2、Yi 或者 Bloom你想让它学会回答特定领域的问题、模仿某种对话风格或者理解你公司的内部文档。传统的做法可能是去啃各种论文和官方示例自己拼凑训练脚本、处理数据格式、调试分布式训练。而llm_finetuning把这些繁琐的工程细节都封装好了你只需要准备好符合格式的数据修改几个配置文件运行几条命令就能启动从全参数微调、LoRA、QLoRA 到 P-Tuning v2 等多种高效微调方案。对于算法工程师、研究者和有一定 Python 基础的技术爱好者来说这极大地降低了微调大模型的门槛和试错成本。2. 项目架构与核心设计思路拆解要理解这个项目的强大之处我们需要先拆解它的核心设计思路。它不是一个简单的脚本集合而是一个有明确分层和模块化设计的框架。2.1 统一的数据处理接口无论你使用哪种模型Llama, Qwen, Bloom等或哪种微调方法Full Fine-tuning, LoRA数据预处理逻辑应该是统一的。项目通过dataHelper类实现了这一点。它定义了标准的数据格式如提供的 JSONL 示例并负责将原始文本转换成模型可接受的 token IDs同时自动处理注意力掩码attention mask和标签labels的生成。这种设计让你更换模型或微调方法时无需重写数据加载代码。注意项目支持两种主流对话数据格式一种是包含role,q,a字段的paragraph结构另一种是conversations列表结构。在实际使用中我建议你统一采用其中一种并确保数据清洗到位比如去除多余的空格、处理特殊字符这能避免训练时出现意外的 tokenization 错误。2.2 模块化的训练器支持这是项目的另一个亮点。它没有绑定在某个特定的训练框架上而是抽象出了一层支持多种后端训练器Transformers Trainer这是 Hugging Face 官方的训练循环简单易用适合快速原型验证和单卡/简单多卡训练。Accelerate同样是 Hugging Face 的库它提供了对混合精度训练、多 GPU 乃至多节点训练更灵活的控制。Colossal-AI和DeepSpeed这两个是面向大规模分布式训练的“重型武器”。当你需要微调数十亿甚至上百亿参数的模型或者使用像 ZeRO-3 这样的显存优化技术时它们就派上用场了。这种设计意味着你可以根据硬件资源和任务复杂度灵活选择最合适的训练后端而项目代码的主体部分模型定义、数据流、回调函数基本保持不变。2.3 丰富的微调策略集成项目集成了当前最流行且实用的参数高效微调方法全参数微调更新模型的所有参数。效果通常最好但显存和计算开销最大适合资源充足且追求极致性能的场景。LoRA在模型的注意力层注入低秩适配器只训练这些新增的小参数。它能达到接近全参数微调的效果但显存占用和保存的权重文件都小得多。QLoRALoRA 的量化版本。它先将预训练模型量化为 4-bit再在此基础上应用 LoRA。这使得在单张消费级显卡如 24GB 显存的 RTX 4090上微调 70B 级别的模型成为可能是资源受限情况下的首选。P-Tuning v2一种在输入层添加可训练连续提示prompt的方法。它几乎不增加推理延迟适合需要保持原始模型权重不变、快速适配多种下游任务的场景。AdaLoRALoRA 的变种能动态地分配参数预算给最重要的权重矩阵理论上可以用更少的参数量达到更好的效果。3. 环境准备与依赖安装实操要点拿到项目代码后第一步就是搭建环境。虽然requirements.txt列出了核心依赖但实际部署时会有不少坑。3.1 基础依赖安装按照 README 的指示使用 pip 安装是最直接的方式pip install -U -r requirements.txt如果遇到网络问题可以切换为官方源加速pip install -i https://pypi.org/simple -U -r requirements.txt这里有一个关键点PyTorch 的版本需要与你的 CUDA 版本严格匹配。requirements.txt里可能指定了某个版本的torch但你需要根据自己显卡驱动支持的 CUDA 版本去 PyTorch 官网 获取正确的安装命令。例如对于 CUDA 11.8你可能需要pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118安装完 PyTorch 后再安装requirements.txt中的其他包以避免版本冲突。3.2 Flash Attention 的选装与避坑项目提到了可选的 Flash Attention 安装这是一个用于加速 Transformer 中注意力计算的优化库。但这里有一个大坑Flash Attention 对 GPU 的算力Compute Capability有要求通常需要 7.5如 RTX 2000系列、T4或 8.0如 A100及以上。如果你的显卡是较旧的 Pascal 架构如 GTX 1080 Ti算力 6.1就无法安装或运行。我的建议是先运行nvidia-smi查看显卡型号再去 NVIDIA 官网查其算力。如果算力支持7.5可以尝试安装以获取显著的训练加速。但请注意从源码编译git clone pip install .可能会遇到环境问题如特定版本的 CUDA Toolkit、编译器。更稳定的方式是尝试安装预编译的 wheel 包pip install flash-attn --no-build-isolation如果安装失败或显卡不支持完全不用担心。项目代码应该能自动回退到使用标准的 PyTorch 注意力实现训练依然可以进行只是速度会慢一些。千万不要在这个环节卡太久。3.3 权重下载与模型准备项目支持数十种预训练模型从 1.8B 的 Qwen 到 34B 的 Yi覆盖很广。你需要根据你的任务需求、硬件显存和性能期望来选择合适的模型。实操心得显存估算一个粗略的估算方法是全参数训练时模型权重以 FP16/BF16 存储所需显存约为参数量的 2 倍字节。例如7B 模型需要约 14 GB 显存。此外优化器状态如 Adam、梯度、激活值会占用更多。对于 LoRA/QLoRA显存需求会大幅下降。下载技巧从 Hugging Face 下载大模型可能很慢。推荐使用huggingface-cli命令并设置镜像或代理此处不展开网络工具相关话题。也可以先在小模型上跑通流程。自定义模型项目提到支持加载自定义模型只需修改config/constant_map.py。这意味着如果你有自己独特的模型结构比如修改了 Attention 层可以在这里注册使框架能够正确识别和加载。4. 数据准备从原始文本到训练集数据是微调成功的基石。项目定义的数据格式非常清晰但如何将你的原始数据可能是 PDF、Word、Excel 或数据库记录转换成这种格式是第一个需要动手的环节。4.1 数据格式详解与转换项目接受的每条数据是一个 JSON 对象核心是paragraph或conversations字段它们都旨在表示一段多轮对话或指令-回答对。对于paragraph格式role: 标识发言者如user,system,assistant。这有助于在训练时构建正确的对话上下文。q: 用户的问题或指令可选。如果对话以用户提问开始可以放在这里。a: 助手的回答必需。这是模型需要学习生成的目标文本。对于conversations格式它是一个列表每个元素是一个字典包含from发言者和value发言内容。这种格式更灵活可以表示多轮对话例如[{from: user, value: 你好}, {from: assistant, value: 你好有什么可以帮您}, {from: user, value: 推荐一部电影}]。转换脚本示例 假设你有一堆(question, answer)对存于 CSV 文件你可以用如下 Python 脚本转换import json import pandas as pd df pd.read_csv(your_data.csv) with open(formatted_data.jsonl, w, encodingutf-8) as f: for idx, row in df.iterrows(): # 使用 paragraph 格式 record { id: idx, paragraph: [ { q: row[question], a: row[answer].split(\n) # 如果答案是列表可以这样处理 } ] } # 或者使用 conversations 格式 # record { # id: idx, # conversations: [ # {from: user, value: row[question]}, # {from: assistant, value: row[answer]} # ] # } f.write(json.dumps(record, ensure_asciiFalse) \n)4.2 数据质量检查与清洗格式正确只是第一步数据质量同样关键。在启动耗时数天的大规模训练前务必做一次数据检查长度过滤过长的样本会消耗大量显存并可能导致训练不稳定。可以统计文本的 token 长度使用目标模型的 tokenizer过滤掉超过最大上下文长度如 2048、4096的样本。重复与去噪检查并去除完全重复或高度相似的样本。对于答案去除无意义的占位符如“暂无信息”、“请联系客服”。毒性/偏见内容根据你的应用场景可能需要过滤含有不当言论、偏见或敏感信息的样本。划分数据集将处理好的数据按比例如 90%/5%/5%划分为训练集、验证集和测试集。项目中的脚本train_*.sh -m dataset就是调用dataHelper.make_dataset_with_args来完成数据预处理和缓存工作的。num_process_worker参数可以设置为你的 CPU 核心数以加速处理。5. 核心训练流程与参数配置解析数据准备好后就可以进入核心的训练环节了。项目通过不同的 shell 脚本train_full.sh,train_lora.sh,train_ptv2.sh来启动不同的微调模式其内部是通过命令行参数来区分的。5.1 训练脚本的工作机制以bash train_lora.sh -m train为例我们看看背后发生了什么。这个 shell 脚本内部很可能设置了诸如--train_mode 1这样的参数并调用了主训练脚本例如train.py。主脚本会解析参数读取命令行传入的所有配置覆盖默认值。这些参数控制着模型路径、数据路径、训练超参数、LoRA 配置等。加载模型和 Tokenizer根据model_name_or_path从本地或 Hugging Face 加载预训练模型。如果启用了量化QLoRA会在这里进行 4-bit 量化。准备数据使用dataHelper加载并 tokenize 训练和验证数据构建 PyTorch DataLoader。配置训练参数设置学习率、批次大小、训练轮数、优化器类型、学习率调度器等。这些是影响训练效果的关键。初始化训练器根据配置选择 Transformers Trainer、Accelerate 或其它训练器并传入模型、数据、训练参数。执行训练开始训练循环包括前向传播、损失计算、反向传播、参数更新。期间会记录日志、保存检查点并在验证集上评估。5.2 关键训练参数调优指南项目的args.MD文件里应该列出了所有可配置参数。这里我结合经验重点解析几个最关键的学习率这是最重要的超参数。对于全参数微调学习率通常设置得很小如 1e-5 到 5e-5。对于 LoRA/QLoRA由于只训练少量参数学习率可以设得大一些如 1e-4 到 5e-4。建议从一个推荐值开始观察训练损失曲线如果损失下降很慢或震荡再进行调整。批次大小受显存限制。在显存允许的情况下使用更大的批次大小通常能使训练更稳定。如果单卡批次大小只能设为 1可以考虑使用梯度累积gradient_accumulation_steps来模拟更大的批次。例如单卡批次为 1累积步数为 8等效批次大小为 8。最大序列长度决定了模型能处理的最长文本。设置得越大显存消耗越大平方关系。应根据你的数据实际长度分布来设置在覆盖大部分样本的同时避免浪费。例如如果你的问答对大多在 500 tokens 以内设为 512 或 1024 即可。LoRA 相关参数lora_rankLoRA 矩阵的秩r。秩越大可训练参数越多能力越强但也可能过拟合。通常从 8 或 16 开始尝试。lora_alpha缩放因子。一般设置为秩的 1-2 倍例如 rank8, alpha16。target_modules指定将 LoRA 应用到哪些模块上。对于 Transformer 模型通常是q_proj,k_proj,v_proj,o_proj注意力层和gate_proj,up_proj,down_projFFN层。项目通常有默认设置但针对不同模型可能需要微调。一个常见的训练启动命令示例如下# 假设在 train_lora.sh 中实际调用可能是这样的 python train.py \ --model_name_or_path /path/to/Qwen1.5-7B-Chat \ --train_file ./data/train.jsonl \ --validation_file ./data/val.jsonl \ --output_dir ./output/qwen-lora \ --num_train_epochs 3 \ --per_device_train_batch_size 2 \ --per_device_eval_batch_size 2 \ --gradient_accumulation_steps 8 \ --learning_rate 2e-4 \ --lr_scheduler_type cosine \ --warmup_steps 100 \ --logging_steps 10 \ --save_steps 500 \ --eval_steps 500 \ --fp16 True \ --lora_rank 16 \ --lora_alpha 32 \ --train_mode 15.3 训练监控与问题排查训练启动后不要放任不管。初期需要密切监控损失曲线训练损失应该稳步下降验证损失在下降后趋于平稳或缓慢上升后者可能预示过拟合。如果训练损失不降可能是学习率太小、数据有问题或模型未被正确训练比如冻结了不该冻结的层。显存使用使用nvidia-smi或gpustat监控。如果显存溢出OOM需要减小批次大小、序列长度或启用梯度检查点gradient checkpointing。日志信息关注日志中的警告和错误。例如如果出现loss is NaN可能是学习率太大、数据包含异常值或者混合精度训练fp16不稳定可以尝试切换到 BF16如果硬件支持或使用动态损失缩放。踩坑记录有一次我在使用 LoRA 微调时发现验证损失从一开始就居高不下。排查后发现是因为在配置中错误地将所有线性层都设为了target_modules包括最后的 LM Head这干扰了模型的输出。后来修正为只针对注意力层的 Q/K/V/O 投影层问题立刻解决。所以理解每个参数的含义至关重要。6. 模型推理与效果验证训练完成后会在output_dir下保存检查点。接下来就是用微调好的模型进行推理验证效果。6.1 不同微调方法的推理差异项目提供了不同的推理脚本对应不同的微调方法infer_finetuning.py: 用于全参数微调模型的推理。infer_lora_finetuning.py: 用于 LoRA/AdaLoRA/QLoRA 微调模型的推理。这里有一个非常实用的功能LoRA 权重合并。通过设置enable_merge_weightTrue可以将训练好的 LoRA 权重合并到基础模型中并保存为一个完整的模型文件。这样在部署时就无需再加载基础模型和 LoRA 适配器两部分简化了服务流程。infer_ptuning.py: 用于 P-Tuning v2 微调模型的推理。P-Tuning v2 的提示向量是独立于模型权重保存的推理时需要同时加载基础模型和这些提示向量。推理脚本的核心流程加载基础模型和 tokenizer。加载微调后的适配器权重LoRA/P-Tuning或直接加载全参数微调后的模型。使用model.generate()方法传入经过 tokenizer 编码的输入文本并指定生成参数如最大长度、温度、top_p 等。将生成的 token IDs 解码为文本输出。6.2 生成参数调优推理时的生成策略直接影响回答的质量和多样性贪心搜索 vs 采样贪心搜索do_sampleFalse每次选择概率最高的 token结果确定但可能枯燥。采样do_sampleTrue更具创造性。温度控制采样的随机性。温度越高如 1.0输出越随机、多样温度越低如 0.1输出越确定、保守。Top-p (核采样)仅从累积概率超过阈值 p 的 token 中采样。这能动态控制候选词的范围通常比 top-k 更有效。一般设置为 0.7-0.9。重复惩罚通过repetition_penalty参数通常 1.0来降低重复 token 的概率避免模型陷入循环。一个典型的生成调用可能如下inputs tokenizer(prompt, return_tensorspt).to(device) with torch.no_grad(): outputs model.generate( **inputs, max_new_tokens512, do_sampleTrue, temperature0.8, top_p0.9, repetition_penalty1.1, pad_token_idtokenizer.eos_token_id ) response tokenizer.decode(outputs[0][len(inputs[0]):], skip_special_tokensTrue)6.3 效果评估与迭代如何判断微调是否成功除了直观地看几个例子还需要更系统的评估构建测试集预留一部分未参与训练的数据作为测试集。设计评估指标自动化指标对于有标准答案的任务可以使用 BLEU、ROUGE 等文本相似度指标或使用 GPT-4 等大模型作为裁判进行打分。人工评估随机抽取一批测试样本让领域专家从相关性、准确性、流畅性、有用性等维度进行打分。这是最可靠但成本最高的方法。A/B 测试如果条件允许将微调后的模型与原始基座模型进行线上 A/B 测试看关键业务指标如用户满意度、任务完成率是否有提升。如果效果不理想需要回到前面的环节进行排查是数据质量不够数据量不足训练超参数尤其是学习率设置不当还是模型本身不适合该任务根据分析结果进行数据补充、清洗或参数调整然后重新训练。7. 高级特性与生产化考量当你掌握了基本流程后可以进一步探索项目的高级特性并思考如何将其用于生产环境。7.1 长上下文与推理长度扩展项目更新日志中提到“支持 Rope NtkScale不训练扩展推理长度”。这是一个针对 Rotary Position Embedding 的技术可以在不重新训练的情况下让模型在推理时处理比训练时更长的序列。这对于需要处理长文档的应用非常有用。在推理脚本中你可能需要找到相应的配置项来启用这个特性。7.2 多 LoRA 混合推理项目还提到了“增加 multi lora infer 例子”。这意味着你可以同时加载多个针对不同技能或风格训练的 LoRA 适配器在推理时通过某种方式如加权平均、路由选择组合它们从而实现一个模型具备多种能力。这为构建可组合的 AI 应用提供了可能。7.3 生产部署建议将微调好的模型部署为 API 服务时需要考虑模型格式转换如果使用 LoRA 且合并了权重得到的是标准的 Hugging Face 模型格式易于部署。也可以考虑转换为更高效的推理格式如 ONNX 或 TensorRT但可能会牺牲一些灵活性。服务框架可以使用 FastAPI Transformers 搭建简单的服务或者使用专为大模型服务的框架如 vLLM、TGI 来获得更高的吞吐量和并发能力。硬件优化使用量化技术如 GPTQ、AWQ将模型量化为 8-bit 或 4-bit可以大幅减少显存占用和提升推理速度同时保持较好的精度。监控与日志记录 API 的响应时间、显存使用、输入输出注意脱敏便于问题排查和性能优化。8. 常见问题排查与实战技巧实录最后分享一些我在使用类似框架进行微调时遇到的典型问题及解决方法希望能帮你少走弯路。问题一训练时 Loss 为 NaN 或突然变得巨大。可能原因 1学习率过高。这是最常见的原因。尝试将学习率降低一个数量级例如从 1e-4 降到 1e-5。可能原因 2混合精度训练不稳定。尝试关闭 fp16 (--fp16 False)或启用梯度裁剪 (--max_grad_norm 1.0)。可能原因 3数据中存在异常值。检查数据中是否有非常长的样本、空字符串或包含大量特殊字符的样本进行过滤或截断。可能原因 4模型权重初始化问题。如果自己添加了新的模块如 LoRA检查其初始化方式。问题二训练速度非常慢。排查点 1数据加载瓶颈。确保使用了DataLoader的num_workers参数在项目中对应num_process_worker并设置为合适的值通常是 CPU 核心数。将数据预处理到内存或高速 SSD 上。排查点 2没有启用混合精度训练。确认--fp16 True已设置并且你的 GPU 支持 FP16大多数现代 GPU 都支持。排查点 3模型太大批次大小太小。对于大模型单步计算本身就很耗时。在显存允许的情况下尽量增大per_device_train_batch_size或使用梯度累积来模拟更大的批次。排查点 4没有使用 Flash Attention。如果你的 GPU 支持安装并启用 Flash Attention 可以显著加速注意力计算。问题三模型“遗忘”了原有知识或者输出胡言乱语。可能原因 1数据质量差或与预训练数据分布差异过大。确保你的微调数据是高质量的并且任务定义清晰。可以尝试在微调数据中混入少量通用语料如 Alpaca 格式的数据以帮助模型保持通用能力。可能原因 2训练步数过多过拟合。观察验证集 loss如果它在下降后开始持续上升说明过拟合了。提前停止训练或增加正则化如权重衰减。可能原因 3对于 LoRA秩rank设置过高。过高的秩可能导致适配器过度适应微调数据干扰基座模型的强大能力。尝试降低lora_rank。问题四推理时生成的内容重复或无法停止。解决方法 1调整重复惩罚。增加repetition_penalty参数的值例如从 1.0 增加到 1.2。解决方法 2设置停止词。在model.generate()中通过stopping_criteria参数指定一些停止词或句子。解决方法 3检查 EOS Token。确保 tokenizer 的eos_token_id已正确设置并且在生成参数中传入了pad_token_idtokenizer.eos_token_id这样模型在生成结束符后会停止。一个实用的技巧使用 WandB 或 TensorBoard 进行可视化监控。虽然项目本身可能只输出日志文件但你可以很容易地将训练过程中的 loss、学习率等指标记录到 WandB。这能让你更直观地监控训练过程及时发现异常。通常只需要在训练脚本中添加几行初始化 WandB 的代码即可。微调大模型是一个需要耐心和反复实验的过程。ssbuild/llm_finetuning这个项目为你提供了一个坚实且灵活的起点将复杂的工程细节封装起来让你能更专注于数据、任务和模型本身。从选择一个合适的小模型开始你的第一次微调记录下每一步的操作和结果你会很快积累起属于自己的经验。

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