MCPcopy Create free account
hub / github.com/alibaba/MNN / _RebuildExternalOp

Function _RebuildExternalOp

tools/quantization/calibration.cpp:62–192  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

60 }
61
62static bool _RebuildExternalOp(FileLoader* external, const MNN::Op* origin, flatbuffers::FlatBufferBuilder& builder) {
63 if (nullptr == external) {
64 MNN_ERROR("Can't rebuild external op because external is nullptr\n");
65 return false;
66 }
67 builder.Clear();
68 bool externalTmp = false;
69 if (nullptr != origin->externalPath()) {
70 external = new FileLoader(origin->externalPath()->c_str());
71 externalTmp = true;
72 }
73 flatbuffers::Offset<flatbuffers::String> externalPathFbb = 0;
74 flatbuffers::Offset<flatbuffers::String> opNameFbb = 0;
75 if (nullptr != origin->name()) {
76 opNameFbb = builder.CreateString(origin->name()->str());
77 }
78 flatbuffers::Offset<void> parameterMain;
79 switch (origin->main_type()) {
80 case OpParameter_Scale:
81 {
82 auto scale = origin->main_as_Scale();
83 auto externalInfo = scale->external()->data();
84 auto externalSize = scale->external()->size();
85 int outputCount = static_cast<int>(externalInfo[1] / sizeof(float));
86 std::vector<float> scaleData(outputCount);
87 external->offset(externalInfo[0]);
88 external->read((char*)scaleData.data(), externalInfo[1]);
89 auto scaleFbb = builder.CreateVector(scaleData);
90 flatbuffers::Offset<flatbuffers::Vector<float>> biasFbb = 0;
91 if (externalSize > 2) {
92 std::vector<float> biasData(outputCount);
93 external->read((char*)biasData.data(), externalInfo[2]);
94 biasFbb = builder.CreateVector(biasData);
95 }
96 ScaleBuilder builder_(builder);
97 builder_.add_biasData(biasFbb);
98 builder_.add_scaleData(scaleFbb);
99 builder_.add_channels(scale->channels());
100 parameterMain = builder_.Finish().Union();
101 break;
102 }
103 case OpParameter_LayerNorm:
104 {
105 auto layer_norm_param = origin->main_as_LayerNorm();
106 auto externalInfo = layer_norm_param->external()->data();
107 auto externalSize = layer_norm_param->external()->size();
108 int32_t size = static_cast<int32_t>(externalInfo[1]);
109 std::vector<float> gamma(size / sizeof(float));
110 std::vector<float> beta(size / sizeof(float));
111 external->offset(externalInfo[0]);
112 external->read((char*)gamma.data(), externalInfo[1]);
113 external->read((char*)beta.data(), externalInfo[2]);
114 flatbuffers::Offset<flatbuffers::Vector<int>> axisFbb = 0;
115 if (nullptr != layer_norm_param->axis()) {
116 std::vector<int> axis(layer_norm_param->axis()->size());
117 ::memcpy(axis.data(), layer_norm_param->axis()->data(), layer_norm_param->axis()->size() * sizeof(int));
118 axisFbb = builder.CreateVector(axis);
119 }

Callers 1

_treateExternalOpsFunction · 0.70

Calls 15

add_scaleDataMethod · 0.80
add_useRMSNormMethod · 0.80
add_externalPathMethod · 0.80
ClearMethod · 0.45
c_strMethod · 0.45
nameMethod · 0.45
strMethod · 0.45
dataMethod · 0.45
sizeMethod · 0.45
offsetMethod · 0.45
readMethod · 0.45
add_biasDataMethod · 0.45

Tested by

no test coverage detected