Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
机器未来
Paddle
提交
128bdf66
P
Paddle
项目概览
机器未来
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
128bdf66
编写于
11月 20, 2021
作者:
J
Jiabin Yang
提交者:
GitHub
11月 20, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Revert "Refactor dygraph to eager (#37318)" (#37386)
上级
4d891c00
变更
7
显示空白变更内容
内联
并排
Showing
7 changed file
with
4 addition
and
423 deletion
+4
-423
paddle/fluid/CMakeLists.txt
paddle/fluid/CMakeLists.txt
+1
-1
paddle/fluid/eager/CMakeLists.txt
paddle/fluid/eager/CMakeLists.txt
+0
-1
paddle/fluid/eager/eager_tensor.h
paddle/fluid/eager/eager_tensor.h
+0
-265
paddle/fluid/eager/tests/CMakeLists.txt
paddle/fluid/eager/tests/CMakeLists.txt
+0
-2
paddle/fluid/eager/tests/data_structure_tests/CMakeLists.txt
paddle/fluid/eager/tests/data_structure_tests/CMakeLists.txt
+0
-1
paddle/fluid/eager/tests/data_structure_tests/eager_tensor_test.cc
...uid/eager/tests/data_structure_tests/eager_tensor_test.cc
+0
-135
paddle/pten/api/include/tensor.h
paddle/pten/api/include/tensor.h
+3
-18
未找到文件。
paddle/fluid/CMakeLists.txt
浏览文件 @
128bdf66
...
...
@@ -11,6 +11,6 @@ add_subdirectory(imperative)
add_subdirectory
(
operators
)
add_subdirectory
(
string
)
add_subdirectory
(
pybind
)
add_subdirectory
(
eager
)
# NOTE: please add subdirectory inference at last.
add_subdirectory
(
inference
)
paddle/fluid/eager/CMakeLists.txt
已删除
100644 → 0
浏览文件 @
4d891c00
add_subdirectory
(
tests
)
paddle/fluid/eager/eager_tensor.h
已删除
100644 → 0
浏览文件 @
4d891c00
// 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 <Python.h>
// framework deps
#include "paddle/fluid/framework/data_layout_transform.h"
#include "paddle/fluid/framework/pten_utils.h"
#include "paddle/fluid/framework/tensor.h"
#include "paddle/fluid/framework/variable.h"
// pten deps
#include "paddle/pten/all.h"
#include "paddle/pten/api/all.h"
#include "paddle/pten/api/lib/utils/tensor_utils.h"
/**
* This class is used by Eager mode for now. It's painful to do this in Eager
* Mode, the better
* choice is to use paddle::experimental::Tensor directly. However, we have a
* punch of nested kernel code, and
* they use paddle::framework::Variable in inner logic code. So, we have to
* provide variable in
* paddle::framework::ExecutionContext to support it. We should remove this as
* soon as we finish our latest
* Pten Lib, and use paddle::experimental::Tensor instead.
*
* Note: Keep this class as clean as possible.
* This class should only support method declared in
* paddle::experimental::Tensor with access method of
* paddle::framework::Variable no more members are acceptable.
* **/
namespace
egr
{
class
EagerTensor
final
{
public:
/* Part 1: Constructors */
EagerTensor
()
:
tensor_
(
std
::
make_shared
<
paddle
::
experimental
::
Tensor
>
()),
var_
(
paddle
::
framework
::
Variable
())
{}
explicit
EagerTensor
(
const
std
::
string
&
name
)
:
tensor_
(
std
::
make_shared
<
paddle
::
experimental
::
Tensor
>
(
name
)),
var_
(
paddle
::
framework
::
Variable
())
{}
/**
* @description: Use a TensorImpl pointer to construct a Tensor
* @param {shared_ptr<TensorBase>} tensor_impl
* @return {Tensor}
*/
explicit
EagerTensor
(
const
std
::
shared_ptr
<
pten
::
TensorBase
>&
tensor_impl
)
:
tensor_
(
std
::
make_shared
<
paddle
::
experimental
::
Tensor
>
(
tensor_impl
)),
var_
(
paddle
::
framework
::
Variable
())
{}
EagerTensor
(
const
EagerTensor
&
)
=
default
;
EagerTensor
(
EagerTensor
&&
)
=
default
;
/* Part 2: Name access methods */
/**
* @description: Return the name of current Tensor.
* @param None
* @return {const std::string&}
*/
const
std
::
string
&
name
()
const
{
return
tensor_
->
name
();
}
/**
* @description: Set the name of current Tensor.
* @param {const std::string& name}
* @return None
*/
void
set_name
(
const
std
::
string
&
name
)
{
tensor_
->
set_name
(
name
);
}
/* Part 3: Dimension, DataType and DataLayout methods */
/**
* @description: Return the number of elements of current Tensor.
* @param None
* @return {int64_t}
*/
int64_t
numel
()
const
{
return
tensor_
->
numel
();
}
/**
* @description: Return the shape (dimensions) of current Tensor.
* @param None
* @return {DDim}
*/
paddle
::
framework
::
DDim
shape
()
const
{
return
tensor_
->
dims
();
}
/**
* @description: Return the data type of current Tensor.
* @param None
* @return {DataType}
*/
paddle
::
experimental
::
DataType
type
()
const
{
return
tensor_
->
type
();
}
/**
* @description: Return the layout of current Tensor.
* @param None
* @return {DataLayout}
*/
paddle
::
experimental
::
DataLayout
layout
()
const
{
return
tensor_
->
layout
();
}
/* Part 3: Device and Backend methods */
/**
* @description: Return the place (device) of current Tensor.
* @param None
* @return {Place}
*/
paddle
::
platform
::
Place
place
()
const
{
return
tensor_
->
inner_place
();
}
/**
* Backend judgment APIs, shield the concept of Backend.
*/
bool
is_cpu
()
const
{
return
paddle
::
platform
::
is_cpu_place
(
place
());
}
bool
is_cuda
()
const
{
return
paddle
::
platform
::
is_gpu_place
(
place
());
}
/* Part 4: Data Access methods */
/**
* @description: Return the implemention of current Tensor.
* @param None
* @return {std::shared_ptr<TensorBase>}
*/
std
::
shared_ptr
<
pten
::
TensorBase
>
impl
()
const
{
return
tensor_
->
impl
();
}
/**
* @description: Set the implemention of current Tensor.
* @param {std::shared_ptr<TensorBase>}
* @return None
*/
void
set_impl
(
const
std
::
shared_ptr
<
pten
::
TensorBase
>&
impl
)
{
tensor_
->
set_impl
(
impl
);
}
// TODO(chenweihang): Whether API Tensor need `data` and `mutable_data`?
// TODO(chenweihang): slice and split methods use kernels?
/* Part 5: Status utils methods */
/**
* @description: Determine whether it is a meaningful Tensor
* @param None
* @return {bool}
*/
bool
defined
()
const
{
return
tensor_
->
defined
();
}
/**
* @description: Determine whether Tensor is initialized
* @param None
* @return {bool}
*/
bool
initialized
()
const
{
return
tensor_
->
initialized
();
}
/**
* @description: Reset the Tensor implementation
* @param None
* @return {void}
*/
void
reset
()
{
tensor_
->
reset
();
}
/* Part 6: Operator overloading */
EagerTensor
&
operator
=
(
const
EagerTensor
&
x
)
&
{
tensor_
=
x
.
tensor_
;
var_
=
x
.
var_
;
return
*
this
;
}
EagerTensor
&
operator
=
(
EagerTensor
&&
x
)
&
{
tensor_
=
std
::
move
(
x
.
tensor_
);
var_
=
std
::
move
(
x
.
var_
);
return
*
this
;
}
/* Part 7: Autograd methods */
paddle
::
experimental
::
AbstractAutogradMeta
*
get_autograd_meta
()
const
{
return
tensor_
->
get_autograd_meta
();
}
void
set_autograd_meta
(
std
::
shared_ptr
<
paddle
::
experimental
::
AbstractAutogradMeta
>
autograd_meta
)
{
tensor_
->
set_autograd_meta
(
autograd_meta
);
}
/** Part 9: Get framework::Variable from EagerTensor **/
const
paddle
::
framework
::
Variable
&
Var
()
const
{
return
var_
;
}
paddle
::
framework
::
Variable
*
MutableVar
()
{
return
&
var_
;
}
/** Part 10: Sync paddle::framework::Variable with pten::Tensor **/
void
SyncToVar
(
paddle
::
framework
::
proto
::
VarType_Type
type
=
paddle
::
framework
::
proto
::
VarType
::
LOD_TENSOR
)
{
// Synchronize allocation only once.
if
(
!
var_
.
IsInitialized
())
{
// TODO(jiabin): Support selected rows later.
if
(
this
->
initialized
())
{
if
(
type
==
paddle
::
framework
::
proto
::
VarType
::
LOD_TENSOR
)
{
auto
*
framework_tensor
=
var_
.
GetMutable
<
paddle
::
framework
::
LoDTensor
>
();
framework_tensor
->
Resize
(
tensor_
->
dims
());
framework_tensor
->
set_layout
(
pten
::
TransToFluidDataLayout
(
tensor_
->
layout
()));
// Contruct framework::Tensor from egr::EagerTensor
auto
tensor_dense
=
std
::
dynamic_pointer_cast
<
pten
::
DenseTensor
>
(
tensor_
->
impl
());
if
(
tensor_dense
)
{
paddle
::
experimental
::
MovesStorage
(
tensor_dense
.
get
(),
framework_tensor
);
}
else
{
PADDLE_THROW
(
paddle
::
platform
::
errors
::
Fatal
(
"Unrecognized egr::EagerTensor type, only "
"DenseTensor is supported for now."
));
}
}
}
else
{
PADDLE_THROW
(
paddle
::
platform
::
errors
::
Fatal
(
"Can not Sync EagerTensor %s whose "
"pten::DenseTensor is not initialized!"
,
name
()));
}
}
}
/** Part 11: Sync paddle::framework::Variable with pten::Tensor **/
void
SyncToTensor
()
{
// Synchronize allocation only once.
if
(
!
this
->
defined
()
||
!
this
->
initialized
())
{
// TODO(jiabin): Support selected rows later.
if
(
var_
.
IsInitialized
())
{
if
(
var_
.
IsType
<
paddle
::
framework
::
LoDTensor
>
())
{
SetImplWithLegacyTensor
<
paddle
::
framework
::
LoDTensor
,
pten
::
DenseTensor
>
();
}
else
if
(
var_
.
IsType
<
paddle
::
framework
::
Tensor
>
())
{
SetImplWithLegacyTensor
<
paddle
::
framework
::
Tensor
,
pten
::
DenseTensor
>
();
}
else
{
PADDLE_THROW
(
paddle
::
platform
::
errors
::
Fatal
(
"Unable to fetch underlying tensor "
"from VarBase, only LoDTensor and "
"Tensor are supported for now"
));
}
}
else
{
PADDLE_THROW
(
paddle
::
platform
::
errors
::
Fatal
(
"Can not Sync EagerTensor %s whose paddle::framework::Variable is "
"not initialized!"
,
name
()));
}
}
}
void
ResetVar
(
const
paddle
::
framework
::
Variable
&
src
)
{
var_
=
src
;
}
private:
template
<
typename
LEGACY_TYPE
,
typename
TYPE
>
void
SetImplWithLegacyTensor
()
{
const
auto
&
framework_tensor
=
var_
.
Get
<
LEGACY_TYPE
>
();
this
->
set_impl
(
std
::
move
(
paddle
::
experimental
::
MakePtenDenseTensor
(
framework_tensor
)));
var_
.
Clear
();
}
private:
std
::
shared_ptr
<
paddle
::
experimental
::
Tensor
>
tensor_
=
nullptr
;
paddle
::
framework
::
Variable
var_
;
};
}
// namespace egr
paddle/fluid/eager/tests/CMakeLists.txt
已删除
100644 → 0
浏览文件 @
4d891c00
set
(
eager_deps pten pten_api python
)
add_subdirectory
(
data_structure_tests
)
paddle/fluid/eager/tests/data_structure_tests/CMakeLists.txt
已删除
100644 → 0
浏览文件 @
4d891c00
cc_test
(
test_egr_ds_eager_tensor SRCS eager_tensor_test.cc DEPS
${
eager_deps
}
)
paddle/fluid/eager/tests/data_structure_tests/eager_tensor_test.cc
已删除
100644 → 0
浏览文件 @
4d891c00
// 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 "paddle/fluid/eager/eager_tensor.h"
#include "paddle/pten/api/lib/utils/allocator.h"
// TODO(jiabin): remove nolint here!!!
using
namespace
egr
;
// NOLINT
namespace
eager_test
{
using
AbstractAutogradMeta
=
paddle
::
experimental
::
AbstractAutogradMeta
;
class
AutogradMetaTest
:
public
AbstractAutogradMeta
{
public:
explicit
AutogradMetaTest
(
int
val
)
:
val_
(
val
)
{}
int
val_
=
0
;
};
}
TEST
(
EagerTensor
,
Constructor
)
{
EagerTensor
et1
=
EagerTensor
();
EagerTensor
et2
=
EagerTensor
(
"et2"
);
CHECK_EQ
(
et1
.
defined
(),
false
);
CHECK_EQ
(
et2
.
name
(),
"et2"
);
pten
::
DenseTensorMeta
meta
=
pten
::
DenseTensorMeta
(
pten
::
DataType
::
FLOAT32
,
paddle
::
framework
::
make_ddim
({
1
,
2
}));
std
::
shared_ptr
<
pten
::
DenseTensor
>
dt
=
std
::
make_shared
<
pten
::
DenseTensor
>
(
std
::
make_shared
<
paddle
::
experimental
::
DefaultAllocator
>
(
paddle
::
platform
::
CPUPlace
()),
meta
);
auto
*
dt_ptr
=
dt
->
mutable_data
<
float
>
();
dt_ptr
[
0
]
=
5.0
f
;
dt_ptr
[
1
]
=
10.0
f
;
EagerTensor
et3
=
EagerTensor
(
dt
);
auto
*
et3_ptr
=
std
::
dynamic_pointer_cast
<
pten
::
DenseTensor
>
(
et3
.
impl
())
->
data
<
float
>
();
CHECK_EQ
(
et3_ptr
[
0
],
5.0
f
);
CHECK_EQ
(
et3_ptr
[
1
],
10.0
f
);
// copy constructor
EagerTensor
et4
(
et3
);
auto
*
et4_ptr
=
std
::
dynamic_pointer_cast
<
pten
::
DenseTensor
>
(
et4
.
impl
())
->
data
<
float
>
();
CHECK_EQ
(
et4_ptr
[
0
],
5.0
f
);
CHECK_EQ
(
et4_ptr
[
1
],
10.0
f
);
EagerTensor
et5
(
std
::
move
(
et4
));
auto
*
et5_ptr
=
std
::
dynamic_pointer_cast
<
pten
::
DenseTensor
>
(
et5
.
impl
())
->
data
<
float
>
();
CHECK_EQ
(
et5_ptr
[
0
],
5.0
f
);
CHECK_EQ
(
et5_ptr
[
1
],
10.0
f
);
}
TEST
(
EagerTensor
,
MemberFunction
)
{
EagerTensor
et3
;
pten
::
DenseTensorMeta
meta
=
pten
::
DenseTensorMeta
(
pten
::
DataType
::
FLOAT32
,
paddle
::
framework
::
make_ddim
({
1
,
2
}));
std
::
shared_ptr
<
pten
::
DenseTensor
>
dt
=
std
::
make_shared
<
pten
::
DenseTensor
>
(
std
::
make_shared
<
paddle
::
experimental
::
DefaultAllocator
>
(
paddle
::
platform
::
CPUPlace
()),
meta
);
auto
*
dt_ptr
=
dt
->
mutable_data
<
float
>
();
dt_ptr
[
0
]
=
5.0
f
;
dt_ptr
[
1
]
=
10.0
f
;
VLOG
(
6
)
<<
"Make Dense Tensor"
;
et3
.
set_name
(
"et3"
);
VLOG
(
6
)
<<
"Set Name"
;
CHECK_EQ
(
et3
.
name
(),
"et3"
);
CHECK_EQ
(
et3
.
defined
(),
false
);
et3
.
set_impl
(
dt
);
VLOG
(
6
)
<<
"Set impl"
;
CHECK_EQ
(
et3
.
initialized
(),
true
);
CHECK_EQ
(
et3
.
is_cpu
(),
true
);
CHECK_EQ
(
et3
.
is_cuda
(),
false
);
CHECK_EQ
(
et3
.
numel
(),
2
);
auto
expected_dim
=
paddle
::
framework
::
make_ddim
({
1
,
2
});
CHECK_EQ
(
et3
.
shape
(),
expected_dim
);
CHECK_EQ
(
et3
.
type
(),
paddle
::
experimental
::
DataType
::
FLOAT32
);
CHECK_EQ
(
et3
.
layout
(),
paddle
::
experimental
::
DataLayout
::
NCHW
);
CHECK
(
paddle
::
platform
::
is_cpu_place
(
et3
.
place
()));
VLOG
(
6
)
<<
"Get impl"
;
auto
*
dt3_ptr
=
std
::
dynamic_pointer_cast
<
pten
::
DenseTensor
>
(
et3
.
impl
())
->
data
<
float
>
();
CHECK_EQ
(
dt3_ptr
[
0
],
5.0
f
);
CHECK_EQ
(
dt3_ptr
[
1
],
10.0
f
);
EagerTensor
et4
=
et3
;
VLOG
(
6
)
<<
"copy ="
;
CHECK
(
et4
.
initialized
()
==
true
);
auto
*
dt4_ptr
=
std
::
dynamic_pointer_cast
<
pten
::
DenseTensor
>
(
et4
.
impl
())
->
data
<
float
>
();
CHECK_EQ
(
dt4_ptr
[
0
],
5.0
f
);
CHECK_EQ
(
dt4_ptr
[
1
],
10.0
f
);
VLOG
(
6
)
<<
"move ="
;
EagerTensor
et5
=
std
::
move
(
et4
);
auto
*
dt5_ptr
=
std
::
dynamic_pointer_cast
<
pten
::
DenseTensor
>
(
et5
.
impl
())
->
data
<
float
>
();
CHECK_EQ
(
dt5_ptr
[
0
],
5.0
f
);
CHECK_EQ
(
dt5_ptr
[
1
],
10.0
f
);
VLOG
(
6
)
<<
"AutogradMeta"
;
auto
autograd_meta_test
=
std
::
make_shared
<
eager_test
::
AutogradMetaTest
>
(
2
);
et3
.
set_autograd_meta
(
autograd_meta_test
);
auto
*
tmp_autograd_meta_test
=
static_cast
<
eager_test
::
AutogradMetaTest
*>
(
et3
.
get_autograd_meta
());
CHECK_EQ
(
tmp_autograd_meta_test
->
val_
,
2
);
VLOG
(
6
)
<<
"SyncToVar"
;
et3
.
SyncToVar
();
CHECK_EQ
(
et3
.
Var
().
Get
<
paddle
::
framework
::
LoDTensor
>
().
data
<
float
>
()[
0
],
5.0
f
);
CHECK_EQ
(
et3
.
Var
().
Get
<
paddle
::
framework
::
LoDTensor
>
().
data
<
float
>
()[
1
],
10.0
f
);
VLOG
(
6
)
<<
"SyncToTensor"
;
CHECK
(
et3
.
initialized
()
==
false
);
et3
.
SyncToTensor
();
CHECK
(
et3
.
initialized
()
==
true
);
VLOG
(
6
)
<<
"Check Tensor"
;
auto
*
dt3_tmp_ptr
=
std
::
dynamic_pointer_cast
<
pten
::
DenseTensor
>
(
et3
.
impl
())
->
data
<
float
>
();
CHECK_EQ
(
dt3_tmp_ptr
[
0
],
5.0
f
);
CHECK_EQ
(
dt3_tmp_ptr
[
1
],
10.0
f
);
et3
.
reset
();
CHECK
(
et3
.
defined
()
==
false
);
VLOG
(
6
)
<<
"Finish"
;
}
paddle/pten/api/include/tensor.h
浏览文件 @
128bdf66
...
...
@@ -86,16 +86,13 @@ class AbstractAutogradMeta {
class
PD_DLL_DECL
Tensor
final
{
public:
/* Part 1: Construction and destruction methods */
/**
* @brief Construct a new Tensor object
*/
Tensor
()
=
default
;
/**
* @brief Construct a new Tensor object with name
* */
explicit
Tensor
(
const
std
::
string
&
name
)
{
name_
=
name
;
}
/**
* @brief Construct a new Tensor object by copy
*/
...
...
@@ -131,19 +128,7 @@ class PD_DLL_DECL Tensor final {
*/
Tensor
(
const
PlaceType
&
place
,
const
std
::
vector
<
int64_t
>&
shape
);
/**
* @brief Return the name of Tensor.
*
* @return const std::string&
*/
const
std
::
string
&
name
()
const
{
return
name_
;
}
/**
* @brief Set name of Tensor.
*
* @param const std::string& name
*/
void
set_name
(
const
std
::
string
&
name
)
{
name_
=
name
;
}
/* Part 2: Dimension, DataType and DataLayout methods */
/**
* @brief Return the number of elements of Tensor.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录