跳到内容

JAX-DIPS/JAX-DIPS

存储库文件导航

日本JAX-DIPS

JAX实现了一个可微分PDE解算器,该解算器具有跨越3D中不规则界面的跳跃条件。

JAX-DIPS实现了神经自举方法(见下文引文)通过利用有效的有限离散化方法来处理空间梯度以及自动微分来训练神经网络参数,来训练紧凑的神经网络替代模型。

  • 紧致模型:与其他训练方法相反,我们表明,当使用有限离散化残差训练网络时,具有1000倍可训练参数的浅层和紧致神经网络可以学习复杂的解。

  • 性能:使用FD计算PDE残差将自动微分限制为仅一阶AD,这大大降低了与评估高阶PDE损失相关的计算/内存成本(如PINN)。与基于反向传播的解算器相比,我们实现了10倍的加速。

  • 准确性:此外,使用精心设计的数值离散化方案处理存在不连续和不规则界面的空间梯度,将数学对称性和约束(例如,通过有限体积离散化实施的守恒定律)告知神经网络在以训练点为中心的本地社区/体素中。这些额外的数学约束提高了PDE在三维空间中学习的神经替代模型的规则性和准确性。

  • 应用数学和机器学习的交叉授粉:JAX-DIPS使利用高级预处理程序成为可能(例如,请参阅炒作)在高性能科学计算社区中开发,用于更快、更准确地训练神经网络模型。

快速示例

泊松解算器提供了一个接口来传入函数,这些函数定义了以下形式中给出的界面PDE的不同术语

 喷气发动机 进口 努皮 作为 jnp公司

 jax_dips._jaxmd模块.实用程序 进口 f32表格
 jax_dips.领域 进口 网格
 jax_dips.解算器.泊松 进口 教练
 jax_dips.实用程序 进口 国际奥委会

初始mesh_fn,坐标_ at = 网格.建造()#---------用于培训的网格节点
xc公司 = jnp公司.林斯空间(克敏,x最大值,编号(_T),数据类型=f32表格)yc公司 = jnp公司.林斯空间(伊敏,ymax公司,纽约(_T),数据类型=f32表格)兹克 = jnp公司.林斯空间(zmin公司,求最大值,编号(_T),数据类型=f32表格)gstate_tr(格式) = 初始化_网格_fn(xc公司,yc公司,兹克)#--------级别集表示的网格节点
xc公司 = jnp公司.林斯空间(克敏,x最大值,Nx(_lvl),数据类型=f32表格)yc公司 = jnp公司.林斯空间(伊敏,ymax公司,Ny_lvl(新阀),数据类型=f32表格)兹克 = jnp公司.林斯空间(zmin公司,求最大值,编号_ lvl,数据类型=f32表格)gstate_lvl(gstate_lvl) = 初始化_网格_fn(xc公司,yc公司,兹克)#----------可视化网格点
不包括 = jnp公司.林斯空间(克敏,x最大值,Nx值(_E),数据类型=f32表格)eyc公司 = jnp公司.林斯空间(伊敏,ymax公司,Ny值(_E),数据类型=f32表格)电子战司令部 = jnp公司.林斯空间(zmin公司,求最大值,数值(_E),数据类型=f32表格)评估_状态 = 初始化_网格_fn(不包括,eyc公司,电子战司令部)#----------定义神经网络代理架构和优化器
优化器字典:字典 ={“优化器名称”:“自定义”,“学习_比率”:1e-3号机组,“计划”: {“调度程序名称”:“指数”,“衰减速率”:0.9},}模型_ ict:字典 ={“名称”:,“模型类型”:“mlp”,“mlp”: {“隐藏层_m”:1,“隐藏_尺寸_ m”:1,“激活_m”:“jnp.tanh”,“隐藏层_p”:2,“隐藏_dim_p”:10,“激活_p”:“jnp.tanh”,},}#----------定义、实例化,然后训练/解决泊松问题
初始化(_fn) = 教练.设置(初始值,目录_bc_fn,phi_fn,mu_m_fn,多个_文件,k _ m _ f n,k_p_fn(千帕_芬),f_米fn,f_p-fn,字母fn,beta_fn(贝塔_芬),非线性算子m,非线性算子p,)模拟状态,解算器fn = 初始化(_fn)(lvl_g状态=gstate_lvl(gstate_lvl),tr_g状态=gstate_tr(格式),评估_状态=评估_状态,纪元(_E)=纪元(_E),批处理大小=批处理大小,多gpu=多gpu,检查点_间隔=检查点_间隔,结果_目录=日志目录,优化器字典=最优(_D),模型_ ict=模型_ ict,)模拟状态,epoch存储,损失(_E) = 解决_fn(模拟状态=模拟状态)#----------将结果保存在vtk文件中
评估(eval_phi) = vmap(虚拟机应用程序)(phi_fn)(评估_状态.R(右))日志 ={“φ”:评估(eval_phi),“u”:模拟状态.解决方案,}存储名称 = 日志目录 + "/" + 分子_名称
国际奥委会.写入vtk手册(评估状态,日志,文件名=存储名称)

