From 9e9bb8b407b5bd8430d24145093cd0b1ec080dd8 Mon Sep 17 00:00:00 2001 From: xudaliang Date: Thu, 4 Jan 2024 14:01:37 +0000 Subject: [PATCH] fix: qnn rope file name --- src/backends/QNN/op/QNNLinear.cpp | 1 + src/backends/QNN/op/QNNRoPE.cpp | 79 ++++++++++++++++++++++++- src/backends/QNN/op/QNNRope.cpp | 96 ------------------------------- src/backends/QNN/op/QNNSiLU.cpp | 1 - 4 files changed, 79 insertions(+), 98 deletions(-) delete mode 100644 src/backends/QNN/op/QNNRope.cpp diff --git a/src/backends/QNN/op/QNNLinear.cpp b/src/backends/QNN/op/QNNLinear.cpp index 58d5ff35..736b5e0d 100644 --- a/src/backends/QNN/op/QNNLinear.cpp +++ b/src/backends/QNN/op/QNNLinear.cpp @@ -63,6 +63,7 @@ ErrorCode QNNLinear::setUp(vector> inputs, vectormodelAddTensor(weight_.name().c_str(), (Qnn_Tensor_t){ .version = QNN_TENSOR_VERSION_1, {.v1 = { diff --git a/src/backends/QNN/op/QNNRoPE.cpp b/src/backends/QNN/op/QNNRoPE.cpp index 0157a6b2..3b4abd4f 100644 --- a/src/backends/QNN/op/QNNRoPE.cpp +++ b/src/backends/QNN/op/QNNRoPE.cpp @@ -9,11 +9,88 @@ QNNRoPE::QNNRoPE(Backend *bn, string opName) : } ErrorCode QNNRoPE::reshape(vector> inputs, vector> outputs) { + outputs[0]->reshape(inputs[0]->batch(), inputs[0]->head(), inputs[0]->sequence(), inputs[0]->dimension()); + return NO_ERROR; } ErrorCode QNNRoPE::setUp(vector> inputs, vector> outputs) { - return graphAddNode(name(), "RoPE", inputs, outputs, {}, "LLaMAOpPackageHtp"); + + pos_max_ = 16384; + + ishape = inputs[0]->dimension(); + + if(!sin_.allocted()) { + if (pose_type_ == 1) { + sinusoidal_position_embedding_hf(1, 1, pos_max_, ishape, sin_, cos_); + } else if (pose_type_ == 2) { + sinusoidal_position_embedding(1, 1, pos_max_, ishape, sin_, cos_); + } else { + sinusoidal_position_embedding_hf(1, 1, pos_max_, ishape/2, sin_, cos_); + } + } + + // vector qnn_RoPE_inputs; + // qnn_RoPE_inputs.push_back(inputs[0]) + // qnn_RoPE_inputs.push_back(sin_); + // qnn_RoPE_inputs.push_back(cos_); + + // return graphAddNode(name(), "RoPE", qnn_RoPE_inputs, outputs); + + return NO_ERROR; } + + +void QNNRoPE::sinusoidal_position_embedding(int batch_size, int nums_head, int seq_len, int output_dim, Tensor &sin, Tensor &cos) { + sin.reshape(batch_size, nums_head, seq_len, output_dim); + cos.reshape(batch_size, nums_head, seq_len, output_dim); + sin.alloc(); + cos.alloc(); + for (int n = 0; n < batch_size; ++n) { + for (int h = 0; h < nums_head; ++h) { + for (int s = 0; s < seq_len; ++s) { + for (int d = 0; d < output_dim; d += 2) { + int i = (int)d / 2; + float sin_value = std::sin(s / std::pow(10000, 2.0 * i / output_dim)); + float cos_value = std::cos(s / std::pow(10000, 2.0 * i / output_dim)); + sin.setDataAt(n, h, s, d, sin_value); + cos.setDataAt(n, h, s, d, cos_value); + if (d + 1 < output_dim) { + sin.setDataAt(n, h, s, d + 1, sin_value); + cos.setDataAt(n, h, s, d + 1, cos_value); + } + } + } + } + } +} + +void QNNRoPE::sinusoidal_position_embedding_hf(int batch_size, int nums_head, int seq_len, int output_dim, Tensor &sin, Tensor &cos) { + sin.reshape(batch_size, nums_head, seq_len, output_dim); + cos.reshape(batch_size, nums_head, seq_len, output_dim); + sin.alloc(); + cos.alloc(); + for (int n = 0; n < batch_size; ++n) { + for (int h = 0; h < nums_head; ++h) { + for (int s = 0; s < seq_len; ++s) { + for (int d = 0; d < output_dim; d += 2) { + int i = (int)d; + if (d >= (int)output_dim / 2) { + i = (int)(d - output_dim / 2); + } + float sin_value = std::sin(s / std::pow(10000, 2.0 * i / output_dim)); + float cos_value = std::cos(s / std::pow(10000, 2.0 * i / output_dim)); + sin.setDataAt(n, h, s, d, sin_value); + cos.setDataAt(n, h, s, d, cos_value); + if (d + 1 < output_dim) { + sin.setDataAt(n, h, s, d + 1, sin_value); + cos.setDataAt(n, h, s, d + 1, cos_value); + } + } + } + } + } +} + } // namespace mllm diff --git a/src/backends/QNN/op/QNNRope.cpp b/src/backends/QNN/op/QNNRope.cpp deleted file mode 100644 index a593106a..00000000 --- a/src/backends/QNN/op/QNNRope.cpp +++ /dev/null @@ -1,96 +0,0 @@ - -#include "QNNRope.hpp" -#include "Types.hpp" -#include "QNNCommonOp.hpp" - -namespace mllm { -QNNRope::QNNRope(Backend *bn, string opName) : - QNNCommonOp(bn, opName) { -} - -ErrorCode QNNRope::reshape(vector> inputs, vector> outputs) { - outputs[0]->reshape(inputs[0]->batch(), inputs[0]->head(), inputs[0]->sequence(), inputs[0]->dimension()); - - return NO_ERROR; -} - -ErrorCode QNNRope::setUp(vector> inputs, vector> outputs) { - - pos_max_ = 16384; - - ishape = inputs[0]->dimension(); - - if(!sin_.allocted()) { - if (pose_type_ == 1) { - sinusoidal_position_embedding_hf(1, 1, pos_max_, ishape, sin_, cos_); - } else if (pose_type_ == 2) { - sinusoidal_position_embedding(1, 1, pos_max_, ishape, sin_, cos_); - } else { - sinusoidal_position_embedding_hf(1, 1, pos_max_, ishape/2, sin_, cos_); - } - } - - // vector qnn_rope_inputs; - // qnn_rope_inputs.push_back(inputs[0]) - // qnn_rope_inputs.push_back(sin_); - // qnn_rope_inputs.push_back(cos_); - - // return graphAddNode(name(), "RoPE", qnn_rope_inputs, outputs); - - return NO_ERROR; -} - - -void QNNRope::sinusoidal_position_embedding(int batch_size, int nums_head, int seq_len, int output_dim, Tensor &sin, Tensor &cos) { - sin.reshape(batch_size, nums_head, seq_len, output_dim); - cos.reshape(batch_size, nums_head, seq_len, output_dim); - sin.alloc(); - cos.alloc(); - for (int n = 0; n < batch_size; ++n) { - for (int h = 0; h < nums_head; ++h) { - for (int s = 0; s < seq_len; ++s) { - for (int d = 0; d < output_dim; d += 2) { - int i = (int)d / 2; - float sin_value = std::sin(s / std::pow(10000, 2.0 * i / output_dim)); - float cos_value = std::cos(s / std::pow(10000, 2.0 * i / output_dim)); - sin.setDataAt(n, h, s, d, sin_value); - cos.setDataAt(n, h, s, d, cos_value); - if (d + 1 < output_dim) { - sin.setDataAt(n, h, s, d + 1, sin_value); - cos.setDataAt(n, h, s, d + 1, cos_value); - } - } - } - } - } -} - -void QNNRope::sinusoidal_position_embedding_hf(int batch_size, int nums_head, int seq_len, int output_dim, Tensor &sin, Tensor &cos) { - sin.reshape(batch_size, nums_head, seq_len, output_dim); - cos.reshape(batch_size, nums_head, seq_len, output_dim); - sin.alloc(); - cos.alloc(); - for (int n = 0; n < batch_size; ++n) { - for (int h = 0; h < nums_head; ++h) { - for (int s = 0; s < seq_len; ++s) { - for (int d = 0; d < output_dim; d += 2) { - int i = (int)d; - if (d >= (int)output_dim / 2) { - i = (int)(d - output_dim / 2); - } - float sin_value = std::sin(s / std::pow(10000, 2.0 * i / output_dim)); - float cos_value = std::cos(s / std::pow(10000, 2.0 * i / output_dim)); - sin.setDataAt(n, h, s, d, sin_value); - cos.setDataAt(n, h, s, d, cos_value); - if (d + 1 < output_dim) { - sin.setDataAt(n, h, s, d + 1, sin_value); - cos.setDataAt(n, h, s, d + 1, cos_value); - } - } - } - } - } -} - -} // namespace mllm - diff --git a/src/backends/QNN/op/QNNSiLU.cpp b/src/backends/QNN/op/QNNSiLU.cpp index a6b8e7ec..6a6a1a48 100644 --- a/src/backends/QNN/op/QNNSiLU.cpp +++ b/src/backends/QNN/op/QNNSiLU.cpp @@ -9,7 +9,6 @@ QNNSiLU::QNNSiLU(Backend *bn, string opName) : } ErrorCode QNNSiLU::reshape(vector> inputs, vector> outputs) { -<<<<<<< HEAD outputs[0]->reshape(inputs[0]->batch(), inputs[0]->head(), inputs[0]->sequence(), inputs[0]->dimension()); return Op::reshape(inputs, outputs); }