Skip to content
This repository was archived by the owner on Jan 31, 2024. It is now read-only.

Commit 4833a20

Browse files
committed
LiteRt Qualcomm wrappers
1 parent 50218d0 commit 4833a20

File tree

9 files changed

+793
-0
lines changed

9 files changed

+793
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# TODO: license
2+
3+
package(
4+
# copybara:uncomment default_applicable_licenses = ["//tensorflow:license"],
5+
default_visibility = ["//tensorflow/lite/experimental/litert/vendors/qualcomm:__subpackages__"],
6+
)
7+
8+
cc_library(
9+
name = "quantize_params_wrapper",
10+
srcs = ["quantize_params_wrapper.cc"],
11+
hdrs = ["quantize_params_wrapper.h"],
12+
tags = [
13+
# Don't build/test in OS until qnn is available.
14+
"nobuilder",
15+
],
16+
deps = [
17+
# copybara:uncomment "//third_party/qairt/latest:qnn_lib_headers",
18+
"//third_party/qairt/latest:qnn_lib_headers",
19+
],
20+
)
21+
22+
cc_library(
23+
name = "tensor_wrapper",
24+
srcs = ["tensor_wrapper.cc"],
25+
hdrs = ["tensor_wrapper.h"],
26+
tags = [
27+
# Don't build/test in OS until qnn is available.
28+
"nobuilder",
29+
],
30+
deps = [
31+
# copybara:uncomment "//third_party/qairt/latest:qnn_lib_headers",
32+
"//third_party/qairt/latest:qnn_lib_headers",
33+
"//tensorflow/lite/experimental/litert/vendors/qualcomm/core/wrappers:quantize_params_wrapper",
34+
],
35+
)
36+
37+
cc_library(
38+
name = "param_wrapper",
39+
srcs = ["param_wrapper.cc"],
40+
hdrs = ["param_wrapper.h"],
41+
tags = [
42+
# Don't build/test in OS until qnn is available.
43+
"nobuilder",
44+
],
45+
deps = [
46+
# copybara:uncomment "//third_party/qairt/latest:qnn_lib_headers",
47+
"//third_party/qairt/latest:qnn_lib_headers",
48+
"//tensorflow/lite/experimental/litert/vendors/qualcomm/core/wrappers:tensor_wrapper",
49+
],
50+
)
51+
52+
cc_library(
53+
name = "op_wrapper",
54+
srcs = ["op_wrapper.cc"],
55+
hdrs = ["op_wrapper.h"],
56+
tags = [
57+
# Don't build/test in OS until qnn is available.
58+
"nobuilder",
59+
],
60+
deps = [
61+
# copybara:uncomment "//third_party/qairt/latest:qnn_lib_headers",
62+
"//third_party/qairt/latest:qnn_lib_headers",
63+
"//tensorflow/lite/experimental/litert/vendors/qualcomm/core/wrappers:tensor_wrapper",
64+
"//tensorflow/lite/experimental/litert/vendors/qualcomm/core/wrappers:param_wrapper",
65+
],
66+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
//==============================================================================
2+
//
3+
// Copyright (c) Qualcomm Technologies, Inc.
4+
// All Rights Reserved.
5+
// Confidential and Proprietary - Qualcomm Technologies, Inc.
6+
//
7+
//==============================================================================
8+
#include "tensorflow/lite/experimental/litert/vendors/qualcomm/core/wrappers/op_wrapper.h"
9+
10+
namespace qnn {
11+
12+
OpWrapper::OpWrapper(std::string name, const char* op_type)
13+
: name_{std::move(name)} {
14+
qnn_op_.v1.packageName = QNN_OP_PACKAGE_NAME_QTI_AISW;
15+
qnn_op_.v1.typeName = op_type;
16+
qnn_op_.v1.name = name_.c_str();
17+
}
18+
19+
OpWrapper::OpWrapper(const OpWrapper& other)
20+
: qnn_op_{other.qnn_op_},
21+
name_{other.name_},
22+
params_{other.params_},
23+
input_tensors_{other.input_tensors_},
24+
output_tensors_{other.output_tensors_} {
25+
qnn_op_.v1.name = name_.c_str();
26+
qnn_op_.v1.params = params_.data();
27+
qnn_op_.v1.inputTensors = input_tensors_.data();
28+
qnn_op_.v1.outputTensors = output_tensors_.data();
29+
}
30+
31+
OpWrapper::OpWrapper(OpWrapper&& other)
32+
: qnn_op_{other.qnn_op_},
33+
name_{std::move(other.name_)},
34+
params_{std::move(other.params_)},
35+
input_tensors_{std::move(other.input_tensors_)},
36+
output_tensors_{std::move(other.output_tensors_)} {
37+
qnn_op_.v1.name = name_.c_str();
38+
qnn_op_.v1.params = params_.data();
39+
qnn_op_.v1.inputTensors = input_tensors_.data();
40+
qnn_op_.v1.outputTensors = output_tensors_.data();
41+
}
42+
43+
OpWrapper::~OpWrapper() = default;
44+
45+
void OpWrapper::AddInputTensor(const TensorWrapper& tensor) {
46+
auto& back = input_tensors_.emplace_back();
47+
tensor.CloneTo(back);
48+
49+
qnn_op_.v1.numOfInputs = input_tensors_.size();
50+
qnn_op_.v1.inputTensors = input_tensors_.data();
51+
}
52+
53+
void OpWrapper::AddOutputTensor(const TensorWrapper& tensor) {
54+
auto& back = output_tensors_.emplace_back();
55+
tensor.CloneTo(back);
56+
57+
qnn_op_.v1.numOfOutputs = output_tensors_.size();
58+
qnn_op_.v1.outputTensors = output_tensors_.data();
59+
}
60+
61+
void OpWrapper::AddTensorParam(const char* name, const TensorWrapper& tensor) {
62+
TensorParamWrapper param_wrapper(name, tensor);
63+
64+
auto& back = params_.emplace_back();
65+
param_wrapper.CloneTo(back);
66+
67+
qnn_op_.v1.numOfParams = params_.size();
68+
qnn_op_.v1.params = params_.data();
69+
}
70+
71+
const Qnn_OpConfig_t& OpWrapper::GetOpConfig() const { return qnn_op_; }
72+
73+
} // namespace qnn
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//==============================================================================
2+
//
3+
// Copyright (c) Qualcomm Technologies, Inc.
4+
// All Rights Reserved.
5+
// Confidential and Proprietary - Qualcomm Technologies, Inc.
6+
//
7+
//==============================================================================
8+
#ifndef TENSORFLOW_LITE_EXPERIMENTAL_LITERT_VENDORS_QUALCOMM_CORE_WRAPPERS_OP_WRAPPER_H_
9+
#define TENSORFLOW_LITE_EXPERIMENTAL_LITERT_VENDORS_QUALCOMM_CORE_WRAPPERS_OP_WRAPPER_H_
10+
11+
#include "tensorflow/lite/experimental/litert/vendors/qualcomm/core/wrappers/param_wrapper.h"
12+
#include "tensorflow/lite/experimental/litert/vendors/qualcomm/core/wrappers/tensor_wrapper.h"
13+
#include "third_party/qairt/latest/include/QNN/QnnOpDef.h"
14+
15+
namespace qnn {
16+
17+
class OpWrapper final {
18+
public:
19+
explicit OpWrapper(std::string name, const char* op_type);
20+
21+
OpWrapper(const OpWrapper& other);
22+
23+
OpWrapper(OpWrapper&& other);
24+
25+
~OpWrapper();
26+
27+
void AddInputTensor(const TensorWrapper& tensor);
28+
29+
void AddOutputTensor(const TensorWrapper& tensor);
30+
31+
template <typename T>
32+
void AddScalarParam(const char* name, const T data,
33+
const bool is_quant = false) {
34+
ScalarParamWrapper param_wrapper(name, data, is_quant);
35+
36+
auto& back = params_.emplace_back();
37+
param_wrapper.CloneTo(back);
38+
39+
qnn_op_.v1.numOfParams = params_.size();
40+
qnn_op_.v1.params = params_.data();
41+
}
42+
43+
void AddTensorParam(const char* name, const TensorWrapper& tensor);
44+
45+
const Qnn_OpConfig_t& GetOpConfig() const;
46+
47+
private:
48+
Qnn_OpConfig_t qnn_op_ = QNN_OPCONFIG_INIT;
49+
std::string name_{}; // human readable name
50+
std::vector<Qnn_Param_t> params_{};
51+
std::vector<Qnn_Tensor_t> input_tensors_{};
52+
std::vector<Qnn_Tensor_t> output_tensors_{};
53+
};
54+
55+
} // namespace qnn
56+
57+
#endif // TENSORFLOW_LITE_EXPERIMENTAL_LITERT_VENDORS_QUALCOMM_CORE_WRAPPERS_OP_WRAPPER_H_
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//==============================================================================
2+
//
3+
// Copyright (c) Qualcomm Technologies, Inc.
4+
// All Rights Reserved.
5+
// Confidential and Proprietary - Qualcomm Technologies, Inc.
6+
//
7+
//==============================================================================
8+
#include "tensorflow/lite/experimental/litert/vendors/qualcomm/core/wrappers/param_wrapper.h"
9+
10+
namespace qnn {
11+
12+
void ScalarParamWrapper::CloneTo(Qnn_Param_t& dst) const { dst = qnn_param_; }
13+
14+
TensorParamWrapper::TensorParamWrapper(const char* name,
15+
const TensorWrapper& tensor) {
16+
qnn_param_.name = name;
17+
qnn_param_.paramType = QNN_PARAMTYPE_TENSOR;
18+
tensor.CloneTo(qnn_param_.tensorParam);
19+
}
20+
21+
void TensorParamWrapper::CloneTo(Qnn_Param_t& dst) const { dst = qnn_param_; }
22+
23+
} // namespace qnn
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
//==============================================================================
2+
//
3+
// Copyright (c) Qualcomm Technologies, Inc.
4+
// All Rights Reserved.
5+
// Confidential and Proprietary - Qualcomm Technologies, Inc.
6+
//
7+
//==============================================================================
8+
#ifndef TENSORFLOW_LITE_EXPERIMENTAL_LITERT_VENDORS_QUALCOMM_CORE_WRAPPERS_PARAM_WRAPPER_H_
9+
#define TENSORFLOW_LITE_EXPERIMENTAL_LITERT_VENDORS_QUALCOMM_CORE_WRAPPERS_PARAM_WRAPPER_H_
10+
11+
#include <type_traits>
12+
13+
#include "tensorflow/lite/experimental/litert/vendors/qualcomm/core/wrappers/tensor_wrapper.h"
14+
#include "third_party/qairt/latest/include/QNN/QnnTypes.h"
15+
16+
namespace qnn {
17+
18+
class ScalarParamWrapper {
19+
public:
20+
template <typename T>
21+
explicit ScalarParamWrapper(const char* name, const T data,
22+
const bool is_quant) {
23+
qnn_param_.name = name;
24+
qnn_param_.paramType = QNN_PARAMTYPE_SCALAR;
25+
if constexpr (std::is_same_v<T, bool>) {
26+
qnn_param_.scalarParam.dataType = QNN_DATATYPE_BOOL_8;
27+
qnn_param_.scalarParam.bool8Value = data;
28+
} else if constexpr (std::is_same_v<T, std::uint8_t>) {
29+
qnn_param_.scalarParam.dataType =
30+
is_quant ? QNN_DATATYPE_UFIXED_POINT_8 : QNN_DATATYPE_UINT_8;
31+
qnn_param_.scalarParam.uint8Value = data;
32+
} else if constexpr (std::is_same_v<T, std::int8_t>) {
33+
qnn_param_.scalarParam.dataType =
34+
is_quant ? QNN_DATATYPE_SFIXED_POINT_8 : QNN_DATATYPE_INT_8;
35+
qnn_param_.scalarParam.int8Value = data;
36+
} else if constexpr (std::is_same_v<T, std::uint16_t>) {
37+
qnn_param_.scalarParam.dataType =
38+
is_quant ? QNN_DATATYPE_UFIXED_POINT_16 : QNN_DATATYPE_UINT_16;
39+
qnn_param_.scalarParam.uint16Value = data;
40+
} else if constexpr (std::is_same_v<T, std::int16_t>) {
41+
qnn_param_.scalarParam.dataType =
42+
is_quant ? QNN_DATATYPE_SFIXED_POINT_16 : QNN_DATATYPE_INT_16;
43+
qnn_param_.scalarParam.int16Value = data;
44+
} else if constexpr (std::is_same_v<T, std::uint32_t>) {
45+
qnn_param_.scalarParam.dataType =
46+
is_quant ? QNN_DATATYPE_UFIXED_POINT_32 : QNN_DATATYPE_UINT_32;
47+
qnn_param_.scalarParam.uint32Value = data;
48+
} else if constexpr (std::is_same_v<T, std::int32_t>) {
49+
qnn_param_.scalarParam.dataType =
50+
is_quant ? QNN_DATATYPE_SFIXED_POINT_32 : QNN_DATATYPE_INT_32;
51+
qnn_param_.scalarParam.int32Value = data;
52+
} else if constexpr (std::is_same_v<T, float>) {
53+
qnn_param_.scalarParam.dataType = QNN_DATATYPE_FLOAT_32;
54+
qnn_param_.scalarParam.floatValue = data;
55+
} else {
56+
// TODO: error log
57+
}
58+
}
59+
60+
void CloneTo(Qnn_Param_t& dst) const;
61+
62+
private:
63+
Qnn_Param_t qnn_param_ = QNN_PARAM_INIT;
64+
};
65+
66+
class TensorParamWrapper {
67+
public:
68+
explicit TensorParamWrapper(const char* name, const TensorWrapper& tensor);
69+
70+
void CloneTo(Qnn_Param_t& dst) const;
71+
72+
private:
73+
Qnn_Param_t qnn_param_ = QNN_PARAM_INIT;
74+
};
75+
76+
} // namespace qnn
77+
78+
#endif // TENSORFLOW_LITE_EXPERIMENTAL_LITERT_VENDORS_QUALCOMM_CORE_WRAPPERS_PARAM_WRAPPER_H_
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
//==============================================================================
2+
//
3+
// Copyright (c) Qualcomm Technologies, Inc.
4+
// All Rights Reserved.
5+
// Confidential and Proprietary - Qualcomm Technologies, Inc.
6+
//
7+
//==============================================================================
8+
#include "tensorflow/lite/experimental/litert/vendors/qualcomm/core/wrappers/quantize_params_wrapper.h"
9+
10+
#include <cassert>
11+
12+
namespace qnn {
13+
14+
UndefinedQuantizeParamsWrapper::UndefinedQuantizeParamsWrapper() = default;
15+
16+
UndefinedQuantizeParamsWrapper::UndefinedQuantizeParamsWrapper(
17+
const UndefinedQuantizeParamsWrapper&) = default;
18+
19+
UndefinedQuantizeParamsWrapper::UndefinedQuantizeParamsWrapper(
20+
UndefinedQuantizeParamsWrapper&&) = default;
21+
22+
void UndefinedQuantizeParamsWrapper::CloneTo(Qnn_QuantizeParams_t& dst) {
23+
dst = qnn_quantize_param_;
24+
}
25+
26+
ScaleOffsetQuantizeParamsWrapper::ScaleOffsetQuantizeParamsWrapper(
27+
const float scale, const std::int32_t zero_point) {
28+
qnn_quantize_param_.encodingDefinition = QNN_DEFINITION_DEFINED;
29+
qnn_quantize_param_.quantizationEncoding =
30+
QNN_QUANTIZATION_ENCODING_SCALE_OFFSET;
31+
qnn_quantize_param_.scaleOffsetEncoding.scale = scale;
32+
qnn_quantize_param_.scaleOffsetEncoding.offset = -1 * zero_point;
33+
}
34+
35+
ScaleOffsetQuantizeParamsWrapper::ScaleOffsetQuantizeParamsWrapper(
36+
const ScaleOffsetQuantizeParamsWrapper&) = default;
37+
38+
ScaleOffsetQuantizeParamsWrapper::ScaleOffsetQuantizeParamsWrapper(
39+
ScaleOffsetQuantizeParamsWrapper&&) = default;
40+
41+
void ScaleOffsetQuantizeParamsWrapper::CloneTo(Qnn_QuantizeParams_t& dst) {
42+
dst = qnn_quantize_param_;
43+
}
44+
45+
AxisScaleOffsetQuantizeParamsWrapper::AxisScaleOffsetQuantizeParamsWrapper(
46+
const std::int32_t axis, const std::span<const float> scales,
47+
const std::span<const std::int32_t> zero_points)
48+
: scale_offsets_(scales.size()) {
49+
assert(scales.size() == zero_points.size());
50+
for (size_t i = 0; i < scale_offsets_.size(); ++i) {
51+
scale_offsets_[i].scale = scales[i];
52+
scale_offsets_[i].offset = -1 * zero_points[i];
53+
}
54+
55+
qnn_quantize_param_.encodingDefinition = QNN_DEFINITION_DEFINED;
56+
qnn_quantize_param_.quantizationEncoding =
57+
QNN_QUANTIZATION_ENCODING_AXIS_SCALE_OFFSET;
58+
qnn_quantize_param_.axisScaleOffsetEncoding.axis = axis;
59+
qnn_quantize_param_.axisScaleOffsetEncoding.numScaleOffsets =
60+
scale_offsets_.size();
61+
qnn_quantize_param_.axisScaleOffsetEncoding.scaleOffset =
62+
scale_offsets_.data();
63+
}
64+
65+
AxisScaleOffsetQuantizeParamsWrapper::AxisScaleOffsetQuantizeParamsWrapper(
66+
const AxisScaleOffsetQuantizeParamsWrapper& rhs)
67+
: qnn_quantize_param_{rhs.qnn_quantize_param_},
68+
scale_offsets_{rhs.scale_offsets_} {
69+
qnn_quantize_param_.axisScaleOffsetEncoding.scaleOffset =
70+
scale_offsets_.data();
71+
}
72+
73+
AxisScaleOffsetQuantizeParamsWrapper::AxisScaleOffsetQuantizeParamsWrapper(
74+
AxisScaleOffsetQuantizeParamsWrapper&& rhs)
75+
: qnn_quantize_param_{rhs.qnn_quantize_param_},
76+
scale_offsets_{std::move(rhs.scale_offsets_)} {
77+
qnn_quantize_param_.axisScaleOffsetEncoding.scaleOffset =
78+
scale_offsets_.data();
79+
}
80+
81+
void AxisScaleOffsetQuantizeParamsWrapper::CloneTo(Qnn_QuantizeParams_t& dst) {
82+
dst = qnn_quantize_param_;
83+
}
84+
85+
} // namespace qnn

0 commit comments

Comments
 (0)