图书馆结构

我 我

例子。

模型

模型存储在jax地址.nn模块,并通过获取模型(**model_dict)API定义于jax_dips.nn.configure模块。添加新模型时,只应将其添加到此API。模型参数(即。,模型_ ict)应提供给jax_dips.solvers.poisson.trainer(jax_dips.solvers.poisson.trainer)模块,通常在hydra的yaml配置文件中定义,类似于:

型号:model_type:“mlp”百万像素:隐藏层:1隐藏_尺寸_ m:3activation_m:“jnp.tanh”隐藏层:2隐藏_dim_p:10激活p:“jnp.tanh”资源网:res_blocks_m:3个res_dim_m:40激活m:“nn.tanh”res_blocks_p:3个res_dim_p:80激活p:“nn.tanh”

优化器

通过雅克索普操作税程序包(操作税配置自jax_dips.solvers.optimizers模块;当前呼叫到雅克索普直接由jax_dips.solvers.poisson.trainer模块)。在yaml文件中,可以通过以下方式进行配置

解算器:优化:optimizer_name:“custom”#选项包括“自定义”、“adam”、“rmsprop”、“lbfgs”学习_比率:1e-3sched:#学习速率调度器scheduler_name:“指数”#选项为“指数”、“多项式”衰减速率:0.9

目前,正在选择磅/平方英尺提示雅克索普包含隐式微分的包。

注意:在当前版本中,我们支持使用操作税.

测试

pytest测试/test_*.py父目录中的每个可用测试:

  • 测试_建议:球体围绕长方体旋转360度以复制初始配置。水平集函数中的L2误差应小于1e-4才能通过。平流采用半拉格朗日格式进行,并重新初始化Sussman。
  • 测试_初始化:从球体内部为-1、外部为+1的球体级别集函数开始,我们重复执行Sussman重新初始化,直到级别集的签名距离属性实现。长方体的中心应具有与球体半径相等的水平设置值,长方体拐角应处于预先指定的距离才能通过。
  • 测试几何集成积分球体的表面积及其体积。预计与相关理论值的微小差异将被忽略。
  • 测试噪音:在恒星和球体界面上测试逐点和基于网格的泊松解算器。请注意,在当前实现中,基于网格的解算器不支持批处理,因此速度更快。将在未来版本中修复此问题。

安装

从PyPI do安装最新发布的版本pip安装jax-dip。如果要为jax-dip创建专用虚拟环境,可以使用python3-m venv<my-virtual-env>然后通过激活源<my-virtual-env>/bin/activate然后可以在此环境中安装jax-dip,以确保它不会干扰现有的库安装。注释jax-dip将在您的机器上安装jax,因此建议使用虚拟环境。

开发和使用

0.硬件要求

以下考虑的默认硬件要求适用于带有CUDA版本的NVIDIA GPU>=12.*和CUDA驱动程序版本>=530。但是,如果您使用的是不同的CUDA版本,则应替换要求.txt用你想要的https://storage.googleapis.com/jax-releases/jax_cuda_releases.html。如果您使用不同的硬件(AMD GPU、TPU等),您也可以修改要求.txt相应地或从源代码构建(修改Dockerfile(码头文件))根据上的说明https://jax.readthedocs.io/en/latest/developer.html#构建-源。如果您面临安装问题,请不要在https://github.com/JAX-DIPS/JAX-DIPS问题我们将为您的特殊硬件添加支持。

1.虚拟环境

通过运行以下命令创建虚拟环境

./create_virtualenv.sh

