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
52c74f0e
Unverified
Commit
52c74f0e
authored
Oct 17, 2023
by
Attila Dusnoki
Committed by
GitHub
Oct 17, 2023
Browse files
Add GroupNorm and LayerNorm onnx parsing (#2242)
parent
f25606f9
Changes
31
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
534 additions
and
0 deletions
+534
-0
test/onnx/layer_norm_3d_test.onnx
test/onnx/layer_norm_3d_test.onnx
+24
-0
test/onnx/layer_norm_4d_half_test.onnx
test/onnx/layer_norm_4d_half_test.onnx
+30
-0
test/onnx/layer_norm_4d_test.onnx
test/onnx/layer_norm_4d_test.onnx
+26
-0
test/onnx/layer_norm_invalid_axis_error_test.onnx
test/onnx/layer_norm_invalid_axis_error_test.onnx
+0
-0
test/onnx/layer_norm_invalid_input_count_error_test.onnx
test/onnx/layer_norm_invalid_input_count_error_test.onnx
+11
-0
test/onnx/layer_norm_invalid_minus_axis_error_test.onnx
test/onnx/layer_norm_invalid_minus_axis_error_test.onnx
+26
-0
test/onnx/layer_norm_invalid_shape_error_test.onnx
test/onnx/layer_norm_invalid_shape_error_test.onnx
+0
-0
test/onnx/layer_norm_small_eps_half_test.onnx
test/onnx/layer_norm_small_eps_half_test.onnx
+20
-0
test/onnx/layer_norm_without_bias_test.onnx
test/onnx/layer_norm_without_bias_test.onnx
+16
-0
test/onnx/onnx_test.cpp
test/onnx/onnx_test.cpp
+282
-0
test/onnx/verify_onnx.cpp
test/onnx/verify_onnx.cpp
+99
-0
No files found.
test/onnx/layer_norm_3d_test.onnx
0 → 100644
View file @
52c74f0e
layer_norm_3d_test:
=
x
scale
biasy"LayerNormalization*
axislayer_norm_3d_testZ
x
Z
scale
Z
bias
b
y
B
\ No newline at end of file
test/onnx/layer_norm_4d_half_test.onnx
0 → 100644
View file @
52c74f0e
layer_norm_4d_half_test:
=
x
scale
biasy"LayerNormalization*
axislayer_norm_4d_half_testZ
x
Z
scale
Z
bias
b
y
B
\ No newline at end of file
test/onnx/layer_norm_4d_test.onnx
0 → 100644
View file @
52c74f0e
layer_norm_4d_test:
=
x
scale
biasy"LayerNormalization*
axislayer_norm_4d_testZ
x
Z
scale
Z
bias
b
y
B
\ No newline at end of file
test/onnx/layer_norm_invalid_axis_error_test.onnx
0 → 100644
View file @
52c74f0e
File added
test/onnx/layer_norm_invalid_input_count_error_test.onnx
0 → 100644
View file @
52c74f0e
)layer_norm_invalid_input_count_error_test:q
xy"LayerNormalization)layer_norm_invalid_input_count_error_testZ
x
b
y
B
\ No newline at end of file
test/onnx/layer_norm_invalid_minus_axis_error_test.onnx
0 → 100644
View file @
52c74f0e
(layer_norm_invalid_minus_axis_error_test:
=
x
scale
biasy"LayerNormalization*
axis(layer_norm_invalid_minus_axis_error_testZ
x
Z
scale
Z
bias
b
y
B
\ No newline at end of file
test/onnx/layer_norm_invalid_shape_error_test.onnx
0 → 100644
View file @
52c74f0e
File added
test/onnx/layer_norm_small_eps_half_test.onnx
0 → 100644
View file @
52c74f0e
layer_norm_small_eps_half_test:
4
x
scaley"LayerNormalization*
epsilon̼+layer_norm_small_eps_half_testZ
x
Z
scale
b
y
B
\ No newline at end of file
test/onnx/layer_norm_without_bias_test.onnx
0 → 100644
View file @
52c74f0e
layer_norm_without_bias_test:
!
x
scaley"LayerNormalizationlayer_norm_without_bias_testZ
x
Z
scale
b
y
B
\ No newline at end of file
test/onnx/onnx_test.cpp
View file @
52c74f0e
...
...
@@ -2786,6 +2786,145 @@ TEST_CASE(group_conv_test)
EXPECT(p == prog);
}
migraphx::program make_group_norm(const std::vector<int64_t>& input_dims,
const std::vector<int64_t>& scale_dims,
const std::vector<int64_t>& bias_dims,
const std::vector<int64_t>& reshape_dims,
const std::vector<int64_t>& reduce_axes,
const float eps_value = 1e-5f,
const migraphx::shape::type_t dtype = migraphx::shape::float_type)
{
migraphx::program p;
auto* mm = p.get_main_module();
auto x = mm->add_parameter("x", {dtype, input_dims});
auto scale = mm->add_parameter("scale", {dtype, scale_dims});
auto bias = mm->add_parameter("bias", {dtype, bias_dims});
auto eps = mm->add_literal(migraphx::literal{dtype, {eps_value}});
auto x_reshaped =
mm->add_instruction(migraphx::make_op("reshape", {{"dims", reshape_dims}}), x);
auto mean =
mm->add_instruction(migraphx::make_op("reduce_mean", {{"axes", reduce_axes}}), x_reshaped);
auto x_sub_mean = add_common_op(*mm, migraphx::make_op("sub"), {x_reshaped, mean});
auto x_sqdiff_mean = add_common_op(*mm, migraphx::make_op("sqdiff"), {x_reshaped, mean});
auto var = mm->add_instruction(migraphx::make_op("reduce_mean", {{"axes", reduce_axes}}),
x_sqdiff_mean);
auto var_eps = add_common_op(*mm, migraphx::make_op("add"), {var, eps});
auto rsqrt = mm->add_instruction(migraphx::make_op("rsqrt"), {var_eps});
auto result = add_common_op(*mm, migraphx::make_op("mul"), {x_sub_mean, rsqrt});
auto scale_bcast = mm->add_instruction(
migraphx::make_op("broadcast", {{"axis", 1}, {"out_lens", reshape_dims}}), scale);
auto bias_bcast = mm->add_instruction(
migraphx::make_op("broadcast", {{"axis", 1}, {"out_lens", reshape_dims}}), bias);
auto scaled = mm->add_instruction(migraphx::make_op("mul"), {result, scale_bcast});
auto y = mm->add_instruction(migraphx::make_op("add"), {scaled, bias_bcast});
mm->add_instruction(migraphx::make_op("reshape", {{"dims", input_dims}}), y);
return p;
}
TEST_CASE(group_norm_3d_test)
{
migraphx::program p = make_group_norm(
{1, 4, 2}, {2}, {2}, {1, 2, 2, 2}, {2, 3}, 1e-5f, migraphx::shape::float_type);
auto prog = optimize_onnx("group_norm_3d_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(group_norm_3d_half_test)
{
migraphx::program p = make_group_norm(
{1, 4, 2}, {2}, {2}, {1, 2, 2, 2}, {2, 3}, 1e-5f, migraphx::shape::half_type);
auto prog = optimize_onnx("group_norm_3d_half_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(group_norm_4d_test)
{
migraphx::program p = make_group_norm(
{1, 4, 3, 3}, {2}, {2}, {1, 2, 2, 3, 3}, {2, 3, 4}, 1e-5f, migraphx::shape::float_type);
auto prog = optimize_onnx("group_norm_4d_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(group_norm_4d_half_test)
{
migraphx::program p = make_group_norm(
{1, 4, 3, 3}, {2}, {2}, {1, 2, 2, 3, 3}, {2, 3, 4}, 1e-5f, migraphx::shape::half_type);
auto prog = optimize_onnx("group_norm_4d_half_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(group_norm_5d_test)
{
migraphx::program p = make_group_norm({3, 3, 3, 3, 3},
{1},
{1},
{3, 1, 3, 3, 3, 3},
{2, 3, 4, 5},
1e-5f,
migraphx::shape::float_type);
auto prog = optimize_onnx("group_norm_5d_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(group_norm_5d_half_test)
{
migraphx::program p = make_group_norm({3, 3, 3, 3, 3},
{1},
{1},
{3, 1, 3, 3, 3, 3},
{2, 3, 4, 5},
1e-5f,
migraphx::shape::half_type);
auto prog = optimize_onnx("group_norm_5d_half_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(group_norm_small_eps_half_test)
{
migraphx::program p = make_group_norm(
{1, 4, 2}, {2}, {2}, {1, 2, 2, 2}, {2, 3}, 1e-7f, migraphx::shape::half_type);
auto prog = optimize_onnx("group_norm_small_eps_half_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(group_norm_invalid_num_groups_error_test)
{
EXPECT(test::throws(
[&] { migraphx::parse_onnx("group_norm_invalid_num_groups_error_test.onnx"); }));
}
TEST_CASE(group_norm_missing_attribute_error_test)
{
EXPECT(test::throws(
[&] { migraphx::parse_onnx("group_norm_missing_attribute_error_test.onnx"); }));
}
TEST_CASE(group_norm_invalid_input_count_error_test)
{
EXPECT(test::throws(
[&] { migraphx::parse_onnx("group_norm_invalid_input_count_error_test.onnx"); }));
}
TEST_CASE(group_norm_invalid_input_shape_error_test)
{
EXPECT(test::throws(
[&] { migraphx::parse_onnx("group_norm_invalid_input_shape_error_test.onnx"); }));
}
TEST_CASE(group_norm_invalid_scale_shape_test)
{
EXPECT(test::throws([&] { migraphx::parse_onnx("group_norm_invalid_scale_shape_test.onnx"); }));
}
TEST_CASE(group_norm_invalid_bias_shape_test)
{
EXPECT(test::throws([&] { migraphx::parse_onnx("group_norm_invalid_bias_shape_test.onnx"); }));
}
TEST_CASE(hardsigmoid_default_test)
{
migraphx::program p;
...
...
@@ -3648,6 +3787,149 @@ TEST_CASE(lessorequal_test)
EXPECT(p == prog);
}
migraphx::program make_layer_norm(const std::vector<int64_t>& input_shape,
const std::vector<int64_t>& scale_bias_shape,
const std::vector<int64_t>& reduce_axes,
size_t skipped_axis,
bool skip_bias = false,
const float eps_value = 1e-5f,
const migraphx::shape::type_t dtype = migraphx::shape::float_type)
{
migraphx::program p;
auto* mm = p.get_main_module();
auto x = mm->add_parameter("x", {dtype, input_shape});
auto scale = mm->add_parameter("scale", {dtype, scale_bias_shape});
migraphx::instruction_ref bias;
if(not skip_bias)
{
bias = mm->add_parameter("bias", {dtype, scale_bias_shape});
}
auto eps = mm->add_literal(migraphx::literal{dtype, {eps_value}});
auto mean = mm->add_instruction(migraphx::make_op("reduce_mean", {{"axes", reduce_axes}}), x);
auto x_sub_mean = add_common_op(*mm, migraphx::make_op("sub"), {x, mean});
auto x_sqdiff_mean = add_common_op(*mm, migraphx::make_op("sqdiff"), {x, mean});
auto var = mm->add_instruction(migraphx::make_op("reduce_mean", {{"axes", reduce_axes}}),
x_sqdiff_mean);
auto var_eps = add_common_op(*mm, migraphx::make_op("add"), {var, eps});
auto rsqrt = mm->add_instruction(migraphx::make_op("rsqrt"), {var_eps});
auto result = add_common_op(*mm, migraphx::make_op("mul"), {x_sub_mean, rsqrt});
migraphx::instruction_ref scale_bcast = scale;
migraphx::instruction_ref bias_bcast = bias;
if(skipped_axis > 0)
{
scale_bcast = mm->add_instruction(
migraphx::make_op("broadcast", {{"axis", skipped_axis}, {"out_lens", input_shape}}),
scale);
if(not skip_bias)
{
bias_bcast = mm->add_instruction(
migraphx::make_op("broadcast", {{"axis", skipped_axis}, {"out_lens", input_shape}}),
bias);
}
}
auto scaled = mm->add_instruction(migraphx::make_op("mul"), {result, scale_bcast});
if(not skip_bias)
{
mm->add_instruction(migraphx::make_op("add"), {scaled, bias_bcast});
}
return p;
}
TEST_CASE(layer_norm_2d_axis_zero_test)
{
migraphx::program p = make_layer_norm({3, 4}, {3, 4}, {0, 1}, 0);
auto prog = optimize_onnx("layer_norm_2d_axis_zero_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(layer_norm_2d_axis_one_test)
{
migraphx::program p = make_layer_norm({3, 4}, {4}, {1}, 1);
auto prog = optimize_onnx("layer_norm_2d_axis_one_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(layer_norm_2d_axis_minus_one_test)
{
migraphx::program p = make_layer_norm({3, 4}, {4}, {1}, 1);
auto prog = optimize_onnx("layer_norm_2d_axis_one_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(layer_norm_3d_test)
{
migraphx::program p = make_layer_norm({1, 4, 2}, {2}, {2}, 2);
auto prog = optimize_onnx("layer_norm_3d_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(layer_norm_3d_half_test)
{
migraphx::program p =
make_layer_norm({1, 4, 2}, {2}, {2}, 2, false, 1e-5f, migraphx::shape::half_type);
auto prog = optimize_onnx("layer_norm_3d_half_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(layer_norm_4d_test)
{
migraphx::program p = make_layer_norm({3, 3, 3, 3}, {3}, {3}, 3);
auto prog = optimize_onnx("layer_norm_4d_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(layer_norm_4d_half_test)
{
migraphx::program p =
make_layer_norm({3, 3, 3, 3}, {3}, {3}, 3, false, 1e-5f, migraphx::shape::half_type);
auto prog = optimize_onnx("layer_norm_4d_half_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(layer_norm_invalid_axis_error_test)
{
EXPECT(test::throws([&] { migraphx::parse_onnx("layer_norm_invalid_axis_error_test.onnx"); }));
}
TEST_CASE(layer_norm_invalid_minus_axis_error_test)
{
EXPECT(test::throws(
[&] { migraphx::parse_onnx("layer_norm_invalid_minus_axis_error_test.onnx"); }));
}
TEST_CASE(layer_norm_invalid_input_count_error_test)
{
EXPECT(test::throws(
[&] { migraphx::parse_onnx("layer_norm_invalid_input_count_error_test.onnx"); }));
}
TEST_CASE(layer_norm_without_bias_test)
{
migraphx::program p = make_layer_norm({1, 2}, {2}, {1}, 1, true);
auto prog = optimize_onnx("layer_norm_without_bias_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(layer_norm_small_eps_half_test)
{
migraphx::program p =
make_layer_norm({1, 2}, {2}, {1}, 1, true, 1e-7, migraphx::shape::half_type);
auto prog = optimize_onnx("layer_norm_small_eps_half_test.onnx");
EXPECT(p == prog);
}
TEST_CASE(log_test)
{
migraphx::program p;
...
...
test/onnx/verify_onnx.cpp
View file @
52c74f0e
...
...
@@ -538,6 +538,70 @@ TEST_CASE(gemm_half_test)
EXPECT
(
migraphx
::
verify
::
verify_rms_range
(
result_vector
,
gold
));
}
template
<
typename
T
=
float
>
std
::
vector
<
T
>
norm_test
(
const
std
::
vector
<
size_t
>&
x_dims
,
std
::
vector
<
T
>&
scale
,
std
::
vector
<
T
>&
bias
,
const
std
::
string
&
onnx_file
)
{
migraphx
::
program
p
=
migraphx
::
parse_onnx
(
onnx_file
);
p
.
compile
(
migraphx
::
make_target
(
"ref"
));
migraphx
::
shape
s_x
{
migraphx
::
shape
::
get_type
<
T
>
{},
x_dims
};
migraphx
::
shape
s_s
{
migraphx
::
shape
::
get_type
<
T
>
{},
{
scale
.
size
()}};
migraphx
::
shape
s_b
{
migraphx
::
shape
::
get_type
<
T
>
{},
{
scale
.
size
()}};
std
::
vector
<
T
>
x
(
s_x
.
elements
());
std
::
iota
(
std
::
begin
(
x
),
std
::
end
(
x
),
1
);
migraphx
::
parameter_map
pp
;
pp
[
"x"
]
=
migraphx
::
argument
(
s_x
,
x
.
data
());
pp
[
"scale"
]
=
migraphx
::
argument
(
s_s
,
scale
.
data
());
pp
[
"bias"
]
=
migraphx
::
argument
(
s_b
,
bias
.
data
());
auto
result
=
p
.
eval
(
pp
).
back
();
std
::
vector
<
T
>
result_vector
;
result
.
visit
([
&
](
auto
output
)
{
result_vector
.
assign
(
output
.
begin
(),
output
.
end
());
});
return
result_vector
;
}
TEST_CASE
(
group_norm_test
)
{
std
::
vector
<
float
>
scale
{
1.2
,
0.8
};
std
::
vector
<
float
>
bias
{
0.5
,
0.2
};
std
::
vector
<
float
>
result_vector
=
norm_test
<
float
>
({
1
,
4
,
2
},
scale
,
bias
,
"group_norm_3d_test.onnx"
);
std
::
vector
<
float
>
gold
=
{
-
1.10996256
,
-
0.0366542
,
1.0366542
,
2.10996256
,
-
0.87330837
,
-
0.15776947
,
0.55776947
,
1.27330837
};
EXPECT
(
migraphx
::
verify
::
verify_rms_range
(
result_vector
,
gold
));
}
TEST_CASE
(
group_norm_half_test
)
{
using
migraphx
::
half
;
std
::
vector
<
half
>
scale
{
half
{
1.2
},
half
{
0.8
}};
std
::
vector
<
half
>
bias
{
half
{
0.5
},
half
{
0.2
}};
std
::
vector
<
half
>
result_vector
=
norm_test
<
half
>
({
1
,
4
,
2
},
scale
,
bias
,
"group_norm_3d_half_test.onnx"
);
std
::
vector
<
half
>
gold
=
{
half
{
-
1.10996256
},
half
{
-
0.0366542
},
half
{
1.0366542
},
half
{
2.10996256
},
half
{
-
0.87330837
},
half
{
-
0.15776947
},
half
{
0.55776947
},
half
{
1.27330837
}};
EXPECT
(
migraphx
::
verify
::
verify_rms_range
(
result_vector
,
gold
));
}
TEST_CASE
(
greaterorequal_test
)
{
migraphx
::
program
p
=
migraphx
::
parse_onnx
(
"greaterorequal_test.onnx"
);
...
...
@@ -950,6 +1014,41 @@ TEST_CASE(instance_norm_3d_test)
EXPECT
(
migraphx
::
verify
::
verify_rms_range
(
result_vector
,
gold
));
}
TEST_CASE
(
layer_norm_test
)
{
std
::
vector
<
float
>
scale
{
1.2
,
0.8
};
std
::
vector
<
float
>
bias
{
0.5
,
0.2
};
std
::
vector
<
float
>
result_vector
=
norm_test
<
float
>
({
1
,
4
,
2
},
scale
,
bias
,
"layer_norm_3d_test.onnx"
);
std
::
vector
<
float
>
gold
=
{
-
0.69997597
,
0.99998398
,
-
0.69997597
,
0.99998398
,
-
0.69997597
,
0.99998398
,
-
0.69997597
,
0.99998398
};
EXPECT
(
migraphx
::
verify
::
verify_rms_range
(
result_vector
,
gold
));
}
TEST_CASE
(
layer_norm_half_test
)
{
using
migraphx
::
half
;
std
::
vector
<
half
>
scale
{
half
{
1.2
},
half
{
0.8
}};
std
::
vector
<
half
>
bias
{
half
{
0.5
},
half
{
0.2
}};
std
::
vector
<
half
>
result_vector
=
norm_test
<
half
>
({
1
,
4
,
2
},
scale
,
bias
,
"layer_norm_3d_half_test.onnx"
);
std
::
vector
<
half
>
gold
=
{
half
{
-
0.69997597
},
half
{
0.99998398
},
half
{
-
0.69997597
},
half
{
0.99998398
},
half
{
-
0.69997597
},
half
{
0.99998398
},
half
{
-
0.69997597
},
half
{
0.99998398
}};
EXPECT
(
migraphx
::
verify
::
verify_rms_range
(
result_vector
,
gold
));
}
TEST_CASE
(
lessorequal_test
)
{
migraphx
::
program
p
=
migraphx
::
parse_onnx
(
"lessorequal_test.onnx"
);
...
...
Prev
1
2
Next
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