Download scripts/test_modularization.py from OneScience-Group/MatRIS: direct link, hf CLI and curl.
- Browser
- Download file 4.87 kB
-
https://huggingface.co/OneScience-Group/MatRIS/resolve/main/scripts/test_modularization.py
- Command line
-
hf download hf://OneScience-Group/MatRIS/scripts/test_modularization.py
-
curl -L -o test_modularization.py https://huggingface.co/OneScience-Group/MatRIS/resolve/main/scripts/test_modularization.py
4.87 kB
| """ | |
| 验证 MatRIS 模块化重构后各模块能否被正确导入与运行。 | |
| 测试内容: | |
| 1. 分散在各目录的 matris 模块能否正常 import | |
| 2. MatRIS 模型能否正常实例化 | |
| 3. 模型能否执行一次简单的前向传播(energy/force/stress/magmom) | |
| """ | |
| import sys | |
| from pathlib import Path | |
| # 把本仓库根目录放到 sys.path 最前面,避免 PYTHONPATH 中其他同名 model 包干扰 | |
| sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) | |
| import model # noqa: E402 | |
| import torch | |
| def test_imports(): | |
| """测试所有分散模块的导入路径""" | |
| print("[1/4] 测试模块导入...") | |
| # layer | |
| from onescience.modules.layer.matris_radial import ( | |
| PolynomialEnvelope, BesselExpansion, GaussianExpansion, | |
| FourierExpansion, SphericalExpansion | |
| ) | |
| from onescience.modules.layer.matris_interaction import Interaction_Block | |
| # embedding | |
| from onescience.modules.embedding.matris_embedding import ( | |
| AtomTypeEmbedding, EdgeBasisEmbedding, ThreebodyEmbedding | |
| ) | |
| # func_utils | |
| from onescience.modules.func_utils.matris_func_utils import ( | |
| MLP, GatedMLP, get_activation, get_normalization, aggregate | |
| ) | |
| from onescience.modules.func_utils.matris_reference import AtomRef | |
| from onescience.modules.func_utils.matris_graph import process_graphs | |
| # head | |
| from onescience.modules.head.matris_head import EnergyHead, MagmomHead, ForceStressHead | |
| # utils | |
| from onescience.utils.matris import StructOptimizer, MatRISCalculator | |
| print(" 所有模块导入成功 ✓") | |
| def test_model_instantiate(): | |
| """测试模型能否正常实例化""" | |
| print("[2/4] 测试模型实例化...") | |
| from model import MatRIS | |
| model = MatRIS( | |
| num_layers=2, # 用小层数加速测试 | |
| node_feat_dim=64, | |
| edge_feat_dim=64, | |
| three_body_feat_dim=64, | |
| num_radial=5, | |
| num_angular=5, | |
| pairwise_cutoff=5.0, | |
| three_body_cutoff=3.0, | |
| reference_energy=None, # 不加载参考能量 | |
| ) | |
| num_params = sum(p.numel() for p in model.parameters()) | |
| print(f" MatRIS 实例化成功,参数量: {num_params:,} ✓") | |
| return model | |
| def test_forward_cpu(): | |
| """测试 CPU 前向传播""" | |
| print("[3/4] 测试 CPU 前向传播...") | |
| from model import MatRIS | |
| from onescience.datapipes.materials.matris import GraphConverter | |
| from pymatgen.core.structure import Structure | |
| from pymatgen.core.lattice import Lattice | |
| # 构建一个极简晶体:2原子 Si | |
| lattice = Lattice.cubic(5.43) | |
| structure = Structure(lattice, ["Si", "Si"], [[0, 0, 0], [0.25, 0.25, 0.25]]) | |
| model = MatRIS( | |
| num_layers=2, | |
| node_feat_dim=64, | |
| edge_feat_dim=64, | |
| three_body_feat_dim=64, | |
| num_radial=5, | |
| num_angular=5, | |
| pairwise_cutoff=5.0, | |
| three_body_cutoff=3.0, | |
| reference_energy=None, | |
| ) | |
| model.eval() | |
| # 构建图 | |
| graph_converter = GraphConverter( | |
| atom_graph_cutoff=5.0, | |
| line_graph_cutoff=3.0, | |
| ) | |
| graph = graph_converter(structure) | |
| out = model([graph], task="efsm") | |
| print(f" 预测能量 (eV/atom): {out['e'].item():.4f} ✓") | |
| print(f" 预测力数量: {len(out['f'])} 组 ✓") | |
| print(f" 预测应力数量: {len(out['s'])} 组 ✓") | |
| print(f" 预测磁矩数量: {len(out['m'])} 组 ✓") | |
| def test_cuda_available(): | |
| """若存在 GPU,测试 CUDA 前向传播""" | |
| print("[4/4] 测试 CUDA 可用性...") | |
| if not torch.cuda.is_available(): | |
| print(" 无可用 GPU,跳过 CUDA 测试") | |
| return | |
| from model import MatRIS | |
| from onescience.datapipes.materials.matris import GraphConverter | |
| from pymatgen.core.structure import Structure | |
| from pymatgen.core.lattice import Lattice | |
| lattice = Lattice.cubic(5.43) | |
| structure = Structure(lattice, ["Si", "Si"], [[0, 0, 0], [0.25, 0.25, 0.25]]) | |
| model = MatRIS( | |
| num_layers=2, | |
| node_feat_dim=64, | |
| edge_feat_dim=64, | |
| three_body_feat_dim=64, | |
| num_radial=5, | |
| num_angular=5, | |
| pairwise_cutoff=5.0, | |
| three_body_cutoff=3.0, | |
| reference_energy=None, | |
| ).cuda() | |
| model.eval() | |
| graph_converter = GraphConverter(5.0, 3.0) | |
| graph = graph_converter(structure).to("cuda") | |
| out = model([graph], task="efsm") | |
| print(f" CUDA 前向传播成功,能量: {out['e'].item():.4f} ✓") | |
| if __name__ == "__main__": | |
| print("=" * 60) | |
| print("MatRIS 模块化重构验证测试") | |
| print("=" * 60) | |
| test_imports() | |
| test_model_instantiate() | |
| test_forward_cpu() | |
| test_cuda_available() | |
| print("=" * 60) | |
| print("全部测试通过 ✓") | |
| print("=" * 60) | |