Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
bc7632be
P
Paddle
项目概览
BaiXuePrincess
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
bc7632be
编写于
3月 05, 2021
作者:
石
石晓伟
提交者:
GitHub
3月 05, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
upgrade inference tensor apis, test=develop (#31402)
上级
8491ae9a
变更
9
显示空白变更内容
内联
并排
Showing
9 changed file
with
441 addition
and
340 deletion
+441
-340
paddle/fluid/inference/api/analysis_predictor.cc
paddle/fluid/inference/api/analysis_predictor.cc
+2
-20
paddle/fluid/inference/api/details/CMakeLists.txt
paddle/fluid/inference/api/details/CMakeLists.txt
+2
-0
paddle/fluid/inference/api/details/zero_copy_tensor.cc
paddle/fluid/inference/api/details/zero_copy_tensor.cc
+140
-122
paddle/fluid/inference/api/details/zero_copy_tensor_dummy.cc
paddle/fluid/inference/api/details/zero_copy_tensor_dummy.cc
+15
-15
paddle/fluid/inference/api/details/zero_copy_tensor_test.cc
paddle/fluid/inference/api/details/zero_copy_tensor_test.cc
+138
-0
paddle/fluid/inference/api/helper.h
paddle/fluid/inference/api/helper.h
+20
-0
paddle/fluid/inference/api/paddle_api.h
paddle/fluid/inference/api/paddle_api.h
+11
-71
paddle/fluid/inference/api/paddle_inference_api.h
paddle/fluid/inference/api/paddle_inference_api.h
+2
-112
paddle/fluid/inference/api/paddle_tensor.h
paddle/fluid/inference/api/paddle_tensor.h
+111
-0
未找到文件。
paddle/fluid/inference/api/analysis_predictor.cc
浏览文件 @
bc7632be
...
...
@@ -1195,20 +1195,6 @@ USE_TRT_CONVERTER(clip);
namespace
paddle_infer
{
void
Tensor
::
Reshape
(
const
std
::
vector
<
int
>
&
shape
)
{
tensor_
->
Reshape
(
shape
);
}
std
::
vector
<
int
>
Tensor
::
shape
()
const
{
return
tensor_
->
shape
();
}
void
Tensor
::
SetLoD
(
const
std
::
vector
<
std
::
vector
<
size_t
>>
&
x
)
{
return
tensor_
->
SetLoD
(
x
);
}
std
::
vector
<
std
::
vector
<
size_t
>>
Tensor
::
lod
()
const
{
return
tensor_
->
lod
();
}
const
std
::
string
&
Tensor
::
name
()
const
{
return
tensor_
->
name
();
}
DataType
Tensor
::
type
()
const
{
return
tensor_
->
type
();
}
Predictor
::
Predictor
(
const
Config
&
config
)
{
const_cast
<
Config
*>
(
&
config
)
->
SwitchUseFeedFetchOps
(
false
);
// The second parameter indicates that the discard log is not printed
...
...
@@ -1221,9 +1207,7 @@ std::vector<std::string> Predictor::GetInputNames() {
}
std
::
unique_ptr
<
Tensor
>
Predictor
::
GetInputHandle
(
const
std
::
string
&
name
)
{
auto
zero_copy_tensor
=
predictor_
->
GetInputTensor
(
name
);
std
::
unique_ptr
<
Tensor
>
tensor
(
new
Tensor
(
std
::
move
(
zero_copy_tensor
)));
return
tensor
;
return
predictor_
->
GetInputTensor
(
name
);
}
std
::
vector
<
std
::
string
>
Predictor
::
GetOutputNames
()
{
...
...
@@ -1231,9 +1215,7 @@ std::vector<std::string> Predictor::GetOutputNames() {
}
std
::
unique_ptr
<
Tensor
>
Predictor
::
GetOutputHandle
(
const
std
::
string
&
name
)
{
auto
zero_copy_tensor
=
predictor_
->
GetOutputTensor
(
name
);
std
::
unique_ptr
<
Tensor
>
tensor
(
new
Tensor
(
std
::
move
(
zero_copy_tensor
)));
return
tensor
;
return
predictor_
->
GetOutputTensor
(
name
);
}
bool
Predictor
::
Run
()
{
return
predictor_
->
ZeroCopyRun
();
}
...
...
paddle/fluid/inference/api/details/CMakeLists.txt
浏览文件 @
bc7632be
...
...
@@ -16,3 +16,5 @@
cc_library
(
reset_tensor_array SRCS reset_tensor_array.cc DEPS lod_tensor scope
)
cc_library
(
zero_copy_tensor SRCS zero_copy_tensor.cc DEPS scope lod_tensor enforce
)
cc_library
(
zero_copy_tensor_dummy SRCS zero_copy_tensor_dummy.cc
)
cc_test
(
zero_copy_tensor_test SRCS zero_copy_tensor_test.cc DEPS paddle_inference_api
)
paddle/fluid/inference/api/details/zero_copy_tensor.cc
浏览文件 @
bc7632be
...
...
@@ -18,52 +18,55 @@
#include "paddle/fluid/memory/memcpy.h"
#include "paddle/fluid/platform/enforce.h"
namespace
paddle
{
namespace
paddle
_infer
{
void
ZeroCopy
Tensor
::
Reshape
(
const
std
::
vector
<
int
>
&
shape
)
{
void
Tensor
::
Reshape
(
const
std
::
vector
<
int
>
&
shape
)
{
PADDLE_ENFORCE_EQ
(
name_
.
empty
(),
false
,
platform
::
errors
::
PreconditionNotMet
(
p
addle
::
p
latform
::
errors
::
PreconditionNotMet
(
"Need to SetName first, so that the corresponding tensor can "
"be retrieved."
));
PADDLE_ENFORCE_EQ
(
input_or_output_
,
true
,
platform
::
errors
::
PermissionDenied
(
p
addle
::
p
latform
::
errors
::
PermissionDenied
(
"Can't reshape the output tensor, it is readonly"
));
PADDLE_ENFORCE_NOT_NULL
(
scope_
,
platform
::
errors
::
PreconditionNotMet
(
"The scope should not be nullptr."
));
auto
*
scope
=
static_cast
<
framework
::
Scope
*>
(
scope_
);
auto
*
scope
=
static_cast
<
paddle
::
framework
::
Scope
*>
(
scope_
);
auto
*
var
=
scope
->
FindVar
(
name_
);
PADDLE_ENFORCE_NOT_NULL
(
var
,
platform
::
errors
::
PreconditionNotMet
(
var
,
p
addle
::
p
latform
::
errors
::
PreconditionNotMet
(
"No tensor called [%s] in the runtime scope"
,
name_
));
auto
*
tensor
=
var
->
GetMutable
<
framework
::
LoDTensor
>
();
tensor
->
Resize
(
framework
::
make_ddim
(
shape
));
auto
*
tensor
=
var
->
GetMutable
<
paddle
::
framework
::
LoDTensor
>
();
tensor
->
Resize
(
paddle
::
framework
::
make_ddim
(
shape
));
}
#define EAGER_GET_TENSOR \
if (!tensor_) { \
tensor_ = FindTensor(); \
} \
auto *tensor = static_cast<framework::LoDTensor *>(tensor_);
auto *tensor = static_cast<
paddle::
framework::LoDTensor *>(tensor_);
template
<
typename
T
>
T
*
ZeroCopyTensor
::
mutable_data
(
PaddlePlac
e
place
)
{
T
*
Tensor
::
mutable_data
(
PlaceTyp
e
place
)
{
EAGER_GET_TENSOR
;
PADDLE_ENFORCE_GT
(
tensor
->
numel
(),
0
,
platform
::
errors
::
PreconditionNotMet
(
"You should call
ZeroCopy
Tensor::Reshape(const std::vector<int> "
p
addle
::
p
latform
::
errors
::
PreconditionNotMet
(
"You should call Tensor::Reshape(const std::vector<int> "
"&shape)"
"function before retrieving mutable_data from input tensor."
));
switch
(
static_cast
<
int
>
(
place
))
{
case
static_cast
<
int
>
(
P
addlePlac
e
::
kCPU
):
{
return
tensor
->
mutable_data
<
T
>
(
platform
::
CPUPlace
());
case
static_cast
<
int
>
(
P
laceTyp
e
::
kCPU
):
{
return
tensor
->
mutable_data
<
T
>
(
p
addle
::
p
latform
::
CPUPlace
());
}
case
static_cast
<
int
>
(
PaddlePlace
::
kGPU
):
{
return
tensor
->
mutable_data
<
T
>
(
platform
::
CUDAPlace
(
device_
));
case
static_cast
<
int
>
(
PlaceType
::
kGPU
):
{
return
tensor
->
mutable_data
<
T
>
(
paddle
::
platform
::
CUDAPlace
(
device_
));
}
case
static_cast
<
int
>
(
PlaceType
::
kXPU
):
{
return
tensor
->
mutable_data
<
T
>
(
paddle
::
platform
::
XPUPlace
(
device_
));
}
default:
PADDLE_THROW
(
platform
::
errors
::
Unavailable
(
"Unsupported place: %d"
,
PADDLE_THROW
(
paddle
::
platform
::
errors
::
Unavailable
(
"Only CPU / CUDA / XPU places is supported. The place `%d` is not "
"supported."
,
static_cast
<
int
>
(
place
)));
break
;
}
...
...
@@ -71,73 +74,79 @@ T *ZeroCopyTensor::mutable_data(PaddlePlace place) {
}
template
<
typename
T
>
T
*
ZeroCopyTensor
::
data
(
PaddlePlac
e
*
place
,
int
*
size
)
const
{
T
*
Tensor
::
data
(
PlaceTyp
e
*
place
,
int
*
size
)
const
{
EAGER_GET_TENSOR
;
auto
*
res
=
tensor
->
data
<
T
>
();
if
(
platform
::
is_cpu_place
(
tensor
->
place
()))
{
*
place
=
PaddlePlace
::
kCPU
;
}
else
if
(
platform
::
is_gpu_place
(
tensor
->
place
()))
{
*
place
=
PaddlePlace
::
kGPU
;
if
(
paddle
::
platform
::
is_cpu_place
(
tensor
->
place
()))
{
*
place
=
PlaceType
::
kCPU
;
}
else
if
(
paddle
::
platform
::
is_gpu_place
(
tensor
->
place
()))
{
*
place
=
PlaceType
::
kGPU
;
}
else
if
(
paddle
::
platform
::
is_xpu_place
(
tensor
->
place
()))
{
*
place
=
PlaceType
::
kXPU
;
}
else
{
*
place
=
P
addlePlac
e
::
kUNK
;
*
place
=
P
laceTyp
e
::
kUNK
;
}
*
size
=
tensor
->
numel
();
return
res
;
}
PaddleDType
ZeroCopy
Tensor
::
type
()
const
{
DataType
Tensor
::
type
()
const
{
EAGER_GET_TENSOR
;
auto
type
=
tensor
->
type
();
if
(
type
==
framework
::
proto
::
VarType
::
FP32
)
{
return
PaddleD
Type
::
FLOAT32
;
}
else
if
(
type
==
framework
::
proto
::
VarType
::
INT64
)
{
return
PaddleD
Type
::
INT64
;
}
else
if
(
type
==
framework
::
proto
::
VarType
::
INT32
)
{
return
PaddleD
Type
::
INT32
;
}
else
if
(
type
==
framework
::
proto
::
VarType
::
UINT8
)
{
return
PaddleD
Type
::
UINT8
;
if
(
type
==
paddle
::
framework
::
proto
::
VarType
::
FP32
)
{
return
Data
Type
::
FLOAT32
;
}
else
if
(
type
==
paddle
::
framework
::
proto
::
VarType
::
INT64
)
{
return
Data
Type
::
INT64
;
}
else
if
(
type
==
paddle
::
framework
::
proto
::
VarType
::
INT32
)
{
return
Data
Type
::
INT32
;
}
else
if
(
type
==
paddle
::
framework
::
proto
::
VarType
::
UINT8
)
{
return
Data
Type
::
UINT8
;
}
return
PaddleD
Type
::
FLOAT32
;
return
Data
Type
::
FLOAT32
;
}
template
<
typename
T
>
void
ZeroCopyTensor
::
copy_from_c
pu
(
const
T
*
data
)
{
void
Tensor
::
CopyFromC
pu
(
const
T
*
data
)
{
EAGER_GET_TENSOR
;
PADDLE_ENFORCE_GE
(
tensor
->
numel
(),
0
,
platform
::
errors
::
PreconditionNotMet
(
"You should call
ZeroCopy
Tensor::Reshape(const "
p
addle
::
p
latform
::
errors
::
PreconditionNotMet
(
"You should call Tensor::Reshape(const "
"std::vector<int> &shape)"
"function before copying data from cpu."
));
size_t
ele_size
=
tensor
->
numel
()
*
sizeof
(
T
);
if
(
place_
==
P
addlePlac
e
::
kCPU
)
{
auto
*
t_data
=
tensor
->
mutable_data
<
T
>
(
platform
::
CPUPlace
());
if
(
place_
==
P
laceTyp
e
::
kCPU
)
{
auto
*
t_data
=
tensor
->
mutable_data
<
T
>
(
p
addle
::
p
latform
::
CPUPlace
());
std
::
memcpy
(
static_cast
<
void
*>
(
t_data
),
data
,
ele_size
);
}
else
if
(
place_
==
P
addlePlac
e
::
kGPU
)
{
}
else
if
(
place_
==
P
laceTyp
e
::
kGPU
)
{
#if defined(PADDLE_WITH_CUDA) || defined(PADDLE_WITH_HIP)
platform
::
DeviceContextPool
&
pool
=
platform
::
DeviceContextPool
::
Instance
();
platform
::
CUDAPlace
gpu_place
(
device_
);
paddle
::
platform
::
DeviceContextPool
&
pool
=
paddle
::
platform
::
DeviceContextPool
::
Instance
();
paddle
::
platform
::
CUDAPlace
gpu_place
(
device_
);
auto
*
t_data
=
tensor
->
mutable_data
<
T
>
(
gpu_place
);
auto
*
dev_ctx
=
static_cast
<
const
platform
::
CUDADeviceContext
*>
(
pool
.
Get
(
gpu_place
));
auto
*
dev_ctx
=
static_cast
<
const
paddle
::
platform
::
CUDADeviceContext
*>
(
pool
.
Get
(
gpu_place
));
memory
::
Copy
(
gpu_place
,
static_cast
<
void
*>
(
t_data
),
platform
::
CPUPlace
(),
data
,
ele_size
,
dev_ctx
->
stream
());
paddle
::
memory
::
Copy
(
gpu_place
,
static_cast
<
void
*>
(
t_data
),
paddle
::
platform
::
CPUPlace
(),
data
,
ele_size
,
dev_ctx
->
stream
());
#else
PADDLE_THROW
(
platform
::
errors
::
Unavailable
(
"Not compiled with CUDA, should not reach here."
));
PADDLE_THROW
(
paddle
::
platform
::
errors
::
Unavailable
(
"Can not create tensor with CUDA place because paddle is not compiled "
"with CUDA."
));
#endif
}
else
if
(
place_
==
P
addlePlac
e
::
kXPU
)
{
}
else
if
(
place_
==
P
laceTyp
e
::
kXPU
)
{
#ifdef PADDLE_WITH_XPU
platform
::
XPUPlace
xpu_place
(
device_
);
p
addle
::
p
latform
::
XPUPlace
xpu_place
(
device_
);
auto
*
t_data
=
tensor
->
mutable_data
<
T
>
(
xpu_place
);
memory
::
Copy
(
xpu_place
,
static_cast
<
void
*>
(
t_data
),
platform
::
CPUPlace
(
),
data
,
ele_size
);
paddle
::
memory
::
Copy
(
xpu_place
,
static_cast
<
void
*>
(
t_data
),
paddle
::
platform
::
CPUPlace
(),
data
,
ele_size
);
#else
PADDLE_THROW
(
platform
::
errors
::
Unavailable
(
"Not compiled with XPU, should not reach here."
));
PADDLE_THROW
(
paddle
::
platform
::
errors
::
Unavailable
(
"Can not create tensor with XPU place because paddle is not compiled "
"with XPU."
));
#endif
}
else
{
PADDLE_THROW
(
paddle
::
platform
::
errors
::
InvalidArgument
(
...
...
@@ -146,119 +155,119 @@ void ZeroCopyTensor::copy_from_cpu(const T *data) {
}
template
<
typename
T
>
void
ZeroCopyTensor
::
copy_to_c
pu
(
T
*
data
)
{
void
Tensor
::
CopyToC
pu
(
T
*
data
)
{
EAGER_GET_TENSOR
;
auto
ele_num
=
tensor
->
numel
();
auto
*
t_data
=
tensor
->
data
<
T
>
();
auto
t_place
=
tensor
->
place
();
if
(
platform
::
is_cpu_place
(
t_place
))
{
if
(
p
addle
::
p
latform
::
is_cpu_place
(
t_place
))
{
std
::
memcpy
(
static_cast
<
void
*>
(
data
),
t_data
,
ele_num
*
sizeof
(
T
));
}
else
if
(
place_
==
P
addlePlac
e
::
kGPU
)
{
}
else
if
(
place_
==
P
laceTyp
e
::
kGPU
)
{
#if defined(PADDLE_WITH_CUDA) || defined(PADDLE_WITH_HIP)
platform
::
DeviceContextPool
&
pool
=
platform
::
DeviceContextPool
::
Instance
();
auto
gpu_place
=
BOOST_GET_CONST
(
platform
::
CUDAPlace
,
t_place
);
auto
*
dev_ctx
=
static_cast
<
const
platform
::
CUDADeviceContext
*>
(
pool
.
Get
(
gpu_place
));
memory
::
Copy
(
platform
::
CPUPlace
(),
static_cast
<
void
*>
(
data
),
gpu_place
,
t_data
,
ele_num
*
sizeof
(
T
),
dev_ctx
->
stream
());
paddle
::
platform
::
DeviceContextPool
&
pool
=
paddle
::
platform
::
DeviceContextPool
::
Instance
();
auto
gpu_place
=
BOOST_GET_CONST
(
paddle
::
platform
::
CUDAPlace
,
t_place
);
auto
*
dev_ctx
=
static_cast
<
const
paddle
::
platform
::
CUDADeviceContext
*>
(
pool
.
Get
(
gpu_place
));
paddle
::
memory
::
Copy
(
paddle
::
platform
::
CPUPlace
(),
static_cast
<
void
*>
(
data
),
gpu_place
,
t_data
,
ele_num
*
sizeof
(
T
),
dev_ctx
->
stream
());
#ifdef PADDLE_WITH_HIP
hipStreamSynchronize
(
dev_ctx
->
stream
());
#else
cudaStreamSynchronize
(
dev_ctx
->
stream
());
#endif
#else
PADDLE_THROW
(
platform
::
errors
::
Unavailable
(
"Not compile with CUDA, should not reach here."
));
PADDLE_THROW
(
paddle
::
platform
::
errors
::
Unavailable
(
"Can not create tensor with CUDA place because paddle is not compiled "
"with CUDA."
));
#endif
}
else
if
(
place_
==
P
addlePlac
e
::
kXPU
)
{
}
else
if
(
place_
==
P
laceTyp
e
::
kXPU
)
{
#ifdef PADDLE_WITH_XPU
auto
xpu_place
=
BOOST_GET_CONST
(
platform
::
XPUPlace
,
t_place
);
memory
::
Copy
(
platform
::
CPUPlace
(),
static_cast
<
void
*>
(
data
),
xpu_place
,
t_data
,
ele_num
*
sizeof
(
T
));
auto
xpu_place
=
BOOST_GET_CONST
(
paddle
::
platform
::
XPUPlace
,
t_place
);
paddle
::
memory
::
Copy
(
paddle
::
platform
::
CPUPlace
(),
static_cast
<
void
*>
(
data
),
xpu_place
,
t_data
,
ele_num
*
sizeof
(
T
));
#else
PADDLE_THROW
(
platform
::
errors
::
Unavailable
(
"Not compile with XPU, should not reach here."
));
PADDLE_THROW
(
paddle
::
platform
::
errors
::
Unavailable
(
"Can not create tensor with XPU place because paddle is not compiled "
"with XPU."
));
#endif
}
else
{
PADDLE_THROW
(
paddle
::
platform
::
errors
::
InvalidArgument
(
"The analysis predictor supports CPU, GPU and XPU now."
));
}
}
template
PD_INFER_DECL
void
ZeroCopyTensor
::
copy_from_cpu
<
float
>(
const
float
*
data
);
template
PD_INFER_DECL
void
ZeroCopyTensor
::
copy_from_cpu
<
int64_t
>(
const
int64_t
*
data
);
template
PD_INFER_DECL
void
ZeroCopyTensor
::
copy_from_cpu
<
int32_t
>(
const
int32_t
*
data
);
template
PD_INFER_DECL
void
ZeroCopyTensor
::
copy_from_cpu
<
uint8_t
>(
const
uint8_t
*
data
);
template
PD_INFER_DECL
void
ZeroCopyTensor
::
copy_from_cpu
<
int8_t
>(
const
int8_t
*
data
);
template
PD_INFER_DECL
void
Tensor
::
CopyFromCpu
<
float
>(
const
float
*
data
);
template
PD_INFER_DECL
void
Tensor
::
CopyFromCpu
<
int64_t
>(
const
int64_t
*
data
);
template
PD_INFER_DECL
void
Tensor
::
CopyFromCpu
<
int32_t
>(
const
int32_t
*
data
);
template
PD_INFER_DECL
void
Tensor
::
CopyFromCpu
<
uint8_t
>(
const
uint8_t
*
data
);
template
PD_INFER_DECL
void
Tensor
::
CopyFromCpu
<
int8_t
>(
const
int8_t
*
data
);
template
PD_INFER_DECL
void
ZeroCopyTensor
::
copy_to_c
pu
<
float
>(
float
*
data
);
template
PD_INFER_DECL
void
ZeroCopyTensor
::
copy_to_c
pu
<
int64_t
>(
int64_t
*
data
);
template
PD_INFER_DECL
void
ZeroCopyTensor
::
copy_to_c
pu
<
int32_t
>(
int32_t
*
data
);
template
PD_INFER_DECL
void
ZeroCopyTensor
::
copy_to_c
pu
<
uint8_t
>(
uint8_t
*
data
);
template
PD_INFER_DECL
void
ZeroCopyTensor
::
copy_to_c
pu
<
int8_t
>(
int8_t
*
data
);
template
PD_INFER_DECL
void
Tensor
::
CopyToC
pu
<
float
>(
float
*
data
);
template
PD_INFER_DECL
void
Tensor
::
CopyToC
pu
<
int64_t
>(
int64_t
*
data
);
template
PD_INFER_DECL
void
Tensor
::
CopyToC
pu
<
int32_t
>(
int32_t
*
data
);
template
PD_INFER_DECL
void
Tensor
::
CopyToC
pu
<
uint8_t
>(
uint8_t
*
data
);
template
PD_INFER_DECL
void
Tensor
::
CopyToC
pu
<
int8_t
>(
int8_t
*
data
);
template
PD_INFER_DECL
float
*
ZeroCopyTensor
::
data
<
float
>(
PaddlePlace
*
place
,
template
PD_INFER_DECL
float
*
Tensor
::
data
<
float
>(
PlaceType
*
place
,
int
*
size
)
const
;
template
PD_INFER_DECL
int64_t
*
Tensor
::
data
<
int64_t
>(
PlaceType
*
place
,
int
*
size
)
const
;
template
PD_INFER_DECL
int32_t
*
Tensor
::
data
<
int32_t
>(
PlaceType
*
place
,
int
*
size
)
const
;
template
PD_INFER_DECL
int64_t
*
ZeroCopyTensor
::
data
<
int64_t
>(
PaddlePlace
*
place
,
int
*
size
)
const
;
template
PD_INFER_DECL
int32_t
*
ZeroCopyTensor
::
data
<
int32_t
>(
PaddlePlace
*
place
,
int
*
size
)
const
;
template
PD_INFER_DECL
uint8_t
*
ZeroCopyTensor
::
data
<
uint8_t
>(
PaddlePlace
*
place
,
int
*
size
)
const
;
template
PD_INFER_DECL
int8_t
*
ZeroCopyTensor
::
data
<
int8_t
>(
PaddlePlace
*
place
,
template
PD_INFER_DECL
uint8_t
*
Tensor
::
data
<
uint8_t
>(
PlaceType
*
place
,
int
*
size
)
const
;
template
PD_INFER_DECL
int8_t
*
Tensor
::
data
<
int8_t
>(
PlaceType
*
place
,
int
*
size
)
const
;
template
PD_INFER_DECL
float
*
Tensor
::
mutable_data
<
float
>(
PlaceType
place
);
template
PD_INFER_DECL
int64_t
*
Tensor
::
mutable_data
<
int64_t
>(
PlaceType
place
);
template
PD_INFER_DECL
int32_t
*
Tensor
::
mutable_data
<
int32_t
>(
PlaceType
place
);
template
PD_INFER_DECL
uint8_t
*
Tensor
::
mutable_data
<
uint8_t
>(
PlaceType
place
);
template
PD_INFER_DECL
int8_t
*
Tensor
::
mutable_data
<
int8_t
>(
PlaceType
place
);
template
PD_INFER_DECL
float
*
ZeroCopyTensor
::
mutable_data
<
float
>(
PaddlePlace
place
);
template
PD_INFER_DECL
int64_t
*
ZeroCopyTensor
::
mutable_data
<
int64_t
>(
PaddlePlace
place
);
template
PD_INFER_DECL
int32_t
*
ZeroCopyTensor
::
mutable_data
<
int32_t
>(
PaddlePlace
place
);
template
PD_INFER_DECL
uint8_t
*
ZeroCopyTensor
::
mutable_data
<
uint8_t
>(
PaddlePlace
place
);
template
PD_INFER_DECL
int8_t
*
ZeroCopyTensor
::
mutable_data
<
int8_t
>(
PaddlePlace
place
);
Tensor
::
Tensor
(
void
*
scope
)
:
scope_
{
scope
}
{
PADDLE_ENFORCE_NOT_NULL
(
scope_
,
paddle
::
platform
::
errors
::
PreconditionNotMet
(
"The `scope` can not be nullptr. It should be "
"set to the pointer of scope."
));
}
void
*
ZeroCopy
Tensor
::
FindTensor
()
const
{
void
*
Tensor
::
FindTensor
()
const
{
PADDLE_ENFORCE_EQ
(
name_
.
empty
(),
false
,
platform
::
errors
::
PreconditionNotMet
(
p
addle
::
p
latform
::
errors
::
PreconditionNotMet
(
"Need to SetName first, so that the corresponding tensor can "
"be retrieved."
));
PADDLE_ENFORCE_NOT_NULL
(
scope_
,
platform
::
errors
::
PreconditionNotMet
(
"The scope should not be nullptr."
));
auto
*
scope
=
static_cast
<
framework
::
Scope
*>
(
scope_
);
auto
*
scope
=
static_cast
<
paddle
::
framework
::
Scope
*>
(
scope_
);
auto
*
var
=
scope
->
FindVar
(
name_
);
PADDLE_ENFORCE_NOT_NULL
(
var
,
platform
::
errors
::
PreconditionNotMet
(
var
,
p
addle
::
p
latform
::
errors
::
PreconditionNotMet
(
"No tensor called [%s] in the runtime scope"
,
name_
));
auto
*
tensor
=
var
->
GetMutable
<
framework
::
LoDTensor
>
();
auto
*
tensor
=
var
->
GetMutable
<
paddle
::
framework
::
LoDTensor
>
();
return
tensor
;
}
std
::
vector
<
int
>
ZeroCopy
Tensor
::
shape
()
const
{
std
::
vector
<
int
>
Tensor
::
shape
()
const
{
EAGER_GET_TENSOR
;
PADDLE_ENFORCE_NOT_NULL
(
tensor_
,
platform
::
errors
::
PreconditionNotMet
(
tensor_
,
p
addle
::
p
latform
::
errors
::
PreconditionNotMet
(
"Not found tensor called %s in the scope"
,
name_
));
return
framework
::
vectorize
<
int
>
(
tensor
->
dims
());
return
paddle
::
framework
::
vectorize
<
int
>
(
tensor
->
dims
());
}
void
ZeroCopy
Tensor
::
SetLoD
(
const
std
::
vector
<
std
::
vector
<
size_t
>>
&
x
)
{
void
Tensor
::
SetLoD
(
const
std
::
vector
<
std
::
vector
<
size_t
>>
&
x
)
{
EAGER_GET_TENSOR
;
framework
::
LoD
lod
;
paddle
::
framework
::
LoD
lod
;
for
(
auto
&
level
:
x
)
{
lod
.
emplace_back
(
level
);
}
tensor
->
set_lod
(
lod
);
}
std
::
vector
<
std
::
vector
<
size_t
>>
ZeroCopy
Tensor
::
lod
()
const
{
std
::
vector
<
std
::
vector
<
size_t
>>
Tensor
::
lod
()
const
{
EAGER_GET_TENSOR
;
std
::
vector
<
std
::
vector
<
size_t
>>
res
;
for
(
auto
&
level
:
tensor
->
lod
())
{
...
...
@@ -267,4 +276,13 @@ std::vector<std::vector<size_t>> ZeroCopyTensor::lod() const {
return
res
;
}
}
// namespace paddle
void
Tensor
::
SetName
(
const
std
::
string
&
name
)
{
name_
=
name
;
}
const
std
::
string
&
Tensor
::
name
()
const
{
return
name_
;
}
void
Tensor
::
SetPlace
(
PlaceType
place
,
int
device
)
{
place_
=
place
;
device_
=
device
;
}
}
// namespace paddle_infer
paddle/fluid/inference/api/details/zero_copy_tensor_dummy.cc
浏览文件 @
bc7632be
...
...
@@ -15,35 +15,35 @@
#include "paddle/fluid/inference/api/paddle_api.h"
#include "paddle/fluid/inference/api/paddle_infer_declare.h"
namespace
paddle
{
namespace
paddle
_infer
{
void
ZeroCopy
Tensor
::
Reshape
(
const
std
::
vector
<
int
>
&
shape
)
{}
void
Tensor
::
Reshape
(
const
std
::
vector
<
int
>
&
shape
)
{}
template
<
typename
T
>
T
*
ZeroCopyTensor
::
mutable_data
(
PaddlePlac
e
place
)
{
T
*
Tensor
::
mutable_data
(
PlaceTyp
e
place
)
{
return
nullptr
;
}
template
<
typename
T
>
T
*
ZeroCopyTensor
::
data
(
PaddlePlac
e
*
place
,
int
*
size
)
const
{
T
*
Tensor
::
data
(
PlaceTyp
e
*
place
,
int
*
size
)
const
{
return
nullptr
;
}
template
PD_INFER_DECL
float
*
ZeroCopyTensor
::
data
<
float
>(
PaddlePlac
e
*
place
,
template
PD_INFER_DECL
float
*
Tensor
::
data
<
float
>(
PlaceTyp
e
*
place
,
int
*
size
)
const
;
template
PD_INFER_DECL
int64_t
*
ZeroCopyTensor
::
data
<
int64_t
>(
PaddlePlace
*
place
,
int
*
size
)
const
;
template
float
*
ZeroCopyTensor
::
mutable_data
(
PaddlePlac
e
place
);
template
int64_t
*
ZeroCopyTensor
::
mutable_data
(
PaddlePlac
e
place
);
template
PD_INFER_DECL
int64_t
*
Tensor
::
data
<
int64_t
>(
PlaceType
*
place
,
int
*
size
)
const
;
template
float
*
Tensor
::
mutable_data
(
PlaceTyp
e
place
);
template
int64_t
*
Tensor
::
mutable_data
(
PlaceTyp
e
place
);
void
*
ZeroCopy
Tensor
::
FindTensor
()
const
{
return
nullptr
;
}
void
*
Tensor
::
FindTensor
()
const
{
return
nullptr
;
}
std
::
vector
<
int
>
ZeroCopy
Tensor
::
shape
()
const
{
return
{};
}
std
::
vector
<
int
>
Tensor
::
shape
()
const
{
return
{};
}
void
ZeroCopy
Tensor
::
SetLoD
(
const
std
::
vector
<
std
::
vector
<
size_t
>>
&
x
)
{}
void
Tensor
::
SetLoD
(
const
std
::
vector
<
std
::
vector
<
size_t
>>
&
x
)
{}
std
::
vector
<
std
::
vector
<
size_t
>>
ZeroCopy
Tensor
::
lod
()
const
{
std
::
vector
<
std
::
vector
<
size_t
>>
Tensor
::
lod
()
const
{
return
std
::
vector
<
std
::
vector
<
size_t
>>
();
}
}
// namespace paddle
}
// namespace paddle
_infer
paddle/fluid/inference/api/details/zero_copy_tensor_test.cc
0 → 100644
浏览文件 @
bc7632be
// Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <glog/logging.h>
#include <gtest/gtest.h>
#include <algorithm>
#include <functional>
#include <limits>
#include <memory>
#include <random>
#include "paddle/fluid/framework/data_type.h"
#include "paddle/fluid/framework/scope.h"
#include "paddle/fluid/inference/api/helper.h"
#include "paddle/fluid/inference/api/paddle_tensor.h"
#include "paddle/fluid/platform/place.h"
namespace
paddle_infer
{
struct
TensorWrapper
:
public
Tensor
{
TensorWrapper
(
paddle_infer
::
PlaceType
place
,
paddle
::
framework
::
Scope
*
scope
,
const
std
::
string
&
name
)
:
Tensor
{
static_cast
<
void
*>
(
scope
)}
{
SetPlace
(
place
,
0
/*device_id*/
);
SetName
(
name
);
input_or_output_
=
true
;
}
};
std
::
unique_ptr
<
Tensor
>
CreateTensor
(
paddle_infer
::
PlaceType
place
,
paddle
::
framework
::
Scope
*
scope
,
const
std
::
string
&
name
)
{
return
std
::
unique_ptr
<
Tensor
>
(
new
TensorWrapper
{
place
,
scope
,
name
});
}
template
<
typename
T
>
struct
RandomGenerator
{
RandomGenerator
(
double
min
=
(
std
::
numeric_limits
<
T
>::
min
)(),
double
max
=
(
std
::
numeric_limits
<
T
>::
max
)())
:
dist_
{
static_cast
<
double
>
(
min
),
static_cast
<
double
>
(
max
)}
{}
T
operator
()()
{
return
static_cast
<
T
>
(
dist_
(
random_engine_
));
}
private:
std
::
mt19937_64
random_engine_
{
std
::
random_device
()()};
std
::
uniform_real_distribution
<
double
>
dist_
;
};
template
<
typename
T
,
template
<
typename
>
typename
G
>
bool
FillRandomDataAndCheck
(
PlaceType
place
,
size_t
length
,
G
<
T
>&&
generator
,
float
threshold
=
10e-5
)
{
std
::
vector
<
T
>
data_in
(
length
);
std
::
generate
(
data_in
.
begin
(),
data_in
.
end
(),
std
::
forward
<
G
<
T
>>
(
generator
));
paddle
::
framework
::
Scope
scope
;
const
std
::
string
name
{
"name"
};
scope
.
Var
(
name
);
auto
tensor
=
CreateTensor
(
place
,
&
scope
,
name
);
tensor
->
CopyFromCpu
<
T
>
(
data_in
.
data
());
if
(
tensor
->
type
()
!=
paddle
::
inference
::
ConvertToPaddleDType
(
paddle
::
framework
::
DataTypeTrait
<
T
>::
DataType
()))
{
return
false
;
}
std
::
vector
<
T
>
data_out
(
length
);
tensor
->
CopyToCpu
<
T
>
(
data_out
.
data
());
for
(
size_t
i
=
0
;
i
<
length
;
++
i
)
{
if
(
std
::
abs
(
data_out
[
i
]
-
data_out
[
i
])
>
threshold
)
{
return
false
;
}
}
return
true
;
}
template
<
typename
T
>
bool
SetPlaceAndCheck
(
PlaceType
place
,
size_t
length
)
{
paddle
::
framework
::
Scope
scope
;
const
std
::
string
name
{
"name"
};
const
std
::
vector
<
std
::
vector
<
size_t
>>
lod
{{
0
,
length
}};
scope
.
Var
(
name
);
auto
tensor
=
CreateTensor
(
place
,
&
scope
,
name
);
tensor
->
Reshape
({
static_cast
<
int
>
(
length
)});
tensor
->
mutable_data
<
T
>
(
place
);
tensor
->
SetLoD
(
lod
);
PlaceType
place_out
{
PlaceType
::
kUNK
};
int
length_out
{
-
1
};
tensor
->
data
<
T
>
(
&
place_out
,
&
length_out
);
if
(
length_out
!=
static_cast
<
int
>
(
length
)
||
place_out
!=
place
)
{
return
false
;
}
if
(
tensor
->
name
()
!=
name
||
tensor
->
lod
()
!=
lod
)
{
return
false
;
}
return
true
;
}
bool
FillRandomDataAndCheck
(
PlaceType
place
)
{
const
size_t
length
{
RandomGenerator
<
size_t
>
{
1
,
1000
}()};
VLOG
(
3
)
<<
"FillRandomDataAndCheck: length = "
<<
length
;
return
FillRandomDataAndCheck
<
float
>
(
place
,
length
,
RandomGenerator
<
float
>
{})
&&
FillRandomDataAndCheck
<
int64_t
>
(
place
,
length
,
RandomGenerator
<
int64_t
>
{})
&&
FillRandomDataAndCheck
<
int32_t
>
(
place
,
length
,
RandomGenerator
<
int32_t
>
{})
&&
FillRandomDataAndCheck
<
uint8_t
>
(
place
,
length
,
RandomGenerator
<
uint8_t
>
{});
}
bool
SetPlaceAndCheck
(
PlaceType
place
)
{
const
size_t
length
{
RandomGenerator
<
size_t
>
{
1
,
1000
}()};
VLOG
(
3
)
<<
"SetPlaceAndCheck: length = "
<<
length
;
return
SetPlaceAndCheck
<
float
>
(
place
,
length
)
&&
SetPlaceAndCheck
<
int64_t
>
(
place
,
length
)
&&
SetPlaceAndCheck
<
int32_t
>
(
place
,
length
)
&&
SetPlaceAndCheck
<
uint8_t
>
(
place
,
length
);
}
TEST
(
Tensor
,
FillRandomDataAndCheck
)
{
ASSERT_TRUE
(
FillRandomDataAndCheck
(
PlaceType
::
kCPU
));
ASSERT_TRUE
(
SetPlaceAndCheck
(
PlaceType
::
kCPU
));
#ifdef PADDLE_WITH_CUDA
ASSERT_TRUE
(
FillRandomDataAndCheck
(
PlaceType
::
kGPU
));
ASSERT_TRUE
(
SetPlaceAndCheck
(
PlaceType
::
kGPU
));
#endif
}
}
// namespace paddle_infer
paddle/fluid/inference/api/helper.h
浏览文件 @
bc7632be
...
...
@@ -58,6 +58,26 @@ constexpr PaddleDType PaddleTensorGetDType<float>() {
return
PaddleDType
::
FLOAT32
;
}
inline
PaddleDType
ConvertToPaddleDType
(
paddle
::
framework
::
proto
::
VarType
::
Type
type
)
{
if
(
type
==
paddle
::
framework
::
proto
::
VarType
::
FP32
)
{
return
PaddleDType
::
FLOAT32
;
}
else
if
(
type
==
paddle
::
framework
::
proto
::
VarType
::
INT64
)
{
return
PaddleDType
::
INT64
;
}
else
if
(
type
==
paddle
::
framework
::
proto
::
VarType
::
INT32
)
{
return
PaddleDType
::
INT32
;
}
else
if
(
type
==
paddle
::
framework
::
proto
::
VarType
::
UINT8
)
{
return
PaddleDType
::
UINT8
;
}
else
{
PADDLE_THROW
(
paddle
::
platform
::
errors
::
Unimplemented
(
"The paddle dtype convert function only supports FLOAT32, INT64, INT32 "
"and UINT8 now. But "
"we get %d here."
,
static_cast
<
int
>
(
type
)));
return
PaddleDType
::
FLOAT32
;
}
}
using
paddle
::
framework
::
DataTypeToString
;
// Timer for timer
...
...
paddle/fluid/inference/api/paddle_api.h
浏览文件 @
bc7632be
...
...
@@ -29,19 +29,13 @@
#include <vector>
#include "crypto/cipher.h"
#include "paddle_infer_declare.h" // NOLINT
#include "paddle_tensor.h" // NOLINT
/*! \namespace paddle
*/
namespace
paddle
{
/// \brief Paddle data type.
enum
PaddleDType
{
FLOAT32
,
INT64
,
INT32
,
UINT8
,
INT8
,
// TODO(Superjomn) support more data types if needed.
};
using
PaddleDType
=
paddle_infer
::
DataType
;
using
PaddlePlace
=
paddle_infer
::
PlaceType
;
/// \brief Memory manager for PaddleTensor.
///
...
...
@@ -162,8 +156,6 @@ struct PD_INFER_DECL PaddleTensor {
std
::
vector
<
std
::
vector
<
size_t
>>
lod
;
///< Tensor+LoD equals LoDTensor
};
enum
class
PaddlePlace
{
kUNK
=
-
1
,
kCPU
,
kGPU
,
kXPU
};
/// \brief Represents an n-dimensional array of values.
/// The ZeroCopyTensor is used to store the input or output of the network.
/// Zero copy means that the tensor supports direct copy of host or device data
...
...
@@ -172,79 +164,27 @@ enum class PaddlePlace { kUNK = -1, kCPU, kGPU, kXPU };
/// AnalysisPredictor.
/// It is obtained through PaddlePredictor::GetinputTensor()
/// and PaddlePredictor::GetOutputTensor() interface.
class
PD_INFER_DECL
ZeroCopyTensor
{
public:
/// \brief Reset the shape of the tensor.
/// Generally it's only used for the input tensor.
/// Reshape must be called before calling mutable_data() or copy_from_cpu()
/// \param shape The shape to set.
void
Reshape
(
const
std
::
vector
<
int
>&
shape
);
/// \brief Get the memory pointer in CPU or GPU with specific data type.
/// Please Reshape the tensor first before call this.
/// It's usually used to get input data pointer.
/// \param place The place of the tensor.
template
<
typename
T
>
T
*
mutable_data
(
PaddlePlace
place
);
/// \brief Get the memory pointer directly.
/// It's usually used to get the output data pointer.
/// \param[out] place To get the device type of the tensor.
/// \param[out] size To get the data size of the tensor.
/// \return The tensor data buffer pointer.
template
<
typename
T
>
T
*
data
(
PaddlePlace
*
place
,
int
*
size
)
const
;
class
PD_INFER_DECL
ZeroCopyTensor
:
public
paddle_infer
::
Tensor
{
public:
/// \brief Copy the host memory to tensor data.
/// It's usually used to set the input tensor data.
/// \param data The pointer of the data, from which the tensor will copy.
template
<
typename
T
>
void
copy_from_cpu
(
const
T
*
data
);
void
copy_from_cpu
(
const
T
*
data
)
{
return
CopyFromCpu
(
data
);
}
/// \brief Copy the tensor data to the host memory.
/// It's usually used to get the output tensor data.
/// \param[out] data The tensor will copy the data to the address.
template
<
typename
T
>
void
copy_to_cpu
(
T
*
data
);
/// \brief Return the shape of the Tensor.
std
::
vector
<
int
>
shape
()
const
;
/// \brief Set lod info of the tensor.
/// More about LOD can be seen here:
/// https://www.paddlepaddle.org.cn/documentation/docs/zh/beginners_guide/basic_concept/lod_tensor.html#lodtensor
/// \param x the lod info.
void
SetLoD
(
const
std
::
vector
<
std
::
vector
<
size_t
>>&
x
);
/// \brief Return the lod info of the tensor.
std
::
vector
<
std
::
vector
<
size_t
>>
lod
()
const
;
/// \brief Return the name of the tensor.
const
std
::
string
&
name
()
const
{
return
name_
;
}
void
SetPlace
(
PaddlePlace
place
,
int
device
=
-
1
)
{
place_
=
place
;
device_
=
device
;
void
copy_to_cpu
(
T
*
data
)
{
return
CopyToCpu
(
data
);
}
/// \brief Return the data type of the tensor.
/// It's usually used to get the output tensor data type.
/// \return The data type of the tensor.
PaddleDType
type
()
const
;
protected:
explicit
ZeroCopyTensor
(
void
*
scope
)
:
scope_
{
scope
}
{}
void
SetName
(
const
std
::
string
&
name
)
{
name_
=
name
;
}
void
*
FindTensor
()
const
;
private:
std
::
string
name_
;
bool
input_or_output_
;
friend
class
AnalysisPredictor
;
void
*
scope_
{
nullptr
};
// The corresponding tensor pointer inside Paddle workspace is cached for
// performance.
mutable
void
*
tensor_
{
nullptr
};
PaddlePlace
place_
;
PaddleDType
dtype_
;
int
device_
;
explicit
ZeroCopyTensor
(
void
*
scope
)
:
paddle_infer
::
Tensor
{
scope
}
{}
};
/// \brief A Predictor for executing inference on a model.
...
...
paddle/fluid/inference/api/paddle_inference_api.h
浏览文件 @
bc7632be
...
...
@@ -42,97 +42,10 @@ limitations under the License. */
///
namespace
paddle_infer
{
using
DataType
=
paddle
::
PaddleDType
;
using
PlaceType
=
paddle
::
PaddlePlace
;
using
PrecisionType
=
paddle
::
AnalysisConfig
::
Precision
;
using
Config
=
paddle
::
AnalysisConfig
;
///
/// \class Tensor
///
/// \brief Represents an n-dimensional array of values.
/// The Tensor is used to store the input or output of the network.
/// It is obtained through Predictor::GetinputHandle()
/// and Predictor::GetOutputHandle() interface.
///
class
PD_INFER_DECL
Tensor
{
public:
// Can only be created by predictor->GetInputHandle(cosnt std::string& name)
// or predictor->GetOutputHandle(cosnt std::string& name)
Tensor
()
=
delete
;
explicit
Tensor
(
std
::
unique_ptr
<
paddle
::
ZeroCopyTensor
>&&
tensor
)
:
tensor_
(
std
::
move
(
tensor
))
{}
///
/// \brief Reset the shape of the tensor.
/// Generally it's only used for the input tensor.
/// Reshape must be called before calling mutable_data() or CopyFromCpu()
/// \param shape The shape to set.
///
void
Reshape
(
const
std
::
vector
<
int
>&
shape
);
///
/// \brief Copy the host memory to tensor data.
/// It's usually used to set the input tensor data.
/// \param data The pointer of the data, from which the tensor will copy.
///
template
<
typename
T
>
void
CopyFromCpu
(
const
T
*
data
);
///
/// \brief Get the memory pointer in CPU or GPU with specific data type.
/// Please Reshape the tensor first before call this.
/// It's usually used to get input data pointer.
/// \param place The place of the tensor.
/// \return The tensor data buffer pointer.
///
template
<
typename
T
>
T
*
mutable_data
(
PlaceType
place
);
///
/// \brief Copy the tensor data to the host memory.
/// It's usually used to get the output tensor data.
/// \param[out] data The tensor will copy the data to the address.
///
template
<
typename
T
>
void
CopyToCpu
(
T
*
data
);
///
/// \brief Get the memory pointer directly.
/// It's usually used to get the output data pointer.
/// \param[out] place To get the device type of the tensor.
/// \param[out] size To get the data size of the tensor.
/// \return The tensor data buffer pointer.
///
template
<
typename
T
>
T
*
data
(
PlaceType
*
place
,
int
*
size
)
const
;
///
/// \brief Set lod info of the tensor.
/// More about LOD can be seen here:
/// https://www.paddlepaddle.org.cn/documentation/docs/zh/beginners_guide/basic_concept/lod_tensor.html#lodtensor
/// \param x the lod info.
///
void
SetLoD
(
const
std
::
vector
<
std
::
vector
<
size_t
>>&
x
);
/// \brief Return the lod info of the tensor.
std
::
vector
<
std
::
vector
<
size_t
>>
lod
()
const
;
/// \brief Return the data type of the tensor.
/// It's usually used to get the output tensor data type.
/// \return The data type of the tensor.
DataType
type
()
const
;
/// \brief Return the shape of the Tensor.
std
::
vector
<
int
>
shape
()
const
;
/// \brief Return the name of the tensor.
const
std
::
string
&
name
()
const
;
private:
std
::
unique_ptr
<
paddle
::
ZeroCopyTensor
>
tensor_
;
};
///
/// \class Predictor
///
...
...
@@ -258,31 +171,7 @@ PD_INFER_DECL int GetNumBytesOfDataType(DataType dtype);
PD_INFER_DECL
std
::
string
GetVersion
();
PD_INFER_DECL
std
::
string
UpdateDllFlag
(
const
char
*
name
,
const
char
*
value
);
template
<
typename
T
>
void
Tensor
::
CopyFromCpu
(
const
T
*
data
)
{
tensor_
->
copy_from_cpu
<
T
>
(
data
);
}
template
<
typename
T
>
void
Tensor
::
CopyToCpu
(
T
*
data
)
{
return
tensor_
->
copy_to_cpu
<
T
>
(
data
);
}
template
<
typename
T
>
T
*
Tensor
::
mutable_data
(
PlaceType
place
)
{
return
tensor_
->
mutable_data
<
T
>
(
place
);
}
template
<
typename
T
>
T
*
Tensor
::
data
(
PlaceType
*
place
,
int
*
size
)
const
{
return
tensor_
->
data
<
T
>
(
place
,
size
);
}
}
// namespace paddle_infer
namespace
paddle_infer
{
namespace
services
{
///
/// \class PredictorPool
///
...
...
@@ -308,4 +197,5 @@ class PD_INFER_DECL PredictorPool {
std
::
vector
<
std
::
unique_ptr
<
Predictor
>>
preds_
;
};
}
// namespace services
}
// namespace paddle_infer
paddle/fluid/inference/api/paddle_tensor.h
0 → 100644
浏览文件 @
bc7632be
// Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include "paddle_infer_declare.h" // NOLINT
namespace
paddle_infer
{
/// \brief Paddle data type.
enum
DataType
{
FLOAT32
,
INT64
,
INT32
,
UINT8
,
INT8
,
// TODO(Superjomn) support more data types if needed.
};
enum
class
PlaceType
{
kUNK
=
-
1
,
kCPU
,
kGPU
,
kXPU
};
/// \brief Represents an n-dimensional array of values.
/// The Tensor is used to store the input or output of the network.
/// Zero copy means that the tensor supports direct copy of host or device data
/// to device,
/// eliminating additional CPU copy. Tensor is only used in the
/// AnalysisPredictor.
/// It is obtained through PaddlePredictor::GetinputTensor()
/// and PaddlePredictor::GetOutputTensor() interface.
class
PD_INFER_DECL
Tensor
{
public:
/// \brief Reset the shape of the tensor.
/// Generally it's only used for the input tensor.
/// Reshape must be called before calling mutable_data() or copy_from_cpu()
/// \param shape The shape to set.
void
Reshape
(
const
std
::
vector
<
int
>&
shape
);
/// \brief Get the memory pointer in CPU or GPU with specific data type.
/// Please Reshape the tensor first before call this.
/// It's usually used to get input data pointer.
/// \param place The place of the tensor.
template
<
typename
T
>
T
*
mutable_data
(
PlaceType
place
);
/// \brief Get the memory pointer directly.
/// It's usually used to get the output data pointer.
/// \param[out] place To get the device type of the tensor.
/// \param[out] size To get the data size of the tensor.
/// \return The tensor data buffer pointer.
template
<
typename
T
>
T
*
data
(
PlaceType
*
place
,
int
*
size
)
const
;
/// \brief Copy the host memory to tensor data.
/// It's usually used to set the input tensor data.
/// \param data The pointer of the data, from which the tensor will copy.
template
<
typename
T
>
void
CopyFromCpu
(
const
T
*
data
);
/// \brief Copy the tensor data to the host memory.
/// It's usually used to get the output tensor data.
/// \param[out] data The tensor will copy the data to the address.
template
<
typename
T
>
void
CopyToCpu
(
T
*
data
);
/// \brief Return the shape of the Tensor.
std
::
vector
<
int
>
shape
()
const
;
/// \brief Set lod info of the tensor.
/// More about LOD can be seen here:
/// https://www.paddlepaddle.org.cn/documentation/docs/zh/beginners_guide/basic_concept/lod_tensor.html#lodtensor
/// \param x the lod info.
void
SetLoD
(
const
std
::
vector
<
std
::
vector
<
size_t
>>&
x
);
/// \brief Return the lod info of the tensor.
std
::
vector
<
std
::
vector
<
size_t
>>
lod
()
const
;
/// \brief Return the name of the tensor.
const
std
::
string
&
name
()
const
;
/// \brief Return the data type of the tensor.
/// It's usually used to get the output tensor data type.
/// \return The data type of the tensor.
DataType
type
()
const
;
protected:
explicit
Tensor
(
void
*
scope
);
void
*
FindTensor
()
const
;
void
SetPlace
(
PlaceType
place
,
int
device
=
-
1
);
void
SetName
(
const
std
::
string
&
name
);
std
::
string
name_
;
// The corresponding tensor pointer inside Paddle workspace is cached for
// performance.
mutable
void
*
tensor_
{
nullptr
};
DataType
dtype_
;
bool
input_or_output_
;
void
*
scope_
{
nullptr
};
PlaceType
place_
;
int
device_
;
};
}
// namespace paddle_infer
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录