pyscf / gpu4pyscf

A plugin to use Nvidia GPU in PySCF package
GNU General Public License v3.0
117 stars 21 forks source link

Geometry optimization failing on the GPU #190

Closed amartyabose closed 1 month ago

amartyabose commented 1 month ago

I am new to both PySCF and GPU4pyscf. I am being able to run the single point calculations using both the GPU and CPU version on benzene and getting similar energy values. However, when I am trying to optimize the geometry, the GPU version seems to be failing. The energy seems to be decreasing without a bound. However, the CPU version is able to optimize the geometry perfectly.

CPU Version

from datetime import datetime
import numpy as np

from pyscf import gto, dft
from pyscf.geomopt.geometric_solver import optimize

mol = '''C                 -1.43530661   -0.38248086    0.00007236;
 C                 -0.03390667   -0.38255097    0.00050137;
 C                  0.66685425    0.83106172   -0.00006381;
 C                 -0.03378475    2.04474452   -0.00105877;
 C                 -1.43518468    2.04481464   -0.00148574;
 C                 -2.13594561    0.83120195   -0.00092082;
 H                 -1.97035312   -1.30910108    0.00050287;
 H                  0.50104676   -1.30922473    0.00125995;
 H                  1.73685420    0.83100818    0.00026331;
 H                  0.50126177    2.97136475   -0.00149182;
 H                 -1.97013811    2.97148840   -0.00224291;
 H                 -3.20594556    0.83125549   -0.00124699
'''

mol_benzene = gto.M(
    atom = mol,
    basis = '6-31g'
)

rks_benzene = dft.RKS(mol_benzene)
rks_benzene.xc = 'wb97x_d'

start_time = datetime.now()
rks_benzene.kernel()
print(f'Total time taken for single point energy = {(datetime.now() - start_time).total_seconds()} seconds')

start_time = datetime.now()
opt_benzene = optimize(rks_benzene)
print(f'Total time taken for geometry optimization = {(datetime.now() - start_time).total_seconds()} seconds')

print(opt_benzene.tostring())

GPU Version

from datetime import datetime
import numpy as np

from pyscf import gto
from pyscf.geomopt.geometric_solver import optimize
from gpu4pyscf import dft

import warnings
warnings.filterwarnings("ignore")

mol = '''C                 -1.43530661   -0.38248086    0.00007236;
 C                 -0.03390667   -0.38255097    0.00050137;
 C                  0.66685425    0.83106172   -0.00006381;
 C                 -0.03378475    2.04474452   -0.00105877;
 C                 -1.43518468    2.04481464   -0.00148574;
 C                 -2.13594561    0.83120195   -0.00092082;
 H                 -1.97035312   -1.30910108    0.00050287;
 H                  0.50104676   -1.30922473    0.00125995;
 H                  1.73685420    0.83100818    0.00026331;
 H                  0.50126177    2.97136475   -0.00149182;
 H                 -1.97013811    2.97148840   -0.00224291;
 H                 -3.20594556    0.83125549   -0.00124699
'''

mol_benzene = gto.M(
    atom = mol,
    basis = '6-31g'
)

rks_benzene = dft.RKS(mol_benzene)
rks_benzene.xc = 'wb97x_d'
rks_benzene.grids.level = 8

start_time = datetime.now()
rks_benzene.kernel()
print(f'Total time taken for single point energy = {(datetime.now() - start_time).total_seconds()} seconds')

start_time = datetime.now()
opt_benzene = optimize(rks_benzene)
print(f'Total time taken for geometry optimization = {(datetime.now() - start_time).total_seconds()} seconds')

print(opt_benzene.tostring())

benzene_cpu.log benzene_gpu.log

wxj6000 commented 1 month ago

@amartyabose Thank you for raising the issue. The issue has been fixed in https://github.com/pyscf/gpu4pyscf/pull/191

amartyabose commented 1 month ago

@wxj6000 Thank you!