Download scripts/train.py from OneScience-Group/ClimateNet: direct link, hf CLI and curl.
- Browser
- Download file 1.24 kB
-
https://huggingface.co/OneScience-Group/ClimateNet/resolve/main/scripts/train.py
- Command line
-
hf download hf://OneScience-Group/ClimateNet/scripts/train.py
-
curl -L -o train.py https://huggingface.co/OneScience-Group/ClimateNet/resolve/main/scripts/train.py
1.24 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.climatenet 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']);ids=np.where(d['split']==0)[0];base=ClimateNetDeepLab(**c['model']);m=DDP(base) if ddp else base;opt=torch.optim.Adam(m.parameters(),lr=c['train']['learning_rate']);w=torch.tensor(c['train']['class_weights']).float();ls=[] | |
| for _ in range(c['train']['epochs']): | |
| for i in ids[rank::world]:loss=F.cross_entropy(m(torch.tensor(d['input'][i:i+1])),torch.tensor(d['target'][i:i+1]),weight=w);opt.zero_grad();loss.backward();opt.step();ls.append(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'],{'weighted_cross_entropy':float(v[0]/v[1]),'world_size':world});print(p) | |
| if ddp:dist.destroy_process_group() | |