【CPT】可重复性

可重复性

原文链接:https://docs.pytorch.org/docs/stable/notes/randomness.html#avoiding-nondeterministic-algorithms
无法保证在 PyTorch 不同版本、单个提交或不同平台上都能完全重现结果。此外,即使使用相同的种子,CPU 和 GPU 执行之间也可能无法重现结果。

不过,您可以采取一些措施来限制特定平台、设备和 PyTorch 版本的不确定性行为源的数量。首先,您可以控制可能导致应用程序多次执行时行为不同的随机性源。其次,您可以配置 PyTorch,避免对某些操作使用不确定性算法,这样,在给定相同输入的情况下,多次调用这些操作将产生相同的结果。

警告

确定性操作通常比非确定性操作慢,因此模型的单次运行性能可能会降低。然而,确定性可以通过促进实验、调试和回归测试来节省开发时间。

控制随机性来源

PyTorch 随机数生成器

您可以使用它torch.manual_seed()来为所有设备(CPU 和 CUDA)播种 RNG:

import torch
torch.manual_seed(0)

某些 PyTorch 操作可能在内部使用随机数。 torch.svd_lowrank()例如, 就是这么做的。因此,使用相同的输入参数连续多次调用它可能会得到不同的结果。但是,只要torch.manual_seed()在应用程序开始时将 设置为常量,并且消除了所有其他不确定性因素,那么每次在同一环境中运行应用程序时,都会生成相同的一系列随机数。

torch.manual_seed()通过在后续调用之间设置相同的值,也可以从使用随机数的操作中获得相同的结果。

Python

对于自定义运算符,您可能还需要设置 python 种子:

import random
random.seed(0)

其他库中的随机数生成器

如果您或您正在使用的任何库依赖于 NumPy,则可以使用以下方式为全局 NumPy RNG 播种:

import numpy as np
np.random.seed(0)

