Exemplo n.º 1
0
    def __init__(self, solver_file, architecture_file=None, model_file=None):
        solver = caffe.SGDSolver(solver_file)
        self.net = solver.net

        if model_file and architecture_file:
            # Load the parameters from file
            pretrained_net = caffe.Net(architecture_file, model_file)
            self.net.copy_from(pretrained_net)

        # Allocate shared memory for all memory data layers in the network
        self.shared_data = []
        self.shared_params = []
        self.shared_grads = []
        self.shmem = {}

        for idx, layer in enumerate(self.net.layers):
            if layer.type == barista.MEMORY_DATA_LAYER:
                self.shared_data.append(SharedData(self.net, idx))

        for param in self.net.params:
            self.shared_params.append(SharedParameter(self.net, param))
            self.shared_grads.append(SharedGradient(self.net, param))

        self.batch_size = self.shared_data[0].data.shape[0]

        # Allow convenient access to certain Caffe net properties
        self.blobs = self.net.blobs

        # Create semaphore for interprocess synchronization
        self.compute_semaphore = posix_ipc.Semaphore(
                                     "/"+prepend_pid("compute"),
                                     flags=O_CREAT | O_EXCL)
        self.model_semaphore = posix_ipc.Semaphore(
                                   "/"+prepend_pid("model"),
                                   flags=O_CREAT | O_EXCL)
Exemplo n.º 2
0
    def __init__(self, net, layer_idx):
        self.data = None
        self.label = None
        self.shmem = []

        self.name = net._layer_names[layer_idx]
        handles = self.name.split('-', 1)

        # print "Allocating shared memory for %s." % handles[0]
        handle = prepend_pid(handles[0])
        shmem, arr = create_shmem_ndarray('/'+handle,
                                          net.blobs[handles[0]].data.shape,
                                          np.float32,
                                          flags=posix_ipc.O_CREAT)
        self.data = arr
        self.shmem.append(shmem)

        if len(handles) == 2:
            handle = prepend_pid(handles[1])
            shmem, arr = create_shmem_ndarray('/'+handle,
                                              net.blobs[handles[1]].data.shape,
                                              np.float32,
                                              flags=posix_ipc.O_CREAT)
            self.label = arr
            self.shmem.append(shmem)
            net.set_input_arrays(self.data, self.label, layer_idx)

        else:
            if SharedData._null_array is None:
                SharedData._null_array = np.empty(
                                             (self.data.shape[0], 1, 1, 1),
                                             dtype=np.float32)

            print("[SharedData] Warning: didn't specify a handle for the "
                  "label in layer", layer_idx, ". Should not be used in net.",
                  file=sys.stderr)

            net.set_input_arrays(self.data, SharedData._null_array, layer_idx)
Exemplo n.º 3
0
    def __init__(self, net, param_name):
        self.caffe_grads = []
        self.shared_grads = []
        self.shmem = []

        for i, param in enumerate(net.params[param_name]):
            # Typically, we'll have two, a weight and bias.
            handle = prepend_pid(param_name + '_' + SharedGradient.POSTFIX[i])
            shmem, arr = create_shmem_ndarray('/' + handle,
                                              param.diff.shape,
                                              np.float32,
                                              flags=posix_ipc.O_CREAT)

            self.caffe_grads.append(param.diff)
            self.shared_grads.append(arr)
            self.shmem.append(shmem)