ops-rand:AI 训练中的随机数生成
AI 训练离不开随机数。权重初始化要随机、Dropout 要随机、数据打乱要随机、噪声注入要随机。每一次随机操作的背后都有一组随机数生成器在工作。CANN 的 ops-rand 仓库提供了 NPU 上的随机数生成算子——Dropout、随机 Shuffle、随机初始化、正态分布采样等。这些操作在训练中平均每步调用几十次如果在 CPU 上生成再拷到 NPU开销不可忽视。AI 为什么需要随机数模型训练的每个阶段都用到了随机数权重初始化。Xavier 初始化或 Kaiming 初始化——每层权重用服从特定分布均匀分布或正态分布的随机数填充。初始化太差模型可能不收敛。Dropout。训练时每条数据随机丢弃一部分神经元——每个神经元被保留的概率是 p。需要生成跟激活 Tensor 形状相同的二值掩码。数据打乱。每个 epoch 把训练数据打乱一次。虽然这个操作通常 CPU 上做但 NPU 上的 shuffle 算子可以避免 CPU ↔ NPU 的数据搬运。噪声注入。差分隐私训练、对抗训练等场景需要在梯度上叠加随机噪声。ops-rand 提供的算子覆盖了上述所有场景Uniform、Normal、BernoulliDropout 掩码、Multinomial采样。昇腾NPU如何生成随机 Tensorops-rand 的随机数生成在 NPU 内部完成。流程CPU 设置 Seed 和随机数生成算法默认 PhiloxSeed 传给 NPU 的随机数生成器硬件单元随机数生成器并行生成大量随机数——每个 AI Core 有独立的生成器实例生成的随机数直接写入目标 Tensor 的显存地址整个过程 CPU 只需要传一个 Seed8 字节。几 MB 的随机 Tensor 直接在 NPU 显存中生成不经过 CPU 内存。# ops-rand 的使用示例importcann# 在 NPU 上生成正态分布随机 Tensorweightcann.randn([4096,4096],dtypefloat16,seed42)# 生成均匀分布noisecann.rand([4096],dtypefloat32,seed123,low-0.01,high0.01)# 生成 Dropout 掩码maskcann.bernoulli([8,4096],p0.1,seed7)ops-rand 的算子内部调用 CANN Runtime 的随机数生成指令不走 AI Core 的计算单元。随机数生成的带宽约 80 GB/s受显存带宽限制在训练中跟正常算子并行执行。Seed 管理Seed 管理是分布式训练中容易被忽视的细节。单卡训练中每步调用一个 seed 递增的生成器——seedstep确保每步的随机数不同。多卡训练中如果所有卡用同一个 seed每张卡在权重初始化时生成完全相同的随机权重——失去了分布式初始化的意义。HCCL 的通信域初始化时会给每张卡分配一个 rankops-rand 的推荐做法是每张卡的 seed base_seed rank * 1000 step这样每张卡的随机序列不同由 rank 区分但训练可复现只要 base_seed 固定。rankdist.get_rank()base_seed42step0forepochinrange(epochs):forbatchindataloader:seedbase_seedrank*1000step maskcann.bernoulli([8,4096],p0.1,seedseed)# 训练...step1大模型训练中的随机机制大模型训练中随机数的主要消耗者是 Dropout。LLaMA-13B 训练时每步需要做约 40 次 Dropout每 Decoder Block 一次每次 Dropout 的掩码 Tensor 大小跟当前 Batch 的激活 Tensor 一致。Batch4、序列长度 4096、隐藏维度 4096 时一次 Dropout 的掩码是[4, 4096, 4096]的 bool Tensor——约 64MB。40 次 Dropout 总共需要 2.5GB 的随机数。ops-rand 在 NPU 上生成这个 2.5GB 随机数的时间约 30ms80 GB/s 带宽。如果在 CPU 上生成再拷到 NPUCPU 生成约 80ms数据搬运约 20ms合计 100ms。ops-rand 直接在 NPU 上生成节省了 70% 的时间。ops-rand 仓库训练框架集成指南随机数生成器的硬件实现ops-rand 在 NPU 上的随机数生成器用 Philox 算法——一种密码学安全的伪随机数生成器。Philox 用 AES-like 的轮函数把 Seed 和 Counter 加密成随机输出。每个 AI Core 有独立的 Philox 实例。生成随机 Tensor 时每个 Core 负责自己那部分元素的随机数生成——不需要跨 Core 同步。Seed 相同、Counter 不同时不同 Core 的随机序列不相关。Philox 的硬件实现在 NPU 上是一个小型的 AES 加密引擎。它不占用 AI Core 的计算流水线跟模型推理并行执行。Dropout 的掩码生成可以在计算的前向传播开始前就完成。分布式训练中的 Seed 管理实践在分布式训练中Seed 管理的常见实践importnumpyasnpimportrandomimporttorch# 所有进程共用一个 base_seedbase_seed42random.seed(base_seedrank)np.random.seed(base_seedrank)torch.manual_seed(base_seedrank)torch.cuda.manual_seed(base_seedrank)# GPU 场景# CANN 场景cann.manual_seed(base_seedrank)每张卡用base_seed rank确保不同卡产生不同的随机序列。训练可复现通过固定base_seed实现——相同 base_seed 下多次训练产生相同的初始权重和 Dropout 模式。总结ops-rand 是 AI 训练中容易被忽略但不可或缺的组件。它在 NPU 上直接生成随机 Tensor避免了 CPU 生成 数据搬运的开销。Philox 算法的硬件实现提供了高质量的随机序列Dropout 掩码、权重初始化、噪声注入等场景都能直接从 ops-rand 获得性能收益。在分布式训练中正确的 Seed 管理策略确保训练的随机性同时保持可复现性——ops-rand 的 Seed 设计支持了多卡场景下的差异化随机序列生成。参考仓库ops-rand 随机数算子库torchtitan-npu 训练参考v
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2632508.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!