jsuarez/tools/GPUTest.py (73 lines of code) (raw):

from pdb import set_trace as T import torch from torch import nn, optim from torch.nn import functional as F from torch.nn.parameter import Parameter from torch.autograd import Variable from torch.distributions import Categorical import numpy as np import time #Same padded (odd k) def Conv2d(fIn, fOut, k, stride=1): pad = int((k-1)/2) return torch.nn.Conv2d(fIn, fOut, k, stride=stride, padding=pad) class StimNet(nn.Module): def __init__(self, xdim, h, ydim): super().__init__() self.conv1 = Conv2d(8, int(h/2), 3, stride=2) self.conv2 = Conv2d(int(h/2), h, 3, stride=2) self.fc1 = torch.nn.Linear(5+4*4*h, h) self.fc2 = torch.nn.Linear(h, ydim) def forward(self, conv, flat): if len(conv.shape) == 3: conv = conv.view(1, *conv.shape) flat = flat.view(1, *flat.shape) x, batch = conv, conv.shape[0] x = torch.nn.functional.relu(self.conv1(x)) x = torch.nn.functional.relu(self.conv2(x)) x = x.view(batch, -1) x = torch.cat((x, flat), dim=1) x = torch.nn.functional.relu(self.fc1(x)) x = self.fc2(x) pi = x.view(batch, -1) return pi def classify(logits): #logits = logits + 0.15*torch.norm(logits) distribution = Categorical(F.softmax(logits, dim=1)) atn = distribution.sample() return atn class ANN(nn.Module): def __init__(self, xdim, h, ydim): super().__init__() self.stimNet = StimNet(xdim, 24, ydim) self.valNet = StimNet(xdim, 24, 1) #self.curNet = CurNet(xdim, 24, ydim) self.conv, self.flat, self.ent, self.stim, self.idx = [], [], [], [], [] def recv(self, conv, flat, ent, stim, idx): self.conv.append(conv) self.flat.append(flat) self.ent.append(ent) self.stim.append(stim) self.idx.append(idx) def send(self): conv = torch.stack(self.conv, dim=0) flat = torch.stack(self.flat, dim=0) pi, val, atn = [], [], [] #for c, f in zip(conv, flat): # p, v, a = self.forward(c, f) # pi.append(p) # val.append(v) # atn.append(a) pi, val, atn = self.forward(conv, flat) pi = [e.view(1, -1) for e in pi] val = [e.view(1, -1) for e in val] atn = [e.view(1) for e in atn] ret = list(zip(pi, val, self.ent, self.stim, atn, self.idx)) self.conv, self.flat, self.ent, self.stim, self.idx = [], [], [], [], [] return ret def forward(self, conv, flat): pi = self.stimNet(conv, flat) val = self.valNet(conv, flat) atn = classify(pi) #ri, li = self.curNet(ents, entID, atn, conv, flat) return pi, val, atn if __name__ == '__main__': ann = ANN(1850, 32, 6)#.cuda() batch = 100 conv = torch.rand(batch, 8, 15, 15)#.cuda() flat = torch.rand(batch, 5)#.cuda() while True: start = time.time() _ = ann(conv, flat) print(1.0 / (time.time() - start))