Skip to content

Commit fdb64ac

Browse files
committed
add unittest for prediction
1 parent 106620e commit fdb64ac

16 files changed

+304
-156
lines changed

paddle/capi/Arguments.cpp

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,61 @@
11
#include "PaddleCAPI.h"
22
#include "PaddleCAPIPrivate.h"
33

4-
#define cast(v) paddle::capi::cast<paddle::capi::CArguments>(v)
4+
using paddle::capi::cast;
5+
6+
#define castArg(v) cast<paddle::capi::CArguments>(v)
7+
#define castIVec(v) cast<paddle::capi::CIVector>(v)
58

69
extern "C" {
710
int PDArgsCreateNone(PD_Arguments* args) {
811
auto ptr = new paddle::capi::CArguments();
912
*args = ptr;
10-
return PD_NO_ERROR;
13+
return kPD_NO_ERROR;
1114
}
1215

1316
int PDArgsDestroy(PD_Arguments args) {
14-
if (args == nullptr) return PD_NULLPTR;
15-
delete cast(args);
16-
return PD_NO_ERROR;
17+
if (args == nullptr) return kPD_NULLPTR;
18+
delete castArg(args);
19+
return kPD_NO_ERROR;
1720
}
1821

1922
int PDArgsGetSize(PD_Arguments args, uint64_t* size) {
20-
if (args == nullptr || size == nullptr) return PD_NULLPTR;
21-
*size = cast(args)->args.size();
22-
return PD_NO_ERROR;
23+
if (args == nullptr || size == nullptr) return kPD_NULLPTR;
24+
*size = castArg(args)->args.size();
25+
return kPD_NO_ERROR;
2326
}
2427

2528
int PDArgsResize(PD_Arguments args, uint64_t size) {
26-
if (args == nullptr) return PD_NULLPTR;
27-
cast(args)->args.resize(size);
28-
return PD_NO_ERROR;
29+
if (args == nullptr) return kPD_NULLPTR;
30+
castArg(args)->args.resize(size);
31+
return kPD_NO_ERROR;
2932
}
3033

3134
int PDArgsSetValue(PD_Arguments args, uint64_t ID, PD_Matrix mat) {
32-
if (args == nullptr || mat == nullptr) return PD_NULLPTR;
35+
if (args == nullptr || mat == nullptr) return kPD_NULLPTR;
3336
auto m = paddle::capi::cast<paddle::capi::CMatrix>(mat);
34-
if (m->mat == nullptr) return PD_NULLPTR;
35-
auto a = cast(args);
36-
if (ID >= a->args.size()) return PD_OUT_OF_RANGE;
37+
if (m->mat == nullptr) return kPD_NULLPTR;
38+
auto a = castArg(args);
39+
if (ID >= a->args.size()) return kPD_OUT_OF_RANGE;
3740
a->args[ID].value = m->mat;
38-
return PD_NO_ERROR;
41+
return kPD_NO_ERROR;
3942
}
4043

4144
int PDArgsGetValue(PD_Arguments args, uint64_t ID, PD_Matrix mat) {
42-
if (args == nullptr || mat == nullptr) return PD_NULLPTR;
45+
if (args == nullptr || mat == nullptr) return kPD_NULLPTR;
4346
auto m = paddle::capi::cast<paddle::capi::CMatrix>(mat);
44-
auto a = cast(args);
45-
if (ID >= a->args.size()) return PD_OUT_OF_RANGE;
47+
auto a = castArg(args);
48+
if (ID >= a->args.size()) return kPD_OUT_OF_RANGE;
4649
m->mat = a->args[ID].value;
47-
return PD_NO_ERROR;
50+
return kPD_NO_ERROR;
51+
}
52+
53+
int PDArgsGetIds(PD_Arguments args, uint64_t ID, PD_IVector ids) {
54+
if (args == nullptr || ids == nullptr) return kPD_NULLPTR;
55+
auto iv = castIVec(ids);
56+
auto a = castArg(args);
57+
if (ID >= a->args.size()) return kPD_OUT_OF_RANGE;
58+
iv->vec = a->args[ID].ids;
59+
return kPD_NO_ERROR;
4860
}
4961
}

