Delta-HBV / scripts /train.py
zhangrenchao's picture
Publish Delta-HBV reproduction
48fc6c1 verified
Raw
History Blame Contribute Delete
1.17 kB
from pathlib import Path
import sys,os,numpy as np,torch;import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
R=Path(__file__).resolve().parents[1];sys.path.insert(0,str(R));from model.delta_hbv import *
c=cfg(R);rank=int(os.getenv('RANK',0));world=int(os.getenv('WORLD_SIZE',1));ddp=world>1
if ddp:dist.init_process_group('gloo')
d=np.load(R/c['data']['path']);torch.set_num_threads(2);base=DeltaHBV(**c['model']);m=DDP(base) if ddp else base;opt=torch.optim.Adam(m.parameters(),lr=c['train']['learning_rate']);ids=np.arange(rank,12,world);q,_=m(torch.tensor(d['forcing'][ids]),torch.tensor(d['attributes'][ids]));t=torch.tensor(d['streamflow'][ids]);loss=torch.sqrt(((q[:,365:]-t[:,365:])**2).mean()+1e-8);opt.zero_grad();loss.backward();opt.step();ls=[float(loss)]
v=torch.tensor([sum(ls),len(ls)],dtype=torch.float64)
if ddp:dist.all_reduce(v)
p=R/c['paths']['checkpoint']
if rank==0:p.parent.mkdir(parents=True,exist_ok=True);torch.save({'model':base.state_dict(),'model_config':c['model']},p);write(R/c['paths']['training_metrics'],{'rmse':float(v[0]/v[1]),'world_size':world});print(p)
if ddp:dist.destroy_process_group()