|
|
|
@ -2,6 +2,7 @@
|
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
#include "parameter_optimizer.h"
|
|
|
|
|
|
|
|
|
|
using namespace paddle;
|
|
|
|
|
using namespace paddle::optimizer;
|
|
|
|
|
|
|
|
|
@ -26,6 +27,7 @@ MATCH_ENUM_TYPE(int32_t, PADDLE_ELEMENT_TYPE_INT32);
|
|
|
|
|
MATCH_ENUM_TYPE(uint32_t, PADDLE_ELEMENT_TYPE_UINT32);
|
|
|
|
|
MATCH_ENUM_TYPE(int64_t, PADDLE_ELEMENT_TYPE_INT64);
|
|
|
|
|
MATCH_ENUM_TYPE(uint64_t, PADDLE_ELEMENT_TYPE_UINT64);
|
|
|
|
|
// TODO(zhihong): only implement below type, need to fix
|
|
|
|
|
MATCH_ENUM_TYPE(float, PADDLE_ELEMENT_TYPE_FLOAT32);
|
|
|
|
|
MATCH_ENUM_TYPE(double, PADDLE_ELEMENT_TYPE_FLOAT64);
|
|
|
|
|
|
|
|
|
@ -35,15 +37,20 @@ struct paddle_optimizer {
|
|
|
|
|
|
|
|
|
|
paddle_optimizer* paddle_create_optimizer(const unsigned char* config_proto,
|
|
|
|
|
const int config_proto_len,
|
|
|
|
|
const char** state,
|
|
|
|
|
const int state_size) {
|
|
|
|
|
const paddle_element_type data_type,
|
|
|
|
|
void* param_buffer,
|
|
|
|
|
int num_bytes,
|
|
|
|
|
const char* state,
|
|
|
|
|
const int state_len) {
|
|
|
|
|
paddle_optimizer* optimizer = new paddle_optimizer;
|
|
|
|
|
std::string config(config_proto, config_proto + config_proto_len);
|
|
|
|
|
optimizer->impl = ParameterOptimizer::Create(config);
|
|
|
|
|
if (state != nullptr) {
|
|
|
|
|
std::string s(*state, *state + state_size);
|
|
|
|
|
std::string s(state, state + state_len);
|
|
|
|
|
optimizer->impl->DeSerializeState(s);
|
|
|
|
|
}
|
|
|
|
|
Tensor* param = new Tensor(reinterpret_cast<float*>(param_buffer), num_bytes);
|
|
|
|
|
optimizer->impl->set_weight(param);
|
|
|
|
|
return optimizer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -57,28 +64,19 @@ int paddle_update_parameter(paddle_optimizer* o,
|
|
|
|
|
const void* grad_buffer,
|
|
|
|
|
int num_bytes) {
|
|
|
|
|
// TOOD(zhihong): datatype not work. need to add the runtime datatype
|
|
|
|
|
auto grad_type = reinterpret_cast<const real*>(grad_buffer);
|
|
|
|
|
Tensor* gradient = new Tensor(const_cast<real*>(grad_type), num_bytes);
|
|
|
|
|
auto grad_type = reinterpret_cast<const float*>(grad_buffer);
|
|
|
|
|
Tensor* gradient = new Tensor(const_cast<float*>(grad_type), num_bytes);
|
|
|
|
|
o->impl->Update(gradient);
|
|
|
|
|
return PADDLE_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int paddle_optimizer_set_weights(paddle_optimizer* o,
|
|
|
|
|
const paddle_element_type data_type,
|
|
|
|
|
void* param_buffer,
|
|
|
|
|
int num_bytes) {
|
|
|
|
|
// TOOD(zhihong): datatype not work. need to add the runtime datatype
|
|
|
|
|
Tensor* param = new Tensor(reinterpret_cast<real*>(param_buffer), num_bytes);
|
|
|
|
|
o->impl->set_weight(param);
|
|
|
|
|
return PADDLE_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void* paddle_optimizer_get_weights(paddle_optimizer* o) {
|
|
|
|
|
void* buffer = (void*)o->impl->get_weight();
|
|
|
|
|
return buffer;
|
|
|
|
|
int paddle_optimizer_get_weights(paddle_optimizer* o, void** param_buffer) {
|
|
|
|
|
int param_size = 0;
|
|
|
|
|
*param_buffer = (void*)o->impl->get_weight(¶m_size);
|
|
|
|
|
return param_size;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int paddle_optimizer_get_state(paddle_optimizer* o, const char* state) {
|
|
|
|
|
state = o->impl->SerializeState();
|
|
|
|
|
return PADDLE_SUCCESS;
|
|
|
|
|
int paddle_optimizer_get_state(paddle_optimizer* o, const char** state) {
|
|
|
|
|
*state = o->impl->SerializeState();
|
|
|
|
|
return strlen(*state);
|
|
|
|
|
}
|
|
|
|
|