def request_process(args, img_paths, inchan, outchan): # print("Starting REQ PROC") q = Queue(100) # only allow this many requests in flight at once def throttler(): xsResult = xstream.Subscribe(outchan) while True: msg = q.get() if msg == None: break xsResult.get() t = Thread(target=throttler) t.start() # pad num images to be multiple of batch_sz if len(img_paths) % args['batch_sz']: npad = args['batch_sz'] - (len(img_paths) % args['batch_sz']) for i in range(npad): img_paths.append(img_paths[-1]) xs = xstream.Publisher() for inum, fpath in enumerate(img_paths): (buf, objId) = xs.new(1, obj_id="img_%d" % inum, meta={ 'id': inum, 'path': fpath }) q.put('+') xs.put(inchan, objId) # print("REQ put data : {} ".format(fpath)) q.put(None) t.join()
def __init__(self): signal.signal(signal.SIGINT, self.signal_handler) # signal.signal(signal.SIGQUIT, self.sigquit_handler) self.do_exit = False self.hbeat_id = 0 self.hbeat = 0 # self.do_restart = False self.xserver = xstream.Server() parse_command_line() self.web_app = ServerWebApplication() # Add handlers for default services here so they can be destroyed if # needed. Handlers installed in the web_app __init__ cannot be destroyed. recipes = self.get_recipes() for recipe in recipes: tornado_handler = construct.construct(recipe) self.web_app.add_handlers( r".*", # match any host tornado_handler) self.web_server = self.web_app.listen(options.port) self.ws_app = tornado.web.Application([(r"/", WebSocketHandler)]) self.ws_server = self.ws_app.listen(options.wsport) self.xspub = xstream.Publisher() self.xs2server = threading.Thread(target=ServerApp.xstream2server) self.xs2server.start() self.heartbeat_thread = threading.Thread(target=ServerApp.heartbeat, args=(lambda: self.do_exit, )) self.heartbeat_thread.start()
def run(rundir, chanIdx, q, args): xspub = xstream.Publisher() xssub = xstream.Subscribe(chanIdx2Str(chanIdx)) runner = Runner(rundir) inTensors = runner.get_input_tensors() outTensors = runner.get_output_tensors() q.put(1) # ready for work fpgaBlobs = None fcOutput = None labels = xdnn_io.get_labels(args['labels']) xdnnCPUOp = xdnn.XDNNCPUOp("%s/weights.h5" % rundir) while True: try: payload = xssub.get() if not payload: break (meta, buf) = payload if fpgaBlobs == None: # allocate buffers fpgaBlobs = [] batchsz = meta['shape'][0] # inTensors[0].dims[0] for io in [inTensors, outTensors]: blobs = [] for t in io: shape = (batchsz,) + tuple([t.dims[i] for i in range(t.ndims)][1:]) blobs.append(np.empty((shape), dtype=np.float32, order='C')) fpgaBlobs.append(blobs) fcOutput = np.empty((batchsz, args['outsz'],), dtype=np.float32, order='C') fpgaInput = fpgaBlobs[0][0] assert(tuple(meta['shape']) == fpgaInput.shape) data = np.frombuffer(buf, dtype=np.float32).reshape(fpgaInput.shape) np.copyto(fpgaInput, data) jid = runner.execute_async(fpgaBlobs[0], fpgaBlobs[1]) runner.wait(jid) xdnnCPUOp.computeFC(fpgaBlobs[1][0], fcOutput) softmaxOut = xdnnCPUOp.computeSoftmax(fcOutput) xdnn_io.printClassification(softmaxOut, meta['images'], labels) sys.stdout.flush() if meta['id'] % 1000 == 0: print("Recvd query %d" % meta['id']) sys.stdout.flush() del data del buf del payload xspub.send(meta['from'], "success") except Exception as e: logging.error("Worker exception " + str(e))
def _init(nWorkers, inshape): token = pid2TokenStr() if token not in Dispatcher.xspub: Dispatcher.xspub[token] = xstream.Publisher() Dispatcher.xstoken[token] = xstream.Subscribe(token) Dispatcher.inshape = inshape Dispatcher.nWorkers = nWorkers Dispatcher.inBlob[token] = np.zeros(tuple(inshape), dtype=np.float32, order='C')
def __init__(self, rundir, nWorkers, workerArgs): self.xspub = xstream.Publisher() self.workers = [] self.wq = mp.Queue() for wi in range(nWorkers): w = mp.Process(target=WorkerPool.run, args=(rundir, wi, self.wq, workerArgs,)) w.start() self.workers.append(w) # wait for worker to be ready before starting next worker # because the last worker overwrites the IP programming # (Note: this assumes all workers must have the same IP instructions) self.wq.get()
def run(rundir, chanIdx, q, args): xspub = xstream.Publisher() xssub = xstream.Subscribe(chanIdx2Str(chanIdx)) runner = Runner(rundir) inTensors = runner.get_input_tensors() outTensors = runner.get_output_tensors() q.put(1) # ready for work fpgaBlobs = None labels = xdnn_io.get_labels(args['labels']) if args['yolo_version'] == 'v2': yolo_postproc = yolo.yolov2_postproc elif args['yolo_version'] == 'v3': yolo_postproc = yolo.yolov3_postproc else: assert args['yolo_version'] in ( 'v2', 'v3'), "--yolo_version should be <v2|v3>" biases = bias_selector(args) if (args['visualize']): colors = generate_colors(len(labels)) while True: try: payload = xssub.get() if not payload: break (meta, buf) = payload if fpgaBlobs == None: # allocate buffers fpgaBlobs = [] batchsz = meta['shape'][0] # inTensors[0].dims[0] for io in [inTensors, outTensors]: blobs = [] for t in io: shape = (batchsz, ) + tuple( [t.dims[i] for i in range(t.ndims)][1:]) blobs.append( np.empty((shape), dtype=np.float32, order='C')) fpgaBlobs.append(blobs) fcOutput = np.empty(( batchsz, args['outsz'], ), dtype=np.float32, order='C') fpgaInput = fpgaBlobs[0][0] assert (tuple(meta['shape']) == fpgaInput.shape) data = np.frombuffer(buf, dtype=np.float32).reshape(fpgaInput.shape) np.copyto(fpgaInput, data) jid = runner.execute_async(fpgaBlobs[0], fpgaBlobs[1]) runner.wait(jid) boxes = yolo_postproc(fpgaBlobs[1], args, meta['image_shapes'], biases=biases) if (not args['profile']): for i in range(min(batchsz, len(meta['image_shapes']))): print("Detected {} boxes in {}".format( len(boxes[i]), meta['images'][i]), flush=True) # Save the result if (args['results_dir']): for i in range(min(batchsz, len(meta['image_shapes']))): fname = meta['images'][i] filename = os.path.splitext(os.path.basename(fname))[0] out_file_txt = os.path.join(args['results_dir'], filename + '.txt') print("Saving {} boxes to {}".format( len(boxes[i]), out_file_txt)) sys.stdout.flush() saveDetectionDarknetStyle(out_file_txt, boxes[i], meta['image_shapes'][i]) if (args['visualize']): out_file_png = os.path.join( args['results_dir'], filename + '.png') print("Saving result to {}".format(out_file_png)) sys.stdout.flush() draw_boxes(fname, boxes[i], labels, colors, out_file_png) if meta['id'] % 1000 == 0: print("Recvd query %d" % meta['id']) sys.stdout.flush() del data del buf del payload xspub.send(meta['from'], "success") except Exception as e: logging.error("Worker exception " + str(e))