Skip to content

Commit 38af546

Browse files
authored
[Serving] Return model signature in json format to user. (#288)
1 parent bf9d14e commit 38af546

File tree

2 files changed

+97
-2
lines changed

2 files changed

+97
-2
lines changed

serving/processor/serving/model_instance.cc

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@
1212
#include "tensorflow/cc/saved_model/loader.h"
1313
#include "tensorflow/core/framework/tensor.h"
1414
#include "tensorflow/cc/saved_model/constants.h"
15+
#include "tensorflow/cc/saved_model/signature_constants.h"
1516
#include "tensorflow/core/platform/protobuf_internal.h"
1617
#include "tensorflow/core/lib/io/path.h"
1718
#include "tensorflow/core/util/tensor_bundle/naming.h"
1819

20+
using tensorflow::kPredictMethodName;
21+
1922
namespace tensorflow {
2023
namespace processor {
2124
namespace {
@@ -114,6 +117,92 @@ bool ShouldWarmup(SignatureDef& sig_def) {
114117
return true;
115118
}
116119

120+
void StringReplace(std::string& strBig, const std::string& strsrc,
121+
const std::string& strdst) {
122+
std::string::size_type pos = 0;
123+
std::string::size_type srclen = strsrc.size();
124+
std::string::size_type dstlen = strdst.size();
125+
126+
while ((pos = strBig.find(strsrc, pos)) != std::string::npos) {
127+
strBig.replace(pos, srclen, strdst);
128+
pos += dstlen;
129+
}
130+
}
131+
void GenerateJsonSignatureFormat(
132+
const std::pair<std::string, SignatureDef>& signature,
133+
std::string& json_signature) {
134+
std::map<int, std::string> dtype_to_string = {
135+
{1, "DT_FLOAT"}, {2, "DT_DOUBLE"}, {3, "DT_INT32"}, {4, "DT_UINT8"},
136+
{6, "DT_INT8"}, {7, "DT_STRING"}, {9, "DT_INT64"}, {10, "DT_BOOL"}};
137+
std::ostringstream model_signature;
138+
if (signature.second.method_name() == kPredictMethodName) {
139+
model_signature << "{";
140+
model_signature << "\"signature_name\": \"" << signature.first << "\",";
141+
model_signature << "\"inputs\": [";
142+
LOG(INFO) << "Inputs:";
143+
for (auto& input : (signature.second).inputs()) {
144+
model_signature << "{";
145+
model_signature << "\"name\": \"" << input.first << "\",";
146+
std::stringstream signature_input_info;
147+
signature_input_info << input.first + ": [";
148+
model_signature << "\"shape\": [";
149+
int dims = input.second.tensor_shape().dim_size();
150+
if (dims > 0) {
151+
for (int i = 0; i < dims - 1; i++) {
152+
signature_input_info << input.second.tensor_shape().dim(i).size();
153+
model_signature << input.second.tensor_shape().dim(i).size()
154+
<< ", ";
155+
signature_input_info << ", ";
156+
}
157+
signature_input_info
158+
<< input.second.tensor_shape().dim(dims - 1).size();
159+
model_signature << input.second.tensor_shape().dim(dims - 1).size();
160+
}
161+
signature_input_info << "]; ";
162+
model_signature << "],";
163+
signature_input_info << dtype_to_string[input.second.dtype()];
164+
model_signature << "\"type\": \""
165+
<< dtype_to_string[input.second.dtype()] << "\"";
166+
LOG(INFO) << signature_input_info.str();
167+
model_signature << "},";
168+
}
169+
model_signature << "],";
170+
LOG(INFO) << "Outputs:";
171+
model_signature << "\"outputs\": [";
172+
for (auto& output : (signature.second).outputs()) {
173+
model_signature << "{";
174+
model_signature << "\"name\": \"" << output.first << "\",";
175+
std::stringstream signature_output_info;
176+
signature_output_info << output.first + ": [";
177+
model_signature << "\"shape\": [";
178+
int dims = output.second.tensor_shape().dim_size();
179+
if (dims > 0) {
180+
for (int i = 0; i < dims - 1; i++) {
181+
signature_output_info
182+
<< output.second.tensor_shape().dim(i).size();
183+
model_signature << output.second.tensor_shape().dim(i).size()
184+
<< ", ";
185+
signature_output_info << ", ";
186+
}
187+
signature_output_info
188+
<< output.second.tensor_shape().dim(dims - 1).size();
189+
model_signature
190+
<< output.second.tensor_shape().dim(dims - 1).size();
191+
}
192+
signature_output_info << "]; ";
193+
model_signature << "],";
194+
signature_output_info << dtype_to_string[output.second.dtype()];
195+
model_signature << "\"type\": \""
196+
<< dtype_to_string[output.second.dtype()] << "\"";
197+
LOG(INFO) << signature_output_info.str();
198+
model_signature << "},";
199+
}
200+
model_signature << "]}";
201+
}
202+
json_signature = model_signature.str();
203+
StringReplace(json_signature, "},]", "}]");
204+
}
205+
117206
} // namespace
118207

119208
LocalSessionInstance::LocalSessionInstance(
@@ -185,6 +274,8 @@ Status LocalSessionInstance::ReadModelSignature(ModelConfig* model_config) {
185274
for (auto it : model_signatures) {
186275
if (it.first == model_config->signature_name) {
187276
model_signature_ = it;
277+
GenerateJsonSignatureFormat(model_signature_,
278+
model_json_signature_);
188279
return Status::OK();
189280
}
190281
}
@@ -226,7 +317,7 @@ Status LocalSessionInstance::Warmup(
226317
}
227318

228319
std::string LocalSessionInstance::DebugString() {
229-
return model_signature_.second.DebugString();
320+
return model_json_signature_;
230321
}
231322

232323
Status LocalSessionInstance::FullModelUpdate(
@@ -279,6 +370,8 @@ Status RemoteSessionInstance::ReadModelSignature(ModelConfig* model_config) {
279370
for (auto it : model_signatures) {
280371
if (it.first == model_config->signature_name) {
281372
model_signature_ = it;
373+
GenerateJsonSignatureFormat(model_signature_,
374+
model_json_signature_);
282375
return Status::OK();
283376
}
284377
}
@@ -436,7 +529,7 @@ Status RemoteSessionInstance::DeltaModelUpdate(
436529
}
437530

438531
std::string RemoteSessionInstance::DebugString() {
439-
return model_signature_.second.DebugString();
532+
return model_json_signature_;
440533
}
441534

442535
LocalSessionInstanceMgr::LocalSessionInstanceMgr(ModelConfig* config)

serving/processor/serving/model_instance.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class LocalSessionInstance {
4949
private:
5050
MetaGraphDef meta_graph_def_;
5151
std::pair<std::string, SignatureDef> model_signature_;
52+
std::string model_json_signature_;
5253
std::string warmup_file_name_;
5354

5455
ModelSessionMgr* session_mgr_ = nullptr;
@@ -91,6 +92,7 @@ class RemoteSessionInstance {
9192
private:
9293
MetaGraphDef meta_graph_def_;
9394
std::pair<std::string, SignatureDef> model_signature_;
95+
std::string model_json_signature_;
9496
std::string warmup_file_name_;
9597

9698
ModelSessionMgr* session_mgr_ = nullptr;

0 commit comments

Comments
 (0)