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

【Paddle Toolkit Development Competition No.3】support neural operator on paddle #1018

Closed
wants to merge 20 commits into from

Conversation

xiaoyewww
Copy link

PR types

New features

PR changes

APIs

Describe

support neural operator on paddle

Copy link

paddle-bot bot commented Nov 14, 2024

Thanks for your contribution!

Copy link
Collaborator

@HydrogenSulfate HydrogenSulfate left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

代码有很多问题,可以按照review建议全局检查下

from ppsci.contrib.neuralop.training import CheckpointCallback
from ppsci.contrib.neuralop.utils import count_model_params

device = "cpu"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

paddle与torch不同,torch的Tensor、Module默认创建在CPU上,而paddle默认创建在当前设备(一般是GPU)上,所以比较好的方式是在开头直接把paddle的当前设备设置为cpu,这样后续所有的操作都不需要再通过device去设置了。

Suggested change
device = "cpu"
device = "cpu"
paddle.device.set_device(device)

factorization="tucker",
rank=0.42,
)
model = model.to(device)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

删除,其余类似的地方也可以删除

Comment on lines 56 to 62
optimizer = paddle.optimizer.Adam(
learning_rate=8e-3, parameters=model.parameters(), weight_decay=1e-4
)
scheduler = paddle.optimizer.lr.CosineAnnealingDecay(
learning_rate=optimizer.get_lr(), T_max=30
)
optimizer.set_lr_scheduler(scheduler=scheduler)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

optimizer和lr_scheduler建议按照下面的代码进行设置。

Suggested change
optimizer = paddle.optimizer.Adam(
learning_rate=8e-3, parameters=model.parameters(), weight_decay=1e-4
)
scheduler = paddle.optimizer.lr.CosineAnnealingDecay(
learning_rate=optimizer.get_lr(), T_max=30
)
optimizer.set_lr_scheduler(scheduler=scheduler)
scheduler = paddle.optimizer.lr.CosineAnnealingDecay(
learning_rate=8e-3, T_max=30
)
optimizer = paddle.optimizer.Adam(
learning_rate=scheduler, parameters=model.parameters(), weight_decay=1e-4
)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

preactivation,
):
if paddle.device.cuda.device_count() >= 1:
device = "cuda"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

此处不正确,所有"cuda"的字符串在paddle里要改为"gpu",同理"cuda:x"要改为"gpu:x"(假设x是卡号)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

确认下这类单测文件能在GPU环境下跑通吗?device="cuda"应该是会报错的吧

grid_test = grid.repeat(n_test, 1)

x_train = paddle.concat((x_train.unsqueeze(1), grid_train.unsqueeze(1)), 1)
x_test = paddle.cat((x_test.unsqueeze(1), grid_test.unsqueeze(1)), 1)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

paddle.cat --> paddle.concat,全局检查一遍

Comment on lines 118 to 119
grid_t.repeat([n_train, 1, spatial_length]),
grid_x.repeat([n_train, temporal_length, 1]),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

paddle.Tensor没有repeat方法,请全局检查

Comment on lines 106 to 112
grid_x = grid_x.reshape(1, 1, spatial_length)
grid_t = grid_t.reshape(1, temporal_length, 1)

x_train = x_train.reshape(n_train, 1, spatial_length).repeat(
[1, temporal_length, 1]
)
x_test = x_test.reshape(n_test, 1, spatial_length).repeat([1, temporal_length, 1])
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这些shape都没带中括号,代码应该都是跑不通的

if grid is not None:
grid = paddle.linspace(grid[0], grid[1], s + 1)[0:-1].view(1, -1)

grid_train = grid.repeat(n_train, 1)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

paddle里repeat应该是tile,并且参数要带中括号

Comment on lines 132 to 133
x_train = x_train.permute(0, 3, 1, 2)
x_test = x_test.permute(0, 3, 1, 2)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

paddle.Tensor没有permute方法,请全局检查

@xiaoyewww
Copy link
Author

@HydrogenSulfate 已经按照要求修改,另外paddle_harmonics这个部分按照下面的pr可以正常跑通
#1013