以及环境jax_dips将创建虚拟环境。然后您可以通过以下方式启动此环境源env_jax_dips/bin/activate。完成后,停用.

2.码头

Docker映像提供了一个独立且一致的运行时环境,确保无论主机系统如何,应用程序的行为都相同。我们建议使用此处提供的docker映像,因为它完全加载了用于数据中心规模模拟的库,并针对NVIDIA GPU进行了优化。有关支持的软件和随此容器映像打包的特定版本的完整列表,请参阅框架支持矩阵https://docs.nvidia.com/deeplearning/frameworks/support-matrix/index.html.

前提条件

首先,您需要安装nvidia驱动程序和docker引擎:

容器设置

要个性化您的开发环境,您需要设置.env(英语)包含

IMAGE_NAME=docker.io/porion/jax_dips:可下载的最新#默认docker图像!如果您想构建新的docker映像并将其推送到您首选的docker注册表,请更改此项DATA_PATH=/DATA/#docker容器内的默认数据路径,将镜像DATA_MOUNT_PATH目录DATA_MOUNT_PATH=/DATA#机器内的默认数据装入路径,将镜像到docker容器的DATA_PATH目录RESULT_PATH=/results/#docker容器内的默认结果路径RESULT_MOUNT_PATH=/results/#计算机内的默认结果装载路径REGISTRY=<your-preferred-REGISTRY-name>#(可选)选项包括docker.io(默认)、nvcr.io、ghcr.io等。REGISTRY_USER=<your-REGISTRY-username>#(可选)连接到docker注册表的用户名REGISTRY_ACCESS_TOKEN=<您的注册表访问令牌>#(可选)连接到docker注册表的访问令牌WANDB_API_KEY=未指定#(可选)连接到权重和偏差服务的API密钥JUPYTER_PORT=8888#(可选)端口,用于连接到JUPYTER服务器

拉动开发容器

docker Hub上当前可用的最新docker映像可在docker.io/porion/jax_dips。您只能通过运行

./launch.sh拉动

从码头中心拉动;即,相当于$docker pull pourion/jax_dips:最新.

生成开发容器

或者,您可以通过运行以下命令来构建容器

./launch.sh版本

如果您想向容器中添加其他库,建议使用这种方法。

启动开发容器

这将创建一个容器,并将用户放置在装入源代码的容器中。

./launch.sh开发

此外,您可以在后台运行容器,而无需让终端跳转到容器中。可以通过传递-d日守护程序的标志:

./launch.sh开发-d

你可以随时将你的teminal连接到跑步jax_dips集装箱依据

./launch.sh附加

VS代码的开发

创建容器并在您的机器上运行后,用户可以从VS代码附加到此容器;即,您需要安装Microsoft的开发人员容器在VS代码中添加扩展名,然后Ctrl+Shift+P然后选择开发容器:附加到正在运行的容器。。。,然后选择jax_dips计算机上正在运行的容器列表中的容器。

引用JAX-DIPS

如果您在研究中使用JAX-DIPS,请使用以下引文:

@文章{mistani2022jax,标题={JAX-DIPS:有限离散化方法的神经自举及其在不连续椭圆问题中的应用},作者={米斯塔尼、波利亚和帕克拉万、萨米拉和伊兰戈、拉杰什和吉布、弗雷德里克},杂志={arXiv预打印arXiv:2210.14312},={2022}}@文章{mistani2022神经,标题={神经符号偏微分方程求解器},作者={米斯塔尼、波利亚和帕克拉万、萨米拉和伊兰戈、拉杰什和乔德利、桑杰和吉布、弗雷德里克},杂志={arXiv预打印arXiv:2210.14907},={2022}}

为JAX-DIPS做出贡献

  • 报告错误。要报告错误,请在GitHub中打开问题问题.
  • 建议增强功能。要提交增强建议,包括新特性或对现有功能的改进,请通过在GitHub中打开问题让我们知道问题.
  • Pull请求。如果您对JAX-DIPS进行了改进,修复了一个错误,或者添加了一个新示例,请随时向我们发送一个拉请求。

团队

JAX-DIPS由开发和维护波里亚·米斯塔尼萨米拉·帕克拉文拉杰什·伊兰戈.

许可证

LGPL-2.1许可证

包装

未发布包

贡献者

  •  
  •  
  •  

语言文字