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
f0370072
Unverified
Commit
f0370072
authored
Nov 04, 2023
by
Ted Themistokleous
Committed by
GitHub
Nov 04, 2023
Browse files
Merge branch 'develop' into enable_navi_32_ci
parents
01c2f5fd
b0798343
Changes
30
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
353 additions
and
84 deletions
+353
-84
test/onnx/split_test_uneven_num_outputs.onnx
test/onnx/split_test_uneven_num_outputs.onnx
+24
-0
test/onnx/verify_onnx.cpp
test/onnx/verify_onnx.cpp
+71
-0
test/op_shape_test.cpp
test/op_shape_test.cpp
+33
-3
test/py/CMakeLists.txt
test/py/CMakeLists.txt
+2
-2
test/py/onnx_backend_test.py
test/py/onnx_backend_test.py
+0
-4
test/py/requirements-onnx.txt
test/py/requirements-onnx.txt
+1
-1
test/py/requirements.txt
test/py/requirements.txt
+1
-1
test/ref/multinomial.cpp
test/ref/multinomial.cpp
+221
-12
tools/docker/ubuntu_2204.dockerfile
tools/docker/ubuntu_2204.dockerfile
+0
-5
tools/download_models.sh
tools/download_models.sh
+0
-56
No files found.
test/onnx/split_test_uneven_num_outputs.onnx
0 → 100644
View file @
f0370072
split_test_uneven_num_outputs:
.
xy1y2y3y4"Split*
num_outputssplit_test_uneven_num_outputsZ
x
b
y1
b
y2
b
y3
b
y4
B
\ No newline at end of file
test/onnx/verify_onnx.cpp
View file @
f0370072
...
@@ -1434,6 +1434,77 @@ TEST_CASE(mod_test_fmod_different_types)
...
@@ -1434,6 +1434,77 @@ TEST_CASE(mod_test_fmod_different_types)
EXPECT
(
migraphx
::
verify
::
verify_rms_range
(
result_vector
,
gold
));
EXPECT
(
migraphx
::
verify
::
verify_rms_range
(
result_vector
,
gold
));
}
}
TEST_CASE
(
multinomial_dyn_test
)
{
migraphx
::
onnx_options
options
;
options
.
default_dyn_dim_value
=
{
1
,
4
};
auto
p
=
migraphx
::
parse_onnx
(
"multinomial_dyn_test.onnx"
,
options
);
const
size_t
batch_size
(
2
);
const
size_t
categories
(
5
);
const
size_t
sample_size
(
100000
);
p
.
compile
(
migraphx
::
make_target
(
"ref"
));
// Distribution function (2 distributions of 5 categories each)
std
::
vector
<
int
>
dist
{
15
,
25
,
15
,
25
,
20
,
20
,
20
,
10
,
25
,
25
};
EXPECT
(
dist
.
size
()
==
categories
*
batch_size
);
std
::
vector
<
float
>
data
(
categories
*
batch_size
);
std
::
transform
(
dist
.
begin
(),
dist
.
end
(),
data
.
begin
(),
[
&
](
auto
d
)
{
return
log
(
d
);
});
// Shape of the probability distribution, which also defines the number of categories
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
categories
}};
migraphx
::
parameter_map
pp
;
pp
[
"input"
]
=
migraphx
::
argument
(
s
,
data
.
data
());
auto
result
=
p
.
eval
(
pp
).
back
();
std
::
vector
<
int32_t
>
result_vec
(
batch_size
*
sample_size
);
result
.
visit
([
&
](
auto
output
)
{
result_vec
.
assign
(
output
.
begin
(),
output
.
end
());
});
// Make a categorical histogram of output
// for first result in batch
std
::
vector
<
int
>
res_dist
(
categories
,
0
);
size_t
r
=
0
;
for
(
r
=
0
;
r
<
result_vec
.
size
()
/
2
;
r
++
)
res_dist
[
result_vec
[
r
]]
++
;
// normalizing factors for original and measured distributions
auto
dist_sum
=
std
::
accumulate
(
dist
.
begin
(),
dist
.
begin
()
+
5
,
0
);
auto
res_dist_sum
=
std
::
accumulate
(
res_dist
.
begin
(),
res_dist
.
end
(),
0
);
// Values approximate the distribution in dist
std
::
vector
<
float
>
norm
(
5
);
std
::
vector
<
float
>
res_norm
(
5
);
std
::
transform
(
dist
.
begin
(),
dist
.
begin
()
+
5
,
norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
dist_sum
;
});
std
::
transform
(
res_dist
.
begin
(),
res_dist
.
end
(),
res_norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
res_dist_sum
;
});
EXPECT
(
migraphx
::
verify
::
verify_range_with_tolerance
(
norm
,
migraphx
::
verify
::
expected
{
res_norm
},
migraphx
::
verify
::
tolerance
{
0.01
}));
// Make a categorical histogram of output
// for second result in batch
std
::
fill
(
res_dist
.
begin
(),
res_dist
.
end
(),
0
);
for
(;
r
<
result_vec
.
size
();
r
++
)
res_dist
[
result_vec
[
r
]]
++
;
dist_sum
=
std
::
accumulate
(
dist
.
begin
()
+
5
,
dist
.
end
(),
0
);
res_dist_sum
=
std
::
accumulate
(
res_dist
.
begin
(),
res_dist
.
end
(),
0
);
std
::
transform
(
dist
.
begin
()
+
5
,
dist
.
end
(),
norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
dist_sum
;
});
std
::
transform
(
res_dist
.
begin
(),
res_dist
.
end
(),
res_norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
res_dist_sum
;
});
EXPECT
(
migraphx
::
verify
::
verify_range_with_tolerance
(
res_norm
,
migraphx
::
verify
::
expected
{
norm
},
migraphx
::
verify
::
tolerance
{
0.01
}));
}
TEST_CASE
(
nonzero_test
)
TEST_CASE
(
nonzero_test
)
{
{
migraphx
::
program
p
=
migraphx
::
parse_onnx
(
"nonzero_dynamic_test.onnx"
);
migraphx
::
program
p
=
migraphx
::
parse_onnx
(
"nonzero_dynamic_test.onnx"
);
...
...
test/op_shape_test.cpp
View file @
f0370072
...
@@ -1957,12 +1957,42 @@ TEST_CASE(multibroadcast_3in_dyn_dyn)
...
@@ -1957,12 +1957,42 @@ TEST_CASE(multibroadcast_3in_dyn_dyn)
expect_shape
(
expected_shape
,
migraphx
::
make_op
(
"multibroadcast"
),
c_shape
,
a_shape
,
b_shape
);
expect_shape
(
expected_shape
,
migraphx
::
make_op
(
"multibroadcast"
),
c_shape
,
a_shape
,
b_shape
);
}
}
TEST_CASE
(
multinomial
)
TEST_CASE
(
multinomial
_bool_type
)
{
{
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
2
,
5
}};
migraphx
::
shape
s1
{
migraphx
::
shape
::
float_type
,
{
1
,
2
}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
float_type
,
{
3
,
4
}};
int
dtype
=
0
;
int
dtype
=
0
;
throws_shape
(
migraphx
::
make_op
(
"multinomial"
,
{{
"dtype"
,
dtype
}}),
s
,
s
);
throws_shape
(
migraphx
::
make_op
(
"multinomial"
,
{{
"dtype"
,
dtype
}}),
s1
,
s2
);
}
TEST_CASE
(
multinomial
)
{
migraphx
::
shape
s1
{
migraphx
::
shape
::
float_type
,
{
1
,
2
}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
float_type
,
{
3
,
4
}};
migraphx
::
shape
s3
{
migraphx
::
shape
::
float_type
,
{
1
,
4
}};
int
dtype
=
2
;
expect_shape
(
s3
,
migraphx
::
make_op
(
"multinomial"
,
{{
"dtype"
,
dtype
}}),
s1
,
s2
);
}
TEST_CASE
(
multinomial_0size_input
)
{
migraphx
::
shape
s1
{
migraphx
::
shape
::
float_type
,
{
1
,
2
}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
float_type
,
{}};
int
dtype
=
2
;
throws_shape
(
migraphx
::
make_op
(
"multinomial"
,
{{
"dtype"
,
dtype
}}),
s1
,
s2
);
}
TEST_CASE
(
multinomial_dyn
)
{
migraphx
::
shape
s1
{
migraphx
::
shape
::
int32_type
,
{{
2
,
3
},
{
5
,
6
}}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
int32_type
,
{{
7
,
8
},
{
9
,
10
}}};
migraphx
::
shape
s3
{
migraphx
::
shape
::
int32_type
,
{{
2
,
3
},
{
9
,
10
}}};
expect_shape
(
s3
,
migraphx
::
make_op
(
"multinomial"
,
{{
"dtype"
,
migraphx
::
shape
::
int32_type
}}),
s1
,
s2
);
}
}
TEST_CASE
(
nms_shape
)
TEST_CASE
(
nms_shape
)
...
...
test/py/CMakeLists.txt
View file @
f0370072
...
@@ -41,7 +41,7 @@ function(add_py_venv_fixture FIXTURE_NAME VIRTUAL_ENV_DIR REQUIREMENTS_FILE)
...
@@ -41,7 +41,7 @@ function(add_py_venv_fixture FIXTURE_NAME VIRTUAL_ENV_DIR REQUIREMENTS_FILE)
set
(
PYTHON_EXECUTABLE
${
PYTHON_
${
PYTHON_VERSION
}
_EXECUTABLE
}
)
set
(
PYTHON_EXECUTABLE
${
PYTHON_
${
PYTHON_VERSION
}
_EXECUTABLE
}
)
if
(
NOT TEST py_
${
PYTHON_VERSION
}
_
${
FIXTURE_NAME
}
_initialize_env
)
if
(
NOT TEST py_
${
PYTHON_VERSION
}
_
${
FIXTURE_NAME
}
_initialize_env
)
if
(
NOT
(
${
FIXTURE_NAME
}
STREQUAL
"onnx"
AND
${
PYTHON_VERSION
}
STREQUAL
${
PYTHON_VERSION_TO_DISABLE_ONNX
}
))
if
(
NOT
(
${
PYTHON_VERSION
}
STREQUAL
${
PYTHON_VERSION_TO_DISABLE_ONNX
}
))
add_test
(
NAME py_
${
PYTHON_VERSION
}
_
${
FIXTURE_NAME
}
_initialize_env COMMAND
${
PYTHON_EXECUTABLE
}
-m venv
${
VIRTUAL_ENV_DIR
}
/
${
PYTHON_VERSION
}
--clear
)
add_test
(
NAME py_
${
PYTHON_VERSION
}
_
${
FIXTURE_NAME
}
_initialize_env COMMAND
${
PYTHON_EXECUTABLE
}
-m venv
${
VIRTUAL_ENV_DIR
}
/
${
PYTHON_VERSION
}
--clear
)
set_tests_properties
(
py_
${
PYTHON_VERSION
}
_
${
FIXTURE_NAME
}
_initialize_env PROPERTIES FIXTURES_SETUP
${
FIXTURE_NAME
}
_
${
PYTHON_VERSION
}
_INIT_VENV
)
set_tests_properties
(
py_
${
PYTHON_VERSION
}
_
${
FIXTURE_NAME
}
_initialize_env PROPERTIES FIXTURES_SETUP
${
FIXTURE_NAME
}
_
${
PYTHON_VERSION
}
_INIT_VENV
)
set
(
PYTHON_EXECUTABLE
${
VIRTUAL_ENV_DIR
}
/
${
PYTHON_VERSION
}
/bin/python
)
set
(
PYTHON_EXECUTABLE
${
VIRTUAL_ENV_DIR
}
/
${
PYTHON_VERSION
}
/bin/python
)
...
@@ -67,7 +67,7 @@ function(add_py_test NAME SCRIPT FIXTURE_NAME VENV_DIR)
...
@@ -67,7 +67,7 @@ function(add_py_test NAME SCRIPT FIXTURE_NAME VENV_DIR)
else
()
else
()
set
(
PYTHON_EXECUTABLE
${
VENV_DIR
}
/
${
PYTHON_VERSION
}
/bin/python
)
set
(
PYTHON_EXECUTABLE
${
VENV_DIR
}
/
${
PYTHON_VERSION
}
/bin/python
)
endif
()
endif
()
if
(
NOT
(
${
FIXTURE_NAME
}
STREQUAL
"onnx"
AND
${
PYTHON_VERSION
}
STREQUAL
${
PYTHON_VERSION_TO_DISABLE_ONNX
}
)
)
if
(
NOT
${
PYTHON_VERSION
}
STREQUAL
${
PYTHON_VERSION_TO_DISABLE_ONNX
}
)
add_test
(
add_test
(
NAME test_py_
${
PYTHON_VERSION
}
_
${
NAME
}
NAME test_py_
${
PYTHON_VERSION
}
_
${
NAME
}
COMMAND
${
ENV_COMMAND
}
${
PYTHON_EXECUTABLE
}
${
CMAKE_CURRENT_SOURCE_DIR
}
/
${
SCRIPT
}
${
ARGN
}
)
COMMAND
${
ENV_COMMAND
}
${
PYTHON_EXECUTABLE
}
${
CMAKE_CURRENT_SOURCE_DIR
}
/
${
SCRIPT
}
${
ARGN
}
)
...
...
test/py/onnx_backend_test.py
View file @
f0370072
...
@@ -835,10 +835,6 @@ def disabled_tests_onnx_1_13_0(backend_test):
...
@@ -835,10 +835,6 @@ def disabled_tests_onnx_1_13_0(backend_test):
backend_test
.
exclude
(
r
'test_scatter_elements_with_reduction_max_cpu'
)
backend_test
.
exclude
(
r
'test_scatter_elements_with_reduction_max_cpu'
)
backend_test
.
exclude
(
r
'test_scatter_elements_with_reduction_min_cpu'
)
backend_test
.
exclude
(
r
'test_scatter_elements_with_reduction_min_cpu'
)
# The following tests fail due to the CastLike operator being unsupported
backend_test
.
exclude
(
r
'test_split_1d_uneven_split_opset18_cpu'
)
backend_test
.
exclude
(
r
'test_split_2d_uneven_split_opset18_cpu'
)
def
disabled_tests_onnx_1_14_0
(
backend_test
):
def
disabled_tests_onnx_1_14_0
(
backend_test
):
# fails
# fails
...
...
test/py/requirements-onnx.txt
View file @
f0370072
...
@@ -26,4 +26,4 @@ onnx==1.14.1
...
@@ -26,4 +26,4 @@ onnx==1.14.1
protobuf==3.20.2
protobuf==3.20.2
numpy==1.21.6
numpy==1.21.6
packaging==23.0
packaging==23.0
pytest==6.0.1
pytest==6.0.1
\ No newline at end of file
test/py/requirements.txt
View file @
f0370072
...
@@ -22,4 +22,4 @@
...
@@ -22,4 +22,4 @@
# THE SOFTWARE.
# THE SOFTWARE.
#####################################################################################
#####################################################################################
numpy==1.19.5
numpy==1.21.6
\ No newline at end of file
test/ref/multinomial.cpp
View file @
f0370072
...
@@ -24,9 +24,10 @@
...
@@ -24,9 +24,10 @@
#include <migraphx/instruction.hpp>
#include <migraphx/instruction.hpp>
#include <migraphx/literal.hpp>
#include <migraphx/literal.hpp>
#include <migraphx/make_op.hpp>
#include <migraphx/make_op.hpp>
#include <migraphx/
program
.hpp>
#include <migraphx/
onnx
.hpp>
#include <migraphx/register_target.hpp>
#include <migraphx/register_target.hpp>
#include <migraphx/verify.hpp>
#include <migraphx/verify.hpp>
#include <numeric>
#include <random>
#include <random>
#include <test.hpp>
#include <test.hpp>
...
@@ -48,27 +49,37 @@ TEST_CASE(multinomial_test)
...
@@ -48,27 +49,37 @@ TEST_CASE(multinomial_test)
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
1
,
5
}};
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
1
,
5
}};
std
::
vector
<
int
>
dist
{
15
,
25
,
15
,
25
,
20
};
std
::
vector
<
int
>
dist
{
15
,
25
,
15
,
25
,
20
};
std
::
vector
<
float
>
data
(
5
);
std
::
vector
<
float
>
data
(
5
);
std
::
transform
(
dist
.
begin
(),
dist
.
end
(),
data
.
begin
(),
[
&
](
auto
d
)
{
return
std
::
log
(
d
);
});
std
::
vector
<
float
>
sum
(
5
);
auto
input
=
mm
->
add_literal
(
migraphx
::
literal
(
s
,
data
));
// convert to float
std
::
transform
(
dist
.
begin
(),
dist
.
end
(),
data
.
begin
(),
[
&
](
auto
d
)
{
return
d
;
});
// take cumulative sum
std
::
partial_sum
(
data
.
begin
(),
data
.
end
(),
sum
.
begin
(),
std
::
plus
<
float
>
());
// scale probabilities arbitrarily
float
odd_scale
=
10000.
;
std
::
transform
(
sum
.
begin
(),
sum
.
end
(),
data
.
begin
(),
[
&
](
auto
d
)
{
return
d
*
odd_scale
;
});
auto
maxes
=
mm
->
add_instruction
(
migraphx
::
make_op
(
"reduce_max"
,
{{
"axes"
,
{
1
}}}),
input
);
auto
input
=
mm
->
add_literal
(
migraphx
::
literal
(
s
,
data
));
auto
mb_maxes
=
mm
->
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
{
1
,
5
}}}),
maxes
);
auto
cdf
=
mm
->
add_instruction
(
migraphx
::
make_op
(
"sub"
),
input
,
mb_maxes
);
cdf
=
mm
->
add_instruction
(
migraphx
::
make_op
(
"exp"
),
cdf
);
cdf
=
mm
->
add_instruction
(
migraphx
::
make_op
(
"prefix_scan_sum"
,
{{
"axis"
,
1
},
{
"exclusive"
,
false
}}),
cdf
);
mm
->
add_instruction
(
migraphx
::
make_op
(
"multinomial"
),
cdf
,
rs_lit
);
mm
->
add_instruction
(
migraphx
::
make_op
(
"multinomial"
),
input
,
rs_lit
);
p
.
compile
(
migraphx
::
make_target
(
"ref"
));
p
.
compile
(
migraphx
::
make_target
(
"ref"
));
auto
result
=
p
.
eval
({}).
back
();
auto
result
=
p
.
eval
({}).
back
();
// result_vec contains an index, or category label, for each random input value
std
::
vector
<
int32_t
>
result_vec
(
sample_size
);
std
::
vector
<
int32_t
>
result_vec
(
sample_size
);
result
.
visit
([
&
](
auto
output
)
{
result_vec
.
assign
(
output
.
begin
(),
output
.
end
());
});
result
.
visit
([
&
](
auto
output
)
{
result_vec
.
assign
(
output
.
begin
(),
output
.
end
());
});
// res_dist is a count, or histogram, of the number of samples in each category. This is the
// sampled distribution.
std
::
vector
<
int
>
res_dist
(
5
,
0
);
std
::
vector
<
int
>
res_dist
(
5
,
0
);
for
(
const
auto
&
r
:
result_vec
)
for
(
const
auto
&
r
:
result_vec
)
res_dist
[
r
]
++
;
res_dist
[
r
]
++
;
auto
dist_sum
=
std
::
accumulate
(
dist
.
begin
(),
dist
.
end
(),
0
);
// To check the result, normalize the original probability distribution dist
// and the sampling result res_dist; they should be close
// Total the unnormalized probabilities
auto
dist_sum
=
std
::
accumulate
(
dist
.
begin
(),
dist
.
end
(),
0
);
// Total the number of values returned
auto
res_dist_sum
=
std
::
accumulate
(
res_dist
.
begin
(),
res_dist
.
end
(),
0
);
auto
res_dist_sum
=
std
::
accumulate
(
res_dist
.
begin
(),
res_dist
.
end
(),
0
);
std
::
vector
<
float
>
norm
(
5
);
std
::
vector
<
float
>
norm
(
5
);
std
::
vector
<
float
>
res_norm
(
5
);
std
::
vector
<
float
>
res_norm
(
5
);
...
@@ -78,6 +89,204 @@ TEST_CASE(multinomial_test)
...
@@ -78,6 +89,204 @@ TEST_CASE(multinomial_test)
std
::
transform
(
res_dist
.
begin
(),
res_dist
.
end
(),
res_norm
.
begin
(),
[
&
](
auto
n
)
{
std
::
transform
(
res_dist
.
begin
(),
res_dist
.
end
(),
res_norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
res_dist_sum
;
return
static_cast
<
double
>
(
n
)
/
res_dist_sum
;
});
});
EXPECT
(
migraphx
::
verify
::
verify_range_with_tolerance
(
res_norm
,
migraphx
::
verify
::
expected
{
norm
},
migraphx
::
verify
::
tolerance
{
0.01
}));
}
TEST_CASE
(
multinomial_dyn_test
)
{
// Invokes random_uniform and multinomial ops together, to verify the interface
// Dynamic Batch dimension input of 2 means there are 2 different probability
// distribution functions contained in Input_2
migraphx
::
program
p
;
auto
*
mm
=
p
.
get_main_module
();
size_t
sample_size
=
100000
;
size_t
batch_size
=
2
;
// Shape of the random data
migraphx
::
shape
rs
{
migraphx
::
shape
::
float_type
,
{{
1
,
2
},
{
2
,
sample_size
+
1
}}};
auto
input
=
mm
->
add_parameter
(
"Input_1"
,
rs
);
// Runtime randomization seed
// To seed the random_uniform, we can provide a value by literal or input,
// or ask the system to auto-seed with random_seed op.
migraphx
::
shape
seed_shape
{
migraphx
::
shape
::
uint32_type
,
{
migraphx
::
shape
::
dynamic_dimension
{
0
,
1
}}};
auto
seed_input
=
mm
->
add_parameter
(
"Seed"
,
seed_shape
);
// Shape of the probability distribution, which also defines the number of categories
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
2
},
{
5
,
6
}}};
// Unnormalized distributions for batch size 2:
// 15, 25, 15, 15, 20
// 20, 20, 10, 25, 25
std
::
vector
<
int
>
dist
{
15
,
25
,
15
,
25
,
20
,
20
,
20
,
10
,
25
,
25
};
// Hard-coded non-normalized, accumulated distribution follows:
std
::
vector
<
float
>
data
{
.15
f
,
.40
f
,
.55
f
,
.80
f
,
1.0
f
,
20.
f
,
40.
f
,
50.
f
,
75.
f
,
100.
f
};
auto
input2
=
mm
->
add_parameter
(
"Input_2"
,
s
);
auto
randoms
=
mm
->
add_instruction
(
migraphx
::
make_op
(
"random_uniform"
),
seed_input
,
input
);
mm
->
add_instruction
(
migraphx
::
make_op
(
"multinomial"
),
input2
,
randoms
);
p
.
compile
(
migraphx
::
make_target
(
"ref"
));
// Create a dummy input in the shape we want for the random data
std
::
vector
<
float
>
dummy
(
sample_size
,
0
);
migraphx
::
shape
input_fixed_shape1
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
sample_size
}};
migraphx
::
shape
input_fixed_shape2
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
5
}};
migraphx
::
parameter_map
params0
;
params0
[
"Input_1"
]
=
migraphx
::
argument
(
input_fixed_shape1
,
dummy
.
data
());
migraphx
::
shape
seed_fixed_shape
{
migraphx
::
shape
::
uint32_type
,
{
1
}};
std
::
vector
<
uint32_t
>
seed_data
=
{
4
};
params0
[
"Seed"
]
=
migraphx
::
argument
(
seed_fixed_shape
,
seed_data
.
data
());
params0
[
"Input_2"
]
=
migraphx
::
argument
(
input_fixed_shape2
,
data
.
data
());
auto
result
=
p
.
eval
(
params0
).
back
();
std
::
vector
<
float
>
result_vec
(
input_fixed_shape2
.
elements
());
result
.
visit
([
&
](
auto
output
)
{
result_vec
.
assign
(
output
.
begin
(),
output
.
end
());
});
// Make a categorical histogram of output
std
::
vector
<
int
>
res_dist
(
5
,
0
);
size_t
r
=
0
;
for
(
r
=
0
;
r
<
result_vec
.
size
()
/
2
;
r
++
)
res_dist
[
result_vec
[
r
]]
++
;
// histogram for second set of batch
std
::
vector
<
int
>
res_dist2
(
5
,
0
);
for
(;
r
<
result_vec
.
size
();
r
++
)
res_dist2
[
result_vec
[
r
]]
++
;
// Rescale or normalize both the input probability distribution and the output
// histogram, and compare. Should be close but not identical.
auto
dist_sum
=
std
::
accumulate
(
dist
.
begin
(),
dist
.
begin
()
+
5
,
0
);
auto
res_dist_sum
=
std
::
accumulate
(
res_dist
.
begin
(),
res_dist
.
end
(),
0
);
std
::
vector
<
float
>
norm
(
5
);
std
::
vector
<
float
>
res_norm
(
5
);
std
::
transform
(
dist
.
begin
(),
dist
.
begin
()
+
5
,
norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
dist_sum
;
});
std
::
transform
(
res_dist
.
begin
(),
res_dist
.
end
(),
res_norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
res_dist_sum
;
});
EXPECT
(
migraphx
::
verify
::
verify_range_with_tolerance
(
res_norm
,
migraphx
::
verify
::
expected
{
norm
},
migraphx
::
verify
::
tolerance
{
0.01
}));
// Do the same rescaling for the 2nd in batch, which has a different probability distribution
dist_sum
=
std
::
accumulate
(
dist
.
begin
()
+
5
,
dist
.
end
(),
0
);
res_dist_sum
=
std
::
accumulate
(
res_dist2
.
begin
(),
res_dist2
.
end
(),
0
);
std
::
transform
(
dist
.
begin
()
+
5
,
dist
.
end
(),
norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
dist_sum
;
});
std
::
transform
(
res_dist2
.
begin
(),
res_dist2
.
end
(),
res_norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
res_dist_sum
;
});
EXPECT
(
migraphx
::
verify
::
verify_range_with_tolerance
(
res_norm
,
migraphx
::
verify
::
expected
{
norm
},
migraphx
::
verify
::
tolerance
{
0.01
}));
}
TEST_CASE
(
multinomial_float_dyn_test
)
{
// int data type for random_uniform op and float data type for multinomial.
migraphx
::
program
p
;
auto
*
mm
=
p
.
get_main_module
();
size_t
sample_size
=
100000
;
size_t
batch_size
=
2
;
// Shape of the random data
migraphx
::
shape
rs
{
migraphx
::
shape
::
int32_type
,
{{
1
,
2
},
{
2
,
sample_size
+
1
}}};
auto
input
=
mm
->
add_parameter
(
"Input_1"
,
rs
);
// Runtime randomization seed
// To seed the random_uniform, we can provide a value by literal or input,
// or ask the system to auto-seed with random_seed op.
migraphx
::
shape
seed_shape
{
migraphx
::
shape
::
uint32_type
,
{
migraphx
::
shape
::
dynamic_dimension
{
0
,
1
}}};
auto
seed_input
=
mm
->
add_parameter
(
"Seed"
,
seed_shape
);
// Shape of the probability distribution, which also defines the number of categories
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{{
2
,
2
},
{
5
,
6
}}};
// Unnormalized distributions for batch size 2:
// 15, 25, 15, 15, 20
// 20, 20, 10, 25, 25
std
::
vector
<
int
>
dist
{
15
,
25
,
15
,
25
,
20
,
20
,
20
,
10
,
25
,
25
};
// Hard-coded normalized, accumulated distribution follows:
std
::
vector
<
float
>
data
{
.15
f
,
.40
f
,
.55
f
,
.80
f
,
1.0
f
,
.20
f
,
.40
f
,
.50
f
,
.75
f
,
1.0
f
};
auto
input2
=
mm
->
add_parameter
(
"Input_2"
,
s
);
auto
randoms
=
mm
->
add_instruction
(
migraphx
::
make_op
(
"random_uniform"
),
seed_input
,
input
);
mm
->
add_instruction
(
migraphx
::
make_op
(
"multinomial"
,
{{
"dtype"
,
migraphx
::
shape
::
float_type
}}),
input2
,
randoms
);
p
.
compile
(
migraphx
::
make_target
(
"ref"
));
// Create a dummy input in the shape we want for the random data
std
::
vector
<
float
>
dummy
(
sample_size
,
0
);
migraphx
::
shape
input_fixed_shape1
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
sample_size
}};
migraphx
::
shape
input_fixed_shape2
{
migraphx
::
shape
::
float_type
,
{
batch_size
,
5
}};
migraphx
::
parameter_map
params0
;
params0
[
"Input_1"
]
=
migraphx
::
argument
(
input_fixed_shape1
,
dummy
.
data
());
migraphx
::
shape
seed_fixed_shape
{
migraphx
::
shape
::
uint32_type
,
{
1
}};
std
::
vector
<
uint32_t
>
seed_data
=
{
4
};
params0
[
"Seed"
]
=
migraphx
::
argument
(
seed_fixed_shape
,
seed_data
.
data
());
params0
[
"Input_2"
]
=
migraphx
::
argument
(
input_fixed_shape2
,
data
.
data
());
auto
result
=
p
.
eval
(
params0
).
back
();
std
::
vector
<
float
>
result_vec
(
input_fixed_shape2
.
elements
());
result
.
visit
([
&
](
auto
output
)
{
result_vec
.
assign
(
output
.
begin
(),
output
.
end
());
});
// Make a categorical histogram of output
std
::
vector
<
int
>
res_dist
(
5
,
0
);
size_t
r
=
0
;
for
(
r
=
0
;
r
<
result_vec
.
size
()
/
2
;
r
++
)
res_dist
[
result_vec
[
r
]]
++
;
// histogram for second set of batch
std
::
vector
<
int
>
res_dist2
(
5
,
0
);
for
(;
r
<
result_vec
.
size
();
r
++
)
res_dist2
[
result_vec
[
r
]]
++
;
// Rescale or normalize both the input probability distribution and the output
// histogram, and compare. Should be close but not identical.
auto
dist_sum
=
std
::
accumulate
(
dist
.
begin
(),
dist
.
begin
()
+
5
,
0
);
auto
res_dist_sum
=
std
::
accumulate
(
res_dist
.
begin
(),
res_dist
.
end
(),
0
);
std
::
vector
<
float
>
norm
(
5
);
std
::
vector
<
float
>
res_norm
(
5
);
std
::
transform
(
dist
.
begin
(),
dist
.
begin
()
+
5
,
norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
dist_sum
;
});
std
::
transform
(
res_dist
.
begin
(),
res_dist
.
end
(),
res_norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
res_dist_sum
;
});
EXPECT
(
migraphx
::
verify
::
verify_range_with_tolerance
(
res_norm
,
migraphx
::
verify
::
expected
{
norm
},
migraphx
::
verify
::
tolerance
{
0.01
}));
// Do the same rescaling for the 2nd in batch, which has a different probability distribution
dist_sum
=
std
::
accumulate
(
dist
.
begin
()
+
5
,
dist
.
end
(),
0
);
res_dist_sum
=
std
::
accumulate
(
res_dist2
.
begin
(),
res_dist2
.
end
(),
0
);
std
::
transform
(
dist
.
begin
()
+
5
,
dist
.
end
(),
norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
dist_sum
;
});
std
::
transform
(
res_dist2
.
begin
(),
res_dist2
.
end
(),
res_norm
.
begin
(),
[
&
](
auto
n
)
{
return
static_cast
<
double
>
(
n
)
/
res_dist_sum
;
});
EXPECT
(
migraphx
::
verify
::
verify_range_with_tolerance
(
EXPECT
(
migraphx
::
verify
::
verify_range_with_tolerance
(
res_norm
,
migraphx
::
verify
::
expected
{
norm
},
migraphx
::
verify
::
tolerance
{
0.01
}));
res_norm
,
migraphx
::
verify
::
expected
{
norm
},
migraphx
::
verify
::
tolerance
{
0.01
}));
}
}
tools/docker/ubuntu_2204.dockerfile
View file @
f0370072
...
@@ -90,11 +90,6 @@ RUN pip3 install yapf==0.28.0
...
@@ -90,11 +90,6 @@ RUN pip3 install yapf==0.28.0
ADD
docs/.sphinx/requirements.txt /doc-requirements.txt
ADD
docs/.sphinx/requirements.txt /doc-requirements.txt
RUN
pip3
install
-r
/doc-requirements.txt
RUN
pip3
install
-r
/doc-requirements.txt
# Download real models to run onnx unit tests
ENV
ONNX_HOME=/.onnx
COPY
./tools/download_models.sh /
RUN
/download_models.sh
&&
rm
/download_models.sh
# Install latest ccache version
# Install latest ccache version
RUN
cget
-p
$PREFIX
install
facebook/zstd@v1.4.5
-X
subdir
-DCMAKE_DIR
=
build/cmake
RUN
cget
-p
$PREFIX
install
facebook/zstd@v1.4.5
-X
subdir
-DCMAKE_DIR
=
build/cmake
RUN
cget
-p
$PREFIX
install
ccache@v4.1
-DENABLE_TESTING
=
OFF
RUN
cget
-p
$PREFIX
install
ccache@v4.1
-DENABLE_TESTING
=
OFF
...
...
tools/download_models.sh
deleted
100755 → 0
View file @
01c2f5fd
#!/bin/bash
#####################################################################################
# The MIT License (MIT)
#
# Copyright (c) 2015-2022 Advanced Micro Devices, Inc. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#####################################################################################
set
-e
if
[
-z
"
$ONNX_HOME
"
]
then
# The onnx library uses ONNX_HOME, by default if it doesn't exist
# the path of " ~/.onnx " is used
ONNX_HOME
=
$HOME
/.onnx
fi
model_dir
=
$ONNX_HOME
/models
tmp_dir
=
$ONNX_HOME
/tmp/
mkdir
-p
$model_dir
mkdir
-p
$tmp_dir
models
=
"bvlc_alexnet
\
densenet121
\
inception_v2
\
shufflenet
\
vgg19
\
zfnet512"
for
name
in
$models
do
curl https://download.onnxruntime.ai/onnx/models/
$name
.tar.gz
--output
$tmp_dir
/
$name
.tar.gz
tar
-xzvf
$tmp_dir
/
$name
.tar.gz
--directory
$model_dir
&&
rm
$tmp_dir
/
$name
.tar.gz
done
# CI jobs can run as a different user then the docker image builder.
# Allow read/write access to the models
chmod
777
$model_dir
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