@HydrogenSulfate
Copy link
Collaborator

HydrogenSulfate commented Dec 4, 2024

@HydrogenSulfate 已经按照要求修改,另外paddle_harmonics这个部分按照下面的pr可以正常跑通 #1013

好的,辛苦修改。另外可以将这个PR里的neuraloperator文件夹暂时迁移至你的个人账户下的私人仓库(xiaoyewww/neuraloperator)吗?因为最后我可能以 submodule 的形式集成到 PaddleScience,然后迁移完后加我一下权限即可,谢谢~

@xiaoyewww
Copy link
Author

@xiaoyewww xiaoyewww closed this Dec 13, 2024
@co63oc
Copy link
Contributor

co63oc commented Dec 16, 2024

https://github.com/PFCCLab/neuraloperator 这里是否能加上 neuralop 下 tests 目录, tltorch改为tlpaddle

pytest neuralop/*/tests neuralop/tests/

image

https://github.com/co63oc/paddle_neuraloperator
examples/plot_incremental_FNO_darcy.py 也可以运行
代码重复我就不再提交PR了

@xiaoyewww
Copy link
Author

xiaoyewww commented Dec 17, 2024

https://github.com/PFCCLab/neuraloperator 这里是否能加上 neuralop 下 tests 目录, tltorch改为tlpaddle

pytest neuralop/*/tests neuralop/tests/

image

https://github.com/co63oc/paddle_neuraloperator examples/plot_incremental_FNO_darcy.py 也可以运行 代码重复我就不再提交PR了

@co63oc 好的,请问tests的目录也还是按照原来一样吗,还是统一集中在examples下

@co63oc
Copy link
Contributor

co63oc commented Dec 17, 2024

https://github.com/PFCCLab/neuraloperator 这里是否能加上 neuralop 下 tests 目录, tltorch改为tlpaddle

pytest neuralop/*/tests neuralop/tests/

image
https://github.com/co63oc/paddle_neuraloperator examples/plot_incremental_FNO_darcy.py 也可以运行 代码重复我就不再提交PR了

@co63oc 好的,请问tests的目录也还是按照原来一样吗,还是统一集中在examples下

我也不清楚,感觉应该是neuraloperator一样

@HydrogenSulfate
Copy link
Collaborator

https://github.com/PFCCLab/neuraloperator 这里是否能加上 neuralop 下 tests 目录, tltorch改为tlpaddle

pytest neuralop/*/tests neuralop/tests/

image
https://github.com/co63oc/paddle_neuraloperator examples/plot_incremental_FNO_darcy.py 也可以运行 代码重复我就不再提交PR了

@co63oc 好的,请问tests的目录也还是按照原来一样吗,还是统一集中在examples下

跟neuralop文件结构保持一致即可

@xiaoyewww
Copy link
Author

xiaoyewww commented Dec 19, 2024

https://github.com/PFCCLab/neuraloperator 这里是否能加上 neuralop 下 tests 目录, tltorch改为tlpaddle

pytest neuralop/*/tests neuralop/tests/

image

https://github.com/co63oc/paddle_neuraloperator examples/plot_incremental_FNO_darcy.py 也可以运行 代码重复我就不再提交PR了

@co63oc 已经补充tests,另外paddle_neuraloperator我没有权限查看。

test中有几个问题:

  1. neuralop/layers/tests/test_legacy_spectral_convolution.py单测中有些许很小的误差,我修改了一下atol和rtol
  2. neuralop/layers/tests/test_legacy_spectral_convolution.py单测中einsum中不支持complex128,中间有个计算会cast需要转换成complex128

@co63oc
Copy link
Contributor

co63oc commented Dec 19, 2024

https://github.com/PFCCLab/neuraloperator 这里是否能加上 neuralop 下 tests 目录, tltorch改为tlpaddle

pytest neuralop/*/tests neuralop/tests/

image
https://github.com/co63oc/paddle_neuraloperator examples/plot_incremental_FNO_darcy.py 也可以运行 代码重复我就不再提交PR了