paddle/capi/CMakeLists.txt

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,11 @@ set(CAPI_PRIVATE_HEADER
1212
PaddleCAPIPrivate.h)
1313
file(GLOB CAPI_SOURCES *.cpp)
1414

15-
add_library(paddle_capi SHARED ${CAPI_SOURCES})
15+
add_library(paddle_capi STATIC ${CAPI_SOURCES})
1616

1717
target_include_directories(paddle_capi PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
1818
add_dependencies(paddle_capi gen_proto_cpp)
1919

20-
target_link_libraries(paddle_capi
21-
"-Wl,-force_load"
22-
paddle_gserver
23-
"-Wl,-force_load"
24-
paddle_function
25-
paddle_pserver
26-
paddle_trainer_lib
27-
paddle_network
28-
paddle_math
29-
paddle_utils
30-
paddle_parameter
31-
paddle_proto
32-
paddle_cuda
33-
${PROTOBUF_LIBRARY}
34-
${LIBGLOG_LIBRARY}
35-
gflags
36-
${CMAKE_THREAD_LIBS_INIT}
37-
${CBLAS_LIBS}
38-
${ZLIB_LIBRARIES}
39-
${INTERAL_LIBS}
40-
${CMAKE_DL_LIBS}
41-
${PYTHON_LIBRARIES})
42-
4320
set(PADDLE_CAPI_INC_PATH
4421
${CMAKE_CURRENT_BINARY_DIR}
4522
${CMAKE_CURRENT_SOURCE_DIR})

paddle/capi/GradientMachine.cpp

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,76 @@ extern "C" {
2727
int PDGradientMachineCreateForPredict(PD_GradiemtMachine* machine,
2828
void* modelConfigProtobuf,
2929
int size) {
30-
if (modelConfigProtobuf == nullptr) return PD_NULLPTR;
30+
if (modelConfigProtobuf == nullptr) return kPD_NULLPTR;
3131
paddle::ModelConfig config;
3232
if (!config.ParseFromArray(modelConfigProtobuf, size) ||
3333
!config.IsInitialized()) {
34-
return PD_PROTOBUF_ERROR;
34+
return kPD_PROTOBUF_ERROR;
3535
}
3636

3737
auto ptr = new paddle::capi::CGradientMachine();
3838
ptr->machine.reset(paddle::GradientMachine::create(
3939
config, CREATE_MODE_TESTING, {paddle::PARAMETER_VALUE}));
4040
*machine = ptr;
41-
return PD_NO_ERROR;
41+
return kPD_NO_ERROR;
4242
}
4343

4444
int PDGradientMachineDestroy(PD_GradiemtMachine machine) {
4545
delete cast(machine);
46-
return PD_NO_ERROR;
46+
return kPD_NO_ERROR;
47+
}
48+
49+
int PDGradientMachineLoadParameterFromDisk(PD_GradiemtMachine machine,
50+
const char* path) {
51+
auto m = cast(machine);
52+
if (m == nullptr || path == nullptr || m->machine == nullptr)
53+
return kPD_NULLPTR;
54+
m->machine->loadParameters(path);
55+
return kPD_NO_ERROR;
56+
}
57+
58+
int PDGradientMachineForward(PD_GradiemtMachine machine,
59+
PD_Arguments inArgs,
60+
PD_Arguments outArgs,
61+
bool isTrain) {
62+
auto m = cast(machine);
63+
auto in = paddle::capi::cast<paddle::capi::CArguments>(inArgs);
64+
auto out = paddle::capi::cast<paddle::capi::CArguments>(outArgs);
65+
if (m == nullptr || in == nullptr || out == nullptr || m->machine == nullptr)
66+
return kPD_NULLPTR;
67+
m->machine->forward(
68+
in->args, &out->args, isTrain ? paddle::PASS_TRAIN : paddle::PASS_TEST);
69+
return kPD_NO_ERROR;
70+
}
71+
72+
int PDGradientMachineCreateSharedParam(PD_GradiemtMachine origin,
73+
void* modelConfigProtobuf,
74+
int size,
75+
PD_GradiemtMachine* slave) {
76+
auto o = cast(origin);
77+
if (origin == nullptr || slave == nullptr || o->machine == nullptr) {
78+
return kPD_NULLPTR;
79+
}
80+
paddle::ModelConfig config;
81+
if (!config.ParseFromArray(modelConfigProtobuf, size) ||
82+
!config.IsInitialized()) {
83+
return kPD_PROTOBUF_ERROR;
84+
}
85+
86+
std::unique_ptr<paddle::capi::CGradientMachine> ptr(
87+
new paddle::capi::CGradientMachine());
88+
auto nn = paddle::NeuralNetwork::create(config);
89+
nn->init(config,
90+
[&o](int paramId, paddle::Parameter* param) {
91+
auto p = o->machine->getParameters()[paramId];
92+
param->enableSharedType(paddle::PARAMETER_VALUE,
93+
p->getBuf(paddle::PARAMETER_VALUE));
94+
95+
},
96+
{paddle::PARAMETER_VALUE},
97+
false);
98+
ptr->machine.reset(nn);
99+
*slave = ptr.release();
100+
return kPD_NO_ERROR;
47101
}
48102
}

paddle/capi/Main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@ int PDInit(int argc, char** argv) {
2424
}
2525
initPaddle(argc + 1, realArgv.data());
2626
free(realArgv[0]);
27-
return PD_NO_ERROR;
27+
return kPD_NO_ERROR;
2828
}
2929
}

