返回首页

24小时热榜

12作者: JohannaAlmeida大约 5 小时前原帖
简要概述:对 PyTorch 和 Triton 的内部进行了分支修改。将注意力机制改为线性第一层、中间的二次层和最后的线性层。推理速度显著提升,测试中的困惑度影响较小。 完整注意力 O(n²):17.96秒 / 5.6 个标记/秒 混合注意力 O(n·W + n·D):0.35秒 / 286.6 个标记/秒 我正在用 PyTorch 从零开始构建一个小型 Rust 语言模型。这不是微调,而是从随机初始化开始的字节级训练,训练数据来自一个以 Rust 为主的语料库,链接在此:https://codeberg.org/JohannaJuntos/Sisyphus 模型和训练设置 该模型有 2560 万个参数,上下文长度为 512。它使用 256 的字节级词汇,包含 8 层、8 个头和 512 维的嵌入。位置嵌入是学习得来的,嵌入和语言模型头的权重是绑定在一起的。 训练在一个 173.5M 字节的 Rust 语料库上进行了 30,000 步,使用单个 RTX 4060 Ti 8GB 显卡。最终指标为训练损失 0.5834,验证损失 0.8217,困惑度 2.15。最佳验证损失出现在大约第 18,500 步,这表明可能存在一些晚期过拟合或停滞现象。 架构 该模型是一个 GPT 风格的解码器,但在每一层中用混合注意力块替代了标准的完整注意力。这种设计结合了局部窗口因果注意力和类似 GRU 的递归状态路径,以及一个学习到的门控机制,用于混合这两者。 局部路径处理短程语法,而递归路径则携带压缩的长程状态。门控偏置在训练早期被初始化为偏向局部注意力。 推理使用 Triton 内核和自定义的 torch.library 操作。 语料库 最大的提升来自于语料库的扩展。 运行开始时约有 31MB 的数据,来自 Rust 官方源和主要项目,如 rustc、cargo、rust analyzer、tokio、serde、ripgrep、clap 和 axum。通过克隆前 500 个 crate,语料库扩展到 173.5M 字节,成功克隆 461 个。 这种扩展的影响超过了任何架构上的变化。 推理性能 完整注意力的运行速度约为每秒 5.6 个标记,而使用 KV 缓存的混合注意力达到了每秒 286.6 个标记。这是约 51 倍的加速,且没有明显的质量损失。 KV 缓存使用 64 个标记的热窗口存储在显存中,而旧的标记则被压缩为 8 位的幅度和角度,并可以选择性地提升回全精度。这使得该设置的有效复杂度从二次降低到接近线性。 质量 表面的 Rust 语法看起来不错,导入和函数签名通常是合理的。语义仍然较弱,重复和递归模式较为常见。它看起来像 Rust,但尚未具备良好的推理能力。 有趣之处 该项目结合了从零开始的字节级 Rust 预训练、混合局部注意力和递归架构、跨 Rust 生态系统的大规模语料库扩展,以及一种实用的 KV 缓存分页策略,在消费级 GPU 上实现了显著的加速。 下一步 我计划进行消融实验,比较混合注意力与仅局部和仅递归变体,评估大约 18,500 步的检查点与最终模型,并增加语法级验证,如解析和编译生成的代码。我还想探索将上下文长度从 256 扩展到 2048,并测试在语料库增大后,从字节级切换到 BPE 是否变得有意义。 问题 对于小型代码模型,除了困惑度之外,哪些评估最有用? 有没有人看到混合局部加递归注意力在代码生成中表现良好? 考虑到这个设置,你会优先考虑更多的标记、更长的上下文,还是首先进行干净的消融实验?