Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
composable_kernel
Commits
7a272c85
"examples/vscode:/vscode.git/clone" did not exist on "a1242044906d1a5cbe6be6aebcd44eca9c96fb7a"
Commit
7a272c85
authored
Nov 29, 2023
by
rocking
Browse files
backward x for groupnorm
parent
71fe37e9
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
82 additions
and
6 deletions
+82
-6
example/53_layernorm2d_bwd/layernorm2d_bwd_fp16.cpp
example/53_layernorm2d_bwd/layernorm2d_bwd_fp16.cpp
+5
-2
example/54_groupnorm_bwd/groupnorm_bwd_fp16.cpp
example/54_groupnorm_bwd/groupnorm_bwd_fp16.cpp
+77
-4
No files found.
example/53_layernorm2d_bwd/layernorm2d_bwd_fp16.cpp
View file @
7a272c85
...
@@ -40,6 +40,7 @@ constexpr int NumReduceDim = 1;
...
@@ -40,6 +40,7 @@ constexpr int NumReduceDim = 1;
// inv_std: [M, 1]
// inv_std: [M, 1]
// Output shape
// Output shape
// dx: [M, N]
// dgamma: [1, N]
// dgamma: [1, N]
// dbeta: [1, N]
// dbeta: [1, N]
...
@@ -156,7 +157,8 @@ int main()
...
@@ -156,7 +157,8 @@ int main()
if
(
!
x_device_instance
.
IsSupportedArgument
(
x_argument_ptr
.
get
()))
if
(
!
x_device_instance
.
IsSupportedArgument
(
x_argument_ptr
.
get
()))
{
{
std
::
cout
<<
"The runtime parameters are not supported"
<<
std
::
endl
;
std
::
cout
<<
"The runtime parameters are not supported."
<<
__FILE__
<<
":"
<<
__LINE__
<<
std
::
endl
;
return
1
;
return
1
;
};
};
...
@@ -184,7 +186,8 @@ int main()
...
@@ -184,7 +186,8 @@ int main()
if
(
!
gamma_beta_device_instance
.
IsSupportedArgument
(
gamma_beta_argument_ptr
.
get
()))
if
(
!
gamma_beta_device_instance
.
IsSupportedArgument
(
gamma_beta_argument_ptr
.
get
()))
{
{
std
::
cout
<<
"The runtime parameters are not supported"
<<
std
::
endl
;
std
::
cout
<<
"The runtime parameters are not supported."
<<
__FILE__
<<
":"
<<
__LINE__
<<
std
::
endl
;
return
1
;
return
1
;
};
};
...
...
example/54_groupnorm_bwd/groupnorm_bwd_fp16.cpp
View file @
7a272c85
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
#include "ck/library/utility/literals.hpp"
#include "ck/library/utility/literals.hpp"
#include "ck/tensor_operation/gpu/element/element_wise_operation.hpp"
#include "ck/tensor_operation/gpu/element/element_wise_operation.hpp"
#include "ck/tensor_operation/gpu/device/impl/device_normalization_bwd_x_impl.hpp"
#include "ck/tensor_operation/gpu/device/impl/device_normalization_bwd_gamma_beta_impl.hpp"
#include "ck/tensor_operation/gpu/device/impl/device_normalization_bwd_gamma_beta_impl.hpp"
#include "ck/library/reference_tensor_operation/cpu/reference_groupnorm_bwd.hpp"
#include "ck/library/reference_tensor_operation/cpu/reference_groupnorm_bwd.hpp"
...
@@ -31,7 +32,41 @@ constexpr int Rank = 5;
...
@@ -31,7 +32,41 @@ constexpr int Rank = 5;
constexpr
int
NumReduceDim
=
3
;
constexpr
int
NumReduceDim
=
3
;
// Grouprnorm
// Grouprnorm
// kernel: M , K
// kernel 1: M , K
// dy: N, H, W, G, C -> N * G, H * W * C
// x: N, H, W, G, C -> N * G, H * W * C
// gamma: 1, 1, 1, G, C -> 1 * G, 1 * 1 * C
// mean: N, 1, 1, G, 1 -> N * G, 1 * 1 * 1
// rstd: N, 1, 1, G, 1 -> N * G, 1 * 1 * 1
// dx: N, H, W, G, C -> N * G, H * W * C
using
XDeviceInstance
=
ck
::
tensor_operation
::
device
::
DeviceNormalizationBwdXImpl
<
DYDataType
,
XDataType
,
GammaDataType
,
MeanInvStdDataType
,
ComputeDataType
,
DXDataType
,
Rank
,
NumReduceDim
,
256
,
// BlockSize
8
,
// MThreadClusterSize
32
,
// KThreadClusterSize
1
,
// MThreadSliceSize
8
,
// KThreadSliceSize
true
,
// IsDYFastestDimReduced
8
,
// DYSrcVectorSize
true
,
// IsXFastestDimReduced
8
,
// XSrcVectorSize
true
,
// IsGammaFastestDimReduced
8
,
// GammaSrcVectorSize
false
,
// IsMeanInvStdFastestDimReduced
1
,
// MeanInvStdSrcVectorSize
true
,
// IsDXFastestDimReduced
8
>
;
// DXDstVectorSize
// kernel 2: M , K
// dy: N, H, W, G, C -> G * C, N * H * W
// dy: N, H, W, G, C -> G * C, N * H * W
// x: N, H, W, G, C -> G * C, N * H * W
// x: N, H, W, G, C -> G * C, N * H * W
// mean: N, 1, 1, G, 1 -> G * 1, N * 1 * 1
// mean: N, 1, 1, G, 1 -> G * 1, N * 1 * 1
...
@@ -62,8 +97,8 @@ using GammaBetaDeviceInstance = ck::tensor_operation::device::DeviceNormalizatio
...
@@ -62,8 +97,8 @@ using GammaBetaDeviceInstance = ck::tensor_operation::device::DeviceNormalizatio
8
,
// XSrcVectorSize
8
,
// XSrcVectorSize
false
,
// IsMeanInvStdFastestDimReduced
false
,
// IsMeanInvStdFastestDimReduced
1
,
// MeanInvStdSrcVectorSize
1
,
// MeanInvStdSrcVectorSize
1
,
// DGammaDstVectorSize
8
,
// DGammaDstVectorSize
1
>
;
// DBetaDstVectorSize
8
>
;
// DBetaDstVectorSize
int
main
()
int
main
()
{
{
...
@@ -93,20 +128,55 @@ int main()
...
@@ -93,20 +128,55 @@ int main()
DeviceMem
dy_dev
(
sizeof
(
DYDataType
)
*
dy
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
dy_dev
(
sizeof
(
DYDataType
)
*
dy
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
x_dev
(
sizeof
(
XDataType
)
*
x
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
x_dev
(
sizeof
(
XDataType
)
*
x
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
gamma_dev
(
sizeof
(
GammaDataType
)
*
gamma
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
mean_dev
(
sizeof
(
MeanInvStdDataType
)
*
mean
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
mean_dev
(
sizeof
(
MeanInvStdDataType
)
*
mean
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
inv_std_dev
(
sizeof
(
MeanInvStdDataType
)
*
inv_std
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
inv_std_dev
(
sizeof
(
MeanInvStdDataType
)
*
inv_std
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
dx_dev
(
sizeof
(
DXDataType
)
*
dx
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
dgamma_dev
(
sizeof
(
DGammaDataType
)
*
dgamma
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
dgamma_dev
(
sizeof
(
DGammaDataType
)
*
dgamma
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
dbeta_dev
(
sizeof
(
DBetaDataType
)
*
dbeta
.
mDesc
.
GetElementSpaceSize
());
DeviceMem
dbeta_dev
(
sizeof
(
DBetaDataType
)
*
dbeta
.
mDesc
.
GetElementSpaceSize
());
dy_dev
.
ToDevice
(
dy
.
mData
.
data
());
dy_dev
.
ToDevice
(
dy
.
mData
.
data
());
x_dev
.
ToDevice
(
x
.
mData
.
data
());
x_dev
.
ToDevice
(
x
.
mData
.
data
());
gamma_dev
.
ToDevice
(
gamma
.
mData
.
data
());
mean_dev
.
ToDevice
(
mean
.
mData
.
data
());
mean_dev
.
ToDevice
(
mean
.
mData
.
data
());
inv_std_dev
.
ToDevice
(
inv_std
.
mData
.
data
());
inv_std_dev
.
ToDevice
(
inv_std
.
mData
.
data
());
std
::
vector
<
ck
::
index_t
>
dyStrides
{
dy
.
mDesc
.
GetStrides
().
begin
(),
dy
.
mDesc
.
GetStrides
().
end
()};
std
::
vector
<
ck
::
index_t
>
dyStrides
{
dy
.
mDesc
.
GetStrides
().
begin
(),
dy
.
mDesc
.
GetStrides
().
end
()};
std
::
vector
<
ck
::
index_t
>
xStrides
{
x
.
mDesc
.
GetStrides
().
begin
(),
x
.
mDesc
.
GetStrides
().
end
()};
std
::
vector
<
ck
::
index_t
>
xStrides
{
x
.
mDesc
.
GetStrides
().
begin
(),
x
.
mDesc
.
GetStrides
().
end
()};
std
::
vector
<
ck
::
index_t
>
gammaStrides
=
{
0
,
0
,
0
,
C
,
1
};
std
::
vector
<
ck
::
index_t
>
meanStrides
=
{
G
,
0
,
0
,
1
,
0
};
std
::
vector
<
ck
::
index_t
>
meanStrides
=
{
G
,
0
,
0
,
1
,
0
};
std
::
vector
<
ck
::
index_t
>
invStdStrides
=
{
G
,
0
,
0
,
1
,
0
};
std
::
vector
<
ck
::
index_t
>
invStdStrides
=
{
G
,
0
,
0
,
1
,
0
};
std
::
vector
<
ck
::
index_t
>
dxStrides
{
dx
.
mDesc
.
GetStrides
().
begin
(),
dx
.
mDesc
.
GetStrides
().
end
()};
// backward x
auto
x_device_instance
=
XDeviceInstance
{};
auto
x_argument_ptr
=
x_device_instance
.
MakeArgumentPointer
({
N
,
H
,
W
,
G
,
C
},
// lengths
dyStrides
,
// dyStrides
xStrides
,
// xStrides
gammaStrides
,
// gammaStrides
meanStrides
,
// meanStrides
invStdStrides
,
// invStdStrides
dxStrides
,
// dxStrides
{
1
,
2
,
4
},
// reduceDims
dy_dev
.
GetDeviceBuffer
(),
x_dev
.
GetDeviceBuffer
(),
gamma_dev
.
GetDeviceBuffer
(),
mean_dev
.
GetDeviceBuffer
(),
inv_std_dev
.
GetDeviceBuffer
(),
dx_dev
.
GetDeviceBuffer
());
if
(
!
x_device_instance
.
IsSupportedArgument
(
x_argument_ptr
.
get
()))
{
std
::
cout
<<
"The runtime parameters are not supported."
<<
__FILE__
<<
":"
<<
__LINE__
<<
std
::
endl
;
return
1
;
};
auto
x_invoker_ptr
=
x_device_instance
.
MakeInvokerPointer
();
x_invoker_ptr
->
Run
(
x_argument_ptr
.
get
(),
StreamConfig
{
nullptr
,
time_kernel
});
// backward gamma & beta
auto
gamma_beta_device_instance
=
GammaBetaDeviceInstance
{};
auto
gamma_beta_device_instance
=
GammaBetaDeviceInstance
{};
auto
gamma_beta_argument_ptr
=
auto
gamma_beta_argument_ptr
=
...
@@ -128,7 +198,8 @@ int main()
...
@@ -128,7 +198,8 @@ int main()
if
(
!
gamma_beta_device_instance
.
IsSupportedArgument
(
gamma_beta_argument_ptr
.
get
()))
if
(
!
gamma_beta_device_instance
.
IsSupportedArgument
(
gamma_beta_argument_ptr
.
get
()))
{
{
std
::
cout
<<
"The runtime parameters are not supported"
<<
std
::
endl
;
std
::
cout
<<
"The runtime parameters are not supported."
<<
__FILE__
<<
":"
<<
__LINE__
<<
std
::
endl
;
return
1
;
return
1
;
};
};
...
@@ -158,9 +229,11 @@ int main()
...
@@ -158,9 +229,11 @@ int main()
dgamma_dev
.
FromDevice
(
dgamma
.
mData
.
data
());
dgamma_dev
.
FromDevice
(
dgamma
.
mData
.
data
());
dbeta_dev
.
FromDevice
(
dbeta
.
mData
.
data
());
dbeta_dev
.
FromDevice
(
dbeta
.
mData
.
data
());
dx_dev
.
FromDevice
(
dx
.
mData
.
data
());
pass
&=
ck
::
utils
::
check_err
(
dgamma
,
host_dgamma
,
"Error: Incorrect dgamma"
,
1e-3
,
1e-3
);
pass
&=
ck
::
utils
::
check_err
(
dgamma
,
host_dgamma
,
"Error: Incorrect dgamma"
,
1e-3
,
1e-3
);
pass
&=
ck
::
utils
::
check_err
(
dbeta
,
host_dbeta
,
"Error: Incorrect dbeta"
,
1e-3
,
1e-3
);
pass
&=
ck
::
utils
::
check_err
(
dbeta
,
host_dbeta
,
"Error: Incorrect dbeta"
,
1e-3
,
1e-3
);
pass
&=
ck
::
utils
::
check_err
(
dx
,
host_dx
,
"Error: Incorrect dx"
,
1e-3
,
1e-3
);
}
}
return
(
pass
?
0
:
1
);
return
(
pass
?
0
:
1
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment