ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

单卡微调大模型实战:MindSpore+MindPet LoRA全流程指南

单卡微调大模型实战:MindSpore+MindPet LoRA全流程指南 1. 为什么单卡微调值得认真对待1.1 从一张显卡说起手里只有一张卡还想把大模型微调跑起来这是很多个人开发者和中小团队最真实的处境。昇思 MindSpore 作为国产深度学习框架在大模型训练和推理这条链路上已经打磨得相当完整但网上能找到的教程要么停留在“Hello World”级别的模型加载要么直接甩出一个需要八卡 A100 的脚本中间那段“单卡怎么把微调跑通、跑稳、跑出可用结果”的空白恰恰是大多数人卡住的地方。这篇内容就是来填这段空白的。我会从环境搭建开始一路讲到数据准备、微调脚本编写、训练过程监控、权重合并再到最后的推理验证把整条链路拆开揉碎。目标很明确你跟着走一遍就能在自己的单卡机器上完成一次完整的大模型微调与推理闭环。不管你是刚接触 MindSpore 的新手还是从 PyTorch 转过来的老手都能从中找到可以直接抄作业的部分。需要提前说明的是单卡微调的核心矛盾在于显存。一张 24GB 显存的卡想微调 7B 参数的模型全量微调基本不用想必须走参数高效微调PEFT路线比如 LoRA 或者 QLoRA。MindSpore 生态里对应的方案是MindPetMindSpore Parameter-Efficient Tuning它提供了 LoRA、DoRA 等微调算法的实现配合 MindSpore 的图算融合和内存复用机制单卡跑 7B 模型的 LoRA 微调是完全可行的。下面所有内容都围绕这条技术路线展开。1.2 单卡微调能解决什么实际问题很多人会问单卡微调出来的模型到底能干嘛。我举几个我实际遇到过的场景。第一个是领域术语适配比如你手头有一批医疗问诊对话数据通用大模型对某些专科术语的回答总是差那么点意思用几百到几千条高质量样本做一轮 LoRA 微调模型在特定术语上的准确率会有肉眼可见的提升。第二个是输出格式约束你希望模型严格按照某个 JSON 结构输出或者在客服场景里固定话术风格微调比写一堆提示词工程要稳定得多。第三个是私有数据注入有些知识不适合放在提示词里反复传通过微调让模型“记住”这些内容推理时就不用每次都塞长上下文。这些场景的共同点是数据量不大、任务边界清晰、对基座模型的通用能力依赖不强。这正是单卡微调最擅长的战场。反过来如果你要做的是从零训练一个通用大模型或者需要模型掌握大量新知识那单卡微调就不合适了该上集群就上集群别硬撑。1.3 整体流程鸟瞰在动手之前先把整条链路在脑子里过一遍这样后面每一步你都知道自己在哪个位置。整个流程大致分六个阶段环境准备装 MindSpore、MindPet、依赖库、模型与数据准备下载基座权重、处理数据集、微调配置写训练脚本、设超参、训练执行启动训练、监控 loss、权重合并把 LoRA 权重合并回基座、推理验证加载合并后的模型做生成测试。这六个阶段里最容易出问题的是环境准备和权重合并。环境准备涉及框架版本、CUDA 版本、驱动版本的匹配错一个就报一堆看不懂的错。权重合并则是很多人容易忽略的一步以为训练完就能直接用结果推理时发现加载的是基座模型微调效果完全没体现。后面我会把这两个环节单独拎出来重点讲。2. 环境搭建与依赖版本锁定2.1 硬件与系统基线先说你需要的硬件底线。单卡微调 7B 模型显存建议不低于 24GB比如 RTX 3090、4090、A10 等。如果只有 16GB也不是完全没戏但需要把 batch size 压到 1序列长度控制在 512 以内并且开启梯度检查点代价是训练速度会慢不少。8B 到 13B 的模型在 24GB 卡上做 LoRA 微调序列长度 1024、batch size 2 到 4 是比较舒服的配置。再大的模型单卡就比较吃力了除非用 4-bit 量化加载。系统层面Ubuntu 20.04 或 22.04 是最省心的选择内核版本不要太新也不要太旧。Windows 下用 WSL2 也能跑但涉及到多进程数据加载和显存管理时WSL2 偶尔会有一些玄学问题生产环境还是建议纯 Linux。驱动版本要和 CUDA 版本匹配这个后面细说。2.2 MindSpore 安装的版本选择逻辑MindSpore 的安装是整条链路里第一个大坑。它的版本和 CUDA 版本、Python 版本之间有严格的对应关系不是随便 pip install 就能搞定的。我的建议是先确定 CUDA 版本再反查 MindSpore 版本最后锁定 Python 版本。截至我写这篇内容时MindSpore 2.3.x 和 2.4.x 是相对稳定的两个大版本。2.3.x 对 CUDA 11.6 和 11.8 支持较好2.4.x 开始对 CUDA 12.x 有更完善的支持。如果你用的是 40 系显卡建议走 CUDA 12.x 加 MindSpore 2.4.x 的组合30 系显卡用 CUDA 11.8 加 MindSpore 2.3.x 也很稳。安装命令不要直接抄网上的去 MindSpore 官网的安装页面根据你的系统、CUDA 版本、Python 版本生成对应的 pip 命令。这里给一个参考示例CUDA 11.8、Python 3.9 的环境pip install mindspore2.3.0 -i https://pypi.tuna.tsinghua.edu.cn/simple注意如果你需要 GPU 版本包名可能是mindspore-gpu或者通过官方源安装具体以官网生成的命令为准。装完之后一定要验证import mindspore as ms print(ms.__version__) print(ms.context.get_context(device_target))如果输出是GPU而不是CPU说明 GPU 版本装对了。如果显示 CPU要么是装成了 CPU 版本要么是 CUDA 环境没配好。2.3 MindPet 与配套库MindPet 是 MindSpore 生态里做参数高效微调的核心库。安装方式通常是源码安装或者通过 MindSpore 的扩展包pip install mindpet如果 pip 源里找不到就去官方仓库拉源码python setup.py install装。装完之后验证 LoRA 相关模块能不能正常导入from mindpet.delta import LoRADelta print(MindPet LoRA ready)除了 MindPet还需要几个配套库transformers用于 tokenizer 和部分模型结构参考注意 MindSpore 有自己的模型实现transformers 主要用来处理分词器datasets用于数据加载numpy、tqdm这些基础库不用多说。版本上transformers 建议用 4.30 以上的版本太老的版本对某些新模型的分词器支持不好。注意MindSpore 和 PyTorch 不要装在同一个虚拟环境里两者对底层库的依赖有冲突混装容易出现段错误。用 conda 或 venv 建独立环境这是血泪教训。2.4 环境验证清单装完别急着跑训练先做一轮完整验证。我整理了一个检查清单逐项过一遍能省掉后面大量排查时间检查项验证方法预期结果MindSpore 版本ms.__version__与安装目标一致设备类型ms.context.get_context(device_target)GPUCUDA 可用性nvidia-smi显示显卡和驱动信息MindPet 导入from mindpet.delta import LoRADelta无报错显存识别ms.hal.get_device_properties()显存容量正确分词器加载加载目标模型 tokenizer无报错词表大小正确这一轮验证做完环境基本就稳了。如果哪一项不对先解决再往下走不要带着问题往下跑否则后面报的错会让你怀疑人生。3. 模型与数据的准备细节3.1 基座模型的选择与下载单卡微调基座模型的选择直接决定了你能不能跑起来。7B 是目前单卡最舒服的尺寸再大就要掂量显存了。选模型时看三个维度参数量、词表大小、是否已有 MindSpore 实现。参数量决定了显存占用的大头。7B 模型用 fp16 加载大约占 14GB 显存加上优化器状态、梯度、激活值LoRA 微调时总占用在 18 到 22GB 之间24GB 卡刚好够用。词表大小影响 embedding 层的显存有些模型词表特别大比如超过 15 万embedding 层就能吃掉好几个 G。是否已有 MindSpore 实现则决定了你要不要自己做权重转换能用官方或社区已经转换好的权重就别自己折腾。下载权重时注意区分 fp16 和 fp32 版本。单卡微调一律用 fp16 或 bf16fp32 显存直接翻倍没必要。下载完检查一下权重文件的完整性有些分片下载容易缺文件加载时报的错往往很隐晦。3.2 数据格式与预处理微调数据的质量比数量重要得多。我见过太多人拿几万条脏数据去微调结果模型学了一堆噪声还不如不微调。数据准备这一步核心是三件事格式统一、长度控制、质量过滤。格式上MindSpore 微调通常用 JSONL 或者 MindRecord 格式。JSONL 更通用每行一个样本结构类似{instruction: 请判断以下文本的情感倾向, input: 这家餐厅的服务态度很好, output: 正面}预处理时要做几件事。第一把数据统一成模型能理解的 prompt 模板比如### Instruction: ... ### Input: ... ### Output: ...模板要和推理时保持一致否则微调效果会打折扣。第二控制序列长度超过最大长度的样本要么截断要么丢弃截断时注意别把 output 部分截没了。第三过滤掉空样本、超短样本、乱码样本。长度分布这个事值得单独说。我建议在预处理阶段统计一下样本长度分布如果大部分样本在 256 以内那序列长度设 512 就够了没必要设 2048 浪费显存。如果长度分布很分散可以设一个覆盖 95% 样本的长度值剩下的长样本截断处理。3.3 数据加载与批处理MindSpore 的数据加载用GeneratorDataset或者MindDataset。JSONL 数据一般用GeneratorDataset配合自定义的生成器函数。这里有个细节数据加载的并行度。单卡训练时num_parallel_workers设成 4 到 8 比较合适设太高反而会因为 CPU 抢占影响训练。批处理时要注意 padding 策略。同一个 batch 内的样本要 pad 到相同长度pad 的 token 不参与 loss 计算。MindSpore 里可以通过 attention mask 来实现mask 掉的位置在计算 loss 时权重设为零。这个细节如果处理不好模型会学到一堆 pad token 的模式生成时容易出问题。def create_dataset(data_path, batch_size4, max_length512): def generator(): with open(data_path, r, encodingutf-8) as f: for line in f: sample json.loads(line) yield tokenize(sample, max_length) dataset GeneratorDataset(generator, column_names[input_ids, attention_mask, labels]) dataset dataset.batch(batch_size, drop_remainderTrue) return dataset这段代码是示意实际使用时 tokenize 函数要根据你选的模型分词器来写返回的 tensor 类型也要和 MindSpore 的要求对齐。4. 微调脚本的核心配置与实现4.1 LoRA 参数怎么设才合理LoRA 的核心参数有三个rank秩、alpha缩放系数、dropout。这三个参数怎么设直接决定微调效果和显存占用。rank 决定了低秩矩阵的维度rank 越大可训练参数越多拟合能力越强但显存占用和过拟合风险也越高。我的经验是简单任务格式约束、风格迁移用 rank 8 到 16复杂任务领域知识注入、多轮对话用 rank 32 到 64。7B 模型单卡微调rank 设 32 是个比较稳妥的起点。alpha 是缩放系数通常设成 rank 的两倍。比如 rank 32alpha 设 64。这个比例不是绝对的但作为起点很合适。alpha 的作用是控制 LoRA 更新量对原始权重的影响程度设太小微调效果不明显设太大容易破坏基座模型的原有能力。dropout 一般设 0.05 到 0.1作用是防止过拟合。数据量少的时候几百条可以设高一点数据量大的时候几千条以上可以设低一点甚至设 0。from mindpet.delta import LoRADelta lora_config { rank: 32, alpha: 64, dropout: 0.05, target_modules: [q_proj, v_proj, k_proj, o_proj] }target_modules指定 LoRA 加在哪些层上。一般加在 attention 的 q、k、v、o 四个投影层上就够了。如果效果不够可以再加 FFN 层的 up、down、gate 投影但参数量和显存占用会上去。4.2 学习率与优化器选择学习率是微调里最敏感的超参。LoRA 微调的学习率通常比全量微调大一个数量级因为可训练参数少需要更大的步长才能有效更新。我的经验区间是1e-4 到 5e-4rank 越大学习率可以适当调小rank 越小学习率可以适当调大。优化器用 AdamW 就行MindSpore 里有现成实现。weight decay 设 0.01 到 0.1这个参数对 LoRA 的影响没有全量微调那么大但也不能完全不管。学习率调度用 cosine 或者 linear warmup 加 decaywarmup 步数设总步数的 3% 到 5%。from mindspore.nn import AdamW from mindspore.nn import CosineDecayLR lr CosineDecayLR( min_lr1e-6, max_lr2e-4, decay_stepstotal_steps, warmup_stepsint(total_steps * 0.05) ) optimizer AdamW(paramstrainable_params, learning_ratelr, weight_decay0.01)这里有个容易踩的坑只把 LoRA 参数传给优化器不要传全部参数。如果你不小心把基座模型的参数也传进去了优化器会为这些参数分配状态显存直接爆掉。训练前打印一下可训练参数的数量和名字确认只有 LoRA 相关的参数在里面。4.3 梯度累积与显存优化单卡微调显存永远是紧巴巴的。除了 LoRA 本身省显存还有几个技巧可以用。梯度累积是最常用的。如果你想要等效 batch size 16但显存只够跑 batch size 4那就累积 4 步再更新一次参数。MindSpore 里可以通过TrainOneStepCell的变体或者手动控制来实现。梯度累积的代价是训练速度变慢因为前向反向的计算量没变只是更新频率降低了。梯度检查点是另一个大招。它用计算换显存把中间激活值不保存反向传播时重新计算。开启后显存能省 30% 到 50%但训练速度会慢 20% 到 30%。MindSpore 里可以通过model.recompute()或者配置recompute_config来开启。混合精度也是标配。fp16 或 bf16 训练显存占用比 fp32 少一半速度还更快。MindSpore 的amp模块可以自动做混合精度注意 loss scaling 要配好否则容易梯度下溢。实操心得这几个优化手段不要一次性全开。先开混合精度不够再开梯度累积还不够再开梯度检查点。每开一个都测一下训练速度和显存占用找到最适合你硬件的组合。4.4 训练循环与 checkpoint 保存MindSpore 的训练循环可以用model.train()高层 API也可以自己写TrainOneStepCell做更细粒度的控制。单卡微调建议用高层 API省事且不容易出错。import mindspore as ms from mindspore.train import Model, CheckpointConfig, ModelCheckpoint, LossMonitor config_ck CheckpointConfig( save_checkpoint_steps500, keep_checkpoint_max3 ) ckpt_callback ModelCheckpoint( prefixlora_finetune, directory./checkpoints, configconfig_ck ) loss_callback LossMonitor(per_print_times10) model Model(network, loss_fn, optimizer) model.train(epochs, dataset, callbacks[ckpt_callback, loss_callback])checkpoint 保存策略要注意保存频率别太高否则 IO 会成为瓶颈保留数量别太多否则磁盘很快就满了。LoRA 的 checkpoint 通常只有几十到几百 MB比全量模型小得多但也没必要每个 step 都存。我一般设 500 步存一次保留最近 3 个。5. 训练过程监控与问题排查5.1 loss 曲线怎么看训练启动后第一件事是盯 loss。正常的 loss 曲线应该是先快速下降然后逐渐平缓最后在一个区间内小幅波动。如果 loss 一直不降或者降着降着突然飙升那就有问题。loss 不降的常见原因有几个。学习率太小模型几乎没更新数据有问题比如标签全是同一个值LoRA 没挂上实际训练的是空参数。排查方法先打印可训练参数数量确认 LoRA 生效再把学习率调大一个数量级试试最后检查数据随机抽几条看看输入输出对不对。loss 飙升通常是学习率太大或者梯度爆炸。解决办法是降低学习率或者加梯度裁剪。MindSpore 里可以通过clip_grad或者GradientClipping来实现阈值一般设 1.0 到 5.0。loss 降到很低但生成效果很差这是过拟合的典型表现。数据量少、训练轮数多、rank 设太大都可能导致过拟合。解决办法是减少训练轮数、降低 rank、增大 dropout或者补充更多数据。5.2 显存溢出OOM的排查路径OOM 是单卡微调最常见的报错。排查路径我总结成一张表排查项检查方法解决手段batch size 过大逐步调小测试降到 1 或 2序列长度过长统计样本长度分布截断到合理值梯度累积未生效检查更新逻辑确认累积步数配置优化器状态过多打印可训练参数只传 LoRA 参数激活值未释放开启梯度检查点配置 recompute混合精度未开启检查 amp 配置开启 fp16/bf16排查 OOM 时用nvidia-smi实时看显存占用配合ms.hal.get_device_properties()看总显存。如果显存占用在训练开始后迅速涨满然后报错多半是 batch size 或序列长度的问题。如果显存占用缓慢增长最后报错可能是内存泄漏检查数据加载部分有没有累积不释放的对象。5.3 训练速度慢的优化方向单卡训练速度慢先别急着换硬件看看软件层面有没有优化空间。数据加载是第一个要看的如果 GPU 利用率忽高忽低说明数据加载跟不上把num_parallel_workers调大或者把数据预处理提前做好缓存。算子融合是第二个MindSpore 的图算融合默认开启但有些自定义算子可能没被融合检查一下有没有可以合并的操作。通信开销在单卡上不是问题但如果你用了分布式数据并行即使只有一张卡通信开销也会拖慢速度单卡就老老实实用单卡模式。还有一个容易被忽略的点checkpoint 保存和日志打印的频率。保存太频繁会阻塞训练日志打印太多也会影响性能。把保存间隔调大日志打印间隔调大训练速度会有明显改善。6. 权重合并与推理验证6.1 LoRA 权重合并的原理与操作训练完成后checkpoint 里保存的是 LoRA 的增量权重不是完整的模型权重。推理时有两种选择一是加载基座模型加 LoRA 权重动态合并二是把 LoRA 权重合并回基座保存成一个完整的模型文件。第一种方式灵活可以随时切换不同的 LoRA第二种方式推理时更省显存速度也略快。合并的数学原理很简单LoRA 把权重更新表示为W W0 BA其中W0是原始权重B和A是低秩矩阵。合并就是把BA加到W0上。MindPet 提供了合并的工具函数也可以手动实现import mindspore as ms def merge_lora(base_ckpt, lora_ckpt, output_path): base_params ms.load_checkpoint(base_ckpt) lora_params ms.load_checkpoint(lora_ckpt) for name, param in lora_params.items(): if lora_a in name: base_name name.replace(lora_a, weight) # 计算 BA 并加到 base 上 # 具体实现依赖 MindPet 的命名规则 pass ms.save_checkpoint(base_params, output_path)实际合并时命名规则的匹配是最容易出错的。MindPet 的 LoRA 参数命名有固定格式合并前先打印一下 checkpoint 里的 key确认命名对应关系。如果合并后推理效果和训练时不一致多半是合并时权重对应错了。6.2 推理脚本的编写要点推理脚本比训练脚本简单但有几个细节要注意。分词器要和训练时一致包括 padding 策略、截断策略、特殊 token 的处理。生成参数要调好max_new_tokens、temperature、top_p、repetition_penalty这几个参数直接影响生成质量。import mindspore as ms from mindspore import Tensor def generate(model, tokenizer, prompt, max_new_tokens256): inputs tokenizer(prompt, return_tensorsms, paddingTrue) input_ids inputs[input_ids] attention_mask inputs[attention_mask] outputs model.generate( input_ids, attention_maskattention_mask, max_new_tokensmax_new_tokens, temperature0.7, top_p0.9, repetition_penalty1.1, do_sampleTrue ) return tokenizer.decode(outputs[0], skip_special_tokensTrue)temperature控制随机性设 0.7 到 1.0 比较合适太低会死板太高会胡言乱语。top_p设 0.9 左右配合 temperature 使用。repetition_penalty设 1.1 到 1.2防止模型复读。这些参数没有绝对的最优值要根据你的任务和模型特点调。6.3 效果验证与对比方法推理跑通只是第一步还要验证微调效果。我一般做三组对比基座模型直接推理、基座加 LoRA 推理、合并后模型推理。三组结果应该一致后两组且明显优于第一组否则说明微调没生效或者合并出了问题。验证时准备一批测试样本覆盖训练数据里出现过的模式和没出现过的模式。如果模型在训练模式上表现好在新模式上表现差说明过拟合了需要调整训练策略。如果模型在所有模式上都表现平平说明微调强度不够可以增大 rank 或学习率。还有一个实用的技巧用训练集里的样本做推理测试。如果模型连训练集里的样本都答不对那肯定是哪里出了问题先排查这个再谈泛化。7. 常见问题速查与避坑经验7.1 环境类问题速查问题现象可能原因解决方法导入 MindSpore 报错版本与 CUDA 不匹配按官网对应关系重装设备类型显示 CPU装成了 CPU 版本重装 GPU 版本MindPet 导入失败依赖缺失或版本冲突检查依赖独立环境安装分词器加载报错transformers 版本过老升级到 4.30 以上显存识别异常驱动版本问题更新驱动到匹配版本环境问题排查的核心思路是隔离变量。新建一个干净环境只装最小依赖跑一个最小示例。如果最小示例能跑通再逐步加依赖加到哪个报错就是哪个的问题。7.2 训练类问题速查问题现象可能原因解决方法loss 不降学习率太小或 LoRA 未生效调大学习率检查可训练参数loss 飙升学习率太大或梯度爆炸降低学习率加梯度裁剪OOMbatch size 或序列长度过大调小参数开启梯度检查点训练速度慢数据加载瓶颈调大并行度缓存预处理结果过拟合数据少、rank 大、轮数多降 rank减轮数加 dropout训练类问题的排查日志是关键。把 loss、学习率、显存占用、每步耗时都打出来问题往往一目了然。别嫌日志多出问题的时候你会感谢自己打了这些日志。7.3 推理类问题速查问题现象可能原因解决方法推理结果和训练不一致权重合并错误检查命名对应关系生成重复内容repetition_penalty 太低调高到 1.1 以上生成质量差temperature 或 top_p 不当调整采样参数推理速度慢未合并权重或未开混合精度合并权重开启 fp16输出格式不对prompt 模板不一致训练和推理用同一模板推理问题的核心是一致性。训练和推理的模板、分词、参数都要对齐任何一处不一致都会导致效果打折。7.4 几条踩过坑才懂的经验第一条别迷信默认参数。MindSpore 和 MindPet 的默认参数是通用场景下的保守值不一定适合你的任务。学习率、rank、序列长度这些关键参数一定要根据你的数据和硬件调。第二条小步快跑。先用少量数据、少量步数跑通全流程确认每个环节都没问题再上全量数据。我见过太多人一上来就跑全量结果跑到一半报错前面的时间全白费。第三条checkpoint 是你的救命稻草。训练过程中定期保存出问题可以从最近的 checkpoint 恢复不用从头再来。保存的时候把优化器状态也存上恢复时才能无缝衔接。第四条记录实验。每次调整参数都记下来包括改了什么、结果如何。微调是个实验驱动的过程没有记录你很快就会忘记哪个配置效果好。第五条数据质量大于一切。再好的模型、再优的参数喂进去脏数据也白搭。花在数据清洗上的时间永远不亏。8. 从单卡到可用的最后一公里8.1 微调效果的评估维度微调跑完怎么判断效果好不好。我一般从四个维度评估任务准确率在测试集上的表现、格式合规率输出是否符合预期格式、泛化能力在未见过的样本上的表现、基座能力保留通用能力有没有明显下降。任务准确率是最直接的指标准备一个标注好的测试集跑一遍算准确率。格式合规率用规则匹配或者人工抽查看输出结构对不对。泛化能力用训练时没见过的样本测如果掉得厉害说明过拟合。基座能力保留用一些通用问题测如果模型连常识问题都答不对了说明微调把基座能力破坏了需要降低学习率或减少训练轮数。这四个维度要综合看不能只看一个。任务准确率高但基座能力崩了这个模型不可用格式合规率高但泛化差说明模型只是记住了训练集的格式没真正学会任务。8.2 迭代优化的方向第一轮微调效果不理想是正常的关键是怎么迭代。如果任务准确率不够先看数据是不是样本太少或者质量不高补充数据往往比调参更有效。如果格式合规率不够检查 prompt 模板是不是模板设计得不够清晰或者训练样本里的格式不够统一。如果泛化能力差减少训练轮数降低 rank增大 dropout。如果基座能力下降降低学习率减少 LoRA 影响的层数。迭代的时候一次只改一个变量改完测效果有效就保留无效就回退。同时改多个变量你根本不知道是哪个起了作用。8.3 部署上线的注意事项微调好的模型要上线还有几件事要做。推理性能优化合并权重、开混合精度、用推理引擎加速这些都能提升吞吐降低延迟。输入输出校验线上环境什么输入都可能遇到做好异常处理和兜底策略。版本管理基座模型版本、LoRA 版本、合并后的模型版本都要记录清楚出问题能快速定位。监控告警推理延迟、错误率、显存占用这些指标要实时监控异常时及时告警。单卡微调出来的模型部署时通常也是单卡推理。如果并发量上来了可以考虑用推理引擎做批处理或者上多卡做负载均衡。但那是另一个话题了单卡微调加单卡推理对于大多数个人项目和小团队场景已经够用。我个人在实际操作中的体会是单卡微调这件事门槛不在技术本身而在细节。框架版本、参数配置、数据质量、权重合并每一个环节都有坑但每一个坑都有成熟的解法。把这篇内容里的流程走一遍把速查表存下来遇到问题按表排查基本能覆盖 90% 的情况。剩下的 10%靠的是耐心和记录每次踩坑都记下来下次就是你的经验了。
返回列表