From 0beb2d89347a2dcb085d71a6490694c06e4ce9da Mon Sep 17 00:00:00 2001 From: Donghyeon Jeong Date: Thu, 23 Nov 2023 09:37:06 +0900 Subject: [PATCH] [Tensor] Remove data type as input for Float/Half Tensor As discussed on #2367, the Float/HalfTensor data type does not change. There's no need to take datatype as input and therefore is removed. **Self-evaluation:** 1. Build test: [X]Passed [ ]Failed [ ]Skipped 2. Run test: [X]Passed [ ]Failed [ ]Skipped Signed-off-by: Donghyeon Jeong --- nntrainer/tensor/float_tensor.cpp | 18 ++++----- nntrainer/tensor/float_tensor.h | 59 +++++++++++------------------- nntrainer/tensor/half_tensor.cpp | 20 ++++------ nntrainer/tensor/half_tensor.h | 61 +++++++++++-------------------- nntrainer/tensor/tensor_v2.cpp | 4 +- 5 files changed, 60 insertions(+), 102 deletions(-) diff --git a/nntrainer/tensor/float_tensor.cpp b/nntrainer/tensor/float_tensor.cpp index 3b814ed5..3db9c7ee 100644 --- a/nntrainer/tensor/float_tensor.cpp +++ b/nntrainer/tensor/float_tensor.cpp @@ -1069,7 +1069,7 @@ FloatTensor FloatTensor::sum_by_batch() const { NNTR_THROW_IF(!contiguous, std::invalid_argument) << getName() << " is not contiguous, cannot sum"; - FloatTensor ret(dim.batch(), 1, 1, 1, this->getFormat(), getDataType()); + FloatTensor ret(dim.batch(), 1, 1, 1, this->getFormat()); size_t feat_len = dim.getFeatureLen(); size_t batch = dim.batch(); @@ -1088,7 +1088,7 @@ FloatTensor FloatTensor::sum_by_batch() const { * @brief Calculate sum according to the axis. */ FloatTensor FloatTensor::sum(unsigned int axis, float alpha) const { - FloatTensor ret("", this->getFormat(), this->getDataType()); + FloatTensor ret("", this->getFormat()); return sum(axis, ret, alpha, 0); } @@ -1274,7 +1274,7 @@ FloatTensor &FloatTensor::dotBatched(FloatTensor const &m, FloatTensor &result, FloatTensor FloatTensor::dot(FloatTensor const &m, bool trans, bool trans_m) const { - FloatTensor output("", this->getFormat(), this->getDataType()); + FloatTensor output("", this->getFormat()); dot(m, output, trans, trans_m); return output; @@ -1828,8 +1828,7 @@ void FloatTensor::copy(const FloatTensor &from) { throw std::runtime_error("Cannot copy non-contiguous tensor"); } - if (from.size() != 0 && size() == from.size() && - getDataType() == from.getDataType()) { + if (from.size() != 0 && size() == from.size()) { reshape(from.getDim()); copy(from.getData()); } else { @@ -1919,7 +1918,7 @@ void FloatTensor::save(std::ostream &file) { putData(); } -void FloatTensor::read(std::ifstream &file, Tdatatype s_type) { +void FloatTensor::read(std::ifstream &file) { NNTR_THROW_IF(!contiguous, std::invalid_argument) << getName() << " is not contiguous, cannot read."; @@ -1938,7 +1937,7 @@ void FloatTensor::read(std::ifstream &file, Tdatatype s_type) { * @brief Calculate average value according to the axis. */ FloatTensor FloatTensor::average(unsigned int axis) const { - FloatTensor t("", this->getFormat(), this->getDataType()); + FloatTensor t("", this->getFormat()); return average(axis, t); } @@ -1961,7 +1960,7 @@ FloatTensor &FloatTensor::average(unsigned int axis, } FloatTensor FloatTensor::average(const std::vector &axes) const { - FloatTensor t("", this->getFormat(), this->getDataType()); + FloatTensor t("", this->getFormat()); return average(axes, t); } @@ -2129,8 +2128,7 @@ void FloatTensor::standardization_i() { this->subtract_i(mean_by_batch); - FloatTensor std_dev_by_batch(dim.batch(), 1, 1, 1, dim.getFormat(), - dim.getDataType()); + FloatTensor std_dev_by_batch(dim.batch(), 1, 1, 1, dim.getFormat()); std_dev_by_batch.setZero(); float *std_dev = std_dev_by_batch.getData(); diff --git a/nntrainer/tensor/float_tensor.h b/nntrainer/tensor/float_tensor.h index 94b4599d..dba92b82 100644 --- a/nntrainer/tensor/float_tensor.h +++ b/nntrainer/tensor/float_tensor.h @@ -61,9 +61,8 @@ public: /** * @brief Basic Constructor of FloatTensor */ - FloatTensor(std::string name_ = "", Tformat fm = Tformat::NCHW, - Tdatatype d_type = Tdatatype::FP32) : - dim(TensorDim(fm, d_type)), + FloatTensor(std::string name_ = "", Tformat fm = Tformat::NCHW) : + dim(TensorDim(fm, Tdatatype::FP32)), strides(dim.computeStrides()), contiguous(true), initializer(Initializer::NONE), @@ -98,8 +97,8 @@ public: * @param[in] d3 Width */ FloatTensor(size_t d0, size_t d1, size_t d2, size_t d3, - Tformat fm = Tformat::NCHW, Tdatatype d_type = Tdatatype::FP32) : - FloatTensor(TensorDim(d0, d1, d2, d3, fm, d_type), nullptr){}; + Tformat fm = Tformat::NCHW) : + FloatTensor(TensorDim(d0, d1, d2, d3, fm, Tdatatype::FP32), nullptr){}; /** * @brief Constructor of FloatTensor @@ -107,26 +106,23 @@ public: * @param[in] d2 Height * @param[in] d3 Width */ - FloatTensor(size_t d1, size_t d2, size_t d3, Tformat fm = Tformat::NCHW, - Tdatatype d_type = Tdatatype::FP32) : - FloatTensor(1, d1, d2, d3, fm, d_type){}; + FloatTensor(size_t d1, size_t d2, size_t d3, Tformat fm = Tformat::NCHW) : + FloatTensor(1, d1, d2, d3, fm){}; /** * @brief Constructor of FloatTensor with batch size one and d1 size one * @param[in] d2 Height (NCHW) or Width (NHWC) * @param[in] d3 Width (NCHW) or Channel (NHWC) */ - FloatTensor(size_t d2, size_t d3, Tformat fm = Tformat::NCHW, - Tdatatype d_type = Tdatatype::FP32) : - FloatTensor(1, 1, d2, d3, fm, d_type){}; + FloatTensor(size_t d2, size_t d3, Tformat fm = Tformat::NCHW) : + FloatTensor(1, 1, d2, d3, fm){}; /** * @brief Constructor of FloatTensor with just Width or Channel * @param[in] d3 Width (NCHW) or Channel (NHWC) */ - explicit FloatTensor(size_t d3, Tformat fm = Tformat::NCHW, - Tdatatype d_type = Tdatatype::FP32) : - FloatTensor(1, 1, 1, d3, fm, d_type){}; + explicit FloatTensor(size_t d3, Tformat fm = Tformat::NCHW) : + FloatTensor(1, 1, 1, d3, fm){}; /** * @brief Constructor of FloatTensor @@ -360,9 +356,6 @@ public: * @param[in] idx location */ const float &getValue(unsigned int idx) const noexcept { - if (getDataType() == Tdatatype::QINT4) { - return getData()[idx / 2]; - } return getData()[idx]; } @@ -370,12 +363,7 @@ public: * @brief return value at specific location * @param[in] idx location */ - float &getValue(unsigned int idx) noexcept { - if (getDataType() == Tdatatype::QINT4) { - return getData()[idx / 2]; - } - return getData()[idx]; - } + float &getValue(unsigned int idx) noexcept { return getData()[idx]; } /** * @brief Get the Value thinking that it is padded @@ -733,7 +721,7 @@ public: * @brief getter of size of data * @retval size of data */ - unsigned int sizeofData() { return dim.getDataTypeSize(); } + unsigned int sizeofData() const { return dim.getDataTypeSize(); } /** * @brief Dot Product of FloatTensor ( equal MxM ) @@ -1176,12 +1164,7 @@ public: * @brief Get size of the data in bytes * @retval size_t Size in bytes */ - size_t bytes() const { - if (getDataType() == Tdatatype::QINT4) { - return (size() * dim.getDataTypeSize() + 1) / 2; - } - return size() * dim.getDataTypeSize(); - } + size_t bytes() const { return size() * dim.getDataTypeSize(); } /** * @brief Set the element value @@ -1387,9 +1370,8 @@ public: /** * @brief Read the FloatTensor from file * @param[in] file input file stream - * @param[in] s_type scale factor data type */ - void read(std::ifstream &file, Tdatatype s_type = Tdatatype::FP32); + void read(std::ifstream &file); /** * @brief return argument index which value is max by batch @@ -1519,12 +1501,6 @@ public: return data->getAddr() + offset + index; } - /** - * @brief setter data type - * @param[in] Data Type - */ - void setDataType(Tdatatype d_type) { dim.setDataType(d_type); } - /** * @brief setter tensor type * @param[in] tensor Type @@ -1585,6 +1561,13 @@ public: const std::array getStrides() const noexcept { return strides; } + + /** + * @brief return contiguous state of tensor. + * @retval bool contiguous + */ + bool getContiguous() const { return contiguous; } + /** * @brief Get linear index given the n-d index */ diff --git a/nntrainer/tensor/half_tensor.cpp b/nntrainer/tensor/half_tensor.cpp index 79c11dc7..99317b63 100644 --- a/nntrainer/tensor/half_tensor.cpp +++ b/nntrainer/tensor/half_tensor.cpp @@ -446,8 +446,6 @@ HalfTensor &HalfTensor::multiply(float const &value, HalfTensor &out) const { static_cast<_FP16>(value)); apply(f, out); return out; - - return out; } int HalfTensor::multiply_i(HalfTensor const &m, const float beta) { @@ -1061,7 +1059,7 @@ HalfTensor HalfTensor::sum_by_batch() const { NNTR_THROW_IF(!contiguous, std::invalid_argument) << getName() << " is not contiguous, cannot sum"; - HalfTensor ret(dim.batch(), 1, 1, 1, this->getFormat(), getDataType()); + HalfTensor ret(dim.batch(), 1, 1, 1, this->getFormat()); size_t feat_len = dim.getFeatureLen(); size_t batch = dim.batch(); @@ -1080,7 +1078,7 @@ HalfTensor HalfTensor::sum_by_batch() const { * @brief Calculate sum according to the axis. */ HalfTensor HalfTensor::sum(unsigned int axis, float alpha) const { - HalfTensor ret("", this->getFormat(), this->getDataType()); + HalfTensor ret("", this->getFormat()); return sum(axis, ret, alpha, 0); } @@ -1264,7 +1262,7 @@ HalfTensor &HalfTensor::dotBatched(HalfTensor const &m, HalfTensor &result, HalfTensor HalfTensor::dot(HalfTensor const &m, bool trans, bool trans_m) const { - HalfTensor output("", this->getFormat(), this->getDataType()); + HalfTensor output("", this->getFormat()); dot(m, output, trans, trans_m); return output; @@ -1832,8 +1830,7 @@ void HalfTensor::copy(const HalfTensor &from) { throw std::runtime_error("Cannot copy non-contiguous tensor"); } - if (from.size() != 0 && size() == from.size() && - getDataType() == from.getDataType()) { + if (from.size() != 0 && size() == from.size()) { reshape(from.getDim()); copy(from.getData()); @@ -1931,7 +1928,7 @@ void HalfTensor::save(std::ostream &file) { putData(); } -void HalfTensor::read(std::ifstream &file, Tdatatype s_type) { +void HalfTensor::read(std::ifstream &file) { NNTR_THROW_IF(!contiguous, std::invalid_argument) << getName() << " is not contiguous, cannot read."; @@ -1950,7 +1947,7 @@ void HalfTensor::read(std::ifstream &file, Tdatatype s_type) { * @brief Calculate average value according to the axis. */ HalfTensor HalfTensor::average(unsigned int axis) const { - HalfTensor t("", this->getFormat(), this->getDataType()); + HalfTensor t("", this->getFormat()); return average(axis, t); } @@ -1972,7 +1969,7 @@ HalfTensor &HalfTensor::average(unsigned int axis, HalfTensor &output) const { } HalfTensor HalfTensor::average(const std::vector &axes) const { - HalfTensor t("", this->getFormat(), this->getDataType()); + HalfTensor t("", this->getFormat()); return average(axes, t); } @@ -2146,8 +2143,7 @@ void HalfTensor::standardization_i() { this->subtract_i(mean_by_batch); - HalfTensor std_dev_by_batch(dim.batch(), 1, 1, 1, dim.getFormat(), - dim.getDataType()); + HalfTensor std_dev_by_batch(dim.batch(), 1, 1, 1, dim.getFormat()); std_dev_by_batch.setZero(); _FP16 *std_dev = std_dev_by_batch.getData(); diff --git a/nntrainer/tensor/half_tensor.h b/nntrainer/tensor/half_tensor.h index 86a689ee..eb170cfd 100644 --- a/nntrainer/tensor/half_tensor.h +++ b/nntrainer/tensor/half_tensor.h @@ -63,9 +63,8 @@ public: /** * @brief Basic Constructor of HalfTensor */ - HalfTensor(std::string name_ = "", Tformat fm = Tformat::NCHW, - Tdatatype d_type = Tdatatype::FP16) : - dim(TensorDim(fm, d_type)), + HalfTensor(std::string name_ = "", Tformat fm = Tformat::NCHW) : + dim(TensorDim(fm, Tdatatype::FP16)), strides(dim.computeStrides()), contiguous(true), initializer(Initializer::NONE), @@ -100,8 +99,8 @@ public: * @param[in] d3 Width */ HalfTensor(size_t d0, size_t d1, size_t d2, size_t d3, - Tformat fm = Tformat::NCHW, Tdatatype d_type = Tdatatype::FP16) : - HalfTensor(TensorDim(d0, d1, d2, d3, fm, d_type), nullptr){}; + Tformat fm = Tformat::NCHW) : + HalfTensor(TensorDim(d0, d1, d2, d3, fm, Tdatatype::FP16), nullptr){}; /** * @brief Constructor of HalfTensor @@ -109,26 +108,23 @@ public: * @param[in] d2 Height * @param[in] d3 Width */ - HalfTensor(size_t d1, size_t d2, size_t d3, Tformat fm = Tformat::NCHW, - Tdatatype d_type = Tdatatype::FP16) : - HalfTensor(1, d1, d2, d3, fm, d_type){}; + HalfTensor(size_t d1, size_t d2, size_t d3, Tformat fm = Tformat::NCHW) : + HalfTensor(1, d1, d2, d3, fm){}; /** * @brief Constructor of HalfTensor with batch size one and d1 size one * @param[in] d2 Height (NCHW) or Width (NHWC) * @param[in] d3 Width (NCHW) or Channel (NHWC) */ - HalfTensor(size_t d2, size_t d3, Tformat fm = Tformat::NCHW, - Tdatatype d_type = Tdatatype::FP16) : - HalfTensor(1, 1, d2, d3, fm, d_type){}; + HalfTensor(size_t d2, size_t d3, Tformat fm = Tformat::NCHW) : + HalfTensor(1, 1, d2, d3, fm){}; /** * @brief Constructor of HalfTensor with just Width or Channel * @param[in] d3 Width (NCHW) or Channel (NHWC) */ - explicit HalfTensor(size_t d3, Tformat fm = Tformat::NCHW, - Tdatatype d_type = Tdatatype::FP16) : - HalfTensor(1, 1, 1, d3, fm, d_type){}; + explicit HalfTensor(size_t d3, Tformat fm = Tformat::NCHW) : + HalfTensor(1, 1, 1, d3, fm){}; /** * @brief Constructor of HalfTensor @@ -205,8 +201,6 @@ public: contiguous = true; initializer = Initializer::NONE; - setDataType(Tdatatype::FP16); - // if fm == Tformat::NCHW, then dim[0] == batch , dim[1] == channel, dim[2] // == height, dim[3] == width. and if fm == Tformat::NHWC, dim[0] == batch, // dim[1] == height, dim[2] == width, dim[3] == channel @@ -363,9 +357,6 @@ public: * @param[in] idx location */ const _FP16 &getValue(unsigned int idx) const noexcept { - if (getDataType() == Tdatatype::QINT4) { - return getData()[idx / 2]; - } return getData()[idx]; } @@ -373,12 +364,7 @@ public: * @brief return value at specific location * @param[in] idx location */ - _FP16 &getValue(unsigned int idx) noexcept { - if (getDataType() == Tdatatype::QINT4) { - return getData()[idx / 2]; - } - return getData()[idx]; - } + _FP16 &getValue(unsigned int idx) noexcept { return getData()[idx]; } /** * @brief Get the Value thinking that it is padded @@ -735,7 +721,7 @@ public: * @brief getter of size of data * @retval size of data */ - unsigned int sizeofData() { return dim.getDataTypeSize(); } + unsigned int sizeofData() const { return dim.getDataTypeSize(); } /** * @brief Dot Product of HalfTensor ( equal MxM ) @@ -1178,12 +1164,7 @@ public: * @brief Get size of the data in bytes * @retval size_t Size in bytes */ - size_t bytes() const { - if (getDataType() == Tdatatype::QINT4) { - return (size() * dim.getDataTypeSize() + 1) / 2; - } - return size() * dim.getDataTypeSize(); - } + size_t bytes() const { return size() * dim.getDataTypeSize(); } /** * @brief Set the element value @@ -1403,9 +1384,8 @@ public: /** * @brief Read the HalfTensor from file * @param[in] file input file stream - * @param[in] s_type scale factor data type */ - void read(std::ifstream &file, Tdatatype s_type = Tdatatype::FP32); + void read(std::ifstream &file); /** * @brief return argument index which value is max by batch @@ -1535,12 +1515,6 @@ public: return data->getAddr<_FP16>() + offset + index; } - /** - * @brief setter data type - * @param[in] Data Type - */ - void setDataType(Tdatatype d_type) { dim.setDataType(d_type); } - /** * @brief setter tensor type * @param[in] tensor Type @@ -1601,6 +1575,13 @@ public: const std::array getStrides() const noexcept { return strides; } + + /** + * @brief return contiguous state of tensor. + * @retval bool contiguous + */ + bool getContiguous() const { return contiguous; } + /** * @brief Get linear index given the n-d index */ diff --git a/nntrainer/tensor/tensor_v2.cpp b/nntrainer/tensor/tensor_v2.cpp index 96ff69b2..35a4f561 100644 --- a/nntrainer/tensor/tensor_v2.cpp +++ b/nntrainer/tensor/tensor_v2.cpp @@ -33,12 +33,12 @@ namespace nntrainer { TensorV2::TensorV2(std::string name_, Tformat fm, Tdatatype d_type) { if (d_type == Tdatatype::FP32) { object = std::shared_ptr>( - new TensorBase(FloatTensor(name_, fm, d_type)), + new TensorBase(FloatTensor(name_, fm)), std::default_delete>()); } else if (d_type == Tdatatype::FP16) { #ifdef ENABLE_FP16 object = std::shared_ptr>( - new TensorBase(HalfTensor(name_, fm, d_type)), + new TensorBase(HalfTensor(name_, fm)), std::default_delete>()); #else throw std::invalid_argument("Error: enable-fp16 is not enabled"); -- 2.34.1