Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

能否提供可检查点 #8

Closed
YiQing-Songs opened this issue Oct 7, 2024 · 5 comments
Closed

能否提供可检查点 #8

YiQing-Songs opened this issue Oct 7, 2024 · 5 comments

Comments

@YiQing-Songs
Copy link

在没有改动您源码的情况下,完全按照论文的参数或者您官方提供的参数无法得到论文的效果,大概会差到4到5个点,多次调参也无法得到论文相差不多的效果。

@LchengC
Copy link
Owner

LchengC commented Oct 15, 2024

在没有改动您源码的情况下,完全按照论文的参数或者您官方提供的参数无法得到论文的效果,大概会差到4到5个点,多次调参也无法得到论文相差不多的效果。

您好,您指的是存在性实验结果差距较大还是方向性实验结果差距较大,另外是每一个fold都距离论文中报告的平均结果都差距较大吗?

@YiQing-Songs
Copy link
Author

在没有改动您源码的情况下,完全按照论文的参数或者您官方提供的参数无法得到论文的效果,大概会差到4到5个点,多次调参也无法得到论文相差不多的效果。

您好,您指的是存在性实验结果差距较大还是方向性实验结果差距较大,另外是每一个fold都距离论文中报告的平均结果都差距较大吗?

都不对,不论是存在性还是方向性,另外每个fold的结果,取最好的值可以接近您的效果,但最差的值就是特别低,尤其第二个fold。可能是我的设备的问题?我的设备是24G显存的RTX5000,不知道是不是跟这个有关。但还是希望您能提供可检查点

@lyj963
Copy link

lyj963 commented Oct 16, 2024

在没有改动您源码的情况下,完全按照论文的参数或者您官方提供的参数无法得到论文的效果,大概会差到4到5个点,多次调参也无法得到论文相差不多的效果。

您好,您指的是存在性实验结果差距较大还是方向性实验结果差距较大,另外是每一个fold都距离论文中报告的平均结果都差距较大吗?

都不对,不论是存在性还是方向性,另外每个fold的结果,取最好的值可以接近您的效果,但最差的值就是特别低,尤其第二个fold。可能是我的设备的问题?我的设备是24G显存的RTX5000,不知道是不是跟这个有关。但还是希望您能提供可检查点

我觉得应该是代码中的图部分CGEConv类内置了一些scatter等具有不确定性的函数导致的,这样即使在同设备同超参条件下两次的训练结果也会有差异,在不同设备上差异也会比较大;我对utils.py中的setup_seed()函数及model中CGEConv类进行修改之后,保证了在同超参条件下每次训练结果完全一致,EventStoryLine数据集的方向性实验总f1为46.35,和论文中的47.8差不多,差异这个应该是不同的硬件设备和配置了不同环境导致的,我是用了一块A100训练的和作者硬件不同,为了训练的确定性和匹配硬件cuda版本,我使用的torch版本为1.13.1+cu117。

@lyj963
Copy link

lyj963 commented Oct 16, 2024

在没有改动您源码的情况下,完全按照论文的参数或者您官方提供的参数无法得到论文的效果,大概会差到4到5个点,多次调参也无法得到论文相差不多的效果。

您好,您指的是存在性实验结果差距较大还是方向性实验结果差距较大,另外是每一个fold都距离论文中报告的平均结果都差距较大吗?

作者您好,您代码中的CGE.py因为使用了torch_geometric,图的消息传递函数中有scatter等具有非确定性的函数,所以即使同超参情况下在相同硬件下,每次结果也会有差异,我对您代码中的model/CGE.py和utils.py进行了一些改动,这样每次训练的结果就完全一致了(只要硬件和环境一致),希望您能参考,另外为了保证训练的完全确定性,torch版本最好也在1.13及以上,否则torch.use_deterministic_algorithms可能会保错。
主要是更改了以下两处:
1、model/CGE.py的class CGEConv(MessagePassing)类中,增加了以下部分:
from torch_sparse import SparseTensor
for edge_type, edge_index in edge_index_dict.items():
"""#将edge_index改成sparsetensor来保证确定性"""
edge_index = SparseTensor(row=edge_index[0], col=edge_index[1], value=None,
sparse_sizes=(x.shape[0], x.shape[0])) #将edge_index改成sparsetensor来保证确定性
2、utils.py中的setup_seed函数改为:
def setup_seed(seed):
# seed init.
random.seed(seed)
np.random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)