paddle/capi/Matrix.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,54 +8,54 @@ int PDMatCreate(PD_Matrix* mat, uint64_t height, uint64_t width, bool useGpu) {
88
auto ptr = new paddle::capi::CMatrix();
99
ptr->mat = paddle::Matrix::create(height, width, false, useGpu);
1010
*mat = ptr;
11-
return PD_NO_ERROR;
11+
return kPD_NO_ERROR;
1212
}
1313

1414
int PDMatCreateNone(PD_Matrix* mat) {
1515
auto ptr = new paddle::capi::CMatrix();
1616
*mat = ptr;
17-
return PD_NO_ERROR;
17+
return kPD_NO_ERROR;
1818
}
1919

2020
int PDMatDestroy(PD_Matrix mat) {
21-
if (mat == nullptr) return PD_NULLPTR;
21+
if (mat == nullptr) return kPD_NULLPTR;
2222
auto ptr = cast(mat);
2323
delete ptr;
24-
return PD_NO_ERROR;
24+
return kPD_NO_ERROR;
2525
}
2626

2727
int PDMatCopyToRow(PD_Matrix mat, uint64_t rowID, pd_real* rowArray) {
28-
if (mat == nullptr) return PD_NULLPTR;
28+
if (mat == nullptr) return kPD_NULLPTR;
2929
auto ptr = cast(mat);
30-
if (ptr->mat == nullptr) return PD_NULLPTR;
31-
if (rowID >= ptr->mat->getHeight()) return PD_OUT_OF_RANGE;
30+
if (ptr->mat == nullptr) return kPD_NULLPTR;
31+
if (rowID >= ptr->mat->getHeight()) return kPD_OUT_OF_RANGE;
3232
paddle::real* buf = ptr->mat->getRowBuf(rowID);
3333
size_t width = ptr->mat->getWidth();
3434
#ifndef PADDLE_ONLY_CPU
3535
hl_memcpy(buf, rowArray, sizeof(paddle::real) * width);
3636
#else
3737
std::copy(rowArray, rowArray + width, buf);
3838
#endif
39-
return PD_NO_ERROR;
39+
return kPD_NO_ERROR;
4040
}
4141

4242
int PDMatGetRow(PD_Matrix mat, uint64_t rowID, pd_real** rawRowBuffer) {
43-
if (mat == nullptr) return PD_NULLPTR;
43+
if (mat == nullptr) return kPD_NULLPTR;
4444
auto ptr = cast(mat);
45-
if (ptr->mat == nullptr) return PD_NULLPTR;
46-
if (rowID >= ptr->mat->getHeight()) return PD_OUT_OF_RANGE;
45+
if (ptr->mat == nullptr) return kPD_NULLPTR;
46+
if (rowID >= ptr->mat->getHeight()) return kPD_OUT_OF_RANGE;
4747
*rawRowBuffer = ptr->mat->getRowBuf(rowID);
48-
return PD_NO_ERROR;
48+
return kPD_NO_ERROR;
4949
}
5050

