
大模型增量训练实践
引言 大模型的增量训练(Continued Pretraining,CPT)是指在已有预训练模型基础上,使用新数据继续训练,以注入新知识或适应新领域。与从零训练相比,增量训练大幅降低计算成本,同时保留模型的通用能力。但增量训练面临独特的技术挑战:知识注入与遗忘的平衡、训练稳定性、数据配比优化等。本文分享大模型增量训练的工程实践。 增量训练的定位 与其他训练方式的关系 训练方式 数据量 训练成本 知识注入深度 适用场景 从零预训练 万亿级token 极高 最深 构建全新基础模型 增量训练(CPT) 百亿级token 高 深 知识更新/领域注入 SFT微调 百万级 中 中 指令跟随能力 LoRA微调 万级 低 浅 轻量适配 何时需要增量训练 模型需要掌握大量新的领域知识(如从通用模型到医疗模型) 领域语言模式与通用文本差异大(如法律条文、代码) 需要更新时间敏感的知识(如新法规、新技术) 现有模型在目标领域的幻觉率过高 不推荐增量训练的场景:仅需调整输出格式(用SFT)、仅需少量领域知识(用RAG)、计算资源不足。 数据准备 数据来源与处理 class IncrementalDataPipeline: def __init__(self, tokenizer, max_length=4096): self.tokenizer = tokenizer self.max_length = max_length def process(self, raw_data_sources): """完整数据处理流水线""" all_data = [] for source in raw_data_sources: # 1. 格式统一 text = self.normalize_format(source) # 2. 质量过滤 if not self.quality_filter(text): continue # 3. 去重 text = self.deduplicate(text) # 4. 分词 tokens = self.tokenizer.encode(text) # 5. 长文档切分 chunks = self.split_long_text(tokens) all_data.extend(chunks) # 6. 数据配比 mixed_data = self.mix_data(all_data) return mixed_data def quality_filter(self, text): """质量过滤""" # 去除过短文本 if len(text) < 100: return False # 去除重复率高的文本 if self.repetition_ratio(text) > 0.3: return False # 去除乱码 if self.garbled_ratio(text) > 0.1: return False return True def split_long_text(self, tokens): """长文本切分,保留上下文""" chunks = [] overlap = 512 # 重叠token数 for i in range(0, len(tokens), self.max_length - overlap): chunk = tokens[i:i + self.max_length] chunks.append(chunk) if i + self.max_length >= len(tokens): break return chunks def mix_data(self, domain_data, general_ratio=0.3): """领域数据与通用数据混合""" domain_size = len(domain_data) general_size = int(domain_size * general_ratio / (1 - general_ratio)) general_data = self.load_general_data(general_size) mixed = domain_data + general_data random.shuffle(mixed) return mixed 数据配比策略 数据配比是增量训练最关键的超参数之一: ...