# torch seed init.
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed) # if you are using multi-GPU.

torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.enabled = False # train speed is slower after enabling this opts.

# https://pytorch.org/docs/stable/generated/torch.use_deterministic_algorithms.html
# CUDA版本高的话需要加这个才能保证训练一致性
#os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':16:8' #性能会降低
os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8' #增加内存消耗
# avoiding nondeterministic algorithms (see https://pytorch.org/docs/stable/notes/randomness.html)
torch.use_deterministic_algorithms(True,warn_only=False) #非确定性的函数可以被这个语句检查出来 需要设置CUBLAS_WORKSPACE_CONFIG

改动参考了以下的内容,如您方便可以邮件交流([email protected]):
https://github.com/user-attachments/assets/f842bedc-78a4-466d-a88f-504423ab2e31
pyg-team/pytorch_geometric#3175
https://docs.nvidia.com/cuda/archive/11.4.0/cublas/index.html
https://zhuanlan.zhihu.com/p/621419599

@LchengC
Copy link
Owner

LchengC commented Oct 17, 2024

在没有改动您源码的情况下,完全按照论文的参数或者您官方提供的参数无法得到论文的效果,大概会差到4到5个点,多次调参也无法得到论文相差不多的效果。

您好,您指的是存在性实验结果差距较大还是方向性实验结果差距较大,另外是每一个fold都距离论文中报告的平均结果都差距较大吗?

作者您好,您代码中的CGE.py因为使用了torch_geometric,图的消息传递函数中有scatter等具有非确定性的函数,所以即使同超参情况下在相同硬件下,每次结果也会有差异,我对您代码中的model/CGE.py和utils.py进行了一些改动,这样每次训练的结果就完全一致了(只要硬件和环境一致),希望您能参考,另外为了保证训练的完全确定性,torch版本最好也在1.13及以上,否则torch.use_deterministic_algorithms可能会保错。 主要是更改了以下两处: 1、model/CGE.py的class CGEConv(MessagePassing)类中,增加了以下部分: from torch_sparse import SparseTensor for edge_type, edge_index in edge_index_dict.items(): """#将edge_index改成sparsetensor来保证确定性""" edge_index = SparseTensor(row=edge_index[0], col=edge_index[1], value=None, sparse_sizes=(x.shape[0], x.shape[0])) #将edge_index改成sparsetensor来保证确定性 2、utils.py中的setup_seed函数改为: def setup_seed(seed): # seed init. random.seed(seed) np.random.seed(seed) os.environ['PYTHONHASHSEED'] = str(seed)

# torch seed init.
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed) # if you are using multi-GPU.

torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.enabled = False # train speed is slower after enabling this opts.

# https://pytorch.org/docs/stable/generated/torch.use_deterministic_algorithms.html
# CUDA版本高的话需要加这个才能保证训练一致性
#os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':16:8' #性能会降低
os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8' #增加内存消耗
# avoiding nondeterministic algorithms (see https://pytorch.org/docs/stable/notes/randomness.html)
torch.use_deterministic_algorithms(True,warn_only=False) #非确定性的函数可以被这个语句检查出来 需要设置CUBLAS_WORKSPACE_CONFIG

改动参考了以下的内容,如您方便可以邮件交流([email protected]): https://github.com/user-attachments/assets/f842bedc-78a4-466d-a88f-504423ab2e31 pyg-team/pytorch_geometric#3175 https://docs.nvidia.com/cuda/archive/11.4.0/cublas/index.html https://zhuanlan.zhihu.com/p/621419599

感谢您对iLIF论文代码部分训练的确定性修改方面做出的卓越贡献,后续实验验证后会更新在该代码中~

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

No branches or pull requests

3 participants