公司动态

20B大模型从训练到上线:显存估算、LoRA微调与压测部署全流程

📅 2026/8/28 13:55:55
20B大模型从训练到上线:显存估算、LoRA微调与压测部署全流程
在实际的智能系统研发中训练一个 200 亿参数级别的大模型通常被描述成“造一个大脑”。但真正负责过模型落地的人会清楚模型从训练机里出来之后距离稳定上线还横着一整套评估、压测、容量规划和状态监控流程。本文以“智平方”作为代号型示例项目不对应任何具体公司或融资口径也不讨论资本市场意义上的上市只讨论工程意义上的“上市称重”一个大参数模型在正式对外提供服务之前需要经历的效果评测、性能压测、安全检查和灰度发布。这篇文章适合算法工程师、大模型应用开发者和负责模型平台建设的后端工程师。阅读之后你可以得到一条从 20B 参数模型训练、微调、评估到部署上线的完整技术路线也能拿其中的显存估算表、LoRA 训练脚本、推理引擎参数和生产环境排查清单直接用于自己的项目。1. 先理解“200亿大脑”是一个什么样的工程目标1.1 “大脑”不只是参数量而是能力边界和应用场景7B、13B、20B、70B 这些名词最开始来自大模型的参数规模计数。20B 就是大约 200 亿参数。参数越多模型能记住的知识和能收敛出的复杂模式通常越多但这不意味着参数越多就一定越好用。模型能力还取决于训练数据质量、训练策略、对齐方式和推理上下文长度。在实际项目中20B 量级处于一个很有趣的位置。它比 7B 有更强的复杂指令理解能力又比 70B 更容易在中等规模 GPU 集群上部署。常见的落地场景包括企业私有知识库问答、代码生成与补全、结构化信息抽取、智能体任务规划等。如果要私有化部署到一个不能轻易扩展资源的内网环境20B 配合量化和批处理往往能在效果和成本之间找到一个较稳的平衡点。1.2 为什么很多项目会选 20B 而不是更大的模型选型时不能只看“效果最强”要看训练成本、推理成本和部署门槛共同作用下的综合成本。下面给出一张常用参考表实际项目需要结合自己的 GPU 型号和并发量重新计算。参数规模权重显存FP16推理部署难度典型场景需要关注的代价7B约 14GB单卡或小显存可跑轻量问答、摘要、分类复杂推理能力偏弱13B约 26GB单卡高显存或双卡通用对话、中等知识问答效果与成本较均衡20B约 40GB多卡或量化后单卡私有化知识库、代码助手、智能体需要处理多卡并行和 KV Cache70B约 140GB多卡高规格集群高难度推理、核心生成服务成本高运维复杂度明显上升这里说的“200亿大脑”在技术上更合理的读法是以 20B 参数模型为核心配合数据、微调、推理服务、评测和监控组成一个可对外交付的智能系统。很多项目讨论“上市称重”本质上就是问这个系统是否已经达到稳定交付的条件。1.3 从“能跑”到“能上市”中间隔了四道称重关一个模型在 Jupyter Notebook 里能输出合理答案离生产上线还很远。工程意义上至少要先过四道关效果关在业务评测集上回答质量是否达到验收标准。性能关在预期并发下延迟和吞吐是否满足 SLA。安全关敏感输入、越权指令和异常内容是否有兜底策略。稳定性关长时间运行是否会出现显存泄漏、堆积、超时或不可恢复错误。后面的章节会按这条主线展开。下一章先解决基础问题要把 20B 模型跑起来到底需要多少资源。2. 环境准备与算力评估20B 模型不能只在单卡上碰运气2.1 显存和训练开销要先算清楚否则会反复 OOM大模型工程中显存是第一个硬约束。先记住一个最基础的公式模型权重显存 参数量 × 每个参数占用的字节数以 FP16 为例每个参数占 2 字节20B 模型的权重就需要约 40GB。如果使用 INT8 量化权重约 20GB使用 INT4 量化权重约 10GB。这是推理场景只看权重时的结果。训练比推理复杂得多。使用 AdamW 优化器做全参数微调时除了前向和反向传播的权重副本还需要保存 FP32 主权重、一阶动量、二阶动量和梯度实际每参数占用远超 2 字节。粗略估算20B 模型全参数混合精度训练可能超过 300GB 显存这还不包括激活值。因此在单机 8 卡 A100 80G 环境下全参数训练 20B 也比较吃力。阶段每参数估算20B 模型估算说明FP16 推理权重2 字节40GB最基础的权重占用量INT8 推理权重1 字节20GB需要在精度和显存之间验证INT4 推理权重0.5 字节10GB精度损失需要业务评估AdamW 全参数训练16 字节以上320GB 以上不含激活值LoRA 微调冻结基座 少量可训练参数60-80GB 量级取决于 LoRA 维度、batch 和序列长度这也是为什么 20B 模型的生产路径在训练侧基本都会选择 LoRA/QLoRA在推理侧选择量化加 vLLM 等高性能引擎。资源不足时硬跑全量微调大概率会浪费大量时间在调 batch size 和显存上限上。2.2 推荐技术栈与依赖版本策略下面是一个常见的 20B 模型训练与部署技术栈。不要直接照抄版本号落地前要基于自己的 CUDA 版本和 Python 版本重新确认兼容性。组件用途注意事项Python运行训练和推理脚本建议 3.10 或更高版本避免旧版本生态兼容问题CUDA / 显卡驱动提供 GPU 计算基础用nvidia-smi确认驱动再用nvcc -V确认 CUDAPyTorch张量计算和自动求导选择与 CUDA 匹配的版本优先用官方安装命令Transformers加载模型、tokenizer、训练器确认版本与模型仓库兼容PEFT使用 LoRA/QLoRA 做参数高效微调能显著降低可训练参数规模bitsandbytes量化加载模型需要检查 GPU 架构是否支持Accelerate管理设备并行和混合精度与 Transformers Trainer 配合使用DeepSpeed 或 FSDP训练时的模型分片和内存优化二选一即可避免两套并行机制混用vLLM 或 TensorRT-LLM在线推理服务vLLM 上手快TensorRT-LLM 优化空间大2.3 训练数据准备格式、清洗和切分数据是大模型效果的真正上限。以指令微调为例先准备一份 JSONL 格式的数据集每一行是一个完整样本。比较推荐的是类 Chat 格式因为大多数基座模型都内置了对应的 chat template。{ messages: [ { role: system, content: 你是一个企业知识库助手回答要简洁、准确、基于给定资料。 }, { role: user, content: 请根据技术文档说明如何配置日志级别。 }, { role: assistant, content: 修改 application.yml 中的 logging.level.root 配置即可。 } ] }数据准备阶段至少要完成四件事去重。重复样本会让模型过度记忆降低泛化能力。过滤。清理 HTML 标签、乱码、过短文本、隐私信息和不适合公开的内容。切分。按 8:1:1 或 9:1 切分训练集、验证集和测试集避免评测集混入训练数据。统计长度。统计 token 化之后的长度分布再决定max_seq_length不要盲目设置成 8192。环境准备完成后可以用一个小脚本输出训练集条数、平均 token 长度、标签分布确认数据没有异常再进入训练阶段。2.4 环境自检清单进入训练前建议顺序执行以下检查nvidia-smi驱动是否正常GPU 数量是否和预期一致。python -c import torch; print(torch.cuda.is_available())PyTorch 能否调用 GPU。torch.cuda.device_count()能否看到全部 GPU。检查 NCCL 可用性多机或多卡训练依赖它。检查磁盘剩余空间训练 checkpoint 和日志会占用大量空间。检查模型下载缓存目录避免每次启动都重新下载权重。为训练、评测、部署设置固定随机种子保证结果可复现。3. 训练与微调用 LoRA 跑通 20B 模型的最小闭环3.1 先选训练策略全量预训练、增量预训练还是 LoRA 微调对于多数业务项目不会从随机权重开始预训练一个大模型因为数据量、算力和调优周期都不可控。更常见的做法是选择一个可商用许可的基座模型然后做领域微调。三种常见路径全量微调所有参数都更新效果上限高但显存和训练成本极高20B 模型通常不建议在普通集群上尝试。增量预训练在基座模型基础上继续训练领域语料适合补充专有知识但对数据数量和训练稳定性要求高。LoRA/QLoRA 微调冻结原模型权重只训练低秩适配矩阵。可训练参数通常只有总量的 1%-5%显存和显存占用大幅下降。对于指令跟随、任务格式适配和领域风格学习效果已经能满足大多数场景。本文示例采用 LoRA 指令微调路径。3.2 最小可运行训练脚本下面的代码用于说明思路。实际使用时要替换成你自己的基座模型 ID、数据路径和 target_modules并确认 tokenizer 的 chat template 存在。import torch from transformers import ( AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer, ) from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training from datasets import load_dataset model_id your-org/your-base-model-20b dataset_path data/train.jsonl tokenizer AutoTokenizer.from_pretrained(model_id, trust_remote_codeTrue) tokenizer.pad_token tokenizer.eos_token model AutoModelForCausalLM.from_pretrained( model_id, torch_dtypetorch.bfloat16, device_mapauto, trust_remote_codeTrue, ) model prepare_model_for_kbit_training(model) lora_config LoraConfig( r16, lora_alpha32, lora_dropout0.05, target_modules[q_proj, k_proj, v_proj, o_proj], task_typeCAUSAL_LM, ) model get_peft_model(model, lora_config) model.print_trainable_parameters() def format_chat_sample(example): messages example[messages] text tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptFalse, ) return {text: text} dataset load_dataset(json, data_filesdataset_path, splittrain) dataset dataset.map(format_chat_sample) def tokenize_function(examples): return tokenizer( examples[text], paddingmax_length, truncationTrue, max_length2048, ) tokenized_dataset dataset.map(tokenize_function, remove_columns[messages, text]) training_args TrainingArguments( output_dir./checkpoints/zhifang-square-20b-lora, per_device_train_batch_size2, gradient_accumulation_steps8, learning_rate2e-5, num_train_epochs3, logging_steps10, eval_strategysteps, eval_steps100, save_strategysteps, save_steps500, bf16True, report_totensorboard, ) trainer Trainer( modelmodel, argstraining_args, train_datasettokenized_dataset, eval_datasettokenized_dataset.select(range(200)), ) trainer.train()这里有几个关键点device_mapauto由 Accelerate 根据显存自动切分模型多卡环境下会分配到各个 GPU 上。prepare_model_for_kbit_training用于 QLoRA 场景如果基座没有做量化也可以保留但要理解它只对量化加载的模型有实际意义。tokenizer.pad_token tokenizer.eos_token是常见处理方式因为它能避免 padding token 缺失但也可能在生成时引入额外输出训练无碍推理时需要注意。3.3 训练关键参数速查参数推荐范围影响与注意learning_rate1e-5 到 3e-5过大会导致 loss 震荡或发散过小收敛慢per_device_train_batch_size1 到 4取决于显存20B 模型通常配 gradient accumulationgradient_accumulation_steps4 到 16等效扩大 batch不增加单步显存max_seq_length2048 或 4096增大则显存和训练时间明显上升lora_r8 到 64值越大可学习参数越多效果不一定等比例提升lora_alpha通常是lora_r的 2 倍控制 LoRA 缩放比例eval_strategysteps按固定步数验证便于观察过拟合3.4 训练日志怎么判断是否正常训练过程中会周期性输出日志类似{loss: 1.2354, grad_norm: 0.38, learning_rate: 1.5e-5, epoch: 0.01, step: 10} {loss: 1.1012, grad_norm: 0.21, learning_rate: 1.5e-5, epoch: 0.02, step: 20}关注三个信号loss是否整体呈现下降趋势。grad_norm是否长期在 0.1 到 10 之间波动长期为 0 表示梯度没有更新突然很大表示梯度爆炸。eval_loss是否与loss同步变化。如果训练 loss 下降但 eval loss 快速上升说明已经过拟合。训练结束后用model.save_pretrained保存 LoRA 适配权重并保存一份完整的训练参数记录方便后续复现和出问题时回查。3.5 这一阶段最容易踩的四个坑第一个坑是显存不足直接 OOM。解决办法不是不断调小 batch而是先确认是否真的需要全参数训练。如果选择 LoRA还要检查是否确实冻结了基座参数。第二个坑是数据格式不一致。有的样本是input/output有的是messages如果统一转换函数没有覆盖所有字段训练时会出现大量空样本模型 loss 表现奇怪。建议进入训练前先打印 10 条格式化后的样本。第三个坑是 tokenizer 截断造成答案丢失。max_length设置太小时长样本会被直接截掉后半个答案模型相当于在学习残缺数据。建议先统计样本截断比例再调整最大长度。第四个坑是随机性不可复现。没有固定随机种子、数据加载顺序不稳定或者 Transformers 版本发生变化都会导致实验结果无法对比。建议在每次实验前记录环境版本、数据版本和训练参数形成实验清单。4. 评估与“上市称重”模型上线前过哪几道关卡4.1 把“上市称重”翻译成工程语言如果模型在内部测试时回答得不错直接推到生产通常会出现两类意外一是业务的真实输入比测试集杂得多效果崩掉二是并发一上来显存和延迟全线告警。因此工程上需要把“上市称重”拆成可执行的验收项。至少要定义四类验收效果验收基于业务评测集未达到阈值不允许上线。性能验收在预期并发下满足 P99 延迟和吞吐要求。安全验收对敏感输入和异常请求有兜底不泄露系统信息。稳定性验收持续运行一段时间监控指标无异常增长错误率在阈值内。4.2 效果评测不是只看几个示例而是回归集加指标示例问答只能说明模型“能回答”不能说明“稳定回答”。生产环境建议建立一份和业务强相关的回归评测集规模至少 1000 条以上覆盖正常问题、边界问题、拒答问题和长文本问题。评测分为自动化和人工两层。自动化指标适合有标准答案的场景。例如知识库问答可以检查回答中是否包含关键实体和结论def evaluate_keyword(response, expected_keywords): hit_count sum(1 for kw in expected_keywords if kw in response) return hit_count / len(expected_keywords) cases [ { prompt: 如何修改日志级别, expected_keywords: [logging.level, application.yml], }, ] for case in cases: response generate(case[prompt]) score evaluate_keyword(response, case[expected_keywords]) print(score)对于开放式生成任务BLEU、ROUGE 这类指标只能作为参考更可靠的是人工打分。常见打分维度包括相关性、正确性、完整性和安全性。打分结果要落到表格里和上一版模型做对比。评测维度说明建议最低目标相关性回答是否围绕问题90% 以上相关正确性是否包含明显错误事实错误率低于 5%完整性是否遗漏关键步骤或结论覆盖全部关键点安全性是否拒绝回答不合适的输入敏感场景拒答率 100%4.3 性能压测用数据和图表代替主观判断在部署了推理服务后需要进行压测。常见指标包括 QPS、首 token 延迟、P99 延迟、错误率和 GPU 显存峰值。压测工具可以选择 Locust 或 k6。以一个简单 k6 脚本为例import http from k6/http; import { check, sleep } from k6; export const options { stages: [ { duration: 30s, target: 10 }, { duration: 30s, target: 30 }, { duration: 30s, target: 10 }, ], }; export default function () { const payload JSON.stringify({ model: zhifang-square-20b, messages: [ { role: user, content: 解释一下 Redis 缓存穿透和解决方案。 }, ], max_tokens: 256, }); const res http.post(http://127.0.0.1:8000/v1/chat/completions, payload, { headers: { Content-Type: application/json }, }); check(res, { status is 200: (r) r.status 200, response time 5000ms: (r) r.timings.duration 5000, }); sleep(0.5); }压测结束后结果必须落到一张表里并发QPSP50 延迟P99 延迟错误率108.2980ms1800ms0%2014.11350ms2400ms0.2%如果 P99 延迟达标但错误率上涨优先检查超时时间和排队策略。如果 QPS 增长明显放缓优先检查 GPU 利用率和 KV Cache 是否成为瓶颈。4.4 安全验收和灰度发布安全验收不是训练阶段的事而是系统上线前的兜底。需要配置输入侧和输出侧的过滤策略对敏感内容、明显异常指令和系统提示词注入做拦截或统一回复。这部分只做常规防护不涉及攻击手法。灰度发布建议采用版本模型并行的方式。让新模型和旧模型同时运行先切 5% 流量观察错误率和用户反馈再逐步放量到 20%、50% 和 100%。只要任何指标超过事前阈值立即切回旧版本。灰度期间要保留请求日志便于定位是模型问题还是业务输入变化。5. 部署与上线推理引擎、量化和容量规划5.1 推理引擎选型vLLM、TensorRT-LLM、TGI训练完成后的模型权重不能直接当作生产服务。20B 模型在原生 PyTorch 上运行显存占用高、并发能力有限。常见的推理引擎主要有三个选择。推理引擎核心特点适合场景注意点vLLMPagedAttention吞吐高API 兼容 OpenAI 格式在线对话、知识库问答配置简单社区活跃TensorRT-LLMNVIDIA 深度优化延迟低对延迟要求极高、规模较大的服务构建流程复杂调试成本高TGIHugging Face 官方方案集成 Transformers 生态快速验证、与 HF 生态紧密高并发吞吐通常不如 vLLM多数项目从 vLLM 开始因为它能快速把模型暴露成 OpenAI 兼容接口业务侧接入成本低。5.2 用 vLLM 启动一个 20B 模型服务下面命令把量化后的 20B 模型启动为 OpenAI 兼容服务。实际参数要根据 GPU 数量和显存调整。python -m vllm.entrypoints.openai.api_server \ --model ./models/zhifang-square-20b \ --tensor-parallel-size 4 \ --max-model-len 4096 \ --quantization awq \ --host 0.0.0.0 \ --port 8000参数含义--model模型路径或仓库 ID。--tensor-parallel-size张量并行使用的 GPU 数量。4 表示把模型切分到 4 张卡上。--max-model-len最大上下文长度决定 KV Cache 预留量。--quantization量化方式例如 AWQ、GPTQ。--host和--port服务监听地址。启动成功后可以用 curl 验证curl http://127.0.0.1:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: zhifang-square-20b, messages: [ {role: user, content: 什么是数据库索引} ], max_tokens: 256 }如果返回 JSON 中包含合理的choices字段说明服务已经可用。注意这里的model名称要与服务启动时注册的名称一致。5.3 网关、限流和容量规划大模型推理服务是典型的高成本慢接口不能让业务方无限调用。对外开放前必须在网关层配置限流和超时。Nginx 层面可以做基础的请求频率限制limit_req_zone $binary_remote_addr zonellm_limit:10m rate10r/s; location /v1/chat/completions { limit_req zonellm_limit burst20 nodelay; proxy_pass http://127.0.0.1:8000; proxy_read_timeout 120s; proxy_set_header Host $host; }上面的配置表示每个客户端 IP 平均每秒最多 10 个请求突发 20 个请求会被放行但不排队等待。proxy_read_timeout一定要调长因为大模型生成长文时响应时间可能超过 Nginx 默认的 60 秒。容量规划时需要估算单 GPU 能支撑多少并发。显存是否足够存放模型权重和 KV Cache。如果并发从 10 涨到 100需要几台推理节点。输入 token 数量是否被业务方传递的参数控制住避免单条请求把显存占满。5.4 生产监控指标清单上线不是结束而是状态监控的开始。至少需要监控以下指标监控维度指标示例GPU 资源GPU 利用率、显存使用率、显存峰值、显存碎片服务请求QPS、并发数、TP99 延迟、平均延迟生成性能首 token 延迟、每 token 生成耗时、吞吐 token/s稳定性错误率、超时率、拒答率、重启次数业务分布输入 token 长度分布、输出 token 长度分布、用户来源监控告警要有分级。GPU 利用率低但延迟高可能是排队或锁问题显存持续上涨可能是缓存未释放或请求长度异常错误率突然升高优先看模型版本是否被错误切流。5.5 回滚方案模型服务必须支持版本回滚。最简单的方式是同一套网关后面挂两个推理服务一个指向旧版本一个指向新版本。发布时先启动新版本再通过网关切流量。如果发现异常把流量切回旧版本不需要重新下载权重或重新启动。模型仓库中的版本号要与训练记录、评测记录一一对应。回滚后还要保留新版本的日志和评测结果方便分析问题出在数据、训练参数还是推理配置。6. 常见故障与排查链路6.1 训练阶段问题排查训练阶段的问题通常集中在显存、数据格式和训练稳定性上。下面按“现象、原因、检查方式、处理建议”整理。问题现象常见原因检查方式处理建议启动即 CUDA OOM显存不够或 batch size 过大查看错误日志中的显存占用减小 batch开梯度检查点使用 LoRA 或降低数据长度loss 一直不下降学习率过低、数据太脏、模型冻结错误查看 loss 曲线和 grad_norm调高学习率到 1e-4 量级试用检查可训练参数占比eval_loss 突增过拟合、数据泄漏、评测集太小对比 train 和 eval loss增加评测集规模提前保存最佳 checkpointloss 出现 NaN学习率过高、数据包含异常值查看梯度范数和数据样本降低学习率清理异常文本检查 bf16/fp16 设置训练速度极慢tensor parallel 配置不当、CPU 预处理瓶颈观察 GPU 利用率与数据加载耗时优先检查数据读取是否多线程模型并行是否匹配有一个容易被忽略的检查点训练前打印model.print_trainable_parameters()。如果可训练参数占了整个模型的 90%说明 LoRA 没有正确冻结基座显存和训练时间会失控。6.2 推理阶段问题排查问题现象常见原因检查方式处理建议请求超时生成 token 太多、并发排队查看输出 token 长度和延迟曲线限制max_tokens增加节点检查排队策略显存持续增长长请求过多、KV Cache 过大监控显存变化和并发曲线降低并发限制输入长度定期滚动重启服务回答内容重复temperature 过低、repetition_penalty 未设置查看生成参数调整repetition_penalty到 1.1 附近空响应拒绝策略命中或生成异常查看后处理日志和安全过滤日志调整拒绝策略记录拦截原因并发低张量并行不足、批处理未生效查看 GPU 利用率和吞吐检查 vLLM/推理引擎的批处理开关和 KV Cache 配置6.3 一个典型排查案例QPS 上不去怎么查假设压测目标是 30 并发 QPS 15实际只有 6。按链路顺序排查确认压测请求的输入输出长度。如果每条输入都是 4000 tokenKVCache 占用大QPS 自然会低。查看 GPU 利用率。如果只有 30%说明模型没有吃满瓶颈可能在锁、数据加载或请求排队。查看推理服务日志中的排队耗时。如果排队时间远大于生成时间应该提高集群容量或限制并发。检查是否有多副本竞争。如果服务只启动了一个进程单进程吞吐就是上限。检查网关限流是否误触发。有些限流配置在压测时会直接把请求拒掉表现为 QPS 被压得很平。这种排查方式可以复制到其他性能问题上先看输入再看资源再看排队最后看代码和配置。7. 生产最佳实践与扩展方向7.1 上线前可复用检查清单每一次大模型项目发布前建议按下面清单逐项确认。[ ] 基座模型版本、训练数据版本、评测集版本已记录。[ ] 训练随机种子、LoRA 参数、学习率等关键参数已归档。[ ] 评测集已通过验收评测报告已提交。[ ] 敏感输入过滤、输出过滤和拒答策略已配置。[ ] 推理服务已完成压测延迟和 QPS 达标。[ ] GPU 显存、延迟、错误率、token 吞吐等监控指标已上线。[ ] 灰度发布和回滚预案已准备好。[ ] tokenizer 与模型权重版本一致生成参数已在业务侧固定。[ ] 模型许可证、数据合规和日志审计要求已确认。7.2 推理参数建议速查推理阶段最容易出问题的不是框架而是生成参数。给出常用参数参考参数推荐范围说明temperature0.1 到 0.8业务问答建议低一些创意生成可以高一些top_p0.8 到 0.9控制采样范围避免生成内容过于发散max_tokens按业务需求限制不限制会导致用户请求长文时拖垮服务repetition_penalty1.05 到 1.2减少重复但过高会让输出不自然stop按场景设置例如[\n\n]可让回答在合适位置结束这些参数不是越大越好。经验是两个项目之间不要照搬参数一定要在自己业务数据上做小批量验证。7.3 扩展方向完成 20B 模型训练和上线后可以继续扩展几个方向RAG 接入。把知识库检索结果拼到 prompt 中减少模型幻觉提高答案可追溯性。自动评测。用规则模型或更强大的模型对生成结果打分替代大量人工评测。DPO 对齐。在 SFT 基础上收集偏好数据让模型回答更符合业务风格。多模态扩展。把图像、表格等输入接入现有推理链路。模型压缩。尝试感知量化训练、剪枝或蒸馏降低单 token 成本。7.4 最后说一句关于“上市称重”的判断一个 200 亿参数的“大脑”是否能承担生产压力最终不只看训练 loss 好不好看也不只看 demo 截图是否惊艳。真正的“上市称重”是评测集上跑分稳定、压测下延迟可控、异常输入不会击穿系统、版本回滚能快速完成。先建立这套工程机制再谈模型效果提升才是大模型项目从实验室走向生产的稳妥路径。