但是,某些应用程序和库可能使用 NumPy 随机生成器对象,而不是全局 RNG(https://numpy.org/doc/stable/reference/random/generator.html),并且这些对象也需要一致地播种。

如果您正在使用任何其他使用随机数生成器的库,请参阅这些库的文档以了解如何为它们设置一致的种子。

CUDA 卷积基准测试

CUDA 卷积运算所使用的 cuDNN 库可能会在应用程序的多次执行中造成不确定性。当使用一组新的尺寸参数调用 cuDNN 卷积时,一项可选功能可以运行多个卷积算法,并对它们进行基准测试以找到最快的算法。然后,在后续过程中,针对相应的尺寸参数集,将始终使用最快的算法。由于基准测试噪声和硬件差异,即使在同一台机器上,基准测试也可能在后续运行中选择不同的算法。

禁用基准测试功能 会导致 cuDNN 确定性地选择一种算法,但可能会以性能降低为代价。torch.backends.cudnn.benchmark = False

但是,如果您不需要在应用程序的多次执行中进行重现,则启用基准测试功能可能会提高性能 。torch.backends.cudnn.benchmark = True

请注意,此设置与下面讨论的设置不同torch.backends.cudnn.deterministic 。

避免不确定性算法

torch.use_deterministic_algorithms()允许您配置 PyTorch 以在可用的情况下使用确定性算法而不是非确定性算法,并且如果已知操作是非确定性的(并且没有确定性的替代方法),则抛出错误。

请查看文档以torch.use_deterministic_algorithms() 获取受影响操作的完整列表。如果某个操作未按照文档正确执行,或者您需要某个操作的确定性实现,但该操作尚未提供确定性实现,请提交问题: https://github.com/pytorch/pytorch/issues ?q=label:%22module:%20determinism%22

例如,运行非确定性 CUDA 实现torch.Tensor.index_add_() 将引发错误:

>>> import torch
>>> torch.use_deterministic_algorithms(True)
>>> torch.randn(2, 2).cuda().index_add_(0, torch.tensor([0, 1]), torch.randn(2, 2))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: index_add_cuda_ does not have a deterministic implementation, but you set
'torch.use_deterministic_algorithms(True)'. ...

当torch.bmm()使用稀疏密集 CUDA 张量调用时,它通常使用非确定性算法,但是当确定性标志打开时,将使用其替代的确定性实现:

>>> import torch
>>> torch.use_deterministic_algorithms(True)
>>> torch.bmm(torch.randn(2, 2, 2).to_sparse().cuda(), torch.randn(2, 2, 2).cuda())
tensor([[[ 1.1900, -2.3409],
         [ 0.4796,  0.8003]],
        [[ 0.1509,  1.8027],
         [ 0.0333, -1.1444]]], device='cuda:0')

此外,如果您使用 CUDA 张量,并且您的 CUDA 版本为 10.2 或更高版本,则应根据 CUDA 文档 设置环境变量CUBLAS_WORKSPACE_CONFIG : https://docs.nvidia.com/cuda/cublas/index.html#results-reproducibility

CUDA 卷积确定性

虽然禁用 CUDA 卷积基准测试(如上所述)可确保 CUDA 在每次运行应用程序时选择相同的算法,但该算法本身可能是不确定的,除非设置了 torch.use_deterministic_algorithms(True)或 。后者设置仅控制此行为,而后者 会使其他 PyTorch 操作也具有确定性行为。torch.backends.cudnn.deterministic = Truetorch.use_deterministic_algorithms()

CUDA RNN 和 LSTM

在某些 CUDA 版本中,RNN 和 LSTM 网络可能存在非确定性行为。请参阅torch.nn.RNN()和torch.nn.LSTM()了解详细信息及解决方法。

填充未初始化的内存

torch.empty()像和 这样的操作torch.Tensor.resize_()可能会返回包含未初始化内存的张量,这些内存包含未定义的值。如果需要确定性,则将这样的张量作为其他操作的输入是无效的,因为输出将是不确定的。但实际上没有任何方法可以阻止此类无效代码的运行。因此,为了安全起见, 默认情况下torch.utils.deterministic.fill_uninitialized_memory设置为True ,如果 设置为 ,它将用已知值填充未初始化的内存 torch.use_deterministic_algorithms(True)。这将避免出现这种不确定的行为。

然而,填充未初始化的内存会损害性能。因此,如果您的程序有效,并且不使用未初始化的内存作为操作的输入,则可以关闭此设置以获得更好的性能。

数据加载器
DataLoader 将根据多进程数据加载算法中的随机性重新播种工作进程。使用worker_init_fn()生成器来保持可重复性:

def seed_worker(worker_id):
    worker_seed = torch.initial_seed() % 2**32
    numpy.random.seed(worker_seed)
    random.seed(worker_seed)

g = torch.Generator()
g.manual_seed(0)

DataLoader(
    train_dataset,
    batch_size=batch_size,
    num_workers=num_workers,
    worker_init_fn=seed_worker,
    generator=g,
)

Megatron可重复性

摘自:Github Megatron

Megatron training can be bitwise reproducible; to enable this mode use --deterministic-mode. This means that the same training config run twice in the same HW and SW environment should produce identical model checkpoints, losses and accuracy metric values (iteration time metrics may vary).

There are currently three known Megatron optimizations that break reproducibility whilst still producing almost identical training runs:(Megatron有三种已知的优化方法会破坏可重复性,但是对训练结果的复现影响不是很大,近乎相同)

  • The specific NCCL algorithm that is used during an all-reduce (as specified by the environment variable NCCL_ALGO) is important. We have tested the following: ^NVLS, Tree, Ring, CollnetDirect, CollnetChain. The code admits the use of ^NVLS, which allows NCCL the choice of non-NVLS algorithms; its choice seems to be stable.
  • Flash attention is non-deterministic; do not use --use-flash-attn.
  • If using Transformer Engine, you must also set the environment variable NVTE_ALLOW_NONDETERMINISTIC_ALGO=0.

In addition, determinisim has only been verified in NGC PyTorch containers up to and newer than 23.12. If you observe nondeterminism in Megatron training under other circumstances please open an issue.

内容概要:本文主要介绍了一个基于Matlab实现的无人机空中通信仿真项目,旨在通过数值仿真手段研究无人机在空中作为通信节点时的通信性能、信号传播特性和网络拓扑行为。该仿真涵盖了无人机飞行轨迹建模、无线信道建模(如路径损耗、多普勒效应、阴影衰落等)、通信链路建立与中断判断、信号干扰分析以及网络性能评估(如吞吐量、延迟、连接可靠性等)。项目可能结合优化算法或智能控制策略,用于优化无人机位置部署或动态路径规划,以提升通信服务质量。整个仿真系统为研究人员提供了一套完整的工具链,用于验证新型无人机通信协议、协作机制和网络架构的有效性。; 适合人群:具备一定Matlab编程基础和通信原理基础知识,从事无人机、无线通信、网络优化等相关领域研究的研发人员和高校研究生。; 使用场景及目标:① 评估无人机作为空中基站或中继节点的通信覆盖能力和网络性能;② 设计和优化无人机集群的通信拓扑与协同策略;③ 验证新型无线资源分配、移动性管理和抗干扰算法在动态空地网络中的有效性。; 阅读建议:使用者应结合Matlab代码深入理解仿真模型的构建逻辑,重点关注通信信道模块和无人机运动学模型的耦合关系,并可根据实际研究需求,对仿真参数(如环境噪声、飞行速度、天线增益)进行调整,以开展针对性的对比实验和性能分析。
内容概要:本文围绕微电网中光伏发电系统经逆变器带负载的完整仿真模型展开研究,利用Simulink平台构建了从光伏阵列建模、DC-AC逆变器控制(包括PWM调制与电压电流双闭环控制)、并网策略到负载响应的全过程仿真系统。重点分析了系统在不同工况下的动态响应特性与电能质量表现,并对并网控制策略、最大功率点跟踪(MPPT)技术及系统稳定性进行了深入探讨和验证。该模型不仅可用于教学演示微电网的基本架构与运行机制,更为科研提供了可靠的仿真平台,支持对新型控制算法与系统优化方案的有效验证与评估。; 适合人群:具备一定电力电子技术、自动控制理论基础及Simulink/MATLAB操作经验的电气工程、自动化等相关专业的本科生、研究生及科研人员。; 使用场景及目标:①用于高校课程教学中微电网系统结构与运行原理的直观演示;②为科研工作者提供光伏发电并网系统的仿真验证平台,支持开展逆变器控制算法(如双闭环控制、MPPT)、系统稳定性分析及电能质量管理等关键技术的研究与优化。; 阅读建议:建议学习者结合Simulink仿真环境动手搭建模型,重点关注各功能模块间的信号传递关系与关键参数设置,并通过调整光照强度、温度、负载大小等外部条件,观察系统动态响应过程,从而深化对微电网运行特性的理解与掌握。
内容概要:本文围绕“多变量输入超前多步预测”的光伏功率预测问题,提出了一种基于CNN-BiLSTM混合深度学习模型的研究方法,并提供了完整的Matlab代码实现。该模型首先利用卷积神经网络(CNN)提取输入气象数据(如光照强度、温度、湿度等)中的局部关键特征,捕捉变量间的空间相关性;随后,通过双向长短期记忆网络(BiLSTM)充分挖掘时间序列数据中的长期依赖关系,既能利用历史信息,也能结合未来时刻的上下文信息,从而实现对未来多个时间步长的光伏功率进行高精度预测。研究重点在于处理多变量输入和满足超前多步预测的实际工程需求,有效提升了预测的准确性与鲁棒性。; 适合人群:具备一定机器学习和深度学习理论基础,熟悉Matlab编程,从事新能源发电预测、电力系统调度、时间序列分析等相关领域的研究人员和工程技术人员。; 使用场景及目标:① 解决光伏出力受多重气象因素影响的复杂非线性预测问题;② 实现未来一段时间(如未来24小时)的功率超前多步预测,为电网调度、储能管理和电力市场交易提供决策依据;③ 学习和复现先进的CNN与BiLSTM融合模型在能源预测领域的具体应用。; 阅读建议:使用者应重点关注模型的网络结构设计、多变量数据预处理流程以及多步预测的实现策略。建议结合提供的Matlab代码,自行准备或替换实际的光伏电站运行数据与气象数据,通过调整模型超参数(如卷积核大小、LSTM隐藏层维度、训练周期等)进行实验,以深入理解模型性能并将其应用于具体的科研或工程项目中。
内容概要:本文介绍了一种基于Simulink的光伏储能单相逆变器并网仿真模型,系统性地实现了光伏储能系统与电网之间的能量转换与并网控制全过程。该模型涵盖逆变器的PWM调制、并网同步控制、功率调节策略以及储能单元的能量管理机制,能够精确模拟光照强度变化、负载波动及电网扰动等多种实际运行工况下的系统动态响应特性。通过模块化建模方法,模型具备良好的可扩展性与灵活性,便于研究人员对并网电能质量、控制算法性能及系统稳定性进行深入分析与优化设计。; 适合人群:具备电力电子、新能源发电或自动控制等相关专业背景的本科高年级学生、研究生,以及从事光伏并网系统研发的工程技术人员。; 使用场景及目标:①作为教学工具,帮助学生理解光伏并网逆变器的工作原理与控制逻辑;②服务于科研项目,用于并网控制算法(如PI、PR、重复控制等)的设计、仿真验证与性能对比;③辅助完成毕业设计或工程项目中的系统仿真环节;④为实际工程应用提供前期仿真验证与技术预研支持。; 阅读建议:建议使用者在学习前巩固电力电子技术和可再生能源系统的基础理论,按照模型结构逐步搭建与调试;可利用文中提供的仿真框图和参数设置进行复现,并尝试引入不同工况(如光照突变、电网电压波动等)以评估系统的鲁棒性与适应性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值