Esempio n. 1
0
 def test_get_inputs(self):
     d = MNIST(repo_path=self.tmp_repo)
     d.backend = CPU(rng_seed=0)
     d.backend.actual_batch_size = 128
     inputs = d.get_inputs(train=True)
     # TODO: make this work (numpy import errors at the moment)
     assert inputs['train'] is not None
Esempio n. 2
0
 def test_coarse_labels(self):
     data = CIFAR100(coarse=True, repo_path=self.tmp_repo)
     data.backend = CPU(rng_seed=0)
     data.backend.actual_batch_size = 128
     data.load()
     assert len(data.inputs['train']) == 50000
     assert len(data.targets['train'][0]) == 20
Esempio n. 3
0
def test_softmax_cputensor():
    sftmx = Softmax()
    inputs = np.array([0, 1, -2]).reshape((3, 1))
    be = CPU(rng_seed=0)
    temp = be.zeros((3, 1))
    outputs = np.exp(inputs - 1) / np.sum(np.exp(inputs - 1))
    sftmx.apply_function(be, CPUTensor(inputs), temp)
    assert_tensor_near_equal(CPUTensor(outputs), temp)
Esempio n. 4
0
def test_logistic_cputensor():
    lgstc = Logistic()
    inputs = np.array([0, 1, -2]).reshape((3, 1))
    be = CPU(rng_seed=0)
    temp = be.zeros((3, 1))
    outputs = 1.0 / (1.0 + np.exp(-inputs))
    lgstc.apply_function(be, CPUTensor(inputs), temp)
    assert_tensor_near_equal(CPUTensor(outputs), temp)
Esempio n. 5
0
def test_rectleaky_slope_zero_rectlin_equiv():
    be = CPU()
    inputs = be.uniform(low=-5.0, high=10.0, size=(10, 10))
    lin_buf = be.empty(inputs.shape)
    leaky_buf = be.empty(inputs.shape)
    be.rectlin(inputs, out=lin_buf)
    be.rectleaky(inputs, slope=0.0, out=leaky_buf)
    assert_tensor_equal(lin_buf, leaky_buf)
Esempio n. 6
0
def test_cross_entropy_derivative_cputensor():
    be = CPU(rng_seed=0)
    outputs = CPUTensor([0.5, 0.9, 0.1, 0.0001])
    targets = CPUTensor([0.5, 0.99, 0.01, 0.2])
    temp = [be.zeros(outputs.shape), be.zeros(outputs.shape)]
    expected_result = ((outputs.asnumpyarray() - targets.asnumpyarray()) /
                       (outputs.asnumpyarray() * (1 - outputs.asnumpyarray())))
    assert_tensor_near_equal(
        expected_result, cross_entropy_derivative(be, outputs, targets, temp))
Esempio n. 7
0
 def test_fine_labels(self):
     data = CIFAR100(coarse=False, repo_path=self.tmp_repo)
     data.backend = CPU(rng_seed=0)
     data.backend.actual_batch_size = 128
     par = NoPar()
     par.associate(data.backend)
     data.load()
     assert len(data.inputs['train']) == 50000
     assert len(data.targets['train'][0]) == 100
Esempio n. 8
0
def test_tanh_cputensor():
    tntest = Tanh()
    be = CPU(rng_seed=0)
    CPUTensor([0, 1, -2])
    inputs = np.array([0, 1, -2])
    temp = be.zeros(inputs.shape)
    outputs = np.array([true_tanh(0), true_tanh(1), true_tanh(-2)])
    tntest.apply_function(be, CPUTensor(inputs), temp)
    assert_tensor_near_equal(CPUTensor(outputs), temp)
Esempio n. 9
0
def test_logistic_derivative_cputensor():
    lgstc = Logistic()
    inputs = np.array([0, 1, -2]).reshape((3, 1))
    be = CPU(rng_seed=0)
    outputs = 1.0 / (1.0 + np.exp(-inputs))
    outputs = outputs * (1.0 - outputs)
    temp = be.zeros(inputs.shape)
    lgstc.apply_derivative(be, CPUTensor(inputs), temp)
    assert_tensor_near_equal(CPUTensor(outputs), temp)
Esempio n. 10
0
def test_tanh_derivative_cputensor():
    tntest = Tanh()
    inputs = np.array([0, 1, -2])
    be = CPU(rng_seed=0)
    outputs = np.array(
        [1 - true_tanh(0)**2, 1 - true_tanh(1)**2, 1 - true_tanh(-2)**2])
    temp = be.zeros(inputs.shape)
    tntest.apply_derivative(be, CPUTensor(inputs), temp)
    assert_tensor_near_equal(CPUTensor(outputs), temp)
Esempio n. 11
0
def compare_cpu_tensors(inputs, outputs, deriv=False):
    rlin = RectLeaky()
    be = CPU()
    temp = be.zeros(inputs.shape)
    if deriv is True:
        rlin.apply_derivative(be, CPUTensor(inputs), temp)
    else:
        rlin.apply_function(be, CPUTensor(inputs), temp)
    be.subtract(temp, CPUTensor(outputs), temp)
    assert_tensor_equal(temp, be.zeros(inputs.shape))
Esempio n. 12
0
def test_cross_entropy_cputensor():
    be = CPU(rng_seed=0)
    outputs = CPUTensor([0.5, 0.9, 0.1, 0.0001])
    targets = CPUTensor([0.5, 0.99, 0.01, 0.2])
    temp = [be.zeros(outputs.shape), be.zeros(outputs.shape)]
    expected_result = np.sum(
        (-targets.asnumpyarray()) * np.log(outputs.asnumpyarray()) -
        (1 - targets.asnumpyarray()) * np.log(1 - outputs.asnumpyarray()),
        keepdims=True)
    assert_tensor_near_equal(expected_result,
                             cross_entropy(be, outputs, targets, temp))
Esempio n. 13
0
def test_softmax_derivative_cputensor():
    sftmx = Softmax()
    inputs = np.array([0, 1, -2]).reshape((3, 1))
    be = CPU(rng_seed=0)
    outputs = np.exp(inputs) / np.sum(np.exp(inputs))
    errmat = np.ones(inputs.shape)
    a = np.einsum('ij,ji->i', errmat.T, outputs)
    outputs = outputs * (errmat - a[np.newaxis, :])
    temp = be.zeros(inputs.shape)
    sftmx.apply_derivative(be, CPUTensor(inputs), temp)
    assert_tensor_near_equal(CPUTensor(outputs), temp)
Esempio n. 14
0
    def __setstate__(self, state):
        """
        Defines how we go about deserializing and loading an instance of this
        class from a specified state.

        Arguments:
            state (dict): attribute values to be loaded.
        """
        self.__dict__.update(state)
        if self.backend is None:
            # use CPU as a default backend
            self.backend = CPU()
Esempio n. 15
0
def test_cross_entropy_limits():
    be = CPU(rng_seed=0)
    outputs = CPUTensor([0.5, 1.0, 0.0, 0.0001])
    targets = CPUTensor([0.5, 0.0, 1.0, 0.2])
    eps = 2**-23
    temp = [be.zeros(outputs.shape), be.zeros(outputs.shape)]
    expected_result = np.sum(
        (-targets.asnumpyarray()) * np.log(outputs.asnumpyarray() + eps) -
        (1 - targets.asnumpyarray()) *
        np.log(1 - outputs.asnumpyarray() + eps),
        keepdims=True)
    assert_tensor_near_equal(expected_result,
                             cross_entropy(be, outputs, targets, temp, eps))
Esempio n. 16
0
 def test_round_split(self):
     split = 10
     batch_size = 32
     ntrain, ntest, nin, nout = 100, 10, 10, 5
     data = UniformRandom(ntrain, ntest, nin, nout, validation_pct=split)
     data.backend = CPU(rng_seed=0)
     data.backend.batch_size = batch_size
     data.load()
     split /= 100.0
     nb_batches = ntrain // batch_size
     expected_nb_train = floor((1.0 - split) * nb_batches)
     expected_nb_valid = floor(split * nb_batches)
     assert expected_nb_train == len(data.inputs['train'])
     assert expected_nb_train == len(data.targets['train'])
     assert expected_nb_valid == len(data.inputs['validation'])
     assert expected_nb_valid == len(data.targets['validation'])
Esempio n. 17
0
def test_xcov_cputensor():
    np.random.seed(0)
    n = 10
    k = 8
    (k1, k2) = (3, 5)
    a = np.array(np.random.randn(k, n) * 10, dtype='float32', order='C')
    acc = xcc(a[:k1], a[k1:])
    expected_result = 0.5 * (acc**2.).sum()

    be = CPU(rng_seed=0)
    outputs = CPUTensor(a.copy())
    tempbuf1 = be.empty((k1, n))
    tempbuf2 = be.empty((k2, n))
    tempbuf3 = be.empty((k1, k2))
    tempbuf4 = be.empty(outputs.shape)
    temp = [tempbuf1, tempbuf2, tempbuf3, tempbuf4]
    my_result = xcov_cost(be, outputs, [], temp, k1)
    assert_tensor_near_equal(expected_result, my_result)
Esempio n. 18
0
def test_xcov_derivative_cputensor():
    np.random.seed(0)
    n = 10
    k = 8
    (k1, k2) = (3, 5)
    a = np.array(np.random.randn(k, n), dtype='float32', order='C')
    s = np.zeros_like(a)
    acc = xcc(a[:k1], a[k1:])  # k1 x k2
    c1 = a[k1:] - a[k1:].mean(1, keepdims=True)  # k2 x n
    c2 = a[:k1] - a[:k1].mean(1, keepdims=True)  # k1 x n

    s[:k1] = acc.dot(c1) / n
    s[k1:] = acc.T.dot(c2) / n

    be = CPU(rng_seed=0)
    outputs = CPUTensor(a.copy())
    tempbuf1 = be.empty((k1, n))
    tempbuf2 = be.empty((k2, n))
    tempbuf3 = be.empty((k1, k2))
    tempbuf4 = be.empty(outputs.shape)
    temp = [tempbuf1, tempbuf2, tempbuf3, tempbuf4]
    my_result = xcov_cost_derivative(be, outputs, [], temp, k1)
    expected_result = CPUTensor(s)
    assert_tensor_near_equal(expected_result, my_result)
Esempio n. 19
0
def gen_backend(model=None,
                gpu=None,
                nrv=False,
                datapar=False,
                modelpar=False,
                flexpoint=False,
                rng_seed=None,
                numerr_handling=None,
                half=False,
                stochastic_round=0,
                device_id=None):
    """
    Construct and return a backend instance of the appropriate type based on
    the arguments given.  With no parameters, a single CPU core, float32
    backend is returned.

    Arguments:
        model (neon.models.model.Model): The instantiated model upon which we
                                         will utilize this backend.
        gpu (string, optional): Attempt to utilize a CUDA capable GPU if
                                installed in the system. Defaults to None which
                                implies a CPU based backend.  If 'cudanet',
                                utilize a cuda-convnet2 based backed, which
                                supports Kepler and Maxwell GPUs with single
                                precision. If 'nervanagpu', attempt to utilize
                                the NervanaGPU Maxwell backend with float16 and
                                float32 support.
        nrv (bool, optional): If True, attempt to utilize the Nervana Engine
                              for computation (must be installed on the
                              system).  Defaults to False which implies a CPU
                              based backend.
        datapar (bool, optional): Set to True to ensure that data is
                                  partitioned and each chunk is processed in
                                  parallel on different compute cores. Requires
                                  mpi4py.  Defaults to False which implies that
                                  all data will be processed sequentially on a
                                  single compute core.
        modelpar (bool, optional): Set to True to ensure that the nodes in each
                                   model layer are partitioned and distributed
                                   across multiple compute cores.  Requires
                                   mpi4py.  Defaults to False which implies
                                   that all nodes in all model layers will be
                                   processed by the same single compute core.
        flexpoint (bool, optional): If True, attempt to use FlexPoint(TM)
                                    element typed data instead of the default
                                    float32 which is in place if set to False.
        rng_seed (numeric, optional): Set this to a numeric value which can be
                                      used to seed the random number generator
                                      of the instantiated backend.  Defaults to
                                      None, which doesn't explicitly seed (so
                                      each run will be different)
        stochastic_round (numeric, optional): Only affects the max backend. If
                                              1, perform stochastic rounding.
                                              If 0, round to nearest.
        numerr_handling (dict, optional): Dictate how numeric errors are
                                          displayed and handled.  The keys and
                                          values permissible for this dict
                                          match that seen in numpy.seterr.
                                          If set to None (the default),
                                          behavior is equivalent to
                                          {'all': 'warn'}
        device_id (numeric, optional): Set this to a numeric value which can be
                                       used to select which device to run the
                                       process on

    Returns:
        Backend: newly constructed backend instance of the specifed type.

    Notes:
        * Attempts to construct a GPU instance without a CUDA capable card or
          without cudanet or nervanagpu package installed will cause the
          program to display an error message and exit.
        * Attempts to construct a parallel instance without mpi4py installed
          will cause the program to display an error message and exit.
        * The returned backend will still need to call its par.init_model()
          at some point after the model has been linked, in order for parallel
          training to proceed.
    """
    logger = logging.getLogger(__name__)
    gpuflag = False

    if datapar and modelpar:
        raise NotImplementedError('Hybrid parallelization scheme not '
                                  'implemented yet.  Try with at most one of'
                                  'datapar or modelpar')
    if modelpar:
        par = ModelPar()
    elif datapar:
        par = DataPar()
    else:
        par = NoPar()

    if par.device_id is not None:
        if device_id is not None:
            logger.warn('Ignoring device id specified in command line.')
        device_id = par.device_id

    if gpu is not None:
        gpu = gpu.lower()
        if sys.platform.startswith("linux"):
            gpuflag = (os.system("nvidia-smi > /dev/null 2>&1") == 0)
        elif sys.platform.startswith("darwin"):
            gpuflag = (
                os.system("kextstat | grep -i cuda > /dev/null 2>&1") == 0)
        if gpuflag and gpu == 'cudanet':
            try:
                import cudanet  # noqa
                from neon.backends.cc2 import GPU
                be_name = 'Cudanet'
                be = GPU(rng_seed=rng_seed, device_id=device_id)
            except ImportError:
                logger.warning("cudanet not found, can't run via GPU")
                gpuflag = False
        elif gpuflag and gpu == 'nervanagpu':
            try:
                import nervanagpu  # noqa
                try:
                    # import pycuda.autoinit
                    import pycuda.driver as drv
                    drv.init()
                    device_id = device_id if device_id is not None else 0
                    global ctx
                    ctx = drv.Device(device_id).make_context()
                    import atexit
                    atexit.register(ctx.pop)
                    from neon.backends.gpu import GPU
                    be_name = 'NervanaGPU'
                    be = GPU(rng_seed=rng_seed,
                             stochastic_round=stochastic_round,
                             device_id=device_id)
                except ImportError:
                    logger.warning("pycuda error, can't run via GPU")
                    gpuflag = False
            except ImportError:
                logger.warning("nervanagpu not found, can't run via GPU")
                gpuflag = False
        if gpuflag is False:
            raise RuntimeError("Can't find CUDA capable GPU")
    elif nrv:
        nrv = False
        try:
            from umd.nrv_backend import NRVBackend
            nrv = True
        except ImportError:
            logger.warning("Nervana Engine system software not found")

    if flexpoint:
        logger.warning("Flexpoint(TM) backend not currently available")

    if nrv:
        be_name = 'NRV'
        be = NRVBackend(rng_seed=rng_seed,
                        seterr_handling=numerr_handling,
                        device_id=device_id)
    elif not gpuflag:
        be_name = 'CPU'
        be = CPU(rng_seed=rng_seed, seterr_handling=numerr_handling)
    logger.info("{} backend, RNG seed: {}, numerr: {}".format(
        be_name, rng_seed, numerr_handling))

    par.associate(be)
    return be
Esempio n. 20
0
 def test_argmax_noaxis(self):
     be = CPU()
     tsr = be.array([[-1, 0], [1, 92]])
     out = be.empty([1, 1])
     be.argmax(tsr, None, out)
     assert_tensor_equal(out, CPUTensor(3))
Esempio n. 21
0
def gen_backend(model=None,
                gpu=None,
                nrv=False,
                flexpoint=False,
                rng_seed=None,
                numerr_handling=None,
                half=False,
                stochastic_round=0,
                device_id=None):
    """
    Construct and return a backend instance of the appropriate type based on
    the arguments given.  With no parameters, a single CPU core, float32
    backend is returned.

    Arguments:
        model (neon.models.model.Model): The instantiated model upon which we
                                         will utilize this backend.
        gpu (string, optional): Attempt to utilize a CUDA capable GPU if
                                installed in the system. Defaults to None which
                                implies a CPU based backend.  If 'cudanet',
                                utilize a cuda-convnet2 based backed, which
                                supports Kepler and Maxwell GPUs with single
                                precision. If 'nervanagpu', attempt to utilize
                                the NervanaGPU Maxwell backend with float16 and
                                float32 support.
        nrv (bool, optional): If True, attempt to utilize the Nervana Engine
                              for computation (must be installed on the
                              system).  Defaults to False which implies a CPU
                              based backend.
        rng_seed (numeric, optional): Set this to a numeric value which can be
                                      used to seed the random number generator
                                      of the instantiated backend.  Defaults to
                                      None, which doesn't explicitly seed (so
                                      each run will be different)
        stochastic_round (numeric, optional): Only affects the max backend. If
                                              1, perform stochastic rounding.
                                              If 0, round to nearest.
        numerr_handling (dict, optional): Dictate how numeric errors are
                                          displayed and handled.  The keys and
                                          values permissible for this dict
                                          match that seen in numpy.seterr.
                                          If set to None (the default),
                                          behavior is equivalent to
                                          {'all': 'warn'}
        device_id (numeric, optional): Set this to a numeric value which can be
                                       used to select which device to run the
                                       process on

    Returns:
        Backend: newly constructed backend instance of the specifed type.

    Notes:
        * Attempts to construct a GPU instance without a CUDA capable card or
          without cudanet or nervanagpu package installed will cause the
          program to display an error message and exit.
        * Attempts to construct a parallel instance without mpi4py installed
          will cause the program to display an error message and exit.
        * The returned backend will still need to call its par.init_model()
          at some point after the model has been linked, in order for parallel
          training to proceed.
    """
    logger = logging.getLogger(__name__)
    gpuflag = False

    if gpu is not None:
        gpu = gpu.lower()
        if sys.platform.startswith("linux"):
            gpuflag = (os.system("nvcc --version > /dev/null 2>&1") == 0)
        elif sys.platform.startswith("darwin"):
            gpuflag = (
                os.system("kextstat | grep -i cuda > /dev/null 2>&1") == 0)
        if gpuflag and gpu == 'cudanet':
            try:
                import cudanet  # noqa
                from neon.backends.cc2 import GPU
                be_name = 'Cudanet'
                be = GPU(rng_seed=rng_seed, device_id=device_id)
            except ImportError:
                raise RuntimeError("cudanet not found, can't run via GPU")
        elif gpuflag and gpu.startswith('nervanagpu'):
            try:
                import nervanagpu  # noqa
                try:
                    be_name = 'NervanaGPU'
                    if gpu == 'nervanagpu':
                        device_id = 0 if device_id is None else device_id[0]
                        from neon.backends.gpu import GPU
                        be = GPU(rng_seed=rng_seed,
                                 stochastic_round=stochastic_round,
                                 device_id=device_id)
                    else:
                        from neon.backends.mgpu import MGPU
                        try:
                            num_dev = int(gpu.strip('nervanagpu'))
                        except (ValueError):
                            raise ValueError("invalid number of GPUs" +
                                             " specified")
                        if not device_id:
                            device_id = range(num_dev)
                        if len(device_id) != num_dev:
                            raise RuntimeError(
                                "Incorrect number of devices"
                                " specified ", device_id, num_dev)
                        be = MGPU(rng_seed=rng_seed,
                                  stochastic_round=stochastic_round,
                                  device_id=device_id,
                                  num_dev=num_dev)
                except ImportError:
                    logger.warning("pycuda error, can't run via GPU")
                    gpuflag = False
            except ImportError:
                logger.warning("nervanagpu not found, can't run via GPU")
                gpuflag = False
        if gpuflag is False:
            raise RuntimeError("Can't find CUDA capable GPU")
    elif nrv:
        nrv = False
        try:
            from umd.nrv_backend import NRVBackend
            nrv = True
        except ImportError:
            logger.warning("Nervana Engine system software not found")

    if flexpoint:
        logger.warning("Flexpoint(TM) backend not currently available")

    if nrv:
        be_name = 'NRV'
        be = NRVBackend(rng_seed=rng_seed,
                        seterr_handling=numerr_handling,
                        device_id=device_id)
    elif not gpuflag:
        be_name = 'CPU'
        be = CPU(rng_seed=rng_seed, seterr_handling=numerr_handling)
    logger.info("{} backend, RNG seed: {}, numerr: {}".format(
        be_name, rng_seed, numerr_handling))

    return be
Esempio n. 22
0
 def test_cpu_bprop(self):
     backend = CPU(rng_seed=0)
     layer = self.create_layer(backend=backend)
     check_bprop(layer, backend)
Esempio n. 23
0
 def __init__(self):
     # this code gets called prior to each test
     self.be = CPU()
Esempio n. 24
0
 def test_argmax_axis1(self):
     be = CPU()
     tsr = be.array([[-1, 10], [11, 9]])
     out = be.empty((2, ))
     be.argmax(tsr, 1, out)
     assert_tensor_equal(out, CPUTensor([1, 0]))
Esempio n. 25
0
 def test_argmin_axis0(self):
     be = CPU()
     tsr = be.array([[-1, 0], [1, 92]])
     out = be.empty((1, 2))
     be.argmin(tsr, 0, out)
     assert_tensor_equal(out, CPUTensor([[0, 0]]))