diff --git a/docs/api_reference/cxx_api_doc.md b/docs/api_reference/cxx_api_doc.md index 1eda7d66ca7fbec1d8280d3ae1bc6e28220be6b4..f99625239e12ea64298ecfb71be80bca3a024817 100644 --- a/docs/api_reference/cxx_api_doc.md +++ b/docs/api_reference/cxx_api_doc.md @@ -846,6 +846,43 @@ for (int i = 0; i < ShapeProduction(input_tensor->shape()); ++i) { 返回类型:`T*` +### `ShareExternalMemory(data, memory_size, target)` + +设置Tensor共享用户数据指针。注意:请保证数据指针在预测过程中处于有效状态。 + +示例: + +```c++ +lite_api::CxxConfig config +config.set_model_dir(FLAGS_model_dir); +config.set_valid_places({ + Place{TARGET(kX86), PRECISION(kFloat)}, + Place{TARGET(kARM), PRECISION(kFloat)}, +}); +auto predictor = lite_api::CreatePaddlePredictor(config); +auto inputs = predictor->GetInputNames(); +auto outputs = predictor->GetOutputNames(); + +std::vector external_data(100 * 100, 0); +auto input_tensor = predictor->GetInputByName(inputs[0]); +input_tensor->Resize(std::vector({100, 100})); +size_t memory_size = external_data.size() * sizeof(float); + +input_tensor->ShareExternalMemory(static_cast(external_data.data()), + memory_size, + config.valid_places()[0].target); +predictor->Run(); +``` + +参数: + +- `data(void*)` - 外部数据指针,请确保在预测过程中数据处于有效状态 +- `memory_size(size_t)` - 外部数据所占字节大小 +- `target(TargetType)` - 目标设备硬件类型,即数据所处设备类型 + +返回:`None` + +返回类型:`void` ### `SetLoD(lod)` @@ -872,3 +909,42 @@ for (int i = 0; i < ShapeProduction(input_tensor->shape()); ++i) { 返回:`Tensor`的LoD信息 返回类型:`std::vector>` + + +### `precision()` + +获取Tensor的精度信息 + +参数: + +- `None` + +返回:`Tensor`的precision信息 + +返回类型:`PrecisionType` + + +### `SetPrecision(precision)` + +设置Tensor的精度信息 + +参数: + +- `precision(PrecisionType)` - Tensor的precision信息 + +返回:`None` + +返回类型:`void` + + +### `target()` + +获取Tensor的数据所处设备信息 + +参数: + +- `None` + +返回:`Tensor`的target信息 + +返回类型:`TargetType` diff --git a/lite/api/paddle_api.cc b/lite/api/paddle_api.cc index e6685e55593a7d8efe6974a2be0e1da967d86a28..a3d29dff93155b4a1eaefd91d35080831601eedf 100644 --- a/lite/api/paddle_api.cc +++ b/lite/api/paddle_api.cc @@ -83,6 +83,14 @@ const T *Tensor::data() const { return ctensor(raw_tensor_)->data(); } +void Tensor::ShareExternalMemory(void *data, + size_t memory_size, + TargetType target) { + auto buf = + std::make_shared(lite::Buffer(data, target, memory_size)); + tensor(raw_tensor_)->ResetBuffer(buf, memory_size); +} + template T *Tensor::mutable_data(TargetType type) const { return tensor(raw_tensor_)->mutable_data(type); @@ -93,6 +101,7 @@ template const int8_t *Tensor::data() const; template const uint8_t *Tensor::data() const; template const int64_t *Tensor::data() const; template const int32_t *Tensor::data() const; +template const void *Tensor::data() const; template int *Tensor::mutable_data(TargetType type) const; template float *Tensor::mutable_data(TargetType type) const; @@ -199,6 +208,10 @@ PrecisionType Tensor::precision() const { return precision; } +void Tensor::SetPrecision(PrecisionType precision) { + tensor(raw_tensor_)->set_precision(precision); +} + lod_t Tensor::lod() const { return ctensor(raw_tensor_)->lod(); } void Tensor::SetLoD(const lod_t &lod) { tensor(raw_tensor_)->set_lod(lod); } diff --git a/lite/api/paddle_api.h b/lite/api/paddle_api.h index 288dc356cd47a2d055eb872b26aa86b23b24ea56..42a4b2228b5dc007bc0d6053f15e843bd6343c8f 100644 --- a/lite/api/paddle_api.h +++ b/lite/api/paddle_api.h @@ -49,6 +49,11 @@ struct LITE_API Tensor { template T* mutable_data(TargetType type = TargetType::kHost) const; + // Share external memory. Note: ensure that the data pointer is in a valid + // state + // during the prediction process. + void ShareExternalMemory(void* data, size_t memory_size, TargetType target); + template void CopyFromCpu(const T* data); @@ -58,6 +63,7 @@ struct LITE_API Tensor { shape_t shape() const; TargetType target() const; PrecisionType precision() const; + void SetPrecision(PrecisionType precision); // LoD of the tensor lod_t lod() const; @@ -153,7 +159,7 @@ class LITE_API ConfigBase { } // set Device ID void set_device_id(int device_id) { device_id_ = device_id; } - const int get_device_id() const { return device_id_; } + int get_device_id() const { return device_id_; } }; /// CxxConfig is the config for the Full feature predictor. diff --git a/lite/api/paddle_api_test.cc b/lite/api/paddle_api_test.cc index 4edd61277059e20f7dfb1b8410a784fd04d85502..c381546dfba9326d48b27e094a39dd4cd082c462 100644 --- a/lite/api/paddle_api_test.cc +++ b/lite/api/paddle_api_test.cc @@ -68,6 +68,42 @@ TEST(CxxApi, run) { FLAGS_model_dir + ".opt2.naive", LiteModelType::kNaiveBuffer, true); } +TEST(CxxApi, share_external_data) { + lite_api::CxxConfig config; + config.set_model_dir(FLAGS_model_dir); + config.set_valid_places({ + Place{TARGET(kX86), PRECISION(kFloat)}, + Place{TARGET(kARM), PRECISION(kFloat)}, + }); + + auto predictor = lite_api::CreatePaddlePredictor(config); + + auto inputs = predictor->GetInputNames(); + auto outputs = predictor->GetOutputNames(); + + std::vector external_data(100 * 100); + for (int i = 0; i < 100 * 100; i++) { + external_data[i] = i; + } + + auto input_tensor = predictor->GetInputByName(inputs[0]); + input_tensor->Resize(std::vector({100, 100})); + size_t memory_size = 100 * 100 * sizeof(float); + input_tensor->ShareExternalMemory(static_cast(external_data.data()), + memory_size, + config.valid_places()[0].target); + + predictor->Run(); + + auto output = predictor->GetTensor(outputs[0]); + auto* out = output->data(); + LOG(INFO) << out[0]; + LOG(INFO) << out[1]; + + EXPECT_NEAR(out[0], 50.2132, 1e-3); + EXPECT_NEAR(out[1], -28.8729, 1e-3); +} + // Demo1 for Mobile Devices :Load model from file and run #ifdef LITE_WITH_LIGHT_WEIGHT_FRAMEWORK TEST(LightApi, run) {