@co63oc 已经补充tests,另外paddle_neuraloperator我没有权限查看。

test中有几个问题:

  1. neuralop/layers/tests/test_legacy_spectral_convolution.py单测中有些许很小的误差,我修改了一下atol和rtol
  2. neuralop/layers/tests/test_legacy_spectral_convolution.py单测中einsum中不支持complex128,中间有个计算会cast需要转换成complex128

paddle_neuraloperator 权限已开放
1 测试可以不用设置atol,只设置rtol
2 没有发现einsum complex128问题,测试中如果比较complex128是拆开为image(), real()比较

@xiaoyewww
Copy link
Author

https://github.com/PFCCLab/neuraloperator 这里是否能加上 neuralop 下 tests 目录, tltorch改为tlpaddle

pytest neuralop/*/tests neuralop/tests/

image
https://github.com/co63oc/paddle_neuraloperator examples/plot_incremental_FNO_darcy.py 也可以运行 代码重复我就不再提交PR了

@co63oc 已经补充tests,另外paddle_neuraloperator我没有权限查看。
test中有几个问题:

  1. neuralop/layers/tests/test_legacy_spectral_convolution.py单测中有些许很小的误差,我修改了一下atol和rtol
  2. neuralop/layers/tests/test_legacy_spectral_convolution.py单测中einsum中不支持complex128,中间有个计算会cast需要转换成complex128

paddle_neuraloperator 权限已开放 1 测试可以不用设置atol,只设置rtol 2 没有发现einsum complex128问题,测试中如果比较complex128是拆开为image(), real()比较

感谢,我晚上修改一下

@xiaoyewww
Copy link
Author

@co63oc 已按照要求修改。

@co63oc
Copy link
Contributor

co63oc commented Dec 22, 2024

pytest可以了,就是还少一个文件 neuraloperator/examples/plot_incremental_FNO_darcy.py @xiaoyewww

@xiaoyewww
Copy link
Author

xiaoyewww commented Dec 22, 2024

pytest可以了,就是还少一个文件 neuraloperator/examples/plot_incremental_FNO_darcy.py @xiaoyewww

@co63oc 这个文件我看是main上才有的,比赛题目上要求的tags是0.3.0,没有这个文件。如果需要的话我补充一下

@co63oc
Copy link
Contributor

co63oc commented Dec 22, 2024

pytest可以了,就是还少一个文件 neuraloperator/examples/plot_incremental_FNO_darcy.py @xiaoyewww

@co63oc 这个文件我看是main上才有的,比赛题目上要求的tags是0.3.0,没有这个文件。如果需要的话我补充一下

好的那不用加了感谢修改 @xiaoyewww

@co63oc
Copy link
Contributor

co63oc commented Dec 23, 2024

image
examples/plot_UNO_darcy.py 运行时多一些条纹不知道是什么问题,我修改代码也是这问题 @xiaoyewww

@xiaoyewww
Copy link
Author

image examples/plot_UNO_darcy.py 运行时多一些条纹不知道是什么问题,我修改代码也是这问题 @xiaoyewww

@co63oc 这个好像是随机性的问题,我之前用padiff测试网络没什么问题

@co63oc
Copy link
Contributor

co63oc commented Dec 23, 2024

能复现吗,如果能复现排除环境配置问题,再看其他什么问题 @xiaoyewww

@xiaoyewww
Copy link
Author

能复现吗,如果能复现排除环境配置问题,再看其他什么问题 @xiaoyewww

@co63oc 之前padiff的脚本,需要修改一下neural的命名:

from padiff import auto_diff
import torch
import paddle

import paddle_neuralop
import neuralop

module = neuralop.models.UNO(
    3,
    1,
    hidden_channels=64,
    projection_channels=64,
    uno_out_channels=[32, 64, 64, 64, 32],
    uno_n_modes=[[16, 16], [8, 8], [8, 8], [8, 8], [16, 16]],
    uno_scalings=[[1.0, 1.0], [0.5, 0.5], [1, 1], [2, 2], [1, 1]],
    horizontal_skips_map=None,
    n_layers=5,
    domain_padding=0.2,
)
layer = paddle_neuralop.models.UNO(
    3,
    1,
    hidden_channels=64,
    projection_channels=64,
    uno_out_channels=[32, 64, 64, 64, 32],
    uno_n_modes=[[16, 16], [8, 8], [8, 8], [8, 8], [16, 16]],
    uno_scalings=[[1.0, 1.0], [0.5, 0.5], [1, 1], [2, 2], [1, 1]],
    horizontal_skips_map=None,
    n_layers=5,
    domain_padding=0.2,
)

inp = paddle.rand((32, 3, 16, 16)).numpy().astype("float32")
inp = ({'x': torch.as_tensor(inp) },
     {'x': paddle.to_tensor(inp)})

auto_diff(module, layer, inp, atol=1e-4, auto_init=True)

image

我想起来好像数据集中随机性的问题,过去太久了想不起来了,当时看了一下无法对齐,所以只用padiff验证了一下网络

@co63oc
Copy link
Contributor

co63oc commented Dec 23, 2024

image
examples/plot_UNO_darcy.py 运行时是这样的条纹的显示吗,或者其他不同的显示
@xiaoyewww

@xiaoyewww
Copy link
Author

image examples/plot_UNO_darcy.py 运行时是这样的条纹的显示吗,或者其他不同的显示 @xiaoyewww

@co63oc 我看了一下好像是有问题,我晚上回去检查一下

@xiaoyewww
Copy link
Author

image examples/plot_UNO_darcy.py 运行时是这样的条纹的显示吗,或者其他不同的显示 @xiaoyewww

@co63oc 模型精度没什么问题,应该是paddle和torch在初始化权重上带来的问题,paddle的初始化权重无法有效收敛。200个epoch以后这种条纹显示就不明显了。

我分别跑了一下20,100,200,300epoch的数据:

image image image image

@co63oc
Copy link
Contributor

co63oc commented Dec 24, 2024

@co63oc 模型精度没什么问题,应该是paddle和torch在初始化权重上带来的问题,paddle的初始化权重无法有效收敛。200个epoch以后这种条纹显示就不明显了。

我分别跑了一下20,100,200,300epoch的数据:

初始化权重有差异但是epoch数量差别比较大,不知道是不是paddle有bug

@xiaoyewww
Copy link
Author

@co63oc 我这边测了一下初始化的权重,发现paddle的bias一直是0,这个地方可能有点异常
image

@co63oc
Copy link
Contributor

co63oc commented Dec 25, 2024

@co63oc 我这边测了一下初始化的权重,发现paddle的bias一直是0,这个地方可能有点异常 image

paddle有的函数有配置bias的参数,比如Conv1D https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/Conv1D_cn.html#conv1d,
image
参数名称 bias_attr,在torch中参数名称是bias,bias_attr默认是None,表示使用默认的偏置参数属性,如果为bool,只支持为 False,表示没有偏置参数
image
bias_attr值为None和False不是一样,转换配置可能会有问题

@HydrogenSulfate
Copy link
Collaborator

@co63oc 模型精度没什么问题,应该是paddle和torch在初始化权重上带来的问题,paddle的初始化权重无法有效收敛。200个epoch以后这种条纹显示就不明显了。
我分别跑了一下20,100,200,300epoch的数据:

初始化权重有差异但是epoch数量差别比较大,不知道是不是paddle有bug

paddle和torch采用的默认层初始化函数不同,paddle的weight是xavier初始化,bias应该默认全0,torch是kaiming norm,bias是kaiming uniform好像。

@xiaoyewww
Copy link
Author

@co63oc 模型精度没什么问题,应该是paddle和torch在初始化权重上带来的问题,paddle的初始化权重无法有效收敛。200个epoch以后这种条纹显示就不明显了。
我分别跑了一下20,100,200,300epoch的数据:

初始化权重有差异但是epoch数量差别比较大,不知道是不是paddle有bug

paddle和torch采用的默认层初始化函数不同,paddle的weight是xavier初始化,bias应该默认全0,torch是kaiming norm,bias是kaiming uniform好像。

https://github.com/pytorch/pytorch/blob/main/torch/nn/modules/conv.py#L176
https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/nn/layer/conv.py#L654
@HydrogenSulfate @co63oc 看了是这样的,那这里还需要进行修改吗

@HydrogenSulfate
Copy link
Collaborator

HydrogenSulfate commented Dec 25, 2024

@co63oc 模型精度没什么问题,应该是paddle和torch在初始化权重上带来的问题,paddle的初始化权重无法有效收敛。200个epoch以后这种条纹显示就不明显了。
我分别跑了一下20,100,200,300epoch的数据:

初始化权重有差异但是epoch数量差别比较大,不知道是不是paddle有bug

paddle和torch采用的默认层初始化函数不同,paddle的weight是xavier初始化,bias应该默认全0,torch是kaiming norm,bias是kaiming uniform好像。

https://github.com/pytorch/pytorch/blob/main/torch/nn/modules/conv.py#L176 https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/nn/layer/conv.py#L654 @HydrogenSulfate @co63oc 看了是这样的,那这里还需要进行修改吗

我觉得可以先确认下是不是将paddle的参数默认分布改为kaiming分布之后,训练的结果能恢复正常?如果是这样的话,我觉得可以把这个文件复制到你的项目里,然后统一给每个自定义层的__init__里apply递归调用一下即可:
https://github.com/PaddlePaddle/PaddleScience/blob/develop/ppsci/utils/initializer.py

伪代码如下:

def kaiming_init(m):
    if isinstance(m, nn.Linear):
        kaiming_normal(m.weight)
        ...    
    ... 

class A:
   def __init__(..):
       ... create parameter ..
       ....
       ...
       self._init_weights()

   def _init_weights(self):
        self.apply(kaiming_init)

其中kaiming_init应该只需要写一个通用的就行

@xiaoyewww
Copy link
Author

目前权重初始化后20epoch的训练效果对比如下:
image

image

@HydrogenSulfate @co63oc 麻烦两位再review一下还有问题吗

@co63oc
Copy link
Contributor

co63oc commented Dec 26, 2024

@xiaoyewww
image
这里地址换下 https://github.com/PFCCLab/paddle_harmonics 成员应该是有权限访问,
pip install -e . 中-e选项是编辑的含义,如果只安装不修改代码建议去掉
如果执行了pip install,export PYTHONPATH 是不是不需要
其他没问题了

@xiaoyewww
Copy link
Author

@xiaoyewww image 这里地址换下 https://github.com/PFCCLab/paddle_harmonics 成员应该是有权限访问, pip install -e . 中-e选项是编辑的含义,如果只安装不修改代码建议去掉 如果执行了pip install,export PYTHONPATH 是不是不需要 其他没问题了

@co63oc paddle_harmonics里面少安装了一些文件或者多了一些import无用代码,这个需要修改一下paddle_harmonics。
image

@xiaoyewww xiaoyewww restored the paddle-neuralop branch December 26, 2024 15:55
@co63oc
Copy link
Contributor

co63oc commented Dec 27, 2024

import paddle_aux是这样只引入不调用,使用noqa标记跳过检查,可以执行其中一些初始化代码
安装目录没有包含子目录是配置文件pyproject.toml问题,已修改目录,增加一个星号,然后import examples可以了,重复安装时需要删除build目录重新生成
image

pip install也不用修改参数了,更新代码后也可以使用,没什么问题了

@xiaoyewww
Copy link
Author

import paddle_aux是这样只引入不调用,使用noqa标记跳过检查,可以执行其中一些初始化代码 安装目录没有包含子目录是配置文件pyproject.toml问题,已修改目录,增加一个星号,然后import examples可以了,重复安装时需要删除build目录重新生成 image

pip install也不用修改参数了,更新代码后也可以使用,没什么问题了

@co63oc 感谢,已经修改

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants