[2026春季][T2-2-1]ChaoticLuna#188
Open
ChaoticLuna wants to merge 13 commits into
Open
Conversation
added 13 commits
June 16, 2026 23:36
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Generator_抽象赛题报告.pdf
HONOR_CODE.md
REFERENCE.md
2026 春季人工智能大赛赛题报告
1. 总体架构
实现由四层组成:
Generator句柄与GeneratorImpl多态接口,统一管理 seed、state、device 和 mutex;CPUGeneratorImpl管理std::mt19937状态,CUDAGeneratorImpl管理 Philox seed/subsequence;manual_seed(uint64_t)统一重置默认状态;Uniform、Normal、KaimingUniform、Rand、Randn和普通Dropout接收显式 Generator,缺省时使用目标设备默认 Generator。CPU/CUDA 随机分布与 Dropout 支持
FLOAT16、BFLOAT16、FLOAT32、FLOAT64。当前不覆盖 AlphaDropout、FeatureDropout、inplace Dropout 和 CUDA Graph RNG 状态管理。2. Generator / GeneratorImpl 模块
本章介绍随机数基础设施的核心抽象,包括 Generator Handle、GeneratorImpl 多态接口、默认 Generator 管理及辅助接口,并分析其与 PyTorch Generator 的接口语义关系。该模块主要完成以下内容:
2.1. 实现概述与接口对齐说明
Generator 模块负责随机数系统的状态管理,不直接绑定某一种随机算法。整体职责如下:
Generator:用户侧可持有的轻量句柄,对外提供统一的 seed、state、device 与 clone 接口;GeneratorImpl:后端实现的抽象基类,定义统一随机数状态接口;CPUGeneratorImpl/CUDAGeneratorImpl:CPU 与 CUDA 后端的具体实现;随机算子不直接依赖
std::mt19937、curand或 Philox 的实现细节,而是先接收可选的Generator句柄,再由get_generator_or_default解析为对应后端实现。未传入 Generator 时,算子根据目标 Tensor 的设备选择默认 Generator;显式传入时优先使用用户指定状态。这使随机数消费者与底层随机数生成器解耦,也为后续接入其他设备后端预留了扩展位置。相关核心实现在以下文件中:
infini_train/include/generator.hinfini_train/src/generator.ccinfini_train/src/core/runtime/cpu/cpu_generator_impl.{h,cc}infini_train/src/core/runtime/cuda/cuda_generator_impl.{h,cc}Generator持有std::shared_ptr<GeneratorImpl>。复制 Generator 时复制的是句柄,两个句柄共享同一个随机状态;需要独立状态时使用clone()深拷贝 Impl。默认构造的Generator为 undefined 状态,与 PyTorchat::Generator的默认构造语义一致,不能作为已初始化的随机源使用。2.2. 状态与线程安全设计
seed 用于初始化随机序列,state 则表示随机序列已经推进到的位置。一次随机算子调用会推进 Generator 的内部状态,因此连续调用不会重复得到同一段随机序列;通过保存并恢复 state,可以准确重放保存点之后的随机结果。
GeneratorImpl 提供
mutex_。CPU 随机 kernel 在整个生成循环期间持锁;CUDA kernel 在预留 Philox subsequence 时持锁,随后将 seed 和 subsequence 作为 kernel 参数传入设备端。全局manual_seed也会在重置默认状态时持锁。该策略遵循 PyTorch 的调用方持锁惯例:Generator 不承诺所有公开状态操作自动线程安全,调用方在需要组合多个状态读写操作时可通过Generator::mutex()建立临界区。2.3. 默认 Generator 与全局种子
CPU 后端通过
getDefaultCPUGenerator()返回进程内唯一的默认 CPU Generator。CUDA 后端通过getDefaultCUDAGenerator(device_index)返回指定设备的默认 Generator,每个设备对应独立状态来源。默认 Generator 首次获取时使用非确定性随机种子初始化,后续获取同一设备时返回同一状态来源。框架级
manual_seed(uint64_t seed)依次重置 CPU 默认 Generator 和所有可用 CUDA 设备的默认 Generator。这样,参数初始化、Rand/Randn和 Dropout 在相同 seed、相同设备、相同调用顺序下可以稳定复现。2.4. 与 PyTorch 的对齐与差异
基本一致的行为如下:
set_current_seed、current_seed、seed、get_state、set_state、device、clone的职责一致;当前未完全对齐的部分如下:
std::shared_ptr,PyTorch 使用c10::intrusive_ptr,因此没有 PyTorch 中unsafeReleaseGeneratorImpl()一类的所有权转移接口。std::mt19937的流序列化结果和正态缓存构造UINT8Tensor state;该格式可在同一构建环境恢复,但不承诺跨标准库实现或跨编译器版本稳定。graphsafe_get_state()、graphsafe_set_state()及 capture 专属随机状态。3. CPU 后端、CUDA 后端与随机算子接入
本章介绍 CPU Generator 与 CUDA Generator 的状态组织、随机数消费方式,以及初始化和训练期随机算子如何接入统一 Generator 接口。CPU 与 CUDA 共享 Generator 抽象,但不要求同一 seed 下产生逐元素一致的随机值。
3.1. 后端设计概览
std::mt19937engine 与正态缓存curandStatePhilox4_32_10_tkernel3.2. CPU Generator 实现
CPU 后端使用
std::mt19937作为核心随机引擎。CPUGeneratorImpl保存初始 seed、Mersenne Twister engine 状态,以及 float/double 正态分布的 Box-Muller 缓存样本。重设 seed 时会清空两种正态缓存并重新初始化 engine,避免旧缓存影响新序列。CPU 分布 kernel 使用
uniform_real_distribution与normal_distribution辅助实现。Uniform 会通过random()或random64()取原始随机比特并映射至目标区间;Normal 使用 Box-Muller 变换,在可用时保存第二个样本以减少随机数消耗。该设计确保 Normal 的缓存也会被 state 保存和恢复。CPU state 以 CPU
UINT8Tensor 返回。set_state会检查 state 的 device、dtype、最小长度、缓存标志以及std::mt19937反序列化结果;全部验证通过后才更新 Generator,避免部分非法输入损坏原状态。3.2.1. 与 PyTorch 基本一致的行为
3.2.2. 与 PyTorch 的差异
at::mt19937,而当前实现使用 C++ 标准库的std::mt19937;3.3. CUDA Generator 实现
CUDA Generator 保持与 CPU 相同的 seed/state/clone/device 接口,但内部状态采用适合并行 kernel 的 Philox 模型。
CUDAGeneratorImpl保存seed_和next_philox_subsequence_。每次 Uniform、Normal 或 Dropout CUDA kernel 启动前,主机端在 mutex 保护下为该调用预留一段 subsequence;kernel 中每个元素由seed + subsequence + index初始化独立的curandStatePhilox4_32_10_t状态。这种方式避免了不同 kernel 调用重复使用同一随机序列区间,也不会要求 GPU kernel 修改共享 Generator 对象。CUDA state 由 seed 和 subsequence 构成,并以 CPU
UINT8Tensor 保存;恢复 state 后,后续 CUDA 随机调用会从相同 subsequence 继续执行。3.3.1. 与 PyTorch 基本一致的行为
3.3.2. 暂未对齐的语义及原因
CUDAGeneratorState管理更复杂的 CUDA Graph capture 状态;当前实现仅维护 Generator 私有 seed/subsequence 状态;3.4. 初始化、随机张量与 Dropout 接入
初始化层的
Uniform、Normal、KaimingUniform接收可选 Generator,并根据 Tensor 的设备经 dispatch stub 选择 CPU 或 CUDA kernel。Rand和Randn在函数式接口中创建指定 shape、dtype、device 的 Tensor 后,分别复用 Uniform 和 Normal 初始化路径。普通 Dropout 同时接入 CPU 和 CUDA。前向阶段随机生成
UINT8mask,并对保留元素乘以1 / (1 - p);反向阶段使用前向保存的同一 mask 计算梯度,不生成新的随机数,也不额外推进 Generator。Dropout 支持显式 Generator;未传入时自动使用输入 Tensor 所在设备的默认 Generator。CPU 与 CUDA 随机分布、Dropout 均支持
FLOAT16、BFLOAT16、FLOAT32、FLOAT64。对非浮点 dtype 的随机初始化和 Dropout 会进行参数/类型检查,避免以错误的存储布局写入数据。4. 测试与验证
当前测试覆盖 Generator 接口、state 恢复、默认/显式 Generator、初始化、随机张量和 Dropout 等核心路径;完整训练工作流的端到端随机测试仍可作为后续补充。
4.1. 测试内容
UINT8CPU Tensor 约定。cuda:1随机调用只推进cuda:1默认 Generator。单 GPU 环境会按条件跳过该测试。相关测试文件包括:
tests/generator/test_generator.cctests/generator/test_generator_interface.cctests/generator/cuda_only/test_cuda_generator.cctests/autograd/test_autograd_elementwise_backward.cc4.2. 本地复现命令
以下命令已在 WSL Ubuntu 22.04、CUDA 环境下从新的构建目录实际执行。当前工程的 CUDA 源文件需要 C++20 标准库,因此使用 GCC 13,并显式指定 NVCC 的 host compiler 同为 GCC 13;
CMAKE_POLICY_VERSION_MINIMUM用于兼容项目引入的旧版 gflags CMake 配置。无 CUDA 环境可将USE_CUDA设为OFF并省略CMAKE_CUDA_HOST_COMPILER,CPU Generator 测试仍可执行。完整回归可使用:
在本次最终合并后的 CPU+CUDA 构建环境中,上述命令从干净目录完成配置与编译。Generator 相关的 19 个 CPU/CUDA 测试全部通过;完整 CTest 共 270 项,其中 256 项通过,3 项为禁用测试,11 项因特定 Transformer 配置或其他测试条件而跳过,无失败项。
4.3. 本章小结
测试结果表明,Generator 状态在初始化、随机张量和 Dropout 调用之间能够连续推进;全局 seed 和显式 state 恢复均可稳定控制随机行为;CPU 与 CUDA 后端通过同一 Generator 接口提供一致的使用方式。当前覆盖已满足赛题要求的基础设施验证,后续可继续补充训练脚本级端到端可复现性测试和更多随机算子测试。
5. 附录
5.1. Generator / GeneratorImpl 接口与 PyTorch 对齐表
Generatorat::GeneratorGeneratorImplc10::GeneratorImplset_current_seed(seed)set_current_seed(seed)current_seed()current_seed()seed()seed()get_state()get_state()set_state(state)set_state(state)device()device()mutex()mutex()clone()clone()make_generatormake_generatorcheck_generatorcheck_generatorget_generator_or_defaultget_generator_or_defaultgetDefaultCPUGeneratorgetDefaultCPUGeneratorgetDefaultCUDAGeneratorgetDefaultCUDAGeneratormanual_seed(seed)at::manual_seed/torch.manual_seedgraphsafe_get_state/graphsafe_set_stateset_offset/get_offset本人作为 2026 春季启元人工智能大赛(以下简称“比赛”)的参赛选手,郑重承诺严格遵守比赛规则及本诚信守则,秉持诚信、公正、廉洁的参赛原则,自觉维护比赛的公平性与严肃性。本人充分理解并认可,违反本准则将导致参赛资格被取消、比赛成绩作废等相应后果,且愿意承担由此产生的一切责任。
一、参赛诚信承诺
本人保证所提交的赛题PR(Pull Request)中包含的算子实现代码及相关文档,均为本人(及参赛团队,如为团队参赛)在比赛期间独立完成或在明确标注参考来源的基础上进行开发,不存在任何欺诈、抄袭、作弊行为。
本人承诺主动、全面、真实地披露赛题实现过程中所有参考的外部资源,尤其是开源代码资源,不隐瞒任何可能影响比赛公平性的信息。
本人保证不采用任何不正当手段获取比赛优势,包括但不限于窃取其他参赛选手的代码成果、利用非比赛允许的工具或技术、与他人串通作弊等。
二、参考资源说明
本人确认已按比赛要求,将本次赛题实现过程中涉及的参考资源信息单独撰写至
REFERENCE.md文件中,该文件将与本诚信守则一同作为PR附件提交。REFERENCE.md需根据实际参考情况,按以下要求完整填写,信息不完整或虚假填写将视为违反本准则:情况1:无参考外部开源代码及核心实现思路
REFERENCE.md中需明确声明:“本次赛题提交的算子代码、核心算法逻辑及实现方案均为本人(及参赛团队)独立设计与开发,未参考任何外部开源项目、技术文档中的核心代码片段或实现思路,未接受任何第三方的技术指导或代码支持。”情况2:有参考外部开源代码及相关资源
对每个参考资源提供以下信息陈述:
参考开源项目/资源名称
参考资源链接(GitHub/Gitee/论文/技术文档等)
参考的具体内容(请明确说明参考的代码片段、算法逻辑、实现思路等,需标注对应资源的具体位置,如文件路径、代码行数等)
本人对参考内容的修改与优化说明:(请详细说明在参考基础上,本人所做的独立开发、修改、优化工作,体现自身技术贡献)
若是开源项目,提供参考资源的开源协议类型:(如MIT、Apache 2.0、GPL等)
其他需要补充说明的信息
三、禁止行为确认
本人明确知晓并承诺避免以下违反比赛公平性的行为,若存在以下任一情况,自愿接受比赛组委会的相应处罚:
未经授权复制、抄袭他人(包括其他参赛选手、开源项目、商业代码)的代码、算法或技术方案,且未进行明确标注;
隐瞒或虚假披露参考资源信息,包括遗漏重要参考来源、伪造参考内容说明等;
与其他参赛选手或第三方串通,进行代码共享、成果交换等违规协作;
利用比赛平台漏洞、技术缺陷或非比赛允许的工具获取不正当利益;
伪造比赛相关证明材料、提交虚假信息;
其他违反比赛规则及公序良俗的不诚信行为。
四、责任与确认
本人充分理解,比赛组委会将对所有提交的PR进行代码溯源、参考信息核查等公平性审查,若发现本人存在违反本准则的行为,有权随时取消本人的参赛资格、作废比赛成绩,情节严重的将在比赛相关平台进行公示。
若因本人违反本准则导致比赛争议或第三方权益受损(如开源协议侵权等),本人将独立承担全部法律责任及相关损失,与比赛组委会无关。
本人确认已仔细阅读并完全理解本诚信守则的全部内容,自愿签署本准则,接受比赛组委会的监督与审查。
五、签署信息
参赛选手姓名(团队参赛需填写所有成员姓名)
李源,王柯翰,狄凡瑞
签署日期
2026年7月12日
REFERENCE
本次 Generator 抽象赛题在比赛提供的 InfiniTrain 代码库基础上完成。实现过程中参考了 PyTorch 的 Generator 抽象、CPU/CUDA 随机状态管理、分布采样和 Dropout 的接口语义与实现思路;未将 PyTorch 源码直接整体复制到本项目。所有代码均结合 InfiniTrain 的
Tensor、Device、Dispatcher、Autograd 和 CMake 结构重新实现,并由参赛团队完成集成、调试和验证。1. PyTorch Generator、随机分布与 Dropout 实现
资源名称: PyTorch
资源链接:
参考的具体内容:
Generator 抽象与辅助接口
aten/src/ATen/core/Generator.h中Generator、make_generator、check_generator、get_generator_or_default的分层设计及接口语义;infini_train/include/generator.h、infini_train/src/generator.cc。CPU Generator 与 state 管理
aten/src/ATen/CPUGeneratorImpl.cpp中 CPU 默认 Generator、seed 重设、正态分布缓存、clone、state 保存恢复的语义;infini_train/src/core/runtime/cpu/cpu_generator_impl.h、infini_train/src/core/runtime/cpu/cpu_generator_impl.cc;std::mt19937与流序列化实现 CPU state,而非直接使用 PyTorch 的at::mt19937和内部 POD state。CUDA Generator 与 Philox 状态推进
aten/src/ATen/cuda/CUDAGeneratorImpl.cpp中每 GPU 一个默认 Generator、seed/offset 状态、state 保存恢复和 Philox 随机状态推进的设计;infini_train/src/core/runtime/cuda/cuda_generator_impl.h、infini_train/src/core/runtime/cuda/cuda_generator_impl.cc;seed_与next_philox_subsequence_,为每次 CUDA kernel 启动预留 subsequence;未实现 PyTorch 的 CUDA Graph capture 和 graph-safe state。随机分布与 dtype dispatch
aten/src/ATen/core/DistributionsHelper.h中 Uniform、Normal、Box-Muller 缓存及“Generator 负责状态、kernel 负责消费”的设计;aten/src/ATen/native/cpu/DistributionKernels.cpp与 CUDA distribution 代码中默认/显式 Generator 选择、随机分布参数检查和 dtype dispatch 的组织方式;infini_train/include/core/runtime/distributions_helper.h、infini_train/include/core/runtime/distribution_stubs.h、infini_train/src/core/distribution_kernels.cc、infini_train/src/kernels/cuda/distribution.cu。普通 Dropout 的随机语义
aten/src/ATen/native/cuda/Dropout.cu中以随机 mask 驱动前向、反向复用前向 mask、随机状态仅在前向推进的语义;infini_train/include/autograd/dropout.h、infini_train/src/autograd/dropout.cc、infini_train/src/core/dropout_kernels.cc、infini_train/src/kernels/cpu/dropout.cc、infini_train/src/kernels/cuda/dropout.cu;修改与优化说明:
std::shared_ptr、Tensor、Device、DispatchStub、Dispatcher、FunctionCtx与现有 CUDA stream 管理接口下重新组织和实现;Tensor&与 CPU/CUDA dispatch stub;std::mt19937状态的解析校验、Normal 缓存 state 保存恢复和明确的 dtype/参数检查;curandStatePhilox4_32_10_tkernel 实现 subsequence 分配和设备端随机数消费;2. AI工具
资源名称:OpenAI Codex,Claude Code
资源链接:https://openai.com/codex
参考内容:用于协助整理实验记录、分析 benchmark 结果、撰写报告,并辅助生成小范围代码改动方案。
修改与优化:最终代码与实验决策均由参赛团队确认;
协议:不涉及开源代码复用。