Exemplo n.º 1
0
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()
Exemplo n.º 2
0
    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()
Exemplo n.º 3
0
  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)) 
Exemplo n.º 4
0
 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')
Exemplo n.º 5
0
 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() 
Exemplo n.º 6
0
    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))