Skip to content

Conversation

@hujiyo
Copy link

@hujiyo hujiyo commented Jul 9, 2025

MiniMind 动态长度扩展功能

概述

MiniMind 现在支持动态长度扩展,理论上可以处理任意长度的序列(受内存限制)。这个功能基于 RoPE(Rotary Position Embedding)的数学特性实现,具有良好的向后兼容性。

主要特性

✅ 动态长度扩展

  • 无硬编码长度限制:模型可以处理超出训练时序列长度的输入
  • 自动扩展:位置编码会根据输入长度自动扩展
  • 内存效率:只在需要时扩展,避免预分配过大的内存

✅ 完全向后兼容

  • 原有模型无缝使用:现有的模型权重和配置完全兼容
  • 渐进式迁移:可以选择性启用新功能(默认启用)
  • 配置灵活性:支持固定长度和动态长度两种模式

✅ RoPE 缩放支持

  • 线性缩放:适用于长序列的稳定处理
  • 动态缩放:根据序列长度自适应调整

✅自动检查配置兼容性(新增辅助函数):

from model.model_minimind import check_config_compatibility

# 检查配置是否合理
is_compatible = check_config_compatibility(config, warn=True)

常见警告(本质是不一致问题)

  • 配置冲突max_position_embeddings=Nonedynamic_rope=False
  • 功能未生效:配置了 rope_scalingdynamic_rope=False

性能考虑

内存使用

  • 动态模式:内存使用随序列长度线性增长
  • 固定模式:内存使用预先确定,更可预测

计算复杂度

  • 注意力机制:O(n²) 复杂度,序列越长计算越重
  • RoPE计算:O(n) 复杂度,影响相对较小

常见问题

Q: 原有模型需要重新训练吗?

A: 不需要。现有模型权重完全兼容,并默认启用无上下文策略。

Q: 动态扩展会影响性能吗?

A: 只在首次扩展时有少量计算开销,之后性能与固定长度相同。

Q: 如何处理内存不足?

A: 可以使用梯度检查点、模型并行或减少批次大小来缓解内存压力。

Q: 训练时序列长度还有限制吗?

A: 训练时的 max_seq_len 参数控制数据预处理,但模型本身可以处理更长序列。

迁移指南

无需担心迁移,默认关闭限制并兼容原模型

总之 MiniMind现在能处理任意长度的序列,同时保持与原有代码的完全兼容性!

@zhenyu-02
Copy link

感觉是很好的改进,我在本地复现了一下,推理功能正常。
但这种直白的“外推”通常性能不太好。建议新增一些内插+微调的方式,来获得更好的 context 理解能力。比如 Meta 的 PI:
https://arxiv.org/abs/2306.15595
image

一孔之见供参考。

@hujiyo
Copy link
Author

hujiyo commented Sep 17, 2025

这个pr取消了硬性的上下文长度限制,如果需要让模型实际上拥有更长的上下文处理能力,还是需要在训练阶段逐步逐步扩展训练序列长度,对于已经训练好的旧模型,可以尝试使用长序列继续预训练+再stf

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants