http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/d76caea3/src/python/singa/optimizer.py ---------------------------------------------------------------------- diff --git a/src/python/singa/optimizer.py b/src/python/singa/optimizer.py deleted file mode 100644 index 00380e0..0000000 --- a/src/python/singa/optimizer.py +++ /dev/null @@ -1,377 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ============================================================================= -'''This module includes a set of optimizers for updating model parameters. - -Example usage:: - - from singa import optimizer - from singa import tensor - - sgd = optimizer.SGD(lr=0.01, momentum=0.9, weight_decay=1e-4) - p = tensor.Tensor((3,5)) - p.uniform(-1, 1) - g = tensor.Tensor((3,5)) - g.gaussian(0, 0.01) - - sgd.apply(1, g, p, 'param') # use the global lr=0.1 for epoch 1 - sgd.apply_with_lr(2, 0.03, g, p, 'param') # use lr=0.03 for epoch 2 -''' - -from . import singa_wrap as singa -import tensor -from proto import model_pb2 - - -class Optimizer(object): - '''The base python optimizer class. - - Typically, an optimizer is used as follows: - - 1. construct the optimizer - 2. (optional) register each parameter with its specs. - 3. use the optimizer to update parameter values given parameter gradients - and other optional info - - The subclasses should override the apply_with_lr function to do the real - parameter udpate. - - Args: - lr (float): a constant for the learning rate, mutually exclusive with - 'lr_gen'. - momentum (float): a constant for the momentum value - weight_decay (float): the coefficent for L2 regularizer, which is - mutually exclusive with 'regularizer'. - lr_gen (function): a function returns the learning rate given - the current training step/epoch. It is mutually exclusive with lr. - If both are not set, the apply_with_lr function should be used for - param updating. - regularizer: an instance of Regularizer or RegularizerConf; If set, - regularization would be applied in apply_with_lr(). - Users can also do regularization outside. - constraint: an instance of Constraint or ConstraintConf; If set, - constraint would be applied inside apply_with_lr(). Users can - also do regularization outside. - ''' - - def __init__(self, lr=None, momentum=None, weight_decay=None, lr_gen=None, - regularizer=None, constraint=None): - if lr is not None: - assert lr_gen is None, 'Cannot set lr and lr_gen at the same time' - - def lr_gen(epoch): - return lr - self.lr_gen = lr_gen - self.momentum = momentum - if weight_decay is not None: - assert regularizer is None, \ - 'Cannot set weight_decay and regularizer at the same time' - regularizer = L2Regularizer(weight_decay) - if regularizer is not None: - if isinstance(regularizer, model_pb2.RegularizerConf): - self.regularizer = CppRegularizer(regularizer) - else: - self.regularizer = regularizer - else: - self.regularizer = None - if constraint is not None: - if isinstance(constraint, model_pb2.ConstraintConf): - self.constraint = CppConstraint(constraint) - else: - self.constraint = constraint - else: - self.constraint = None - self.regularizers = {} - self.constraints = {} - self.decay_multiplier = {} - self.learning_rate_multiplier = {} - - def register(self, name, specs): - '''Register the param specs, including creating regularizer and - constraint per param object. Param specific regularizer and constraint - have higher priority than the global ones. - - Args: - name (str): parameter name - specs (ParamSpec): protobuf obj, including regularizer and - constraint, multipliers for learning rate and weight decay. - ''' - assert isinstance(specs, model_pb2.ParamSpec), \ - 'specs should be model_pb2.ParamSpec instance' - if specs.HasField('regularizer'): - self.regularizers[name] = CppRegularizer(specs.regularizer) - elif specs.decay_mult != 1: - self.regularizers[name] = L2Regularizer( - specs.decay_mult * self.regularizer.coefficient) - - if specs.HasField('constraint'): - self.constraints[name] = CppConstraint(specs.constraint) - - if specs.lr_mult != 1: - self.learning_rate_multiplier[name] = specs.lr_mult - - def apply_regularizer_constraint(self, epoch, value, grad, name=None): - '''Apply regularization and constraint if available. - - If there are both global regularizer (constraint) and param specific - regularizer (constraint), it would use the param specific one. - - Args: - value (Tensor): parameter value Tensor - grad (Tensor): parameter gradient Tensor - name (string): to get parameter specific regularizer or constraint - epoch (int): some regularizer or constraint would use epoch - - Returns: - the updated gradient Tensor - ''' - if name is not None and name in self.constraints: - self.constraints[name].apply(epoch, value, grad) - elif self.constraint is not None: - self.constraint.apply(epoch, value, grad) - - if name is not None and name in self.regularizers: - self.regularizers[name].apply(epoch, value, grad) - elif self.regularizer is not None: - self.regularizer.apply(epoch, value, grad) - return grad - - def apply_with_lr(self, epoch, lr, grad, value, name=None): - '''Do update with given learning rate. - - The subclass optimizer must override this function. - - Args: - epoch (int): training epoch (could be iteration or epoch) - lr (float): learning rate - grad (Tensor): parameter gradient - value (Tesnor): parameter value - name (string): paramter name to retrieval parameter specific - updating rules (including regularizer and constraint) - - Returns: - updated parameter value - ''' - assert False, 'This is the base function, pls call the subclass func' - return value - - def apply(self, epoch, grad, value, name=None): - '''Do update assuming the learning rate generator is set. - - The subclass optimizer does not need to override this function. - - Args: - epoch (int): training epoch (could be iteration or epoch) - grad (Tensor): parameter gradient - value (Tesnor): parameter value - name (string): paramter name to retrieval parameter specific - updating rules (including regularizer and constraint) - - Return: - updated parameter value - ''' - assert self.lr_gen is not None, 'Learning rate generator is not set.'\ - 'Either set the lr_gen in constructor or call apply_with_lr' - lr = self.lr_gen(epoch) - return self.apply_with_lr(epoch, lr, grad, value, name) - - -class SGD(Optimizer): - '''The vallina Stochasitc Gradient Descent algorithm with momentum. - - See the base Optimizer for all arguments. - ''' - - def __init__(self, lr=None, momentum=None, weight_decay=None, lr_gen=None, - regularizer=None, constraint=None): - super(SGD, self).__init__(lr, momentum, weight_decay, lr_gen, - regularizer, constraint) - conf = model_pb2.OptimizerConf() - if self.momentum is not None: - conf.momentum = self.momentum - conf.type = 'sgd' - self.opt = singa.CreateOptimizer('SGD') - self.opt.Setup(conf.SerializeToString()) - - def apply_with_lr(self, epoch, lr, grad, value, name): - self.apply_regularizer_constraint(epoch, value, grad, name) - if name is not None and name in self.learning_rate_multiplier: - lr = lr * self.learning_rate_multiplier[name] - self.opt.Apply(epoch, lr, name, grad.singa_tensor, value.singa_tensor) - return value - - -class Nesterov(Optimizer): - '''The SGD with Nesterov momentum. - - See the base Optimizer for all arguments. - ''' - - def __init__(self, lr=None, momentum=0.9, weight_decay=None, lr_gen=None, - regularizer=None, constraint=None): - super(Nesterov, self).__init__(lr, momentum, weight_decay, lr_gen, - regularizer, constraint) - conf = model_pb2.OptimizerConf() - if self.momentum is not None: - conf.momentum = momentum - conf.type = 'nesterov' - self.opt = singa.CreateOptimizer('Nesterov') - self.opt.Setup(conf.SerializeToString()) - - def apply_with_lr(self, epoch, lr, grad, value, name): - self.apply_regularizer_constraint(epoch, value, grad, name) - if name is not None and name in self.learning_rate_multiplier: - lr = lr * self.learning_rate_multiplier[name] - self.opt.Apply(epoch, lr, name, grad.singa_tensor, value.singa_tensor) - return value - - -class AdaGrad(Optimizer): - '''AdaGrad optimizer. - - See the base Optimizer for all constructor args. - - Args: - epsilon (float): small number for preventing numeric error. - ''' - - def __init__(self, epsilon=1e-8, lr=None, weight_decay=None, lr_gen=None, - regularizer=None, constraint=None): - super(RMSProp, self).__init__(lr, weight_decay, lr_gen, regularizer, - constraint) - conf = model_pb2.OptimizerConf() - conf.delta = epsilon - conf.type = 'adagrad' - self.opt = singa.CreateOptimizer('AdaGrad') - self.opt.Setup(conf.SerializeToString()) - - def apply_with_lr(self, epoch, lr, grad, value, name): - grad = self.apply_regularizer_constraint(epoch, value, grad, name) - if name is not None and name in self.learning_rate_multiplier: - lr = lr * self.learning_rate_multiplier[name] - self.opt.Apply(epoch, lr, name, grad.singa_tensor, value.singa_tensor) - return value - - -class RMSProp(Optimizer): - '''RMSProp optimizer. - - See the base Optimizer for all constructor args. - - Args: - rho (float): float within [0, 1] - epsilon (float): small value for preventing numeric error - ''' - - def __init__(self, rho=0.9, epsilon=1e-8, lr=None, weight_decay=None, - lr_gen=None, regularizer=None, constraint=None): - super(RMSProp, self).__init__(lr, weight_decay, lr_gen, regularizer, - constraint) - conf = model_pb2.OptimizerConf() - conf.rho = rho - conf.delta = epsilon - self.opt = singa.CreateOptimizer('RMSProp') - self.opt.Setup(conf.SerializeToString()) - - def apply_with_lr(self, epoch, lr, grad, value, name): - grad = self.apply_regularizer_constraint(epoch, value, grad, name) - if name is not None and name in self.learning_rate_multiplier: - lr = lr * self.learning_rate_multiplier[name] - self.opt.Apply(epoch, lr, name, grad.singa_tensor, value.singa_tensor) - return value - - -class Regularizer(object): - '''Base Python regularizer for parameter gradients.''' - - def apply(self, value, grad): - assert False, 'Not Implemented. Call the subclass function.' - return grad - - -class CppRegularizer(Regularizer): - '''Wrapper for regularizer implemented using C++. - - Args: - conf (RegularizerConf): protobuf message for the configuration. - ''' - - def __init__(self, conf): - self.reg = singa.CreateRegularizer(conf.type) - self.reg.Setup(conf.SerializeToString()) - - def apply(self, epoch, value, grad): - self.reg.Apply(epoch, value.singa_tensor, grad.singa_tensor) - return grad - - -class L2Regularizer(Regularizer): - '''L2 regularization - - Args: - coefficient (float): regularization coefficient. - ''' - - def __init__(self, coefficient): - self.coefficient = coefficient - - def apply(self, epoch, value, grad, coefficient=None): - if coefficient is None: - assert self.coefficient is not None, 'Must set the coefficient' - coefficient = self.coefficient - # print coefficient, value.l1(), grad.l1() - if coefficient != 0: - tensor.axpy(coefficient, value, grad) - return grad - - -class Constraint(object): - '''Base Python constraint class for paramter gradients''' - - def apply(self, epoch, value, grad): - return grad - - -class CppConstraint(Constraint): - '''Wrapper for constraints implemented using C++. - - Args: - conf (ConstraintConf): protobuf message for the configuration. - ''' - - def __init__(self, conf): - self.constraint = singa.CreateConstraint(conf.type) - self.constraint.Setup(conf.SerializeToString()) - - def apply(self, epoch, value, grad): - self.constraint.Apply(epoch, value.singa_tensor, grad.singa_tensor) - return grad - - -class L2Constraint(Constraint): - '''Rescale the gradient to make the L2 norm <= a given threshold''' - - def __init__(self, threshold=None): - self.threshold = threshold - - def apply(self, epoch, value, grad, threshold=None): - if threshold is None: - assert self.threshold is not None, 'Must set the threshold' - threshold = self.threshold - nrm = grad.l2() - grad *= threshold / nrm - return grad
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/d76caea3/src/python/singa/tensor.py ---------------------------------------------------------------------- diff --git a/src/python/singa/tensor.py b/src/python/singa/tensor.py deleted file mode 100644 index f6bca43..0000000 --- a/src/python/singa/tensor.py +++ /dev/null @@ -1,1011 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ============================================================================= -""" -Example usage:: - - from singa import tensor - from singa import device - - # create a tensor with shape (2,3), default CppCPU device and float32 - x = tensor.Tensor((2,3)) - x.set_value(0.4) - - # create a tensor from a numpy array - y = tensor.from_numpy((3,3), dtype=np.float32) - y.uniform(-1, 1) - - z = mult(x, y) # gemm -> z of shape (2, 3) - - x += z # element-wise addition - - dev = device.create_cuda_gpu() - x.to_device(dev) # move the data to a gpu device - - r = relu(x) - - r.to_host() # move the data back to host cpu - s = r.to_numpy() # tensor -> numpy array, r must be on cpu - - -There are two set of tensor functions, - -Tensor member functions - which would change the internal state of the Tensor instance. -Tensor module functions - which accept Tensor instances as arguments and return Tensor instances. - -Every Tesor instance must be initialized before reading data from it. -""" - -import numpy as np -from functools import reduce -from .proto import core_pb2 -from . import singa_wrap as singa -import device as pydevice - - -class Tensor(object): - '''Create a Py Tensor, which wraps a swig converted Tensor from CPP Tensor - - The three arguments are three attributes of the Tensor. - - Args: - shape (list<int>): a list of integers for the tensor shape. If shape is - not specified, the created tensor is called a dummy tensor. - device: a swig converted Device instance using the device moduel . If it - is None, then the default host device would be used. - dtype: data type. currently, most operations only accept kFloat32. - ''' - - def __init__(self, shape=None, device=None, dtype=core_pb2.kFloat32): - if shape is None: - # call constructor of singa::Tensor - self.singa_tensor = singa.Tensor() - return - else: - assert isinstance(shape, tuple), 'shape should be tuple' - if device is None: - device = pydevice.get_default_device() - self.singa_tensor = singa.Tensor(list(shape), device, dtype) - else: - self.singa_tensor = singa.Tensor(list(shape), device, dtype) - self.shape = shape - self.dtype = dtype - self.device = device - - def ndim(self): - ''' - Returns: - the number of dimensions of the tensor. - ''' - return self.singa_tensor.nDim() - - def is_transpose(self): - ''' - Returns: - True if the internal data is transposed; otherwise False. - ''' - return self.singa_tensor.transpose() - - def size(self): # TODO(wangwei) compute size - ''' - Returns: - the number of elements of the tensor. - ''' - return self.singa_tensor.Size() - - def memsize(self): - ''' - Returns: - the number of Bytes allocated for this tensor. - ''' - return self.singa_tensor.MemSize() - - def reshape(self, shape): - '''Change the tensor shape. - - Args: - shape (list<int>): new shape, which should have the same volumn as - the original shape. - ''' - assert product(self.shape) == product(shape), \ - 'product of shape should be equal' - self.shape = shape - self.singa_tensor.Reshape(list(shape)) - - def reset_like(self, t): - '''Reset the shape, dtype and device as the given tensor. - - Args: - t (Tensor) - ''' - self.singa_tensor.ResetLike(t.singa_tensor) - self.shape = t.shape - self.device = t.device - self.dtype = t.dtype - - ''' - def as_type(self, dtype): - Change the data type. - - Args: - dtype: - self.singa_tensor.AsType(dtype) - ''' - - def to_device(self, device): - '''Move the tensor data onto a given device. - - Args: - device: a swig Device converted from CudaGPU or CppCPU or OpenclGPU - ''' - self.singa_tensor.ToDevice(device) - self.device = device - - def to_host(self): - '''Move the tensor data onto the default host CppCPU device. - ''' - self.singa_tensor.ToHost() - self.device = pydevice.default_device - - def l2(self): - ''' - Returns: - the L2 norm. - ''' - return self.singa_tensor.L2() - - def l1(self): - ''' - Returns: - the L1 norm. - ''' - return self.singa_tensor.L1() - - def set_value(self, x): - '''Set all elements of the tensor to be the give value. - - Args: - x (float), a float value to be set to all elements. - ''' - # assert type(x) == float, 'set value only accepts float input' - # if isinstance(x, float): - self.singa_tensor.floatSetValue(x) - - def copy_from_numpy(self, np_array, offset=0): - ''' Copy the data from the numpy array. - - Args: - np_array: source numpy array - offset (int): destination offset - ''' - assert np_array.size == self.size(), 'tensor shape should be the same' - if not np_array.ndim == 1: - np_array = np_array.flatten() - dt = np_array.dtype - if dt == np.float32: - self.singa_tensor.floatCopyDataFromHostPtr(np_array) - elif dt == np.int or dt == np.int32: - self.singa_tensor.intCopyDataFromHostPtr(np_array) - else: - print 'Not implemented yet for ', dt - - def copy_data(self, t): - '''Copy data from other Tensor instance. - - Args: - t (Tensor): source Tensor. - ''' - assert isinstance(t, Tensor), 't must be a singa Tensor instance' - self.singa_tensor.CopyData(t.singa_tensor) - - def clone(self): - ''' - Returns: - a new Tensor which does deep copy of this tensor - ''' - return _call_singa_func(self.singa_tensor.Clone) - - def T(self): - ''' shallow copy, negate the transpose field. - - Returns: - a new Tensor which shares the underlying data memory (shallow copy) - but is marked as a transposed version of this tensor. - ''' - return _call_singa_func(self.singa_tensor.T) - - def copy(self): - '''shallow copy calls copy constructor of singa::Tensor - ''' - return _call_singa_func(singa.Tensor, self.singa_tensor) - - def deepcopy(self): - '''Same as clone(). - - Returns: - a new Tensor - ''' - return self.clone() - - def bernoulli(self, p): - '''Sample 0/1 for each element according to the given probability. - - Args: - p (float): with probability p, each element is sample to 1. - ''' - singa.floatBernoulli(float(p), self.singa_tensor) - - def gaussian(self, mean, std): - '''Generate a value for each element following a Gaussian distribution. - - Args: - mean (float): mean of the distribution - std (float): standard variance of the distribution - ''' - singa.floatGaussian(float(mean), float(std), self.singa_tensor) - - def uniform(self, low, high): - '''Generate a value for each element following a uniform distribution. - - Args: - low (float): the lower bound - high (float): the hight bound - ''' - singa.floatUniform(float(low), float(high), self.singa_tensor) - - def add_column(self, v): - '''Add a tensor to each column of this tensor. - - Args: - v (Tensor): a Tensor to be added as a column to this tensor. - ''' - singa.AddColumn(v.singa_tensor, self.singa_tensor) - - def add_row(self, v): - '''Add a tensor to each row of this tensor. - - Args: - v (Tensor): a Tensor to be added as a row to this tensor. - ''' - singa.AddRow(v.singa_tensor, self.singa_tensor) - - def div_column(self, v): - '''Divide each column of this tensor by v. - - Args: - v (Tensor): 1d tensor of the same length the column of self. - ''' - singa.DivColumn(v.singa_tensor, self.singa_tensor) - - def div_row(self, v): - '''Divide each row of this tensor by v. - - Args: - v (Tensor): 1d tensor of the same length the row of self. - ''' - singa.DivRow(v.singa_tensor, self.singa_tensor) - - def mult_column(self, v): - '''Multiply each column of this tensor by v element-wisely. - - Args: - v (Tensor): 1d tensor of the same length the column of self. - ''' - singa.MultColumn(v.singa_tensor, self.singa_tensor) - - def mult_row(self, v): - '''Multiply each row of this tensor by v element-wisely. - - Args: - v (Tensor): 1d tensor of the same length the row of self. - ''' - singa.MultRow(v.singa_tensor, self.singa_tensor) - - ''' - python operators (+=, -=, *=, /=) for singa::Tensor unary operators - ''' - - def __iadd__(self, x): - ''' inplace element-wise addition with a tensor or a float value. - - Args: - x (float or Tensor): - ''' - if isinstance(x, Tensor): - self.singa_tensor += x.singa_tensor - else: - self.singa_tensor += float(x) - return self - - def __isub__(self, x): - ''' inplace element-wise subtraction with a tensor or a float value. - - Args: - x (float or Tensor): - ''' - - if isinstance(x, Tensor): - self.singa_tensor -= x.singa_tensor - else: - self.singa_tensor -= float(x) - return self - - def __imul__(self, x): - ''' inplace element-wise multiplication with a tensor or a float value. - - Args: - x (float or Tensor): - ''' - if isinstance(x, Tensor): - self.singa_tensor *= x.singa_tensor - else: - self.singa_tensor *= float(x) - return self - - def __idiv__(self, x): - ''' inplace element-wise division by a tensor or a float value. - - Args: - x (float or Tensor): - ''' - if isinstance(x, Tensor): - self.singa_tensor /= x.singa_tensor - else: - self.singa_tensor /= float(x) - return self - - ''' - python operators (+, -, *, /, <, <=, >, >=) for singa binary operators - ''' - - def __add__(self, rhs): - if isinstance(rhs, Tensor): - return _call_singa_func(singa.Add_TT, - self.singa_tensor, rhs.singa_tensor) - else: - return _call_singa_func(singa.Add_Tf, - self.singa_tensor, rhs) - - def __sub__(self, rhs): - if isinstance(rhs, Tensor): - return _call_singa_func(singa.Sub_TT, - self.singa_tensor, rhs.singa_tensor) - else: - return _call_singa_func(singa.Sub_Tf, - self.singa_tensor, rhs) - - def __mul__(self, rhs): - if isinstance(rhs, Tensor): - return _call_singa_func(singa.EltwiseMul_TT, - self.singa_tensor, rhs.singa_tensor) - else: - return _call_singa_func(singa.EltwiseMul_Tf, - self.singa_tensor, rhs) - - def __div__(self, rhs): - if isinstance(rhs, Tensor): - return _call_singa_func(singa.Div_TT, - self.singa_tensor, rhs.singa_tensor) - else: - return _call_singa_func(singa.Div_Tf, - self.singa_tensor, rhs) - - def __lt__(self, rhs): - if isinstance(rhs, Tensor): - return _call_singa_func(singa.LT_TT, self.singa_tensor, - rhs.singa_tensor) - else: - return _call_singa_func(singa.LT_Tf, self.singa_tensor, rhs) - - def __le__(self, rhs): - if isinstance(rhs, Tensor): - return _call_singa_func( - singa.LE_TT, - self.singa_tensor, - rhs.singa_tensor) - else: - return _call_singa_func(singa.LE_Tf, self.singa_tensor, rhs) - - def __gt__(self, rhs): - if isinstance(rhs, Tensor): - return _call_singa_func( - singa.GT_TT, - self.singa_tensor, - rhs.singa_tensor) - else: - return _call_singa_func(singa.GT_Tf, self.singa_tensor, rhs) - - def __ge__(self, rhs): - if isinstance(rhs, Tensor): - return _call_singa_func( - singa.GE_TT, - self.singa_tensor, - rhs.singa_tensor) - else: - return _call_singa_func(singa.GE_Tf, self.singa_tensor, rhs) - - -''' python functions for global functions in Tensor.h -''' - - -def from_raw_tensor(t): - x = Tensor(t.shape(), t.device(), t.data_type()) - x.singa_tensor = t - return x - - -def from_raw_tensors(tt): - ret = [] - for t in list(tt): - ret.append(from_raw_tensor(t)) - return ret - - -def product(shape): - return reduce(lambda x, y: x * y, shape) - - -def sizeof(dtype): - ''' - Returns: - the number of bytes of the given SINGA data type defined in core.proto - ''' - return singa.SizeOf(dtype) - - -def reshape(t, s): - '''Reshape the input tensor with the given shape. - - Args: - t (Tensor): the tensor to be changed - s (list<int>): the new shape, which should have the same volumn as the - old shape. - - Returns: - the new Tensor - ''' - return _call_singa_func(singa.Reshape, t.singa_tensor, s) - - -def copy_data_to_from(dst, src, size, dst_offset=0, src_offset=0): - '''Copy the data between two Tensor instances which could be on different - devices. - - Args: - dst (Tensor): destination Tensor - src (Tensor): source Tensor - size (int) : number of elements to copy - dst_offset (int): offset in terms of elements to the start of dst - src_offset (int): offset in terms of elements to the start of src - ''' - singa.CopyDataToFrom(dst.singa_tensor, src.singa_tensor, size, - dst_offset, src_offset) - - -def from_numpy(np_array): - '''Create a Tensor instance with the shape, dtype and values from the numpy - array. - - Args: - np_array: the numpy array. - - Returns: - A Tensor instance allocated on the default CppCPU device. - ''' - ret = Tensor(np_array.shape) - ret.copy_from_numpy(np_array) - return ret - - -def to_numpy(t): - '''Convert the tensor into a numpy array. - - Since numpy array is allocated on CPU devices, the input Tensor instance - must be on the default CppCPU device. - - Args: - t (Tensor), a Tensor on the default CppCPU device. - - Returns: - a numpy array - ''' - assert (t.device.id() == -1) or (t.device is None), \ - 'Please move the tensor onto the default host device' - - if t.dtype == core_pb2.kFloat32: - np_array = t.singa_tensor.floatGetValue(int(t.size())) - elif t.dtype == core_pb2.kInt: - np_array = t.singa_tensor.intGetValue(int(t.size())) - else: - print 'Not implemented yet for ', t.dtype - return np_array.reshape(t.shape) - - -def abs(t): - ''' - Args: - t (Tensor): input Tensor - - Returns: - a new Tensor whose element y = abs(x), x is an element of t - ''' - return _call_singa_func(singa.Abs, t.singa_tensor) - - -def exp(t): - ''' - Args: - t (Tensor): input Tensor - - Returns: - a new Tensor whose element y = exp(x), x is an element of t - ''' - return _call_singa_func(singa.Exp, t.singa_tensor) - - -def log(t): - ''' - Args: - t (Tensor): input Tensor - - Returns: - a new Tensor whose element y = log(x), x is an element of t - ''' - return _call_singa_func(singa.Log, t.singa_tensor) - - -def relu(t): - ''' - Args: - t (Tensor): input Tensor - - Returns: - a new Tensor whose element y = x if x >0; otherwise 0; x is an element - of t - ''' - return _call_singa_func(singa.ReLU, t.singa_tensor) - - -def sigmoid(t): - ''' - Args: - t (Tensor): input Tensor - - Returns: - a new Tensor whose element y = sigmoid(x); x is an element of t - ''' - return _call_singa_func(singa.Sigmoid, t.singa_tensor) - - -def square(t): - ''' - Args: - t (Tensor): input Tensor - - Returns: - a new Tensor whose element y = x * x, x is an element of t - ''' - return _call_singa_func(singa.Square, t.singa_tensor) - - -def tanh(t): - ''' - Args: - t (Tensor): input Tensor - - Returns: - a new Tensor whose element y = tanh(x), x is an element of t - ''' - return _call_singa_func(singa.Tanh, t.singa_tensor) - - -def sum(t, axis=None): - '''Sum elements of the input tensor long the given axis. - - Args: - t (Tensor): input Tensor - axis (int, optional): if None, the summation is done over all elements; - if axis is provided, then it is calculated along the given axis, - e.g. 0 -- sum each column; 1 -- sum each row. - - Returns: - a float value as the sum of all elements, or a new Tensor - ''' - - if axis is None: - return singa.floatSum(t.singa_tensor) - else: - return _call_singa_func(singa.Sum, t.singa_tensor, axis) - - -def pow(t, x, out=None): - ''' - Args: - t (Tensor): input tensor - x (float or Tensor): y[i] = t[i]^x if x is a float value; otherwise, - y[i]= t[i]^x[i] if x is a tensor. - out (None or Tensor): if None, a new Tensor would be constructed to - store the result; otherwise, the result is put into out. - - Returns: - the result tensor. - ''' - if out is None: - if isinstance(x, Tensor): - return _call_singa_func(singa.Pow, t.singa_tensor, x.singa_tensor) - else: - return _call_singa_func(singa.Pow_f, t.singa_tensor, x) - else: - if isinstance(x, Tensor): - singa.Pow(t.singa_tensor, x.singa_tensor, out.singa_tensor) - else: - singa.Pow_f_out(t.singa_tensor, x, out.singa_tensor) - return out - - -def average(t, axis=None): - ''' - Args: - t (Tensor): input Tensor - axis (int, optional): if None, average all elements; otherwise average - along the given dimension. 0 for averaging each column; 1 for - averaging each row. - - Returns: - a float value if axis is None; otherwise, a new Tensor for the result. - ''' - if t.ndim() > 1: - return _call_singa_func(singa.Average, t.singa_tensor, axis) - else: - return singa.floatSum(t.singa_tensor) / t.size() - - -def softmax(t, out=None): - '''Apply SoftMax for each row of the Tensor. - - Args: - t (Tensor): the input 1d or 2d tensor - out (Tensor, optional): if not None, it is used to store the result - - Returns: - the result Tensor - ''' - if out is None: - return _call_singa_func(singa.SoftMax, t.singa_tensor) - else: - singa.SoftMax(t.singa_tensor, out.singa_tensor) - return out - - -def lt(t, x): - '''Elementi-wise comparison for t < x - - Args: - t (Tensor): left hand side operand - x (Tensor or float): right hand side operand - - Returns: - a Tensor with each element being t[i] < x ? 1.0f:0.0f, - or t[i] < x[i] ? 1.0f:0.0f - ''' - return t < x - - -def le(t, x): - '''Elementi-wise comparison for t <= x. - - Args: - t (Tensor): left hand side operand - x (Tensor or float): right hand side operand - - Returns: - a Tensor with each element being t[i] <= x ? 1.0f:0.0f, - or t[i] <= x[i] ? 1.0f:0.0f - ''' - return t <= x - - -def gt(t, x): - '''Elementi-wise comparison for t > x. - - Args: - t (Tensor): left hand side operand - x (Tensor or float): right hand side operand - - Returns: - a Tensor with each element being t[i] > x ? 1.0f:0.0f, - or t[i] > x[i] ? 1.0f:0.0f - ''' - return t > x - - -def ge(t, x): - '''Elementi-wise comparison for t >= x. - - Args: - t (Tensor): left hand side operand - x (Tensor or float): right hand side operand - - Returns: - a Tensor with each element being t[i] >= x ? 1.0f:0.0f, - or t[i] >= x[i] ? 1.0f:0.0f - ''' - return t >= x - - -def add(lhs, rhs, ret=None): - '''Elementi-wise addition. - - Args: - lhs (Tensor) - rhs (Tensor) - ret (Tensor, optional): if not None, the result is stored in it; - otherwise, a new Tensor would be created for the result. - - Returns: - the result Tensor - ''' - if ret is None: - # call Tensor.__add__() - return lhs + rhs - else: - if isinstance(rhs, Tensor): - singa.Add(lhs.singa_tensor, rhs.singa_tensor, ret.singa_tensor) - else: - singa.Add_Tf_out(lhs.singa_tensor, rhs, ret.singa_tensor) - return ret - - -def sub(lhs, rhs, ret=None): - '''Elementi-wise subtraction. - - Args: - lhs (Tensor) - rhs (Tensor) - ret (Tensor, optional): if not None, the result is stored in it; - otherwise, a new Tensor would be created for the result. - - Returns: - the result Tensor - ''' - if ret is None: - # call Tensor.__sub__() - return lhs - rhs - else: - if isinstance(rhs, Tensor): - singa.Sub(lhs.singa_tensor, rhs.singa_tensor, ret.singa_tensor) - else: - singa.Sub_Tf_out(lhs.singa_tensor, rhs, ret.singa_tensor) - return ret - - -def eltwise_mult(lhs, rhs, ret=None): - '''Elementi-wise multiplication. - - Args: - lhs (Tensor) - rhs (Tensor) - ret (Tensor, optional): if not None, the result is stored in it; - otherwise, a new Tensor would be created for the result. - - Returns: - the result Tensor - ''' - - if ret is None: - # call Tensor.__mul__() - return lhs * rhs - else: - if isinstance(rhs, Tensor): - singa.EltwiseMult(lhs.singa_tensor, rhs.singa_tensor, - ret.singa_tensor) - else: - singa.EltwiseMult_Tf_out(lhs.singa_tensor, rhs, - ret.singa_tensor) - return ret - - -def mult(A, B, C=None, alpha=1.0, beta=0.0): - '''Do matrix-matrix or matrix-vector multiplication. - - This function returns C = alpha * A * B + beta * C - - Args: - A (Tensor): 2d Tensor - B (Tensor): If B is a 1d Tensor, GEMV would be invoked for matrix-vector - multiplication; otherwise GEMM would be invoked. - C (Tensor, optional): for storing the result; If None, a new Tensor - would be created. - alpha (float) - beta (float) - - Returns: - the result Tensor - ''' - if C is None: - return _call_singa_func(singa.Mult, A.singa_tensor, B.singa_tensor) - else: - singa.floatMult(alpha, A.singa_tensor, B.singa_tensor, - beta, C.singa_tensor) - return C - - -def div(lhs, rhs, ret=None): - '''Elementi-wise division. - - Args: - lhs (Tensor) - rhs (Tensor) - ret (Tensor, optional): if not None, the result is stored in it; - otherwise, a new Tensor would be created for the result. - - Returns: - the result Tensor - ''' - if ret is None: - # call Tensor.__div__() - return lhs / rhs - else: - if isinstance(rhs, Tensor): - singa.Div(lhs.singa_tensor, rhs.singa_tensor, ret.singa_tensor) - else: - singa.Div_Tf_out(lhs.singa_tensor, rhs, ret.singa_tensor) - return ret - - -def axpy(alpha, x, y): - '''Element-wise operation for y += alpha * x. - - Args: - alpha (float) - x (Tensor) - y (Tensor) - - Returns: - y - ''' - singa.floatAxpy(float(alpha), x.singa_tensor, y.singa_tensor) - return y - - -def bernoulli(p, t): - '''Generate a binary value for each element of t. - - Args: - p (float): each element is 1 with probability p; and 0 with 1 - p - t (Tensor): the results are put into t - - Returns: - t - ''' - singa.floatBernoulli(float(p), t.singa_tensor) - return t - - -def gaussian(mean, std, t): - '''Generate values following a Gaussian distribution. - - Args: - mean (float): the mean of the Gaussian distribution. - std (float): the standard variance of the Gaussian distribution. - t (Tensor): the results are put into t - - Returns: - t - ''' - singa.floatGaussian(float(mean), float(std), t.singa_tensor) - return t - - -def uniform(low, high, t): - '''Generate values following a Uniform distribution. - - Args: - low (float): the lower bound - hight (float): the higher bound - t (Tensor): the results are put into t - - Returns: - t - ''' - singa.floatUniform(float(low), float(high), t.singa_tensor) - return t - - -def add_column(alpha, v, beta, M): - '''Add v to each column of M. - - Denote each column of M as m, m = alpha * v + beta * m - - Args: - alpha (float) - v (Tensor) - beta (float) - M (Tensor): 2d tensor - Returns: - M - ''' - singa.floatAddColumn(float(alpha), float(beta), v.singa_tensor, - M.singa_tensor) - return M - - -def add_row(alpha, v, beta, M): - '''Add v to each row of M. - - Denote each row of M as m, m = alpha * v + beta * m - - Args: - alpha (float) - v (Tensor) - beta (float) - M (Tensor): 2d tensor - Returns: - M - ''' - singa.floatAddRow(alpha, beta, v.singa_tensor, M.singa_tensor) - return M - - -def sum_columns(M): - '''Sum all columns into a single column. - - Args: - M (Tensor): the input 2d tensor. - - Returns: - a new Tensor as the resulted column. - ''' - assert M.ndim() == 2, 'M.nDim() is supposed to be 2' - ret = Tensor((M.shape[0], 1)) - singa.SumColumns(M.singa_tensor, ret.singa_tensor) - return ret - - -def sum_rows(M): - '''Sum all rows into a single row. - - Args: - M (Tensor): the input 2d tensor. - - Returns: - a new Tensor as the resulted row. - ''' - assert M.ndim() == 2, 'M.nDim() is supposed to be 2' - ret = Tensor((1, M.shape[1])) - singa.SumRows(M.singa_tensor, ret.singa_tensor) - return ret - - -''' private functions, internally used -''' - - -def _call_singa_func(_singa_func, *args): - ''' this function calls singa global functions that returns Tensor - and create new python Tensor instance - e.g., Tensor [singa_func](args...) - ''' - new_t = Tensor() - new_t.singa_tensor = _singa_func(*args) - new_t.shape = tuple(new_t.singa_tensor.shape()) - new_t.device = new_t.singa_tensor.device() - new_t.dtype = new_t.singa_tensor.data_type() - return new_t http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/d76caea3/src/python/singa/utils.py ---------------------------------------------------------------------- diff --git a/src/python/singa/utils.py b/src/python/singa/utils.py deleted file mode 100644 index a192cff..0000000 --- a/src/python/singa/utils.py +++ /dev/null @@ -1,47 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================= - -import sys - - -def update_progress(progress, info): - """Display progress bar and user info. - - Args: - progress (float): progress [0, 1], negative for halt, and >=1 for done. - info (str): a string for user provided info to be displayed. - """ - barLength = 20 # bar length - status = "" - if isinstance(progress, int): - progress = float(progress) - if not isinstance(progress, float): - progress = 0 - status = "error: progress var must be float. " - if progress < 0: - progress = 0 - status = "Halt. " - if progress >= 1: - progress = 1 - status = "Done. " - status = status + info - block = int(round(barLength*progress)) - text = "[{0}] {1:3.1f}% {2}".format("."*block + " "*(barLength-block), - progress*100, status) - sys.stdout.write(text) - sys.stdout.write('\b'*(9 + barLength + len(status))) - sys.stdout.flush() http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/d76caea3/src/python/swig/config.i.in ---------------------------------------------------------------------- diff --git a/src/python/swig/config.i.in b/src/python/swig/config.i.in deleted file mode 100644 index 5743ba3..0000000 --- a/src/python/swig/config.i.in +++ /dev/null @@ -1,4 +0,0 @@ -// Pass in cmake configurations to swig -#cmakedefine01 USE_CUDA -#cmakedefine01 USE_CUDNN -#cmakedefine CUDNN_VERSION_SWIG ${CUDNN_VERSION_SWIG} http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/d76caea3/src/python/swig/core_device.i ---------------------------------------------------------------------- diff --git a/src/python/swig/core_device.i b/src/python/swig/core_device.i deleted file mode 100644 index b3521be..0000000 --- a/src/python/swig/core_device.i +++ /dev/null @@ -1,69 +0,0 @@ -/************************************************************ -* -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, -* software distributed under the License is distributed on an -* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -* KIND, either express or implied. See the License for the -* specific language governing permissions and limitations -* under the License. -* -*************************************************************/ - -/*interface file for swig */ - -%module core_device -%include "std_vector.i" -%include "std_string.i" -%include "std_pair.i" -%include "std_shared_ptr.i" - -%{ -#include "singa/core/device.h" -%} - -/* smart pointer to avoid memory leak */ -%shared_ptr(singa::Device); - -namespace std{ -%template(sizePair) std::pair<size_t, size_t>; -%template(vectorPair) std::vector<std::pair<size_t, size_t>>; -%template(vectorSharedPtr) std::vector<std::shared_ptr<singa::Device>>; -} - -namespace singa{ - -class Device { - public: - virtual void SetRandSeed(unsigned seed) = 0; - std::shared_ptr<Device> host(); - int id() const; -}; - -class Platform { - public: -#if USE_CUDA - static int GetNumGPUs(); - static const std::vector<int> GetGPUIDs(); - static const std::pair<size_t, size_t> GetGPUMemSize(const int device); - static const std::vector<std::pair<size_t, size_t>> GetGPUMemSize(); - static const std::string DeviceQuery(int id, bool verbose = false); - static const std::vector<std::shared_ptr<Device> > - CreateCudaGPUs(const size_t num_devices, size_t init_size = 0); - static const std::vector<std::shared_ptr<Device>> - CreateCudaGPUsOn(const std::vector<int> &devices, size_t init_size = 0); -#endif // USE_CUDA - static std::shared_ptr<Device> GetDefaultDevice(); -}; - -} - http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/d76caea3/src/python/swig/core_tensor.i ---------------------------------------------------------------------- diff --git a/src/python/swig/core_tensor.i b/src/python/swig/core_tensor.i deleted file mode 100644 index 60f8b45..0000000 --- a/src/python/swig/core_tensor.i +++ /dev/null @@ -1,371 +0,0 @@ -/************************************************************ -* -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, -* software distributed under the License is distributed on an -* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -* KIND, either express or implied. See the License for the -* specific language governing permissions and limitations -* under the License. -* -*************************************************************/ - -/*interface file for swig */ - -%module core_tensor -%include "std_vector.i" -%include "std_string.i" -%include "std_shared_ptr.i" - -/* -%include "carrays.i" -%array_class(float, floatArray); -%array_class(int, intArray); -%array_class(char, charArray); -%array_class(double, doubleArray); -*/ - -%{ -#define SWIG_FILE_WITH_INIT -#include "singa/core/tensor.h" -#include "singa/core/device.h" -#include "singa/proto/core.pb.h" -#include "singa/proto/model.pb.h" -using singa::DataType; -%} -%shared_ptr(singa::Device) - -%include "numpy.i" -%init %{ - import_array(); -%} -%apply (float *IN_ARRAY1, int DIM1) { - (const float *src, const size_t num) -} -%apply (int *IN_ARRAY1, int DIM1) { - (const int *src, const size_t num) -} -%apply (float *ARGOUT_ARRAY1, int DIM1) { - (float *value, const size_t num) -} -%apply (int *ARGOUT_ARRAY1, int DIM1) { - (int *value, const size_t num) -} - -%template(Shape) std::vector<size_t>; - -namespace singa{ - - enum DataType { - kFloat32, kFloat16, kInt, kChar, kDouble - }; - - inline size_t Product(const std::vector<size_t> &shape, - int start = 0, size_t len = 0); - inline size_t SizeOf(DataType t); - - - class Tensor { - - public: - Tensor(); - explicit Tensor(const std::vector<size_t> &shape, - DataType dtype = kFloat32); - Tensor(const std::vector<size_t> &shape, - std::shared_ptr<singa::Device> dev, DataType dtype = kFloat32); - Tensor(const Tensor &from); - - std::shared_ptr<singa::Device> device() const; -/* - template <typename DType> const DType* data() const; - %template(floatData) data<float>; - %template(intData) data<int>; - %template(charData) data<char>; - %template(doubleData) data<double>; - */ - - template <typename SType> void GetValue(SType* value, const size_t num); - %template(floatGetValue) GetValue<float>; - %template(intGetValue) GetValue<int>; - - const DataType data_type() const; - const std::vector<size_t> &shape() const; - const size_t shape(size_t idx) const; - size_t nDim() const; - bool transpose() const; - size_t Size() const; - size_t MemSize() const; - void Reshape(const std::vector<size_t> &shape); - void ResetLike(const Tensor &t); - void AsType(DataType type); - void ToDevice(std::shared_ptr<singa::Device> dev); - void ToHost(); - float L2() const; - float L1() const; - - template <typename SType> void SetValue(const SType x); - %template(floatSetValue) SetValue<float>; - /* TODO(chonho-01) other types */ - // --- other types - - template <typename DType> void CopyDataFromHostPtr(const DType *src, - const size_t num, - const size_t offset = 0); - %template(floatCopyDataFromHostPtr) CopyDataFromHostPtr<float>; - %template(intCopyDataFromHostPtr) CopyDataFromHostPtr<int>; - // --- other types - - void CopyData(const Tensor &other); - Tensor Clone() const; - Tensor T() const; - - /* python has no assignment operator - Tensor &operator=(const Tensor &t); */ - Tensor &operator+=(const Tensor &t); - Tensor &operator-=(const Tensor &t); - Tensor &operator*=(const Tensor &t); - Tensor &operator/=(const Tensor &t); - - - template <typename DType> Tensor &operator+=(const DType x); - %template(iAdd_f) operator+=<float>; - // --- other types - - template <typename DType> Tensor &operator-=(DType x); - %template(iSub_f) operator-=<float>; - // --- other types - - template <typename DType> Tensor &operator*=(DType x); - %template(iMul_f) operator*=<float>; - // --- other types - - template <typename DType> Tensor &operator/=(DType x); - %template(iDiv_f) operator/=<float>; - // --- other types - - - /*TODO(chonho-04) - amax - amin - asum - */ - - - }; - - void CopyDataToFrom(Tensor *dst, const Tensor &src, size_t num, - size_t src_offset = 0, size_t dst_offset = 0); - - Tensor Reshape(const Tensor &in, const std::vector<size_t> &s); - - Tensor Abs(const Tensor &t); - Tensor Exp(const Tensor &t); - Tensor Log(const Tensor &t); - Tensor ReLU(const Tensor &t); - Tensor Sigmoid(const Tensor &t); - Tensor Sign(const Tensor &t); - Tensor Sqrt(const Tensor &t); - Tensor Square(const Tensor &t); - Tensor Tanh(const Tensor &t); - - Tensor Sum(const Tensor &t, int axis); - template <typename SType> SType Sum(const Tensor &t); - %template(floatSum) Sum<float>; - // --- other types - - /* TODO(chonho-02) - need to implement the average of all elements ??? */ - Tensor Average(const Tensor &t, int axis); - Tensor SoftMax(const Tensor &t); - - - Tensor Pow(const Tensor &base, const Tensor &exp); - void Pow(const Tensor &base, const Tensor &exp, Tensor *out); - - %rename(Pow_f) Pow(const Tensor &in, const float x); - template <typename SType> - Tensor Pow(const Tensor &in, const SType x); - %template(pow_temp) Pow<float>; - - %rename(Pow_f_out) Pow(const Tensor &in, const float x, Tensor *out); - template <typename SType> - void Pow(const Tensor &in, const SType x, Tensor *out); - %template(pow_temp) Pow<float>; - - - /* rename comparison operators */ - %rename(LT_Tf) operator<(const Tensor &t, const float x); - %rename(LE_Tf) operator<=(const Tensor &t, const float x); - %rename(GT_Tf) operator>(const Tensor &t, const float x); - %rename(GE_Tf) operator>=(const Tensor &t, const float x); - %rename(LT_TT) operator<(const Tensor &lhs, const Tensor &rhs); - %rename(LE_TT) operator<=(const Tensor &lhs, const Tensor &rhs); - %rename(GT_TT) operator>(const Tensor &lhs, const Tensor &rhs); - %rename(GE_TT) operator>=(const Tensor &lhs, const Tensor &rhs); - - Tensor operator<(const Tensor &lhs, const Tensor &rhs); - Tensor operator<=(const Tensor &lhs, const Tensor &rhs); - Tensor operator>(const Tensor &lhs, const Tensor &rhs); - Tensor operator>=(const Tensor &lhs, const Tensor &rhs); - - - template <typename DType> - Tensor operator<(const Tensor &t, const DType x); - %template(op) operator< <float>; - // --- other types - - template <typename DType> - Tensor operator<=(const Tensor &t, const DType x); - %template(op) operator<= <float>; - // --- other types - - template <typename DType> - Tensor operator>(const Tensor &t, const DType x); - %template(op) operator> <float>; - // --- other types - - template <typename DType> - Tensor operator>=(const Tensor &t, const DType x); - %template(op) operator>= <float>; - // --- other types - - /* NOTE(chonho) - no need to include theses - in python, these can be replaced with comparison operators - - template <typename DType> - void LT(const Tensor &t, DType x, Tensor *ret); - template <typename DType> - void LE(const Tensor &t, DType x, Tensor *ret); - template <typename DType> - void GT(const Tensor &t, DType x, Tensor *ret); - template <typename DType> - void GE(const Tensor &t, DType x, Tensor *ret); - */ - - - /* ========== Arithmetic operations ========== */ - %rename(Add_TT) operator+(const Tensor &lhs, const Tensor &rhs); - %rename(Sub_TT) operator-(const Tensor &lhs, const Tensor &rhs); - %rename(EltwiseMul_TT) operator*(const Tensor &lhs, const Tensor &rhs); - %rename(Div_TT) operator/(const Tensor &lhs, const Tensor &rhs); - Tensor operator+(const Tensor &lhs, const Tensor &rhs); - Tensor operator-(const Tensor &lhs, const Tensor &rhs); - Tensor operator*(const Tensor &lhs, const Tensor &rhs); - Tensor operator/(const Tensor &lhs, const Tensor &rhs); - - %rename(Add_Tf) operator+(const Tensor &t, float x); - template <typename DType> - Tensor operator+(const Tensor &t, DType x); - %template(op) operator+<float>; - // --- other types - - %rename(Sub_Tf) operator-(const Tensor &t, float x); - template <typename DType> - Tensor operator-(const Tensor &t, DType x); - %template(op) operator-<float>; - // --- other types - - %rename(EltwiseMul_Tf) operator*(const Tensor &t, float x); - template <typename DType> - Tensor operator*(const Tensor &t, DType x); - %template(op) operator*<float>; - // --- other types - - %rename(Div_Tf) operator/(const Tensor &t, float x); - template <typename DType> - Tensor operator/(const Tensor &t, DType x); - %template(op) operator/<float>; - // --- other types - - void Add(const Tensor &lhs, const Tensor &rhs, Tensor *ret); - void Sub(const Tensor &lhs, const Tensor &rhs, Tensor *ret); - void EltwiseMult(const Tensor &lhs, const Tensor &rhs, Tensor *ret); - void Div(const Tensor &lhs, const Tensor &rhs, Tensor *ret); - - template <typename DType> - void Add(const Tensor &t, DType x, Tensor *ret); - %template(Add_Tf_out) Add<float>; - // --- other types - - template <typename DType> - void Sub(const Tensor &t, DType x, Tensor *ret); - %template(Sub_Tf_out) Sub<float>; - // --- other types - - template <typename DType> - void EltwiseMult(const Tensor &t, DType x, Tensor *ret); - %template(EltwiseMult_Tf_out) EltwiseMult<float>; - // --- other types - - template <typename DType> - void Div(const Tensor &t, DType x, Tensor *ret); - %template(Div_Tf_out) Div<float>; - // --- other types - - - /* ========== Random operations ========== */ - template <typename SType> - void Bernoulli(const SType p, Tensor *out); - %template(floatBernoulli) Bernoulli<float>; - // --- other types - - template <typename SType> - void Gaussian(const SType mean, const SType std, Tensor *out); - %template(floatGaussian) Gaussian<float>; - // --- other types - - template <typename SType> - void Uniform(const SType low, const SType high, Tensor *out); - %template(floatUniform) Uniform<float>; - // --- other types - - /* ========== Blas operations ========== */ - template <typename SType> - void Axpy(SType alpha, const Tensor &in, Tensor *out); - %template(floatAxpy) Axpy<float>; - // --- other types - - Tensor Mult(const Tensor &A, const Tensor &B); - void Mult(const Tensor &A, const Tensor &B, Tensor *C); - template <typename SType> - void Mult(const SType alpha, const Tensor &A, const Tensor &B, - const SType beta, Tensor *C); - %template(floatMult) Mult<float>; - - void AddColumn(const Tensor &v, Tensor *M); - template <typename SType> - void AddColumn(const SType alpha, const SType beta, const Tensor &v, - Tensor *M); - %template(floatAddColumn) AddColumn<float>; - - void AddRow(const Tensor &v, Tensor *M); - template <typename SType> - void AddRow(const SType alpha, const SType beta, const Tensor &v, - Tensor *M); - %template(floatAddRow) AddRow<float>; - - void DivColumn(const Tensor &v, Tensor *M); - void DivRow(const Tensor &v, Tensor *M); - void MultColumn(const Tensor &v, Tensor *M); - void MultRow(const Tensor &v, Tensor *M); - void SubColumn(const Tensor &v, Tensor *M); - void SubRow(const Tensor &v, Tensor *M); - - void SumColumns(const Tensor &M, Tensor *v); - void SumRows(const Tensor &M, Tensor *v); - - Tensor SoftMax(const Tensor &in); - void SoftMax(const Tensor &in, Tensor *out); - -} - http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/d76caea3/src/python/swig/model_layer.i ---------------------------------------------------------------------- diff --git a/src/python/swig/model_layer.i b/src/python/swig/model_layer.i deleted file mode 100644 index ae651d5..0000000 --- a/src/python/swig/model_layer.i +++ /dev/null @@ -1,102 +0,0 @@ -/************************************************************ -* -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, -* software distributed under the License is distributed on an -* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -* KIND, either express or implied. See the License for the -* specific language governing permissions and limitations -* under the License. -* -*************************************************************/ - -/*interface file for swig */ - -%module model_layer -%include "std_vector.i" -%include "std_string.i" -%include "std_pair.i" -%include "std_shared_ptr.i" - - -%{ -#include "singa/model/layer.h" -#include "../src/model/layer/rnn.h" -#include "../src/model/layer/cudnn_rnn.h" -#include "singa/core/tensor.h" -#include "singa/proto/model.pb.h" -#include "singa/singa_config.h" -using singa::Tensor; -using singa::ParamSpec; -using singa::DataType; -using singa::Device; -using singa::LayerConf; -%} - -%shared_ptr(singa::Layer) -%shared_ptr(singa::RNN) -#if USE_CUDNN -%shared_ptr(singa::CudnnRNN) -#endif - -namespace std { - %template(strVector) vector<string>; - %template(paramVector) vector<singa::ParamSpec>; - %template(tensorVector) vector<singa::Tensor>; - %template(ttvecPair) pair<singa::Tensor, vector<singa::Tensor>>; - %template(tvecPair) pair<vector<singa::Tensor>, vector<singa::Tensor>>; -} - - -namespace singa { - -class Layer { - public: - Layer(); -// virtual void Setup(const std::vector<vector<size_t>>&, const string&); - void Setup(const std::vector<size_t>& in_sample_shape, - const std::string& proto_str); - virtual const std::vector<Tensor> param_values(); - virtual const std::vector<size_t> GetOutputSampleShape() const; - virtual void ToDevice(std::shared_ptr<Device> device); - virtual void AsType(DataType dtype); - virtual const Tensor Forward(int flag, const Tensor& input); - virtual const std::vector<Tensor> Forward( - int flag, const std::vector<Tensor>& inputs); - virtual const std::pair<Tensor, std::vector<Tensor>> Backward( - int flag, const Tensor& grad); - virtual const std::pair<std::vector<Tensor>, std::vector<Tensor>> - Backward(int flag, const vector<Tensor>& grads); -}; - -std::shared_ptr<Layer> CreateLayer(const std::string& type); -const std::vector<std::string> GetRegisteredLayers(); -class RNN : public Layer { -}; - -#if USE_CUDA && USE_CUDNN -#if CUDNN_VERSION_SWIG >= 5005 -class CudnnRNN : public RNN { - public: - // note: Must use std::vector instead of vector. - const std::vector<Tensor> Forward(int flag, const std::vector<Tensor>& inputs) override; - const std::pair<std::vector<Tensor>, std::vector<Tensor>> Backward( - int flag, const std::vector<Tensor>& grads) override; - void ToDevice(std::shared_ptr<Device> device) override; - const std::vector<Tensor> param_values() override; - const std::vector<size_t> GetOutputSampleShape() const override; -}; - -#endif // CUDNN_VERSION_SWIG >= 5005 -#endif // USE_CUDA && USE_CUDNN -} - http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/d76caea3/src/python/swig/model_loss.i ---------------------------------------------------------------------- diff --git a/src/python/swig/model_loss.i b/src/python/swig/model_loss.i deleted file mode 100644 index 864ad88..0000000 --- a/src/python/swig/model_loss.i +++ /dev/null @@ -1,62 +0,0 @@ -/************************************************************ -* -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, -* software distributed under the License is distributed on an -* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -* KIND, either express or implied. See the License for the -* specific language governing permissions and limitations -* under the License. -* -*************************************************************/ - -/*interface file for swig */ - -%module model_loss -%include "std_string.i" -%{ -#include "singa/model/loss.h" - using singa::Tensor; -%} - -namespace singa { -class Loss { -public: - Loss() = default; - virtual ~Loss() {} - - virtual Tensor Forward(int flag, const Tensor &prediction, - const Tensor &target) = 0; - - float Evaluate(int flag, const Tensor &prediction, const Tensor &target); - - /// Compute the gradients of the loss values w.r.t. the prediction. - virtual Tensor Backward() = 0; -}; - -class MSE : public Loss { -public: - Tensor Forward(int flag, const Tensor &prediction, const Tensor &target) - override; - - Tensor Backward() override; -}; - -class SoftmaxCrossEntropy : public Loss { -public: - Tensor Forward(int flag, const Tensor &prediction, const Tensor &target) - override; - - Tensor Backward() override; -}; - -} http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/d76caea3/src/python/swig/model_metric.i ---------------------------------------------------------------------- diff --git a/src/python/swig/model_metric.i b/src/python/swig/model_metric.i deleted file mode 100644 index 9d93cd0..0000000 --- a/src/python/swig/model_metric.i +++ /dev/null @@ -1,43 +0,0 @@ -/************************************************************ -* -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, -* software distributed under the License is distributed on an -* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -* KIND, either express or implied. See the License for the -* specific language governing permissions and limitations -* under the License. -* -*************************************************************/ - -/*interface file for swig */ - -%module model_metric -%{ -#include "singa/model/metric.h" -using singa::Tensor; -%} - -namespace singa { -class Metric { - public: - Metric() = default; - virtual ~Metric() {} - virtual Tensor Forward(const Tensor& prediction, const Tensor& target) = 0; - float Evaluate(const Tensor& prediction, const Tensor& target); -}; -class Accuracy : public Metric { - public: - Tensor Forward(const Tensor& prediction, const Tensor& target); -}; - -} http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/d76caea3/src/python/swig/model_optimizer.i ---------------------------------------------------------------------- diff --git a/src/python/swig/model_optimizer.i b/src/python/swig/model_optimizer.i deleted file mode 100644 index 78b30b8..0000000 --- a/src/python/swig/model_optimizer.i +++ /dev/null @@ -1,70 +0,0 @@ -/************************************************************ -* -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, -* software distributed under the License is distributed on an -* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -* KIND, either express or implied. See the License for the -* specific language governing permissions and limitations -* under the License. -* -*************************************************************/ - -/*interface file for swig */ - -%module model_optimizer -%include "std_vector.i" -%include "std_string.i" -%include "std_pair.i" -%include "std_shared_ptr.i" - -%{ -#include "singa/model/optimizer.h" -#include "singa/proto/model.pb.h" -using singa::Tensor; -using singa::ParamSpec; -using singa::OptimizerConf; -%} - - -%shared_ptr(singa::Optimizer) -%shared_ptr(singa::Regularizer) -%shared_ptr(singa::Constraint) - -namespace singa { -class Optimizer { - public: - // Optimizer() = default; - virtual ~Optimizer() = default; - void Setup(const std::string& str); - virtual void Apply(int step, float lr, const std::string& name, - const Tensor& grad, Tensor& value) = 0; -}; -inline std::shared_ptr<Optimizer> CreateOptimizer(const std::string& type); - -class Constraint { - public: - Constraint() = default; - void Setup(const std::string& conf_str); - void Apply(int step, Tensor& grad, Tensor& value); -}; - -inline std::shared_ptr<Constraint> CreateConstraint(const std::string& type); - -class Regularizer { - public: - Regularizer() = default; - void Setup(const std::string& conf_str); - void Apply(int step, Tensor& grad, Tensor& value); -}; -inline std::shared_ptr<Regularizer> CreateRegularizer(const std::string& type); -}
