Skip to content

Commit 33a58e5

Browse files
FrostMLfc500110
authored andcommitted
[cherry-pick] c api update in PD_PredictorRun (#20705)
* improve the performance of capi in PD_PredictorRun (#20665) * alter the capi of PD_PredictorRun to provide proper function, test=release/1.6
1 parent 2099618 commit 33a58e5

File tree

3 files changed

+22
-16
lines changed

3 files changed

+22
-16
lines changed

paddle/fluid/inference/capi/c_api.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ PADDLE_CAPI_EXPORT extern int* PD_GetPaddleTensorShape(const PD_Tensor* tensor,
9999
// AnalysisPredictor
100100
PADDLE_CAPI_EXPORT extern bool PD_PredictorRun(const PD_AnalysisConfig* config,
101101
PD_Tensor* inputs, int in_size,
102-
PD_Tensor* output_data,
103-
int** out_size, int batch_size);
102+
PD_Tensor** output_data,
103+
int* out_size, int batch_size);
104104

105105
PADDLE_CAPI_EXPORT extern bool PD_PredictorZeroCopyRun(
106106
const PD_AnalysisConfig* config, PD_ZeroCopyData* inputs, int in_size,

paddle/fluid/inference/capi/pd_predictor.cc

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,28 @@ using paddle::ConvertToACPrecision;
2626
extern "C" {
2727

2828
bool PD_PredictorRun(const PD_AnalysisConfig* config, PD_Tensor* inputs,
29-
int in_size, PD_Tensor* output_data, int** out_size,
29+
int in_size, PD_Tensor** output_data, int* out_size,
3030
int batch_size) {
3131
PADDLE_ENFORCE_NOT_NULL(config);
32-
auto predictor = paddle::CreatePaddlePredictor(config->config);
32+
static std::map<std::string, std::unique_ptr<paddle::PaddlePredictor>>
33+
predictors;
34+
if (!predictors.count(config->config.model_dir())) {
35+
predictors[config->config.model_dir()] =
36+
paddle::CreatePaddlePredictor(config->config);
37+
}
38+
auto& predictor = predictors[config->config.model_dir()];
3339
std::vector<paddle::PaddleTensor> in;
3440
for (int i = 0; i < in_size; ++i) {
3541
in.emplace_back(inputs->tensor);
3642
}
3743
std::vector<paddle::PaddleTensor> out;
3844
if (predictor->Run(in, &out, batch_size)) {
3945
int osize = out.size();
46+
*output_data = new PD_Tensor[osize];
4047
for (int i = 0; i < osize; ++i) {
41-
output_data[i].tensor = out[i];
48+
output_data[i]->tensor = out[i];
4249
}
43-
*out_size = &osize;
50+
*out_size = osize;
4451
return true;
4552
}
4653
return false;

paddle/fluid/inference/tests/api/analyzer_capi_pd_tensor_tester.cc

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ limitations under the License. */
2121
#include <string>
2222
#include <vector>
2323
#include "paddle/fluid/inference/capi/c_api.h"
24+
#include "paddle/fluid/inference/capi/c_api_internal.h"
2425
#include "paddle/fluid/inference/tests/api/tester_helper.h"
2526

2627
namespace paddle {
@@ -56,16 +57,15 @@ void PD_run() {
5657
PD_SetPaddleTensorData(input, buf);
5758

5859
PD_Tensor* out_data = PD_NewPaddleTensor();
59-
int* out_size;
60-
PD_PredictorRun(config, input, 1, out_data, &out_size, 1);
61-
LOG(INFO) << *out_size;
60+
int out_size;
61+
PD_PredictorRun(config, input, 1, &out_data, &out_size, 1);
62+
LOG(INFO) << out_size;
6263
LOG(INFO) << PD_GetPaddleTensorName(out_data);
6364
LOG(INFO) << PD_GetPaddleTensorDType(out_data);
6465
PD_PaddleBuf* b = PD_GetPaddleTensorData(out_data);
65-
LOG(INFO) << PD_PaddleBufLength(b);
66+
LOG(INFO) << PD_PaddleBufLength(b) / sizeof(float);
6667
float* result = static_cast<float*>(PD_PaddleBufData(b));
6768
LOG(INFO) << *result;
68-
PD_PaddleBufResize(b, 500);
6969
PD_DeletePaddleTensor(input);
7070
int* size;
7171
PD_GetPaddleTensorShape(out_data, &size);
@@ -132,16 +132,15 @@ void buffer_run() {
132132
PD_SetPaddleTensorData(input, buf);
133133

134134
PD_Tensor* out_data = PD_NewPaddleTensor();
135-
int* out_size;
136-
PD_PredictorRun(config, input, 1, out_data, &out_size, 1);
137-
LOG(INFO) << *out_size;
135+
int out_size;
136+
PD_PredictorRun(config, input, 1, &out_data, &out_size, 1);
137+
LOG(INFO) << out_size;
138138
LOG(INFO) << PD_GetPaddleTensorName(out_data);
139139
LOG(INFO) << PD_GetPaddleTensorDType(out_data);
140140
PD_PaddleBuf* b = PD_GetPaddleTensorData(out_data);
141-
LOG(INFO) << PD_PaddleBufLength(b);
141+
LOG(INFO) << PD_PaddleBufLength(b) / sizeof(float);
142142
float* result = static_cast<float*>(PD_PaddleBufData(b));
143143
LOG(INFO) << *result;
144-
PD_PaddleBufResize(b, 500);
145144
PD_DeletePaddleTensor(input);
146145
PD_DeletePaddleBuf(buf);
147146
}

0 commit comments

Comments
 (0)