Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MegEngine 天元
MegEngine
提交
a49d5bf9
MegEngine
项目概览
MegEngine 天元
/
MegEngine
1 年多 前同步成功
通知
403
Star
4705
Fork
582
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
MegEngine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
a49d5bf9
编写于
6月 20, 2022
作者:
M
Megvii Engine Team
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(autodiff): fix inplace operation on autodiff.Function
GitOrigin-RevId: a658680f35dead712faab6f0b094cda9caa56e76
上级
7252825c
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
41 addition
and
3 deletion
+41
-3
imperative/python/megengine/core/autodiff/grad.py
imperative/python/megengine/core/autodiff/grad.py
+7
-3
imperative/python/test/unit/core/test_function.py
imperative/python/test/unit/core/test_function.py
+34
-0
未找到文件。
imperative/python/megengine/core/autodiff/grad.py
浏览文件 @
a49d5bf9
...
...
@@ -178,8 +178,10 @@ class Function:
return
self
.
_default_rule
(
*
args
),
self
.
backward
def
__call__
(
self
,
*
args
):
from
...tensor
import
Tensor
for
arg
in
args
:
if
not
isinstance
(
arg
,
core2
.
Tensor
):
if
not
isinstance
(
arg
,
Tensor
):
raise
TypeError
(
"op Function expect type Tensor as inputs, got {}"
.
format
(
type
(
arg
))
)
...
...
@@ -191,6 +193,8 @@ class Function:
grad
=
Grad
.
key2grad
[
grad_key
]
group
=
[
ref
()
for
ref
in
grad
.
_group
]
origin_args
=
[
Tensor
(
arg
)
for
arg
in
args
]
for
grad
in
group
:
grad
.
suppress
()
outputs
,
backward
=
self
.
_grad_rule
(
*
args
)
...
...
@@ -199,13 +203,13 @@ class Function:
def
normalized_backward
(
*
output_grads
):
input_grads
=
backward
(
*
output_grads
)
if
isinstance
(
input_grads
,
core2
.
Tensor
)
or
input_grads
is
None
:
if
isinstance
(
input_grads
,
Tensor
)
or
input_grads
is
None
:
input_grads
=
(
input_grads
,)
return
input_grads
if
self
.
__single_output
:
outputs
=
(
outputs
,)
outputs
=
core2
.
set_grad
(
normalized_backward
,
args
,
outputs
)
outputs
=
core2
.
set_grad
(
normalized_backward
,
origin_
args
,
outputs
)
if
self
.
__single_output
:
(
outputs
,)
=
outputs
return
outputs
...
...
imperative/python/test/unit/core/test_function.py
浏览文件 @
a49d5bf9
...
...
@@ -347,3 +347,37 @@ def test_multiple_grad():
np
.
testing
.
assert_almost_equal
(
loss
.
numpy
(),
(
av
*
10
))
np
.
testing
.
assert_almost_equal
(
net
.
a
.
numpy
(),
(
av
-
20
))
def
test_inplace_forward
():
data_shape
=
(
9
,
2
,
6
)
av
=
np
.
random
.
random
(
data_shape
).
astype
(
np
.
float32
)
class
MulFunc
(
Function
):
def
forward
(
self
,
a
):
self
.
a
=
a
a
*=
10
return
a
def
backward
(
self
,
grad_o
):
return
grad_o
*
10
class
Simple
(
Module
):
def
__init__
(
self
,
a
):
super
().
__init__
()
self
.
a
=
Parameter
(
a
,
dtype
=
np
.
float32
)
self
.
layer1
=
MulFunc
()
def
forward
(
self
):
x
=
self
.
layer1
(
self
.
a
)
return
x
net
=
Simple
(
av
)
gm
=
ad
.
GradManager
().
attach
(
net
.
parameters
())
opt
=
optimizer
.
SGD
(
net
.
parameters
(),
lr
=
1.0
)
opt
.
clear_grad
()
with
gm
:
loss
=
net
()
gm
.
backward
(
loss
.
sum
())
opt
.
step
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录