5151
int PDMatGetShape(PD_Matrix mat, uint64_t* height, uint64_t* width) {
52-
if (mat == nullptr) return PD_NULLPTR;
52+
if (mat == nullptr) return kPD_NULLPTR;
5353
if (height != nullptr) {
5454
*height = cast(mat)->mat->getHeight();
5555
}
5656
if (width != nullptr) {
5757
*width = cast(mat)->mat->getWidth();
5858
}
59-
return PD_NO_ERROR;
59+
return kPD_NO_ERROR;
6060
}
6161
}

paddle/capi/PaddleCAPI.h

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@ extern "C" {
88
#endif
99

1010
typedef enum {
11-
PD_NO_ERROR = 0,
12-
PD_NULLPTR = 1,
13-
PD_OUT_OF_RANGE = 2,
14-
PD_PROTOBUF_ERROR = 3,
15-
PD_UNDEFINED_ERROR = -1,
11+
kPD_NO_ERROR = 0,
12+
kPD_NULLPTR = 1,
13+
kPD_OUT_OF_RANGE = 2,
14+
kPD_PROTOBUF_ERROR = 3,
15+
kPD_UNDEFINED_ERROR = -1,
1616
} PD_Error;
1717

18-
typedef void* PD_Vector;
18+
typedef void* PD_IVector;
1919

20-
int PDVecCreate(PD_Vector* vec, uint64_t size, bool useGpu);
20+
int PDIVecCreateNone(PD_IVector* ivec);
2121

22-
int PDVecDestroy(PD_Vector vec);
22+
int PDIVecDestroy(PD_IVector ivec);
2323

24-
int PDVecIsSparse(PD_Vector vec, bool* isSparse);
24+
int PDIVectorGet(PD_IVector ivec, int** buffer);
2525

2626
typedef void* PD_Matrix;
2727

@@ -51,12 +51,27 @@ int PDArgsSetValue(PD_Arguments args, uint64_t ID, PD_Matrix mat);
5151

5252
int PDArgsGetValue(PD_Arguments args, uint64_t ID, PD_Matrix mat);
5353

54+
int PDArgsGetIds(PD_Arguments args, uint64_t ID, PD_IVector ids);
55+
5456
typedef void* PD_GradiemtMachine;
5557

5658
int PDGradientMachineCreateForPredict(PD_GradiemtMachine* machine,
5759
void* modelConfigProtobuf,
5860
int size);
5961

62+
int PDGradientMachineLoadParameterFromDisk(PD_GradiemtMachine machine,
63+
const char* path);
64+
65+
int PDGradientMachineForward(PD_GradiemtMachine machine,
66+
PD_Arguments inArgs,
67+
PD_Arguments outArgs,
68+
bool isTrain);
69+
70+
int PDGradientMachineCreateSharedParam(PD_GradiemtMachine origin,
71+
void* modelConfigProtobuf,
72+
int size,
73+
PD_GradiemtMachine* slave);
74+
6075
int PDGradientMachineDestroy(PD_GradiemtMachine machine);
6176

6277
int PDInit(int argc, char** argv);

paddle/capi/PaddleCAPIPrivate.h

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,40 @@
88
namespace paddle {
99
namespace capi {
1010

11-
struct CVector {
12-
VectorPtr vec;
11+
enum CType { kIVECTOR = 0, kMATRIX, kARGUMENTS, kGRADIENT_MACHINE };
12+
13+
#define STRUCT_HEADER CType type;
14+
15+
struct CHeader {
16+
STRUCT_HEADER
17+
};
18+
19+
struct CIVector {
20+
STRUCT_HEADER
21+
IVectorPtr vec;
22+
23+
CIVector() : type(kIVECTOR) {}
1324
};
1425

1526
struct CMatrix {
27+
STRUCT_HEADER
1628
MatrixPtr mat;
29+
30+
CMatrix() : type(kMATRIX) {}
1731
};
1832

1933
struct CArguments {
34+
STRUCT_HEADER
2035
std::vector<paddle::Argument> args;
36+
37+
CArguments() : type(kARGUMENTS) {}
2138
};
2239

2340
struct CGradientMachine {
41+
STRUCT_HEADER
2442
paddle::GradientMachinePtr machine;
43+
44+
CGradientMachine() : type(kGRADIENT_MACHINE) {}
2545
};
2646

2747
template <typename T>

0 commit comments

Comments
 (0)