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
MIGraphX
Commits
153276ce
"git@developer.sourcefind.cn:gaoqiong/migraphx.git" did not exist on "9b00f16f2854c1576d74d95155bb55dab05b44d6"
Commit
153276ce
authored
Dec 08, 2023
by
charlie
Browse files
fast tanh replace
parent
fe61d940
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
44 additions
and
2 deletions
+44
-2
src/include/migraphx/rewrite_gelu.hpp
src/include/migraphx/rewrite_gelu.hpp
+1
-1
src/rewrite_gelu.cpp
src/rewrite_gelu.cpp
+43
-1
No files found.
src/include/migraphx/rewrite_gelu.hpp
View file @
153276ce
...
...
@@ -34,7 +34,7 @@ inline namespace MIGRAPHX_INLINE_NS {
struct
module
;
/**
* Rewrite
gelu standard formula as the sigmoid
approximation
formula
* Rewrite
GELU blocks as different
approximation
s.
*/
struct
MIGRAPHX_EXPORT
rewrite_gelu
{
...
...
src/rewrite_gelu.cpp
View file @
153276ce
...
...
@@ -26,11 +26,16 @@
#include <migraphx/make_op.hpp>
#include <migraphx/matcher.hpp>
#include <migraphx/match/gelu_erf.hpp>
#include <migraphx/match/gelu_tanh.hpp>
#include <migraphx/common.hpp>
namespace
migraphx
{
inline
namespace
MIGRAPHX_INLINE_NS
{
/**
* Finds GELU blocks using the Gaussian distribution and replaces them with the sigmoid approximation
* if the data type is fp16.
*/
struct
find_gelu_erf
{
auto
matcher
()
const
{
return
match
::
gelu_erf
();
}
...
...
@@ -53,7 +58,44 @@ struct find_gelu_erf
}
};
void
rewrite_gelu
::
apply
(
module
&
m
)
const
{
match
::
find_matches
(
m
,
find_gelu_erf
{});
}
/**
* Find fastGELU blocks (where the graph already does a GELU approximation) and replace them
* with an alternative approximation that is less likely to overflow.
* The replacement approximation is equivalent to:
* GELU(x) ~= 0.5 * x * ( 1 + tanh( sqrt(2/M_PI) * (x + 0.044715 * x^3)))
*/
struct
find_tanh_fast_gelu
{
auto
matcher
()
const
{
return
match
::
gelu_tanh
();
}
void
apply
(
module
&
m
,
const
match
::
matcher_result
&
r
)
const
{
auto
ins
=
r
.
result
;
auto
x
=
r
.
instructions
[
"x"
];
auto
sqrt_2_rpi
=
m
.
add_literal
(
literal
{
shape
{
x
->
get_shape
().
type
()},
{
0.7978845608028653558798921198687637369517172623298693153318516593
}});
auto
fit_const
=
m
.
add_literal
(
literal
{
shape
{
x
->
get_shape
().
type
()},
{
0.044715
f
}});
auto
one
=
m
.
add_literal
(
literal
{
shape
{
x
->
get_shape
().
type
()},
{
1.0
f
}});
auto
xb
=
insert_common_op
(
m
,
ins
,
make_op
(
"mul"
),
{
x
,
sqrt_2_rpi
});
auto
a
=
insert_common_op
(
m
,
ins
,
make_op
(
"mul"
),
{
xb
,
fit_const
});
auto
b
=
m
.
insert_instruction
(
ins
,
make_op
(
"mul"
),
a
,
x
);
auto
c
=
m
.
insert_instruction
(
ins
,
make_op
(
"mul"
),
b
,
x
);
auto
u
=
m
.
insert_instruction
(
ins
,
make_op
(
"add"
),
c
,
xb
);
auto
neg_u
=
m
.
insert_instruction
(
ins
,
make_op
(
"neg"
),
u
);
auto
d
=
m
.
insert_instruction
(
ins
,
make_op
(
"sub"
),
neg_u
,
u
);
auto
emu
=
m
.
insert_instruction
(
ins
,
make_op
(
"exp"
),
d
);
auto
e
=
insert_common_op
(
m
,
ins
,
make_op
(
"add"
),
{
one
,
emu
});
auto
cdf
=
insert_common_op
(
m
,
ins
,
make_op
(
"div"
),
{
one
,
e
});
auto
y
=
m
.
insert_instruction
(
ins
,
make_op
(
"mul"
),
x
,
cdf
);
m
.
replace_instruction
(
ins
,
y
);
}
};
void
rewrite_gelu
::
apply
(
module
&
m
)
const
{
match
::
find_matches
(
m
,
find_gelu_erf
{},
find_tanh_fast_gelu
{}
);
}
}
// namespace MIGRAPHX_INLINE_NS
}
// namespace migraphx
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