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
4ea39116
Commit
4ea39116
authored
Nov 10, 2023
by
Khalique Ahmed
Browse files
manual merge
parents
20128cae
d8011adf
Changes
315
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
1547 additions
and
475 deletions
+1547
-475
test/api/test_gpu.cpp
test/api/test_gpu.cpp
+55
-0
test/eliminate_allocation_test.cpp
test/eliminate_allocation_test.cpp
+1
-1
test/eliminate_concat_test.cpp
test/eliminate_concat_test.cpp
+2
-2
test/gpu/codegen_literal.cpp
test/gpu/codegen_literal.cpp
+1
-1
test/gpu/fuse_mlir.cpp
test/gpu/fuse_mlir.cpp
+4
-1
test/gpu/gemm_tune.cpp
test/gpu/gemm_tune.cpp
+225
-0
test/gpu/jit.cpp
test/gpu/jit.cpp
+1
-1
test/gpu/pack_int8_args.cpp
test/gpu/pack_int8_args.cpp
+0
-438
test/gpu/stream_sync.cpp
test/gpu/stream_sync.cpp
+1
-1
test/include/test.hpp
test/include/test.hpp
+2
-0
test/jit.cpp
test/jit.cpp
+1
-3
test/memory_coloring_test.cpp
test/memory_coloring_test.cpp
+1
-1
test/msgpack.cpp
test/msgpack.cpp
+11
-8
test/multi_target/multitarget_test.cpp
test/multi_target/multitarget_test.cpp
+0
-1
test/normalize_ops_test.cpp
test/normalize_ops_test.cpp
+1
-1
test/onnx/.onnxrt-commit
test/onnx/.onnxrt-commit
+1
-1
test/onnx/argmax_select_last_index_test.onnx
test/onnx/argmax_select_last_index_test.onnx
+0
-0
test/onnx/argmin_select_last_index_test.onnx
test/onnx/argmin_select_last_index_test.onnx
+0
-0
test/onnx/gen_onnx.py
test/onnx/gen_onnx.py
+1210
-15
test/onnx/group_norm_3d_half_test.onnx
test/onnx/group_norm_3d_half_test.onnx
+30
-0
No files found.
test/api/test_gpu.cpp
View file @
4ea39116
...
...
@@ -317,4 +317,59 @@ TEST_CASE(loop_test)
}
}
TEST_CASE
(
loop_test_limit_max_iter
)
{
auto
run_prog
=
[
&
](
int64_t
limit_max_iterations
)
{
migraphx
::
onnx_options
parse_options
;
parse_options
.
set_limit_loop_iterations
(
limit_max_iterations
);
auto
p
=
migraphx
::
parse_onnx
(
"loop_test_implicit_tripcnt.onnx"
,
parse_options
);
auto
shapes_before
=
p
.
get_output_shapes
();
migraphx
::
compile_options
options
;
options
.
set_offload_copy
();
p
.
compile
(
migraphx
::
target
(
"gpu"
),
options
);
auto
shapes_after
=
p
.
get_output_shapes
();
CHECK
(
shapes_before
.
size
()
==
2
);
CHECK
(
bool
{
shapes_before
.
front
()
==
shapes_after
.
front
()});
migraphx
::
program_parameters
pp
;
auto
param_shapes
=
p
.
get_parameter_shapes
();
auto
aas
=
param_shapes
[
"a"
];
std
::
vector
<
float
>
xd
=
{
1.0
f
};
pp
.
add
(
"a"
,
migraphx
::
argument
(
aas
,
xd
.
data
()));
auto
bbs
=
param_shapes
[
"b"
];
std
::
vector
<
float
>
yd
=
{
2.0
};
pp
.
add
(
"b"
,
migraphx
::
argument
(
bbs
,
yd
.
data
()));
auto
cs
=
param_shapes
[
"keep_going_cond"
];
bool
cond
=
true
;
pp
.
add
(
"keep_going_cond"
,
migraphx
::
argument
(
cs
,
&
cond
));
auto
outputs
=
p
.
eval
(
pp
);
auto
output
=
outputs
[
0
];
std
::
vector
<
std
::
vector
<
float
>>
ret
;
ret
.
push_back
(
output
.
as_vector
<
float
>
());
output
=
outputs
[
1
];
ret
.
push_back
(
output
.
as_vector
<
float
>
());
return
ret
;
};
{
auto
result_vector
=
run_prog
(
5
);
std
::
vector
<
float
>
gold0
=
{
2.0
f
};
EXPECT
(
result_vector
.
at
(
0
)
==
gold0
);
std
::
vector
<
float
>
gold1
=
{
-
2
,
4
,
0
,
0
,
0
};
EXPECT
(
result_vector
.
at
(
1
)
==
gold1
);
}
{
auto
result_vector
=
run_prog
(
20
);
std
::
vector
<
float
>
gold0
=
{
2.0
f
};
EXPECT
(
result_vector
.
at
(
0
)
==
gold0
);
std
::
vector
<
float
>
gold1
=
{
-
2
,
4
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
EXPECT
(
result_vector
.
at
(
1
)
==
gold1
);
}
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
test/eliminate_allocation_test.cpp
View file @
4ea39116
...
...
@@ -55,7 +55,7 @@ struct allocate
const
migraphx
::
shape
&
output_shape
,
const
std
::
vector
<
migraphx
::
argument
>&
)
const
{
return
{
output_shape
};
return
migraphx
::
argument
{
output_shape
};
}
};
...
...
test/eliminate_concat_test.cpp
View file @
4ea39116
...
...
@@ -60,7 +60,7 @@ struct concat
const
migraphx
::
shape
&
output_shape
,
const
std
::
vector
<
migraphx
::
argument
>&
)
const
{
return
{
output_shape
};
return
migraphx
::
argument
{
output_shape
};
}
};
...
...
@@ -104,7 +104,7 @@ struct allocate
const
migraphx
::
shape
&
output_shape
,
const
std
::
vector
<
migraphx
::
argument
>&
)
const
{
return
{
output_shape
};
return
migraphx
::
argument
{
output_shape
};
}
};
...
...
test/gpu/codegen_literal.cpp
View file @
4ea39116
...
...
@@ -64,7 +64,7 @@ TEST_CASE(mul_literal_round_test)
auto
l1
=
mm
->
add_literal
(
1
/
0.00787402
f
);
auto
mul
=
mm
->
add_instruction
(
migraphx
::
make_op
(
"mul"
),
l0
,
l1
);
auto
round
=
mm
->
add_instruction
(
migraphx
::
make_op
(
"
round
"
),
mul
);
auto
round
=
mm
->
add_instruction
(
migraphx
::
make_op
(
"
nearbyint
"
),
mul
);
mm
->
add_return
({
round
});
...
...
test/gpu/fuse_mlir.cpp
View file @
4ea39116
...
...
@@ -34,7 +34,8 @@
void
run_pass
(
migraphx
::
program
&
p
)
{
migraphx
::
run_passes
(
p
,
{
migraphx
::
gpu
::
fuse_mlir
{},
migraphx
::
dead_code_elimination
{}});
migraphx
::
run_passes
(
p
,
{
migraphx
::
gpu
::
fuse_mlir
{.
enable_extra
=
true
},
migraphx
::
dead_code_elimination
{}});
}
template
<
class
F
>
...
...
@@ -152,6 +153,8 @@ TEST_CASE(int_quant_dot_tanh_fails)
int
main
(
int
argc
,
const
char
*
argv
[])
{
if
(
migraphx
::
gpu
::
mlir_enabled
())
{
test
::
run
(
argc
,
argv
);
}
return
0
;
}
test/gpu/gemm_tune.cpp
0 → 100644
View file @
4ea39116
/*
* The MIT License (MIT)
*
* Copyright (c) 2015-2023 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.
*/
#include <iostream>
#include <vector>
#include <migraphx/gpu/gemm.hpp>
#include <hip/hip_runtime_api.h>
#include <migraphx/gpu/target.hpp>
#include <migraphx/verify.hpp>
#include <test.hpp>
#include <migraphx/make_op.hpp>
#include <migraphx/iterator_for.hpp>
// includes needed for run_lowering
#include <migraphx/gpu/lowering.hpp>
#include <migraphx/auto_contiguous.hpp>
#include <migraphx/instruction.hpp>
#include <migraphx/pass_manager.hpp>
// Abbreviated lowering; we don't need the usual cleanup passes for this test
void
run_lowering
(
migraphx
::
program
&
p
,
bool
offload_copy
=
false
)
{
auto
ctx
=
migraphx
::
gpu
::
context
{};
migraphx
::
run_passes
(
*
p
.
get_main_module
(),
{
migraphx
::
auto_contiguous
{},
migraphx
::
gpu
::
lowering
{
&
ctx
,
offload_copy
}});
}
/**
* Tests the automatic GEMM tuning feature. In the finalize() method of the gemm op,
* rocBLAS API functions are called to quickly benchmark all the GEMM solutions
* available in the currently installed rocBLAS library and choose the index of the fastest.
*/
TEST_CASE
(
gemm_tune_with_rocblas
)
{
migraphx
::
program
p
;
auto
*
mm
=
p
.
get_main_module
();
migraphx
::
shape
sa
{
migraphx
::
shape
::
float_type
,
{
4
,
2
}};
migraphx
::
shape
sb
{
migraphx
::
shape
::
float_type
,
{
2
,
3
}};
auto
a
=
mm
->
add_parameter
(
"a"
,
sa
);
auto
b
=
mm
->
add_parameter
(
"b"
,
sb
);
migraphx
::
operation
dot_op
=
migraphx
::
make_op
(
"dot"
);
mm
->
add_instruction
(
dot_op
,
a
,
b
);
// lowering adds gemm implementation for dot operator
run_lowering
(
p
);
migraphx
::
target
gpu_t
=
migraphx
::
gpu
::
target
{};
migraphx
::
compile_options
options
;
options
.
exhaustive_tune
=
true
;
p
.
compile
(
gpu_t
,
options
);
migraphx
::
value
solution_idx
(
0
);
for
(
auto
ins
:
iterator_for
(
*
p
.
get_main_module
()))
{
if
(
ins
->
name
()
==
"gpu::gemm"
)
{
auto
gemm_op
=
migraphx
::
get_operation
(
ins
);
// tuned solution index is not deterministic, but anything other than 0
// (default, invalid, or not available) is good.
// gemm_op.to_value().debug_print();
solution_idx
=
gemm_op
.
to_value
()[
"solution_idx"
];
break
;
}
}
#ifdef MIGRAPHX_USE_ROCBLAS_TUNING_API
EXPECT
(
0
!=
solution_idx
.
to
<
std
::
size_t
>
());
#else
EXPECT
(
0
==
solution_idx
.
to
<
std
::
size_t
>
());
#endif
}
// GEMM tuning of a strided-batch matrix; invokes rocblas_gemm_strided_batched_ex
TEST_CASE
(
gemm_tune_strided
)
{
migraphx
::
program
p
;
auto
*
mm
=
p
.
get_main_module
();
migraphx
::
shape
sa
{
migraphx
::
shape
::
float_type
,
{
4
,
2
,
2
}};
migraphx
::
shape
sb
{
migraphx
::
shape
::
float_type
,
{
4
,
2
,
2
}};
migraphx
::
shape
s_output
{
migraphx
::
shape
::
float_type
,
{
4
,
2
,
2
}};
auto
a
=
mm
->
add_parameter
(
"a"
,
sa
);
auto
b
=
mm
->
add_parameter
(
"b"
,
sb
);
auto
output
=
mm
->
add_parameter
(
"out"
,
s_output
);
auto
gemm_oper
=
migraphx
::
make_op
(
"gpu::gemm"
,
{{
"beta"
,
2
}});
mm
->
add_instruction
(
gemm_oper
,
a
,
b
,
output
);
migraphx
::
target
gpu_t
=
migraphx
::
gpu
::
target
{};
migraphx
::
compile_options
options
;
options
.
exhaustive_tune
=
true
;
p
.
compile
(
gpu_t
,
options
);
migraphx
::
value
solution_idx
(
0
);
for
(
auto
ins
:
iterator_for
(
*
p
.
get_main_module
()))
{
if
(
ins
->
name
()
==
"gpu::gemm"
)
{
auto
gemm_op
=
migraphx
::
get_operation
(
ins
);
auto
gemmv
=
gemm_op
.
to_value
();
// tuned solution index is not deterministic, but anything other than 0
// (default, invalid, or not available) is good.
solution_idx
=
gemm_op
.
to_value
()[
"solution_idx"
];
break
;
}
}
#ifdef MIGRAPHX_USE_ROCBLAS_TUNING_API
EXPECT
(
0
!=
solution_idx
.
to
<
std
::
size_t
>
());
#else
EXPECT
(
0
==
solution_idx
.
to
<
std
::
size_t
>
());
#endif
}
// GEMM tuning of a strided-batch matrix; created by lowering
TEST_CASE
(
gemm_tune_strided_lowered
)
{
migraphx
::
program
p
;
auto
*
mm
=
p
.
get_main_module
();
// At time of writing this test, gemm_impl considers a shape is strided if it has
// at least three dimensions and the 3rd-to-last is nonzero, invoking
// rocblas_gemm_strided_batched_ex. Also, DOT operator requires all dimensions except the last
// two to be equal.
migraphx
::
shape
sa
{
migraphx
::
shape
::
float_type
,
{
4
,
2
,
5
}};
migraphx
::
shape
sb
{
migraphx
::
shape
::
float_type
,
{
4
,
5
,
3
}};
auto
a
=
mm
->
add_parameter
(
"a"
,
sa
);
auto
b
=
mm
->
add_parameter
(
"b"
,
sb
);
migraphx
::
operation
dot_op
=
migraphx
::
make_op
(
"dot"
);
mm
->
add_instruction
(
dot_op
,
a
,
b
);
// lowering adds gemm implementation for dot operator
run_lowering
(
p
);
migraphx
::
target
gpu_t
=
migraphx
::
gpu
::
target
{};
migraphx
::
compile_options
options
;
options
.
exhaustive_tune
=
true
;
p
.
compile
(
gpu_t
,
options
);
migraphx
::
value
solution_idx
(
0
);
for
(
auto
ins
:
iterator_for
(
*
p
.
get_main_module
()))
{
if
(
ins
->
name
()
==
"gpu::gemm"
)
{
auto
gemm_op
=
migraphx
::
get_operation
(
ins
);
// tuned solution index is not deterministic, but anything other than 0
// (default, invalid, or not available) is good.
solution_idx
=
gemm_op
.
to_value
()[
"solution_idx"
];
break
;
}
}
#ifdef MIGRAPHX_USE_ROCBLAS_TUNING_API
EXPECT
(
0
!=
solution_idx
.
to
<
std
::
size_t
>
());
#else
EXPECT
(
0
==
solution_idx
.
to
<
std
::
size_t
>
());
#endif
}
TEST_CASE
(
gemm_tune_invalid_sol_index
)
{
migraphx
::
program
p
;
auto
*
mm
=
p
.
get_main_module
();
migraphx
::
shape
sa
{
migraphx
::
shape
::
float_type
,
{
4
,
2
}};
migraphx
::
shape
sb
{
migraphx
::
shape
::
float_type
,
{
2
,
3
}};
migraphx
::
shape
s_output
{
migraphx
::
shape
::
float_type
,
{
4
,
3
}};
auto
a
=
mm
->
add_parameter
(
"a"
,
sa
);
auto
b
=
mm
->
add_parameter
(
"b"
,
sb
);
auto
output
=
mm
->
add_parameter
(
"out"
,
s_output
);
auto
gemm_oper
=
migraphx
::
make_op
(
"gpu::gemm"
,
{{
"solution_idx"
,
987654321
}});
mm
->
add_instruction
(
gemm_oper
,
a
,
b
,
output
);
migraphx
::
target
gpu_t
=
migraphx
::
gpu
::
target
{};
migraphx
::
compile_options
options
;
options
.
exhaustive_tune
=
true
;
p
.
compile
(
gpu_t
,
options
);
migraphx
::
value
solution_idx
(
0
);
for
(
auto
ins
:
iterator_for
(
*
p
.
get_main_module
()))
{
if
(
ins
->
name
()
==
"gpu::gemm"
)
{
auto
gemm_op
=
migraphx
::
get_operation
(
ins
);
auto
gemmv
=
gemm_op
.
to_value
();
// given invalid starting index, should return default 0
solution_idx
=
gemm_op
.
to_value
()[
"solution_idx"
];
break
;
}
}
#ifdef MIGRAPHX_USE_ROCBLAS_TUNING_API
EXPECT
(
0
==
solution_idx
.
to
<
std
::
size_t
>
());
#else
EXPECT
(
0
!=
solution_idx
.
to
<
std
::
size_t
>
());
#endif
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
test/gpu/jit.cpp
View file @
4ea39116
...
...
@@ -155,7 +155,7 @@ int main() {}
migraphx
::
src_file
make_src_file
(
const
std
::
string
&
name
,
const
std
::
string
&
content
)
{
return
{
name
,
std
::
make_pair
(
content
.
data
(),
content
.
data
()
+
content
.
size
())
};
return
{
name
,
content
};
}
TEST_CASE
(
simple_compile_hip
)
...
...
test/gpu/pack_int8_args.cpp
deleted
100644 → 0
View file @
20128cae
/*
* 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.
*/
#include <migraphx/instruction_ref.hpp>
#include <migraphx/gpu/context.hpp>
#include <migraphx/gpu/lowering.hpp>
#include <migraphx/gpu/target.hpp>
#include <migraphx/gpu/allocation_model.hpp>
#include <migraphx/apply_alpha_beta.hpp>
#include <migraphx/adjust_allocation.hpp>
#include <migraphx/gpu/pack_int8_args.hpp>
#include <migraphx/gpu/rocblas.hpp>
#include <migraphx/gpu/device_name.hpp>
#include <migraphx/auto_contiguous.hpp>
#include <migraphx/eliminate_contiguous.hpp>
#include <migraphx/dead_code_elimination.hpp>
#include <migraphx/replace_allocate.hpp>
#include <migraphx/instruction.hpp>
#include <migraphx/iterator_for.hpp>
#include <migraphx/pass_manager.hpp>
#include <migraphx/make_op.hpp>
#include <test.hpp>
#include "make_precompile_op.hpp"
// Treat some operators as compilable to enable lowering
MIGRAPHX_GPU_TEST_PRECOMPILE
(
"add"
,
"mul"
,
"convert"
)
void
run_passes
(
migraphx
::
module
&
m
,
migraphx
::
gpu
::
context
&
ctx
)
{
migraphx
::
run_passes
(
m
,
{
migraphx
::
auto_contiguous
{},
migraphx
::
gpu
::
lowering
{
&
ctx
,
false
},
migraphx
::
eliminate_contiguous
{
"gpu::contiguous"
},
migraphx
::
dead_code_elimination
{},
migraphx
::
replace_allocate
{
migraphx
::
gpu
::
gpu_allocation_model
{}},
migraphx
::
dead_code_elimination
{},
migraphx
::
gpu
::
pack_int8_args
{},
migraphx
::
dead_code_elimination
{}});
}
TEST_CASE
(
quant_dot
)
{
auto
create_module
=
[]
{
migraphx
::
module
m
(
"test"
);
migraphx
::
shape
m1_shape
{
migraphx
::
shape
::
int8_type
,
{
5
,
8
}};
migraphx
::
shape
m2_shape
{
migraphx
::
shape
::
int8_type
,
{
8
,
7
}};
migraphx
::
shape
m3_shape
{
migraphx
::
shape
::
int32_type
,
{
5
,
7
}};
auto
l1
=
m
.
add_parameter
(
"a"
,
m1_shape
);
auto
l2
=
m
.
add_parameter
(
"b"
,
m2_shape
);
auto
l3
=
m
.
add_parameter
(
"c"
,
m3_shape
);
auto
r
=
migraphx
::
add_apply_alpha_beta
(
m
,
{
l1
,
l2
,
l3
},
migraphx
::
make_op
(
"quant_dot"
),
1
,
1
);
m
.
add_return
({
r
});
return
m
;
};
auto
create_optimized_int8_x4
=
[](
bool
int8_x4
)
{
migraphx
::
module
m
(
"test"
);
migraphx
::
shape
m1_shape
{
migraphx
::
shape
::
int8_type
,
{
5
,
8
}};
migraphx
::
shape
m2_shape
{
migraphx
::
shape
::
int8_type
,
{
8
,
7
}};
migraphx
::
shape
m3_shape
{
migraphx
::
shape
::
int32_type
,
{
5
,
7
}};
auto
l1
=
m
.
add_parameter
(
"a"
,
m1_shape
);
auto
l2
=
m
.
add_parameter
(
"b"
,
m2_shape
);
auto
l3
=
m
.
add_parameter
(
"c"
,
m3_shape
);
auto
beta
=
m
.
add_literal
(
1
);
auto
output
=
m
.
add_parameter
(
"test:#output_0"
,
m3_shape
);
auto
gemm_alloc
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
m3_shape
)}}));
auto
packa
=
l2
;
if
(
int8_x4
)
{
auto
alloc
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
m2_shape
)}}));
packa
=
m
.
add_instruction
(
migraphx
::
make_op
(
"gpu::int8_gemm_pack_a"
),
l2
,
alloc
);
}
auto
gemm
=
m
.
add_instruction
(
migraphx
::
make_op
(
"gpu::quant_gemm"
,
{{
"int8_x4_format"
,
int8_x4
},
{
"compute_fp32"
,
migraphx
::
gpu
::
get_compute_fp32_flag
()}}),
l1
,
packa
,
gemm_alloc
);
auto
beta_broadcast
=
m
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
m3_shape
.
lens
()}}),
beta
);
auto
mul_alloc
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
m3_shape
)}}));
auto
m3_beta
=
m
.
add_instruction
(
make_precompile_op
(
"mul"
),
l3
,
beta_broadcast
,
mul_alloc
);
auto
gemm_add
=
m
.
add_instruction
(
make_precompile_op
(
"add"
),
gemm
,
m3_beta
,
output
);
m
.
add_return
({
gemm_add
});
return
m
;
};
auto
m1
=
create_module
();
auto
ctx
=
migraphx
::
gpu
::
context
{};
run_passes
(
m1
,
ctx
);
bool
int8_x4
=
migraphx
::
gpu
::
get_int8_x4_format
(
ctx
);
auto
m2
=
create_optimized_int8_x4
(
int8_x4
);
EXPECT
(
m1
==
m2
);
}
TEST_CASE
(
quant_dot_trans
)
{
auto
create_module
=
[]
{
migraphx
::
module
m
(
"test"
);
migraphx
::
shape
s1
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
8
,
5
}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
7
,
8
}};
auto
l1
=
m
.
add_parameter
(
"a"
,
s1
);
auto
tl1
=
m
.
add_instruction
(
migraphx
::
make_op
(
"transpose"
,
{{
"permutation"
,
{
0
,
1
,
3
,
2
}}}),
l1
);
auto
l2
=
m
.
add_parameter
(
"b"
,
s2
);
auto
tl2
=
m
.
add_instruction
(
migraphx
::
make_op
(
"transpose"
,
{{
"permutation"
,
{
0
,
1
,
3
,
2
}}}),
l2
);
auto
r
=
migraphx
::
add_apply_alpha_beta
(
m
,
{
tl1
,
tl2
},
migraphx
::
make_op
(
"quant_dot"
),
3
);
m
.
add_return
({
r
});
return
m
;
};
auto
create_optimized_int8_x4
=
[](
bool
int8_x4
)
{
migraphx
::
module
m
(
"test"
);
migraphx
::
shape
s1
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
8
,
5
}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
7
,
8
}};
migraphx
::
shape
s3
{
migraphx
::
shape
::
int32_type
,
{
3
,
2
,
5
,
7
}};
auto
l1
=
m
.
add_parameter
(
"a"
,
s1
);
auto
l2
=
m
.
add_parameter
(
"b"
,
s2
);
auto
alpha
=
m
.
add_literal
(
3
);
auto
output
=
m
.
add_parameter
(
"test:#output_0"
,
s3
);
auto
tl1
=
m
.
add_instruction
(
migraphx
::
make_op
(
"transpose"
,
{{
"permutation"
,
{
0
,
1
,
3
,
2
}}}),
l1
);
migraphx
::
shape
ts1
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
5
,
8
}};
auto
tl2
=
m
.
add_instruction
(
migraphx
::
make_op
(
"transpose"
,
{{
"permutation"
,
{
0
,
1
,
3
,
2
}}}),
l2
);
migraphx
::
shape
ts2
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
8
,
7
}};
auto
alpha_broadcast
=
m
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
tl1
->
get_shape
().
lens
()}}),
alpha
);
auto
alpha_alloc
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
migraphx
::
shape
(
migraphx
::
shape
::
int32_type
,
{
3
,
2
,
5
,
8
}))}}));
// alpha = int32 and tl1 = int8, convert tl1 to int32 for multiplication and then convert
// back result to int8
auto
tl1_convert
=
m
.
add_instruction
(
make_precompile_op
(
migraphx
::
make_op
(
"convert"
,
{{
"target_type"
,
alpha
->
get_shape
().
type
()}})),
tl1
,
alpha_alloc
);
auto
mul_alloc
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
alpha_alloc
->
get_shape
())}}));
auto
tl1_alpha_int32
=
m
.
add_instruction
(
make_precompile_op
(
"mul"
),
alpha_broadcast
,
tl1_convert
,
mul_alloc
);
// convert mul_res to int8
auto
tl1_alpha_int8_alloc
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
ts1
)}}));
auto
tl1_alpha_int8
=
m
.
add_instruction
(
make_precompile_op
(
migraphx
::
make_op
(
"convert"
,
{{
"target_type"
,
tl1
->
get_shape
().
type
()}})),
tl1_alpha_int32
,
tl1_alpha_int8_alloc
);
auto
packb
=
tl2
;
if
(
int8_x4
)
{
auto
allocpb
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
ts2
)}}));
packb
=
m
.
add_instruction
(
migraphx
::
make_op
(
"gpu::int8_gemm_pack_a"
),
tl2
,
allocpb
);
}
auto
gemm
=
m
.
add_instruction
(
migraphx
::
make_op
(
"gpu::quant_gemm"
,
{{
"int8_x4_format"
,
int8_x4
},
{
"compute_fp32"
,
migraphx
::
gpu
::
get_compute_fp32_flag
()}}),
tl1_alpha_int8
,
packb
,
output
);
m
.
add_return
({
gemm
});
return
m
;
};
auto
m1
=
create_module
();
auto
ctx
=
migraphx
::
gpu
::
context
{};
run_passes
(
m1
,
ctx
);
bool
int8_x4
=
migraphx
::
gpu
::
get_int8_x4_format
(
ctx
);
auto
m2
=
create_optimized_int8_x4
(
int8_x4
);
EXPECT
(
m1
==
m2
);
}
TEST_CASE
(
quant_dot_pad
)
{
auto
create_module
=
[]
{
migraphx
::
module
m
(
"test"
);
migraphx
::
shape
s1
{
migraphx
::
shape
::
int8_type
,
{
5
,
6
}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
int8_type
,
{
6
,
7
}};
migraphx
::
shape
s3
{
migraphx
::
shape
::
int32_type
,
{
5
,
7
}};
auto
l1
=
m
.
add_parameter
(
"a"
,
s1
);
auto
l2
=
m
.
add_parameter
(
"b"
,
s2
);
auto
l3
=
m
.
add_parameter
(
"c"
,
s3
);
auto
r
=
migraphx
::
add_apply_alpha_beta
(
m
,
{
l1
,
l2
,
l3
},
migraphx
::
make_op
(
"quant_dot"
),
1
,
1
);
m
.
add_return
({
r
});
return
m
;
};
auto
create_optimized_int8_x4
=
[](
bool
int8_x4
)
{
migraphx
::
module
m
(
"test"
);
migraphx
::
shape
s1
{
migraphx
::
shape
::
int8_type
,
{
5
,
6
}};
migraphx
::
shape
ps1
{
migraphx
::
shape
::
int8_type
,
{
5
,
8
}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
int8_type
,
{
6
,
7
}};
migraphx
::
shape
ps2
{
migraphx
::
shape
::
int8_type
,
{
8
,
7
}};
migraphx
::
shape
s3
{
migraphx
::
shape
::
int32_type
,
{
5
,
7
}};
auto
l1
=
m
.
add_parameter
(
"a"
,
s1
);
auto
l2
=
m
.
add_parameter
(
"b"
,
s2
);
auto
l3
=
m
.
add_parameter
(
"c"
,
s3
);
auto
beta
=
m
.
add_literal
(
1
);
auto
output
=
m
.
add_parameter
(
"test:#output_0"
,
s3
);
auto
pl1
=
l1
;
auto
packa
=
l2
;
migraphx
::
instruction_ref
pl2
{};
if
(
int8_x4
)
{
auto
po1
=
m
.
insert_instruction
(
l1
,
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
ps1
)}}));
pl1
=
m
.
add_instruction
(
migraphx
::
make_op
(
"gpu::pad"
,
{{
"mode"
,
0
},
{
"pads"
,
{
0
,
2
,
0
,
0
}},
{
"value"
,
0
}}),
l1
,
po1
);
auto
po2
=
m
.
insert_instruction
(
l2
,
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
ps2
)}}));
pl2
=
m
.
insert_instruction
(
std
::
next
(
l2
),
migraphx
::
make_op
(
"gpu::pad"
,
{{
"mode"
,
0
},
{
"pads"
,
{
2
,
0
,
0
,
0
}},
{
"value"
,
0
}}),
l2
,
po2
);
}
auto
gemm_alloc
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
s3
)}}));
if
(
int8_x4
)
{
auto
alloc
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
ps2
)}}));
packa
=
m
.
add_instruction
(
migraphx
::
make_op
(
"gpu::int8_gemm_pack_a"
),
pl2
,
alloc
);
}
auto
gemm
=
m
.
add_instruction
(
migraphx
::
make_op
(
"gpu::quant_gemm"
,
{{
"int8_x4_format"
,
int8_x4
},
{
"compute_fp32"
,
migraphx
::
gpu
::
get_compute_fp32_flag
()}}),
pl1
,
packa
,
gemm_alloc
);
auto
beta_broadcast
=
m
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
s3
.
lens
()}}),
beta
);
auto
mul_alloc
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
s3
)}}));
auto
m3_beta
=
m
.
add_instruction
(
make_precompile_op
(
"mul"
),
l3
,
beta_broadcast
,
mul_alloc
);
auto
gemm_add
=
m
.
add_instruction
(
make_precompile_op
(
"add"
),
gemm
,
m3_beta
,
output
);
m
.
add_return
({
gemm_add
});
return
m
;
};
auto
m1
=
create_module
();
auto
ctx
=
migraphx
::
gpu
::
context
{};
run_passes
(
m1
,
ctx
);
bool
int8_x4
=
migraphx
::
gpu
::
get_int8_x4_format
(
ctx
);
auto
m2
=
create_optimized_int8_x4
(
int8_x4
);
EXPECT
(
m1
==
m2
);
}
TEST_CASE
(
quant_dot_trans_pad
)
{
auto
create_module
=
[]
{
migraphx
::
module
m
(
"test"
);
migraphx
::
shape
s1
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
9
,
5
}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
7
,
9
}};
auto
l1
=
m
.
add_parameter
(
"a"
,
s1
);
auto
tl1
=
m
.
add_instruction
(
migraphx
::
make_op
(
"transpose"
,
{{
"permutation"
,
{
0
,
1
,
3
,
2
}}}),
l1
);
auto
l2
=
m
.
add_parameter
(
"b"
,
s2
);
auto
tl2
=
m
.
add_instruction
(
migraphx
::
make_op
(
"transpose"
,
{{
"permutation"
,
{
0
,
1
,
3
,
2
}}}),
l2
);
auto
r
=
migraphx
::
add_apply_alpha_beta
(
m
,
{
tl1
,
tl2
},
migraphx
::
make_op
(
"quant_dot"
),
3
);
m
.
add_return
({
r
});
return
m
;
};
auto
create_optimized_int8_x4
=
[](
bool
int8_x4
)
{
migraphx
::
module
m
(
"test"
);
migraphx
::
shape
s1
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
9
,
5
}};
migraphx
::
shape
ps1
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
5
,
12
}};
migraphx
::
shape
s2
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
7
,
9
}};
migraphx
::
shape
ps2
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
12
,
7
}};
migraphx
::
shape
s3
{
migraphx
::
shape
::
int32_type
,
{
3
,
2
,
5
,
7
}};
auto
l1
=
m
.
add_parameter
(
"a"
,
s1
);
auto
l2
=
m
.
add_parameter
(
"b"
,
s2
);
auto
alpha
=
m
.
add_literal
(
3
);
auto
output
=
m
.
add_parameter
(
"test:#output_0"
,
s3
);
auto
tl1
=
m
.
add_instruction
(
migraphx
::
make_op
(
"transpose"
,
{{
"permutation"
,
{
0
,
1
,
3
,
2
}}}),
l1
);
migraphx
::
shape
ts1
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
5
,
9
}};
auto
tl2
=
m
.
add_instruction
(
migraphx
::
make_op
(
"transpose"
,
{{
"permutation"
,
{
0
,
1
,
3
,
2
}}}),
l2
);
migraphx
::
shape
ts2
{
migraphx
::
shape
::
int8_type
,
{
3
,
2
,
9
,
7
}};
migraphx
::
instruction_ref
ptb
{};
if
(
int8_x4
)
{
ptb
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
ps2
)}}));
}
auto
pb
=
tl2
;
if
(
int8_x4
)
{
pb
=
m
.
add_instruction
(
migraphx
::
make_op
(
"gpu::pad"
,
{{
"mode"
,
0
},
{
"pads"
,
{
0
,
0
,
3
,
0
,
0
,
0
,
0
,
0
}}}),
tl2
,
ptb
);
}
auto
alpha_broadcast
=
m
.
add_instruction
(
migraphx
::
make_op
(
"multibroadcast"
,
{{
"out_lens"
,
tl1
->
get_shape
().
lens
()}}),
alpha
);
auto
alpha_alloc
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
migraphx
::
shape
(
migraphx
::
shape
::
int32_type
,
tl1
->
get_shape
().
lens
()))}}));
// alpha = int32 and tl1 = int8, convert tl1 to int32 for multiplication and then convert
// back result to int8
auto
tl1_convert
=
m
.
add_instruction
(
make_precompile_op
(
migraphx
::
make_op
(
"convert"
,
{{
"target_type"
,
alpha
->
get_shape
().
type
()}})),
tl1
,
alpha_alloc
);
auto
mul_alloc
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
alpha_alloc
->
get_shape
())}}));
auto
tl1_alpha_int32
=
m
.
add_instruction
(
make_precompile_op
(
"mul"
),
alpha_broadcast
,
tl1_convert
,
mul_alloc
);
// convert mul_res to int8
auto
tl1_alpha_int8_alloc
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
ts1
)}}));
migraphx
::
instruction_ref
pta
{};
if
(
int8_x4
)
{
pta
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
ps1
)}}));
}
auto
tl1_alpha_int8
=
m
.
add_instruction
(
make_precompile_op
(
migraphx
::
make_op
(
"convert"
,
{{
"target_type"
,
ts1
.
type
()}})),
tl1_alpha_int32
,
tl1_alpha_int8_alloc
);
auto
pa
=
tl1_alpha_int8
;
if
(
int8_x4
)
{
pa
=
m
.
add_instruction
(
migraphx
::
make_op
(
"gpu::pad"
,
{{
"mode"
,
0
},
{
"pads"
,
{
0
,
0
,
0
,
3
,
0
,
0
,
0
,
0
}}}),
tl1_alpha_int8
,
pta
);
}
auto
packb
=
pb
;
if
(
int8_x4
)
{
auto
allocpb
=
m
.
add_instruction
(
migraphx
::
make_op
(
"hip::allocate"
,
{{
"shape"
,
migraphx
::
to_value
(
ps2
)}}));
packb
=
m
.
add_instruction
(
migraphx
::
make_op
(
"gpu::int8_gemm_pack_a"
),
pb
,
allocpb
);
}
auto
gemm
=
m
.
add_instruction
(
migraphx
::
make_op
(
"gpu::quant_gemm"
,
{{
"int8_x4_format"
,
int8_x4
},
{
"compute_fp32"
,
migraphx
::
gpu
::
get_compute_fp32_flag
()}}),
pa
,
packb
,
output
);
m
.
add_return
({
gemm
});
return
m
;
};
auto
m1
=
create_module
();
auto
ctx
=
migraphx
::
gpu
::
context
{};
run_passes
(
m1
,
ctx
);
bool
int8_x4
=
migraphx
::
gpu
::
get_int8_x4_format
(
ctx
);
auto
m2
=
create_optimized_int8_x4
(
int8_x4
);
EXPECT
(
m1
==
m2
);
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
test/gpu/stream_sync.cpp
View file @
4ea39116
...
...
@@ -64,7 +64,7 @@ int main() {}
migraphx
::
src_file
make_src_file
(
const
std
::
string
&
name
,
const
std
::
string
&
content
)
{
return
{
name
,
std
::
make_pair
(
content
.
data
(),
content
.
data
()
+
content
.
size
())
};
return
{
name
,
content
};
}
hip_stream_ptr
get_stream
()
...
...
test/include/test.hpp
View file @
4ea39116
...
...
@@ -339,6 +339,8 @@ inline std::ostream& operator<<(std::ostream& os, const color& c)
static
const
bool
use_color
=
isatty
(
STDOUT_FILENO
)
!=
0
;
if
(
use_color
)
return
os
<<
"
\033
["
<<
static_cast
<
std
::
size_t
>
(
c
)
<<
"m"
;
#else
(
void
)
c
;
#endif
return
os
;
}
...
...
test/jit.cpp
View file @
4ea39116
...
...
@@ -48,9 +48,7 @@ compile_function(const std::string& src, const std::string& flags, const std::st
migraphx
::
src_compiler
compiler
;
compiler
.
flags
=
flags
+
"-std=c++14 -fPIC -shared"
;
compiler
.
output
=
"libsimple.so"
;
migraphx
::
src_file
f
;
f
.
path
=
"main.cpp"
;
f
.
content
=
std
::
make_pair
(
src
.
data
(),
src
.
data
()
+
src
.
size
());
migraphx
::
src_file
f
{
"main.cpp"
,
src
};
auto
image
=
compiler
.
compile
({
f
});
return
migraphx
::
dynamic_loader
{
image
}.
get_function
<
F
>
(
fname
);
}
...
...
test/memory_coloring_test.cpp
View file @
4ea39116
...
...
@@ -55,7 +55,7 @@ struct allocate
const
migraphx
::
shape
&
output_shape
,
const
std
::
vector
<
migraphx
::
argument
>&
)
const
{
return
{
output_shape
};
return
migraphx
::
argument
{
output_shape
};
}
};
...
...
test/msgpack.cpp
View file @
4ea39116
...
...
@@ -97,9 +97,12 @@ TEST_CASE(test_msgpack_bool)
TEST_CASE
(
test_msgpack_float
)
{
migraphx
::
value
v
=
3.0
;
// changed all double values in this code to not end with .0 because on msgpack for Windows if
// input type is double and ends with .0 it could be converted to uint64_t or int64_t and the
// goal of these functions is to test double without conversions
migraphx
::
value
v
=
3.01
;
auto
buffer
=
migraphx
::
to_msgpack
(
v
);
EXPECT
(
buffer
==
msgpack_buffer
(
3.0
));
EXPECT
(
buffer
==
msgpack_buffer
(
3.0
1
));
EXPECT
(
migraphx
::
from_msgpack
(
buffer
)
==
v
);
}
...
...
@@ -129,10 +132,10 @@ TEST_CASE(test_msgpack_empty_array)
TEST_CASE
(
test_msgpack_object
)
{
migraphx
::
value
v
=
{{
"one"
,
1.0
},
{
"three"
,
3.0
},
{
"two"
,
2.0
}};
migraphx
::
value
v
=
{{
"one"
,
1.0
1
},
{
"three"
,
3.0
1
},
{
"two"
,
2.0
1
}};
auto
buffer
=
migraphx
::
to_msgpack
(
v
);
EXPECT
(
buffer
==
msgpack_buffer
(
std
::
map
<
std
::
string
,
double
>
{
{
"one"
,
1.0
},
{
"three"
,
3.0
},
{
"two"
,
2.0
}}));
{
"one"
,
1.0
1
},
{
"three"
,
3.0
1
},
{
"two"
,
2.0
1
}}));
EXPECT
(
migraphx
::
from_msgpack
(
buffer
)
==
v
);
}
...
...
@@ -157,17 +160,17 @@ struct foo
TEST_CASE
(
test_msgpack_object_class
)
{
migraphx
::
value
v
=
{{
"a"
,
1.0
},
{
"b"
,
"abc"
}};
migraphx
::
value
v
=
{{
"a"
,
1.0
1
},
{
"b"
,
"abc"
}};
auto
buffer
=
migraphx
::
to_msgpack
(
v
);
EXPECT
(
buffer
==
msgpack_buffer
(
foo
{
1.0
,
"abc"
}));
EXPECT
(
buffer
==
msgpack_buffer
(
foo
{
1.0
1
,
"abc"
}));
EXPECT
(
migraphx
::
from_msgpack
(
buffer
)
==
v
);
}
TEST_CASE
(
test_msgpack_array_class
)
{
migraphx
::
value
v
=
{{{
"a"
,
1.0
},
{
"b"
,
"abc"
}},
{{
"a"
,
3.0
},
{
"b"
,
"xyz"
}}};
migraphx
::
value
v
=
{{{
"a"
,
1.0
1
},
{
"b"
,
"abc"
}},
{{
"a"
,
3.0
1
},
{
"b"
,
"xyz"
}}};
auto
buffer
=
migraphx
::
to_msgpack
(
v
);
EXPECT
(
buffer
==
msgpack_buffer
(
std
::
vector
<
foo
>
{
foo
{
1.0
,
"abc"
},
foo
{
3.0
,
"xyz"
}}));
EXPECT
(
buffer
==
msgpack_buffer
(
std
::
vector
<
foo
>
{
foo
{
1.0
1
,
"abc"
},
foo
{
3.0
1
,
"xyz"
}}));
EXPECT
(
migraphx
::
from_msgpack
(
buffer
)
==
v
);
}
...
...
test/multi_target/multitarget_test.cpp
View file @
4ea39116
...
...
@@ -37,7 +37,6 @@
#include <migraphx/make_op.hpp>
#include <migraphx/check_shapes.hpp>
#include <migraphx/functional.hpp>
#include <basic_ops.hpp>
#include <migraphx/compile_options.hpp>
#include <migraphx/register_target.hpp>
#include <migraphx/generate.hpp>
...
...
test/normalize_ops_test.cpp
View file @
4ea39116
...
...
@@ -57,7 +57,7 @@ struct normalize_test_op
const
migraphx
::
shape
&
output_shape
,
const
std
::
vector
<
migraphx
::
argument
>&
)
const
{
return
{
output_shape
};
return
migraphx
::
argument
{
output_shape
};
}
};
...
...
test/onnx/.onnxrt-commit
View file @
4ea39116
6d7bc2a097a1a08541cd0d4628831c79ab8092d5
b7b8b5b2ce80edb33990c7ae0fedac6ae3c623f4
test/onnx/argmax_select_last_index_test.onnx
0 → 100644
View file @
4ea39116
File added
test/onnx/argmin_select_last_index_test.onnx
0 → 100644
View file @
4ea39116
File added
test/onnx/gen_onnx.py
View file @
4ea39116
...
...
@@ -149,6 +149,21 @@ def argmax_test():
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
argmax_select_last_index_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
3
,
4
,
5
,
6
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
3
,
4
,
6
])
node
=
onnx
.
helper
.
make_node
(
'ArgMax'
,
inputs
=
[
'x'
],
outputs
=
[
'y'
],
axis
=
2
,
keepdims
=
0
,
select_last_index
=
1
)
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
argmax_dyn_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
None
,
4
,
5
,
6
])
...
...
@@ -177,6 +192,21 @@ def argmin_test():
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
argmin_select_last_index_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
3
,
4
,
5
,
6
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
3
,
4
,
5
])
node
=
onnx
.
helper
.
make_node
(
'ArgMin'
,
inputs
=
[
'x'
],
outputs
=
[
'y'
],
axis
=
3
,
keepdims
=
0
,
select_last_index
=
1
)
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
asin_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
10
])
...
...
@@ -2722,6 +2752,119 @@ def group_conv_test():
return
([
node
],
[
x
,
y
],
[
z
])
def
group_norm_test
(
x_dims
,
scale_dims
,
bias_dims
,
y_dims
,
num_groups
,
eps_value
=
1e-5
,
dtype
=
TensorProto
.
FLOAT
):
x
=
helper
.
make_tensor_value_info
(
'x'
,
dtype
,
x_dims
)
scale
=
helper
.
make_tensor_value_info
(
'scale'
,
dtype
,
scale_dims
)
bias
=
helper
.
make_tensor_value_info
(
'bias'
,
dtype
,
bias_dims
)
y
=
helper
.
make_tensor_value_info
(
'y'
,
dtype
,
y_dims
)
node
=
onnx
.
helper
.
make_node
(
'GroupNormalization'
,
inputs
=
[
'x'
,
'scale'
,
'bias'
],
outputs
=
[
'y'
],
num_groups
=
num_groups
,
epsilon
=
eps_value
)
return
([
node
],
[
x
,
scale
,
bias
],
[
y
])
@
onnx_test
()
def
group_norm_3d_test
():
return
group_norm_test
([
1
,
4
,
2
],
[
2
],
[
2
],
[
1
,
4
,
2
],
2
)
@
onnx_test
()
def
group_norm_3d_half_test
():
return
group_norm_test
([
1
,
4
,
2
],
[
2
],
[
2
],
[
1
,
4
,
2
],
2
,
dtype
=
TensorProto
.
FLOAT16
)
@
onnx_test
()
def
group_norm_4d_test
():
return
group_norm_test
([
1
,
4
,
3
,
3
],
[
2
],
[
2
],
[
1
,
4
,
3
,
3
],
2
)
@
onnx_test
()
def
group_norm_4d_half_test
():
return
group_norm_test
([
1
,
4
,
3
,
3
],
[
2
],
[
2
],
[
1
,
4
,
3
,
3
],
2
,
dtype
=
TensorProto
.
FLOAT16
)
@
onnx_test
()
def
group_norm_5d_test
():
return
group_norm_test
([
3
,
3
,
3
,
3
,
3
],
[
1
],
[
1
],
[
3
,
3
,
3
,
3
,
3
],
1
)
@
onnx_test
()
def
group_norm_5d_half_test
():
return
group_norm_test
([
3
,
3
,
3
,
3
,
3
],
[
1
],
[
1
],
[
3
,
3
,
3
,
3
,
3
],
1
,
dtype
=
TensorProto
.
FLOAT16
)
@
onnx_test
()
def
group_norm_small_eps_half_test
():
return
group_norm_test
([
1
,
4
,
2
],
[
2
],
[
2
],
[
1
,
4
,
2
],
2
,
eps_value
=
1e-12
,
dtype
=
TensorProto
.
FLOAT16
)
@
onnx_test
()
def
group_norm_invalid_num_groups_error_test
():
return
group_norm_test
([
1
,
4
,
3
,
3
],
[
2
],
[
2
],
[
1
,
4
,
3
,
3
],
3
)
@
onnx_test
()
def
group_norm_missing_attribute_error_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
1
,
4
])
scale
=
helper
.
make_tensor_value_info
(
'scale'
,
TensorProto
.
FLOAT
,
[
2
])
bias
=
helper
.
make_tensor_value_info
(
'bias'
,
TensorProto
.
FLOAT
,
[
2
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
1
,
4
])
node
=
onnx
.
helper
.
make_node
(
'GroupNormalization'
,
inputs
=
[
'x'
,
'scale'
,
'bias'
],
outputs
=
[
'y'
])
return
([
node
],
[
x
,
scale
,
bias
],
[
y
])
@
onnx_test
()
def
group_norm_invalid_input_count_error_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
1
,
4
,
3
,
3
])
scale
=
helper
.
make_tensor_value_info
(
'scale'
,
TensorProto
.
FLOAT
,
[
2
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
1
,
4
,
3
,
3
])
node
=
onnx
.
helper
.
make_node
(
'GroupNormalization'
,
inputs
=
[
'x'
,
'scale'
],
outputs
=
[
'y'
],
num_groups
=
2
)
return
([
node
],
[
x
,
scale
],
[
y
])
@
onnx_test
()
def
group_norm_invalid_input_shape_error_test
():
return
group_norm_test
([
1
,
4
],
[
2
],
[
2
],
[
1
,
4
],
2
)
@
onnx_test
()
def
group_norm_invalid_scale_shape_test
():
return
group_norm_test
([
1
,
4
,
3
,
3
],
[
1
],
[
2
],
[
1
,
4
,
3
,
3
],
2
)
@
onnx_test
()
def
group_norm_invalid_bias_shape_test
():
return
group_norm_test
([
1
,
4
,
3
,
3
],
[
2
],
[
3
],
[
1
,
4
,
3
,
3
],
2
)
@
onnx_test
()
def
hardsigmoid_default_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
1
,
3
,
4
,
5
])
...
...
@@ -3715,6 +3858,64 @@ def instance_norm_val_3d_test():
return
([
node
],
[],
[
y
],
[
x_tensor
,
scale_tensor
,
bias_tensor
])
@
onnx_test
()
def
isinf_half_test
():
t1
=
helper
.
make_tensor_value_info
(
't1'
,
TensorProto
.
FLOAT16
,
[
2
,
3
])
t2
=
helper
.
make_tensor_value_info
(
't2'
,
TensorProto
.
BOOL
,
[
2
,
3
])
node
=
onnx
.
helper
.
make_node
(
'IsInf'
,
inputs
=
[
't1'
],
outputs
=
[
't2'
],
)
return
([
node
],
[
t1
],
[
t2
])
@
onnx_test
()
def
isinf_neg_test
():
t1
=
helper
.
make_tensor_value_info
(
't1'
,
TensorProto
.
FLOAT
,
[
2
,
3
])
t2
=
helper
.
make_tensor_value_info
(
't2'
,
TensorProto
.
BOOL
,
[
2
,
3
])
node
=
onnx
.
helper
.
make_node
(
'IsInf'
,
detect_negative
=
[
1
],
detect_positive
=
[
0
],
inputs
=
[
't1'
],
outputs
=
[
't2'
],
)
return
([
node
],
[
t1
],
[
t2
])
@
onnx_test
()
def
isinf_double_pos_test
():
t1
=
helper
.
make_tensor_value_info
(
't1'
,
TensorProto
.
DOUBLE
,
[
2
,
3
])
t2
=
helper
.
make_tensor_value_info
(
't2'
,
TensorProto
.
BOOL
,
[
2
,
3
])
node
=
onnx
.
helper
.
make_node
(
'IsInf'
,
detect_negative
=
[
0
],
detect_positive
=
[
1
],
inputs
=
[
't1'
],
outputs
=
[
't2'
],
)
return
([
node
],
[
t1
],
[
t2
])
@
onnx_test
()
def
isinf_no_detect_test
():
t1
=
helper
.
make_tensor_value_info
(
't1'
,
TensorProto
.
FLOAT
,
[
2
,
3
])
t2
=
helper
.
make_tensor_value_info
(
't2'
,
TensorProto
.
BOOL
,
[
2
,
3
])
node
=
onnx
.
helper
.
make_node
(
'IsInf'
,
detect_negative
=
[
0
],
detect_positive
=
[
0
],
inputs
=
[
't1'
],
outputs
=
[
't2'
],
)
return
([
node
],
[
t1
],
[
t2
])
@
onnx_test
()
def
isnan_float_test
():
t1
=
helper
.
make_tensor_value_info
(
't1'
,
TensorProto
.
FLOAT
,
[
2
,
3
])
...
...
@@ -3804,6 +4005,110 @@ def layernorm_test():
bias_add
],
[
x
,
scale
,
bias
],
[
y
],
[
pow_tensor
,
epsilon_tensor
])
def
make_layer_norm
(
shape
,
axis
,
dtype
=
TensorProto
.
FLOAT
):
norm_axis
=
axis
+
len
(
shape
)
if
axis
<
0
else
axis
x
=
helper
.
make_tensor_value_info
(
'x'
,
dtype
,
shape
)
scale
=
helper
.
make_tensor_value_info
(
'scale'
,
dtype
,
shape
[
norm_axis
:])
bias
=
helper
.
make_tensor_value_info
(
'bias'
,
dtype
,
shape
[
norm_axis
:])
y
=
helper
.
make_tensor_value_info
(
'y'
,
dtype
,
shape
)
node
=
onnx
.
helper
.
make_node
(
'LayerNormalization'
,
inputs
=
[
'x'
,
'scale'
,
'bias'
],
outputs
=
[
'y'
],
axis
=
axis
)
return
([
node
],
[
x
,
scale
,
bias
],
[
y
])
@
onnx_test
()
def
layer_norm_invalid_shape_error_test
():
return
make_layer_norm
([
3
],
0
)
@
onnx_test
()
def
layer_norm_2d_axis_zero_test
():
return
make_layer_norm
([
3
,
4
],
0
)
@
onnx_test
()
def
layer_norm_2d_axis_one_test
():
return
make_layer_norm
([
3
,
4
],
1
)
@
onnx_test
()
def
layer_norm_2d_axis_minus_one_test
():
return
make_layer_norm
([
3
,
4
],
-
1
)
@
onnx_test
()
def
layer_norm_3d_test
():
return
make_layer_norm
([
1
,
4
,
2
],
-
1
)
@
onnx_test
()
def
layer_norm_3d_half_test
():
return
make_layer_norm
([
1
,
4
,
2
],
-
1
,
TensorProto
.
FLOAT16
)
@
onnx_test
()
def
layer_norm_4d_test
():
return
make_layer_norm
([
3
,
3
,
3
,
3
],
-
1
)
@
onnx_test
()
def
layer_norm_4d_half_test
():
return
make_layer_norm
([
3
,
3
,
3
,
3
],
-
1
,
TensorProto
.
FLOAT16
)
@
onnx_test
()
def
layer_norm_invalid_axis_error_test
():
return
make_layer_norm
([
1
,
4
,
2
],
1000
)
@
onnx_test
()
def
layer_norm_invalid_minus_axis_error_test
():
return
make_layer_norm
([
1
,
4
,
2
],
-
1000
)
@
onnx_test
()
def
layer_norm_invalid_input_count_error_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
1
,
2
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
1
,
2
])
node
=
onnx
.
helper
.
make_node
(
'LayerNormalization'
,
inputs
=
[
'x'
],
outputs
=
[
'y'
])
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
layer_norm_without_bias_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
1
,
2
])
scale
=
helper
.
make_tensor_value_info
(
'scale'
,
TensorProto
.
FLOAT
,
[
2
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
1
,
2
])
node
=
onnx
.
helper
.
make_node
(
'LayerNormalization'
,
inputs
=
[
'x'
,
'scale'
],
outputs
=
[
'y'
])
return
([
node
],
[
x
,
scale
],
[
y
])
@
onnx_test
()
def
layer_norm_small_eps_half_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT16
,
[
1
,
2
])
scale
=
helper
.
make_tensor_value_info
(
'scale'
,
TensorProto
.
FLOAT16
,
[
2
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT16
,
[
1
,
2
])
node
=
onnx
.
helper
.
make_node
(
'LayerNormalization'
,
inputs
=
[
'x'
,
'scale'
],
outputs
=
[
'y'
],
epsilon
=
1e-12
)
return
([
node
],
[
x
,
scale
],
[
y
])
@
onnx_test
()
def
leaky_relu_test
():
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
3
])
...
...
@@ -4029,6 +4334,50 @@ def loop_test():
return
([
node
],
[
iter
,
cond
,
a
,
b
],
[
b_loop
,
uout
])
@
onnx_test
()
def
loop_test_implicit_tripcnt
():
body
=
helper
.
make_graph
([
helper
.
make_node
(
"Add"
,
[
"a"
,
"b_in"
],
[
"my_local"
]),
helper
.
make_node
(
"Sub"
,
[
"a"
,
"b_in"
],
[
"a_sub_b_in"
]),
helper
.
make_node
(
"Greater"
,
[
"my_local"
,
"a_sub_b_in"
],
[
"keep_going"
]),
helper
.
make_node
(
"Add"
,
[
"a_sub_b_in"
,
"a_sub_b_in"
],
[
"user_defined_vals"
]),
],
"body"
,
[
helper
.
make_tensor_value_info
(
'iteration_num'
,
TensorProto
.
INT64
,
[
1
]),
helper
.
make_tensor_value_info
(
'keep_going_inp'
,
TensorProto
.
BOOL
,
[
1
]),
helper
.
make_tensor_value_info
(
'b_in'
,
TensorProto
.
FLOAT
,
[
1
])
],
[
helper
.
make_tensor_value_info
(
'keep_going'
,
TensorProto
.
BOOL
,
[
1
]),
helper
.
make_tensor_value_info
(
'a_sub_b_in'
,
TensorProto
.
FLOAT
,
[
1
]),
helper
.
make_tensor_value_info
(
'my_local'
,
TensorProto
.
FLOAT
,
[
1
]),
helper
.
make_tensor_value_info
(
'user_defined_vals'
,
TensorProto
.
FLOAT
,
[
1
]),
])
iter
=
helper
.
make_tensor
(
name
=
'max_trip_count'
,
data_type
=
TensorProto
.
INT64
,
dims
=
[
1
],
vals
=
[
15
])
node
=
helper
.
make_node
(
"Loop"
,
inputs
=
[
"max_trip_count"
,
"keep_going_cond"
,
"b"
],
outputs
=
[
"b_loop"
,
"my_local_loop"
,
"user_defined_vals_loop"
],
body
=
body
)
a
=
helper
.
make_tensor_value_info
(
'a'
,
TensorProto
.
FLOAT
,
[
1
])
b
=
helper
.
make_tensor_value_info
(
'b'
,
TensorProto
.
FLOAT
,
[
1
])
cond
=
helper
.
make_tensor_value_info
(
'keep_going_cond'
,
TensorProto
.
BOOL
,
[
1
])
b_loop
=
helper
.
make_tensor_value_info
(
'b_loop'
,
TensorProto
.
FLOAT
,
[
1
])
uout
=
helper
.
make_tensor_value_info
(
'user_defined_vals_loop'
,
TensorProto
.
FLOAT
,
[
2
,
1
])
return
([
node
],
[
cond
,
a
,
b
],
[
b_loop
,
uout
],
[
iter
])
@
onnx_test
()
def
lpnormalization_axis_error_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
2
,
3
])
...
...
@@ -4464,6 +4813,77 @@ def mean_integral_test():
return
([
node
],
data
,
[
mean
])
def
mvn_default_axes_test_base
(
dims
,
type
=
TensorProto
.
FLOAT
):
data
=
helper
.
make_tensor_value_info
(
"data"
,
type
,
dims
)
out
=
helper
.
make_tensor_value_info
(
"out"
,
type
,
dims
)
node
=
helper
.
make_node
(
"MeanVarianceNormalization"
,
inputs
=
[
"data"
],
outputs
=
[
"out"
])
return
([
node
],
[
data
],
[
out
])
@
onnx_test
()
def
mvn_default_axes_test
():
return
mvn_default_axes_test_base
([
2
,
2
,
2
,
2
])
@
onnx_test
()
def
mvn_default_axes_fp16_test
():
return
mvn_default_axes_test_base
([
2
,
2
,
2
,
2
],
TensorProto
.
FLOAT16
)
@
onnx_test
()
def
mvn_default_axes_rank_too_small_test
():
return
mvn_default_axes_test_base
([
2
,
2
,
2
])
@
onnx_test
()
def
mvn_default_axes_rank_too_big_test
():
return
mvn_default_axes_test_base
([
2
,
2
,
2
,
2
,
2
])
def
mvn_n_rank_test_base
(
axes
,
dims
,
type
=
TensorProto
.
FLOAT
):
data
=
helper
.
make_tensor_value_info
(
"data"
,
type
,
dims
)
out
=
helper
.
make_tensor_value_info
(
"out"
,
type
,
dims
)
node
=
helper
.
make_node
(
"MeanVarianceNormalization"
,
inputs
=
[
"data"
],
outputs
=
[
"out"
],
axes
=
axes
)
return
([
node
],
[
data
],
[
out
])
@
onnx_test
()
def
mvn_rank_2_test
():
return
mvn_n_rank_test_base
([
1
],
[
2
,
2
])
@
onnx_test
()
def
mvn_rank_2_fp16_test
():
return
mvn_n_rank_test_base
([
1
],
[
2
,
2
],
TensorProto
.
FLOAT16
)
@
onnx_test
()
def
mvn_rank_3_test
():
return
mvn_n_rank_test_base
([
0
,
1
],
[
2
,
2
,
2
])
@
onnx_test
()
def
mvn_rank_3_fp16_test
():
return
mvn_n_rank_test_base
([
0
,
1
],
[
2
,
2
,
2
],
TensorProto
.
FLOAT16
)
@
onnx_test
()
def
mvn_axes_rank_too_small_test
():
return
mvn_n_rank_test_base
([
0
,
1
,
2
],
[
2
,
2
,
2
])
@
onnx_test
()
def
mvn_axes_rank_too_big_test
():
return
mvn_n_rank_test_base
([
0
],
[
2
,
2
,
2
])
@
onnx_test
()
def
min_test
():
a
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
3
])
...
...
@@ -4565,9 +4985,9 @@ def mod_test_fmod_different_dtypes():
@
onnx_test
()
def
multinomial_test
():
sample_size
=
1
0
seed
=
0.
0
input
=
helper
.
make_tensor_value_info
(
"input"
,
TensorProto
.
FLOAT
,
[
1
,
10
])
sample_size
=
1
3
seed
=
0.
input
=
helper
.
make_tensor_value_info
(
"input"
,
TensorProto
.
FLOAT
,
[
3
,
10
])
output
=
helper
.
make_tensor_value_info
(
"output"
,
TensorProto
.
INT32
,
[
1
,
10
])
...
...
@@ -4581,9 +5001,47 @@ def multinomial_test():
@
onnx_test
()
def
multinomial_generated_seed_test
():
sample_size
=
10
input
=
helper
.
make_tensor_value_info
(
"input"
,
TensorProto
.
FLOAT
,
[
1
,
10
])
def
multinomial_dyn_test
():
sample_size
=
100000
seed
=
1.3
categories
=
5
input
=
helper
.
make_tensor_value_info
(
"input"
,
TensorProto
.
FLOAT
,
[
None
,
categories
])
output
=
helper
.
make_tensor_value_info
(
"output"
,
TensorProto
.
FLOAT
,
[
None
,
categories
])
node
=
onnx
.
helper
.
make_node
(
'Multinomial'
,
inputs
=
[
'input'
],
sample_size
=
sample_size
,
dtype
=
1
,
# shape::float_type
seed
=
seed
,
outputs
=
[
'output'
])
return
([
node
],
[
input
],
[
output
])
@
onnx_test
()
def
multinomial_autoseed_dyn_test
():
# If seed attribute is not given, device should auto generate one at runtime
sample_size
=
12
input
=
helper
.
make_tensor_value_info
(
"input"
,
TensorProto
.
FLOAT
,
[
None
,
10
])
output
=
helper
.
make_tensor_value_info
(
"output"
,
TensorProto
.
INT32
,
[
None
,
10
])
node
=
onnx
.
helper
.
make_node
(
'Multinomial'
,
inputs
=
[
'input'
],
sample_size
=
sample_size
,
outputs
=
[
'output'
])
return
([
node
],
[
input
],
[
output
])
@
onnx_test
()
def
multinomial_generated_seed_test
():
sample_size
=
10
input
=
helper
.
make_tensor_value_info
(
"input"
,
TensorProto
.
FLOAT
,
[
1
,
10
])
output
=
helper
.
make_tensor_value_info
(
"output"
,
TensorProto
.
INT32
,
[
1
,
10
])
...
...
@@ -4890,6 +5348,32 @@ def pad_test():
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
pad_asym_test
():
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
1
,
3
,
4
,
5
])
y
=
helper
.
make_tensor_value_info
(
'1'
,
TensorProto
.
FLOAT
,
[
1
,
6
,
4
,
12
])
node
=
onnx
.
helper
.
make_node
(
'Pad'
,
inputs
=
[
'0'
],
pads
=
[
0
,
1
,
0
,
3
,
0
,
2
,
0
,
4
],
outputs
=
[
'1'
])
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
pad_asym_invalid_pads_error_test
():
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
1
,
3
,
4
,
5
])
y
=
helper
.
make_tensor_value_info
(
'1'
,
TensorProto
.
FLOAT
,
[
1
,
6
,
4
,
12
])
node
=
onnx
.
helper
.
make_node
(
'Pad'
,
inputs
=
[
'0'
],
pads
=
[
0
,
1
,
0
,
3
,
0
,
2
],
outputs
=
[
'1'
])
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
pad_3arg_test
():
values
=
np
.
array
([
1
])
...
...
@@ -4922,6 +5406,129 @@ def pad_3arg_test():
return
([
arg_val
,
arg_pad
,
node
],
[
x
],
[
y
])
@
onnx_test
()
def
pad_4arg_axes_test
():
values
=
np
.
array
([
1
])
val_tensor
=
helper
.
make_tensor
(
name
=
'val'
,
data_type
=
TensorProto
.
FLOAT
,
dims
=
values
.
reshape
(()).
shape
,
vals
=
values
.
astype
(
float
))
arg_val
=
onnx
.
helper
.
make_node
(
'Constant'
,
inputs
=
[],
outputs
=
[
'arg_val'
],
value
=
val_tensor
)
sizes
=
np
.
array
([
1
,
3
,
2
,
4
])
pad_tensor
=
helper
.
make_tensor
(
name
=
'pad_size'
,
data_type
=
TensorProto
.
INT32
,
dims
=
sizes
.
shape
,
vals
=
sizes
.
astype
(
int
))
arg_pad
=
onnx
.
helper
.
make_node
(
'Constant'
,
inputs
=
[],
outputs
=
[
'arg_pad'
],
value
=
pad_tensor
)
axes
=
np
.
array
([
1
,
3
])
axes_tensor
=
helper
.
make_tensor
(
name
=
'pad_axes'
,
data_type
=
TensorProto
.
INT32
,
dims
=
axes
.
shape
,
vals
=
axes
.
astype
(
int
))
arg_axes
=
onnx
.
helper
.
make_node
(
'Constant'
,
inputs
=
[],
outputs
=
[
'arg_axes'
],
value
=
axes_tensor
)
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
1
,
3
,
4
,
5
])
y
=
helper
.
make_tensor_value_info
(
'1'
,
TensorProto
.
FLOAT
,
[
1
,
6
,
4
,
12
])
node
=
onnx
.
helper
.
make_node
(
'Pad'
,
inputs
=
[
'0'
,
'arg_pad'
,
'arg_val'
,
'arg_axes'
],
outputs
=
[
'1'
])
return
([
arg_axes
,
arg_val
,
arg_pad
,
node
],
[
x
],
[
y
])
@
onnx_test
()
def
pad_4arg_invalid_axes_error_test
():
values
=
np
.
array
([
1
])
val_tensor
=
helper
.
make_tensor
(
name
=
'val'
,
data_type
=
TensorProto
.
FLOAT
,
dims
=
values
.
reshape
(()).
shape
,
vals
=
values
.
astype
(
float
))
arg_val
=
onnx
.
helper
.
make_node
(
'Constant'
,
inputs
=
[],
outputs
=
[
'arg_val'
],
value
=
val_tensor
)
sizes
=
np
.
array
([
1
,
3
,
2
,
4
])
pad_tensor
=
helper
.
make_tensor
(
name
=
'pad_size'
,
data_type
=
TensorProto
.
INT32
,
dims
=
sizes
.
shape
,
vals
=
sizes
.
astype
(
int
))
arg_pad
=
onnx
.
helper
.
make_node
(
'Constant'
,
inputs
=
[],
outputs
=
[
'arg_pad'
],
value
=
pad_tensor
)
axes
=
np
.
array
([
1
,
2
,
3
])
axes_tensor
=
helper
.
make_tensor
(
name
=
'pad_axes'
,
data_type
=
TensorProto
.
INT32
,
dims
=
axes
.
shape
,
vals
=
axes
.
astype
(
int
))
arg_axes
=
onnx
.
helper
.
make_node
(
'Constant'
,
inputs
=
[],
outputs
=
[
'arg_axes'
],
value
=
axes_tensor
)
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
1
,
3
,
4
,
5
])
y
=
helper
.
make_tensor_value_info
(
'1'
,
TensorProto
.
FLOAT
,
[
1
,
6
,
4
,
12
])
node
=
onnx
.
helper
.
make_node
(
'Pad'
,
inputs
=
[
'0'
,
'arg_pad'
,
'arg_val'
,
'arg_axes'
],
outputs
=
[
'1'
])
return
([
arg_axes
,
arg_val
,
arg_pad
,
node
],
[
x
],
[
y
])
@
onnx_test
()
def
pad_4arg_neg_axes_test
():
values
=
np
.
array
([
1
])
val_tensor
=
helper
.
make_tensor
(
name
=
'val'
,
data_type
=
TensorProto
.
FLOAT
,
dims
=
values
.
reshape
(()).
shape
,
vals
=
values
.
astype
(
float
))
arg_val
=
onnx
.
helper
.
make_node
(
'Constant'
,
inputs
=
[],
outputs
=
[
'arg_val'
],
value
=
val_tensor
)
sizes
=
np
.
array
([
1
,
3
,
2
,
4
])
pad_tensor
=
helper
.
make_tensor
(
name
=
'pad_size'
,
data_type
=
TensorProto
.
INT32
,
dims
=
sizes
.
shape
,
vals
=
sizes
.
astype
(
int
))
arg_pad
=
onnx
.
helper
.
make_node
(
'Constant'
,
inputs
=
[],
outputs
=
[
'arg_pad'
],
value
=
pad_tensor
)
axes
=
np
.
array
([
-
3
,
-
1
])
axes_tensor
=
helper
.
make_tensor
(
name
=
'pad_axes'
,
data_type
=
TensorProto
.
INT32
,
dims
=
axes
.
shape
,
vals
=
axes
.
astype
(
int
))
arg_axes
=
onnx
.
helper
.
make_node
(
'Constant'
,
inputs
=
[],
outputs
=
[
'arg_axes'
],
value
=
axes_tensor
)
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
1
,
3
,
4
,
5
])
y
=
helper
.
make_tensor_value_info
(
'1'
,
TensorProto
.
FLOAT
,
[
1
,
6
,
4
,
12
])
node
=
onnx
.
helper
.
make_node
(
'Pad'
,
inputs
=
[
'0'
,
'arg_pad'
,
'arg_val'
,
'arg_axes'
],
outputs
=
[
'1'
])
return
([
arg_axes
,
arg_val
,
arg_pad
,
node
],
[
x
],
[
y
])
@
onnx_test
()
def
pad_reflect_test
():
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
2
,
2
])
...
...
@@ -4945,6 +5552,39 @@ def pad_reflect_test():
return
([
arg_pad
,
node
],
[
x
],
[
y
])
@
onnx_test
()
def
pad_reflect_with_axes_test
():
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
2
,
2
])
y
=
helper
.
make_tensor_value_info
(
'1'
,
TensorProto
.
FLOAT
,
[
2
,
5
])
sizes
=
np
.
array
([
2
,
1
])
pad_tensor
=
helper
.
make_tensor
(
name
=
'pad_size'
,
data_type
=
TensorProto
.
INT32
,
dims
=
sizes
.
shape
,
vals
=
sizes
.
astype
(
int
))
arg_pad
=
onnx
.
helper
.
make_node
(
'Constant'
,
inputs
=
[],
outputs
=
[
'arg_pad'
],
value
=
pad_tensor
)
axes
=
np
.
array
([
1
])
axes_tensor
=
helper
.
make_tensor
(
name
=
'pad_axes'
,
data_type
=
TensorProto
.
INT32
,
dims
=
axes
.
shape
,
vals
=
axes
.
astype
(
int
))
arg_axes
=
onnx
.
helper
.
make_node
(
'Constant'
,
inputs
=
[],
outputs
=
[
'arg_axes'
],
value
=
axes_tensor
)
node
=
onnx
.
helper
.
make_node
(
'Pad'
,
mode
=
'reflect'
,
inputs
=
[
'0'
,
'arg_pad'
,
'arg_axes'
],
outputs
=
[
'1'
])
return
([
arg_axes
,
arg_pad
,
node
],
[
x
],
[
y
])
@
onnx_test
()
def
pad_reflect_multiaxis_test
():
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
2
,
3
])
...
...
@@ -5096,6 +5736,278 @@ def prelu_brcst_test():
return
([
node
],
[
arg0
,
arg1
],
[
arg_out
])
@
onnx_test
()
def
qlinearadd_test
():
a
=
helper
.
make_tensor_value_info
(
'A'
,
TensorProto
.
UINT8
,
[
64
])
sc_a
=
helper
.
make_tensor
(
'A_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
zero_pt_a
=
helper
.
make_tensor
(
'A_zero_point'
,
TensorProto
.
UINT8
,
[],
[
0
])
b
=
helper
.
make_tensor_value_info
(
'B'
,
TensorProto
.
UINT8
,
[
64
])
sc_b
=
helper
.
make_tensor
(
'B_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
zero_pt_b
=
helper
.
make_tensor
(
'B_zero_point'
,
TensorProto
.
UINT8
,
[],
[
128
])
sc_c
=
helper
.
make_tensor
(
'C_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
zero_pt_c
=
helper
.
make_tensor
(
'C_zero_point'
,
TensorProto
.
UINT8
,
[],
[
64
])
c
=
helper
.
make_tensor_value_info
(
'C'
,
TensorProto
.
UINT8
,
[
64
])
node
=
onnx
.
helper
.
make_node
(
'QLinearAdd'
,
inputs
=
[
'A'
,
'A_scale'
,
'A_zero_point'
,
'B'
,
'B_scale'
,
'B_zero_point'
,
'C_scale'
,
'C_zero_point'
],
outputs
=
[
'C'
],
)
return
([
node
],
[
a
,
b
],
[
c
],
[
sc_a
,
zero_pt_a
,
sc_b
,
zero_pt_b
,
sc_c
,
zero_pt_c
])
@
onnx_test
()
def
qlinearadd_bcast_test
():
a
=
helper
.
make_tensor_value_info
(
'A'
,
TensorProto
.
INT8
,
[
64
])
sc_a
=
helper
.
make_tensor
(
'A_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
zero_pt_a
=
helper
.
make_tensor
(
'A_zero_point'
,
TensorProto
.
INT8
,
[],
[
0
])
b
=
helper
.
make_tensor_value_info
(
'B'
,
TensorProto
.
INT8
,
[
1
,
1
,
64
])
sc_b
=
helper
.
make_tensor
(
'B_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
zero_pt_b
=
helper
.
make_tensor
(
'B_zero_point'
,
TensorProto
.
INT8
,
[],
[
32
])
sc_c
=
helper
.
make_tensor
(
'C_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
zero_pt_c
=
helper
.
make_tensor
(
'C_zero_point'
,
TensorProto
.
INT8
,
[],
[
-
64
])
c
=
helper
.
make_tensor_value_info
(
'C'
,
TensorProto
.
INT8
,
[
1
,
1
,
64
])
node
=
onnx
.
helper
.
make_node
(
'QLinearAdd'
,
inputs
=
[
'A'
,
'A_scale'
,
'A_zero_point'
,
'B'
,
'B_scale'
,
'B_zero_point'
,
'C_scale'
,
'C_zero_point'
],
outputs
=
[
'C'
],
)
return
([
node
],
[
a
,
b
],
[
c
],
[
sc_a
,
zero_pt_a
,
sc_b
,
zero_pt_b
,
sc_c
,
zero_pt_c
])
@
onnx_test
()
def
qlinearconv_test
():
# https://xadupre.github.io/draft/onnx/onnx_doc_folder/onnx__QLinearConv.html
x
=
helper
.
make_tensor_value_info
(
'X'
,
TensorProto
.
UINT8
,
[
1
,
1
,
7
,
7
])
sc_x
=
helper
.
make_tensor
(
'1'
,
TensorProto
.
FLOAT
,
[],
[
0.00369204697
])
zero_pt_x
=
helper
.
make_tensor
(
'2'
,
TensorProto
.
UINT8
,
[],
[
132
])
wt
=
helper
.
make_tensor
(
'3'
,
TensorProto
.
UINT8
,
[
1
,
1
,
1
,
1
],
[
0
])
sc_wt
=
helper
.
make_tensor
(
'4'
,
TensorProto
.
FLOAT
,
[],
[
0.00172794575
])
zero_pt_wt
=
helper
.
make_tensor
(
'5'
,
TensorProto
.
UINT8
,
[],
[
255
])
sc_y
=
helper
.
make_tensor
(
'6'
,
TensorProto
.
FLOAT
,
[],
[
0.00162681262
])
zero_pt_y
=
helper
.
make_tensor
(
'7'
,
TensorProto
.
UINT8
,
[],
[
123
])
out
=
helper
.
make_tensor_value_info
(
'out'
,
TensorProto
.
UINT8
,
[
1
,
1
,
7
,
7
])
node
=
onnx
.
helper
.
make_node
(
'QLinearConv'
,
inputs
=
[
'X'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
],
outputs
=
[
'out'
],
)
return
([
node
],
[
x
],
[
out
],
[
sc_x
,
zero_pt_x
,
wt
,
sc_wt
,
zero_pt_wt
,
sc_y
,
zero_pt_y
])
@
onnx_test
()
def
qlinearconv_pad_1_test
():
# https://xadupre.github.io/draft/onnx/onnx_doc_folder/onnx__Conv.html
x
=
helper
.
make_tensor_value_info
(
'X'
,
TensorProto
.
UINT8
,
[
1
,
1
,
5
,
5
])
sc_x
=
helper
.
make_tensor
(
'1'
,
TensorProto
.
FLOAT
,
[],
[
0.09411764705882353
])
zero_pt_x
=
helper
.
make_tensor
(
'2'
,
TensorProto
.
UINT8
,
[],
[
0
])
wt
=
helper
.
make_tensor
(
'3'
,
TensorProto
.
UINT8
,
[
1
,
1
,
3
,
3
],
[
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
])
sc_wt
=
helper
.
make_tensor
(
'4'
,
TensorProto
.
FLOAT
,
[],
[
1.0
])
zero_pt_wt
=
helper
.
make_tensor
(
'5'
,
TensorProto
.
UINT8
,
[],
[
0
])
sc_y
=
helper
.
make_tensor
(
'6'
,
TensorProto
.
FLOAT
,
[],
[
0.6352941176470588
])
zero_pt_y
=
helper
.
make_tensor
(
'7'
,
TensorProto
.
UINT8
,
[],
[
0
])
out
=
helper
.
make_tensor_value_info
(
'out'
,
TensorProto
.
UINT8
,
[
1
,
1
,
5
,
5
])
node
=
onnx
.
helper
.
make_node
(
'QLinearConv'
,
inputs
=
[
'X'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
],
outputs
=
[
'out'
],
pads
=
[
1
,
1
,
1
,
1
],
)
return
([
node
],
[
x
],
[
out
],
[
sc_x
,
zero_pt_x
,
wt
,
sc_wt
,
zero_pt_wt
,
sc_y
,
zero_pt_y
])
@
onnx_test
()
def
qlinearconv_pad_0_test
():
# https://xadupre.github.io/draft/onnx/onnx_doc_folder/onnx__Conv.html
x
=
helper
.
make_tensor_value_info
(
'X'
,
TensorProto
.
UINT8
,
[
1
,
1
,
5
,
5
])
sc_x
=
helper
.
make_tensor
(
'1'
,
TensorProto
.
FLOAT
,
[],
[
0.09411764705882353
])
zero_pt_x
=
helper
.
make_tensor
(
'2'
,
TensorProto
.
UINT8
,
[],
[
0
])
wt
=
helper
.
make_tensor
(
'3'
,
TensorProto
.
UINT8
,
[
1
,
1
,
3
,
3
],
[
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
])
sc_wt
=
helper
.
make_tensor
(
'4'
,
TensorProto
.
FLOAT
,
[],
[
1.0
])
zero_pt_wt
=
helper
.
make_tensor
(
'5'
,
TensorProto
.
UINT8
,
[],
[
0
])
sc_y
=
helper
.
make_tensor
(
'6'
,
TensorProto
.
FLOAT
,
[],
[
0.6352941176470588
])
zero_pt_y
=
helper
.
make_tensor
(
'7'
,
TensorProto
.
INT8
,
[],
[
-
128
])
out
=
helper
.
make_tensor_value_info
(
'out'
,
TensorProto
.
INT8
,
[
1
,
1
,
3
,
3
])
node
=
onnx
.
helper
.
make_node
(
'QLinearConv'
,
inputs
=
[
'X'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
],
outputs
=
[
'out'
],
pads
=
[
0
,
0
,
0
,
0
],
)
return
([
node
],
[
x
],
[
out
],
[
sc_x
,
zero_pt_x
,
wt
,
sc_wt
,
zero_pt_wt
,
sc_y
,
zero_pt_y
])
@
onnx_test
()
def
qlinearconv_scale_1D_test
():
# https://xadupre.github.io/draft/onnx/onnx_doc_folder/onnx__Conv.html
x
=
helper
.
make_tensor_value_info
(
'X'
,
TensorProto
.
UINT8
,
[
1
,
1
,
5
,
5
])
sc_x
=
helper
.
make_tensor
(
'1'
,
TensorProto
.
FLOAT
,
[],
[
0.09411764705882353
])
zero_pt_x
=
helper
.
make_tensor
(
'2'
,
TensorProto
.
UINT8
,
[],
[
0
])
wt
=
helper
.
make_tensor
(
'3'
,
TensorProto
.
UINT8
,
[
2
,
1
,
3
,
3
],
[
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
])
sc_wt
=
helper
.
make_tensor
(
'4'
,
TensorProto
.
FLOAT
,
[
2
],
[
1.0
,
0.5
])
zero_pt_wt
=
helper
.
make_tensor
(
'5'
,
TensorProto
.
UINT8
,
[
2
],
[
0
,
0
])
sc_y
=
helper
.
make_tensor
(
'6'
,
TensorProto
.
FLOAT
,
[],
[
0.6352941176470588
])
zero_pt_y
=
helper
.
make_tensor
(
'7'
,
TensorProto
.
INT8
,
[],
[
-
128
])
out
=
helper
.
make_tensor_value_info
(
'out'
,
TensorProto
.
INT8
,
[
1
,
2
,
3
,
3
])
node
=
onnx
.
helper
.
make_node
(
'QLinearConv'
,
inputs
=
[
'X'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
],
outputs
=
[
'out'
],
pads
=
[
0
,
0
,
0
,
0
],
)
return
([
node
],
[
x
],
[
out
],
[
sc_x
,
zero_pt_x
,
wt
,
sc_wt
,
zero_pt_wt
,
sc_y
,
zero_pt_y
])
@
onnx_test
()
def
qlinearglobalavgpool_test
():
x
=
helper
.
make_tensor_value_info
(
'X'
,
TensorProto
.
UINT8
,
[
1
,
3
,
4
,
4
])
sc_x
=
helper
.
make_tensor
(
'X_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
z_pt_x
=
helper
.
make_tensor
(
'X_zero_point'
,
TensorProto
.
UINT8
,
[],
[
128
])
y
=
helper
.
make_tensor_value_info
(
'Y'
,
TensorProto
.
UINT8
,
[
1
,
3
,
1
,
1
])
sc_y
=
helper
.
make_tensor
(
'Y_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.025
])
z_pt_y
=
helper
.
make_tensor
(
'Y_zero_point'
,
TensorProto
.
UINT8
,
[],
[
64
])
n
=
onnx
.
helper
.
make_node
(
'QLinearGlobalAveragePool'
,
inputs
=
[
'X'
,
'X_scale'
,
'X_zero_point'
,
'Y_scale'
,
'Y_zero_point'
],
outputs
=
[
'Y'
],
channels_last
=
0
,
)
return
([
n
],
[
x
],
[
y
],
[
sc_x
,
z_pt_x
,
sc_y
,
z_pt_y
])
def
qlinearmatmul_1D_test
():
a
=
helper
.
make_tensor_value_info
(
'A'
,
TensorProto
.
UINT8
,
[
8
])
sc_a
=
helper
.
make_tensor
(
'A_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
zero_pt_a
=
helper
.
make_tensor
(
'A_zero_point'
,
TensorProto
.
UINT8
,
[],
[
0
])
b
=
helper
.
make_tensor_value_info
(
'B'
,
TensorProto
.
UINT8
,
[
8
])
sc_b
=
helper
.
make_tensor
(
'B_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
zero_pt_b
=
helper
.
make_tensor
(
'B_zero_point'
,
TensorProto
.
UINT8
,
[],
[
128
])
sc_c
=
helper
.
make_tensor
(
'C_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
zero_pt_c
=
helper
.
make_tensor
(
'C_zero_point'
,
TensorProto
.
UINT8
,
[],
[
64
])
c
=
helper
.
make_tensor_value_info
(
'C'
,
TensorProto
.
UINT8
,
[
1
])
node
=
onnx
.
helper
.
make_node
(
'QLinearMatMul'
,
inputs
=
[
'A'
,
'A_scale'
,
'A_zero_point'
,
'B'
,
'B_scale'
,
'B_zero_point'
,
'C_scale'
,
'C_zero_point'
],
outputs
=
[
'C'
],
)
return
([
node
],
[
a
,
b
],
[
c
],
[
sc_a
,
zero_pt_a
,
sc_b
,
zero_pt_b
,
sc_c
,
zero_pt_c
])
@
onnx_test
()
def
qlinearmatmul_2D_test
():
a
=
helper
.
make_tensor_value_info
(
'A'
,
TensorProto
.
UINT8
,
[
1
,
8
])
sc_a
=
helper
.
make_tensor
(
'A_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
zero_pt_a
=
helper
.
make_tensor
(
'A_zero_point'
,
TensorProto
.
UINT8
,
[],
[
0
])
b
=
helper
.
make_tensor_value_info
(
'B'
,
TensorProto
.
UINT8
,
[
8
,
1
])
sc_b
=
helper
.
make_tensor
(
'B_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
zero_pt_b
=
helper
.
make_tensor
(
'B_zero_point'
,
TensorProto
.
UINT8
,
[],
[
128
])
sc_c
=
helper
.
make_tensor
(
'C_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.05
])
zero_pt_c
=
helper
.
make_tensor
(
'C_zero_point'
,
TensorProto
.
UINT8
,
[],
[
64
])
c
=
helper
.
make_tensor_value_info
(
'C'
,
TensorProto
.
UINT8
,
[
1
,
1
])
node
=
onnx
.
helper
.
make_node
(
'QLinearMatMul'
,
inputs
=
[
'A'
,
'A_scale'
,
'A_zero_point'
,
'B'
,
'B_scale'
,
'B_zero_point'
,
'C_scale'
,
'C_zero_point'
],
outputs
=
[
'C'
],
)
return
([
node
],
[
a
,
b
],
[
c
],
[
sc_a
,
zero_pt_a
,
sc_b
,
zero_pt_b
,
sc_c
,
zero_pt_c
])
@
onnx_test
()
def
qlinearmatmul_3D_test
():
a
=
helper
.
make_tensor_value_info
(
'A'
,
TensorProto
.
UINT8
,
[
2
,
2
,
4
])
sc_a
=
helper
.
make_tensor
(
'A_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.0066
])
zero_pt_a
=
helper
.
make_tensor
(
'A_zero_point'
,
TensorProto
.
UINT8
,
[],
[
113
])
b
=
helper
.
make_tensor_value_info
(
'B'
,
TensorProto
.
UINT8
,
[
2
,
4
,
3
])
sc_b
=
helper
.
make_tensor
(
'B_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.00705
])
zero_pt_b
=
helper
.
make_tensor
(
'B_zero_point'
,
TensorProto
.
UINT8
,
[],
[
114
])
sc_c
=
helper
.
make_tensor
(
'C_scale'
,
TensorProto
.
FLOAT
,
[],
[
0.0107
])
zero_pt_c
=
helper
.
make_tensor
(
'C_zero_point'
,
TensorProto
.
UINT8
,
[],
[
118
])
c
=
helper
.
make_tensor_value_info
(
'C'
,
TensorProto
.
UINT8
,
[
2
,
2
,
3
])
node
=
onnx
.
helper
.
make_node
(
'QLinearMatMul'
,
inputs
=
[
'A'
,
'A_scale'
,
'A_zero_point'
,
'B'
,
'B_scale'
,
'B_zero_point'
,
'C_scale'
,
'C_zero_point'
],
outputs
=
[
'C'
],
)
return
([
node
],
[
a
,
b
],
[
c
],
[
sc_a
,
zero_pt_a
,
sc_b
,
zero_pt_b
,
sc_c
,
zero_pt_c
])
@
onnx_test
()
def
quantizelinear_test
():
arg0
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
5
])
...
...
@@ -5793,6 +6705,24 @@ def reshape_non_standard_test():
return
([
trans
,
res
],
[
x
],
[
y
])
@
onnx_test
()
def
reshape_variable_input_test
():
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
4
,
2
,
3
])
x_shape
=
helper
.
make_tensor_value_info
(
'1'
,
TensorProto
.
INT64
,
[
2
])
y
=
helper
.
make_tensor_value_info
(
'2'
,
TensorProto
.
FLOAT
,
[
3
,
8
])
node
=
onnx
.
helper
.
make_node
(
'Reshape'
,
inputs
=
[
'0'
,
'1'
],
outputs
=
[
'2'
])
return
([
node
],
[
x
,
x_shape
],
[
y
])
@
onnx_test
()
def
reshape_variable_input_dyn_test
():
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
None
,
2
,
3
])
x_shape
=
helper
.
make_tensor_value_info
(
'1'
,
TensorProto
.
INT64
,
[
2
])
y
=
helper
.
make_tensor_value_info
(
'2'
,
TensorProto
.
FLOAT
,
[
None
,
6
])
node
=
onnx
.
helper
.
make_node
(
'Reshape'
,
inputs
=
[
'0'
,
'1'
],
outputs
=
[
'2'
])
return
([
node
],
[
x
,
x_shape
],
[
y
])
@
onnx_test
()
def
resize_downsample_f_test
():
scales
=
np
.
array
([
1.0
,
1.0
,
0.6
,
0.6
],
dtype
=
np
.
float32
)
...
...
@@ -6157,6 +7087,16 @@ def roialign_test():
return
([
node
],
[
x
,
roi
,
bi
],
[
y
])
@
onnx_test
()
def
round_half_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT16
,
[
4
,
4
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT16
,
[
4
,
4
])
node
=
onnx
.
helper
.
make_node
(
'Round'
,
inputs
=
[
'x'
],
outputs
=
[
'y'
])
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
scatter_add_test
():
x
=
helper
.
make_tensor_value_info
(
'data'
,
TensorProto
.
FLOAT
,
[
3
,
4
,
5
,
6
])
...
...
@@ -6446,6 +7386,101 @@ def shape_gather_test():
return
([
node_const
,
node_shape
,
node_gather
],
[
x
],
[
z
])
@
onnx_test
()
def
shrink_hard_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
5
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
5
])
node
=
onnx
.
helper
.
make_node
(
"Shrink"
,
inputs
=
[
"x"
],
outputs
=
[
"y"
],
lambd
=
1.5
,
)
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
shrink_soft_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
5
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
5
])
node
=
onnx
.
helper
.
make_node
(
"Shrink"
,
inputs
=
[
"x"
],
outputs
=
[
"y"
],
lambd
=
1.5
,
bias
=
1.5
,
)
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
shrink_verify_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT16
,
[
5
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT16
,
[
5
])
node
=
onnx
.
helper
.
make_node
(
"Shrink"
,
inputs
=
[
"x"
],
outputs
=
[
"y"
],
lambd
=-
5.0
,
bias
=
1.0
,
)
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
shrink_verify2_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT16
,
[
5
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT16
,
[
5
])
node
=
onnx
.
helper
.
make_node
(
"Shrink"
,
inputs
=
[
"x"
],
outputs
=
[
"y"
],
lambd
=-
6.0
,
bias
=
5.0
,
)
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
shrink_int8_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
INT8
,
[
3
,
3
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
INT8
,
[
3
,
3
])
node
=
onnx
.
helper
.
make_node
(
"Shrink"
,
inputs
=
[
"x"
],
outputs
=
[
"y"
],
lambd
=
1.5
,
bias
=
1.5
,
)
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
shrink_uint8_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
UINT8
,
[
3
,
3
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
UINT8
,
[
3
,
3
])
node
=
onnx
.
helper
.
make_node
(
"Shrink"
,
inputs
=
[
"x"
],
outputs
=
[
"y"
],
lambd
=
5.0
,
bias
=-
4.5
,
)
return
([
node
],
[
x
],
[
y
])
@
onnx_test
()
def
sign_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
DOUBLE
,
[
10
,
5
])
...
...
@@ -6981,6 +8016,32 @@ def slice_var_input_dyn1():
return
([
node
],
[
data
,
starts
,
ends
,
axes
],
[
output
])
@
onnx_test
()
def
slice_var_input_default_steps
():
step
=
np
.
array
([
1
,
1
])
step_tensor
=
helper
.
make_tensor
(
name
=
"step"
,
data_type
=
TensorProto
.
INT64
,
dims
=
step
.
shape
,
vals
=
step
.
astype
(
int
))
arg_step
=
helper
.
make_node
(
"Constant"
,
inputs
=
[],
outputs
=
[
'arg_step'
],
value
=
step_tensor
)
data
=
helper
.
make_tensor_value_info
(
'data'
,
TensorProto
.
FLOAT
,
[
None
,
2
])
starts
=
helper
.
make_tensor_value_info
(
'starts'
,
TensorProto
.
INT64
,
[
2
])
ends
=
helper
.
make_tensor_value_info
(
'ends'
,
TensorProto
.
INT64
,
[
2
])
axes
=
helper
.
make_tensor_value_info
(
'axes'
,
TensorProto
.
INT64
,
[
2
])
output
=
helper
.
make_tensor_value_info
(
'output'
,
TensorProto
.
FLOAT
,
[
1
,
2
])
node
=
onnx
.
helper
.
make_node
(
'Slice'
,
inputs
=
[
'data'
,
'starts'
,
'ends'
,
'axes'
,
'arg_step'
],
outputs
=
[
'output'
])
return
([
arg_step
,
node
],
[
data
,
starts
,
ends
,
axes
],
[
output
])
@
onnx_test
()
def
slice_var_input_steps_error
():
step
=
np
.
array
([
2
,
1
])
...
...
@@ -6994,9 +8055,9 @@ def slice_var_input_steps_error():
value
=
step_tensor
)
data
=
helper
.
make_tensor_value_info
(
'data'
,
TensorProto
.
FLOAT
,
[
3
,
2
])
starts
=
helper
.
make_tensor_value_info
(
'starts'
,
TensorProto
.
FLOAT
,
[
2
])
ends
=
helper
.
make_tensor_value_info
(
'ends'
,
TensorProto
.
FLOAT
,
[
2
])
axes
=
helper
.
make_tensor_value_info
(
'axes'
,
TensorProto
.
FLOAT
,
[
2
])
starts
=
helper
.
make_tensor_value_info
(
'starts'
,
TensorProto
.
INT64
,
[
2
])
ends
=
helper
.
make_tensor_value_info
(
'ends'
,
TensorProto
.
INT64
,
[
2
])
axes
=
helper
.
make_tensor_value_info
(
'axes'
,
TensorProto
.
INT64
,
[
2
])
output
=
helper
.
make_tensor_value_info
(
'output'
,
TensorProto
.
FLOAT
,
[
1
,
2
])
node
=
onnx
.
helper
.
make_node
(
...
...
@@ -7157,6 +8218,42 @@ def split_test_no_attribute():
return
([
const_node
,
node
],
[
x
],
[
y1
,
y2
,
y3
,
y4
])
@
onnx_test
()
def
split_test_uneven
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
12
,
15
])
y1
=
helper
.
make_tensor_value_info
(
'y1'
,
TensorProto
.
FLOAT
,
[
3
,
15
])
y2
=
helper
.
make_tensor_value_info
(
'y2'
,
TensorProto
.
FLOAT
,
[
3
,
15
])
y3
=
helper
.
make_tensor_value_info
(
'y3'
,
TensorProto
.
FLOAT
,
[
3
,
15
])
y4
=
helper
.
make_tensor_value_info
(
'y4'
,
TensorProto
.
FLOAT
,
[
3
,
15
])
y5
=
helper
.
make_tensor_value_info
(
'y5'
,
TensorProto
.
FLOAT
,
[
0
,
15
])
node
=
onnx
.
helper
.
make_node
(
'Split'
,
inputs
=
[
'x'
],
outputs
=
[
'y1'
,
'y2'
,
'y3'
,
'y4'
,
'y5'
],
)
return
([
node
],
[
x
],
[
y1
,
y2
,
y3
,
y4
,
y5
])
@
onnx_test
()
def
split_test_uneven_num_outputs
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
11
,
15
])
y1
=
helper
.
make_tensor_value_info
(
'y1'
,
TensorProto
.
FLOAT
,
[
3
,
15
])
y2
=
helper
.
make_tensor_value_info
(
'y2'
,
TensorProto
.
FLOAT
,
[
3
,
15
])
y3
=
helper
.
make_tensor_value_info
(
'y3'
,
TensorProto
.
FLOAT
,
[
3
,
15
])
y4
=
helper
.
make_tensor_value_info
(
'y4'
,
TensorProto
.
FLOAT
,
[
2
,
15
])
node
=
onnx
.
helper
.
make_node
(
'Split'
,
inputs
=
[
'x'
],
outputs
=
[
'y1'
,
'y2'
,
'y3'
,
'y4'
],
num_outputs
=
4
,
)
return
([
node
],
[
x
],
[
y1
,
y2
,
y3
,
y4
])
@
onnx_test
()
def
split_test_no_attribute_invalid_split
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
300
,
15
])
...
...
@@ -7216,6 +8313,24 @@ def split_test_no_attribute_invalid_input_split():
return
([
node
],
[
x
],
[
y1
,
y2
,
y3
])
@
onnx_test
()
def
split_test_invalid_num_outputs
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
11
,
15
])
y1
=
helper
.
make_tensor_value_info
(
'y1'
,
TensorProto
.
FLOAT
,
[
3
,
15
])
y2
=
helper
.
make_tensor_value_info
(
'y2'
,
TensorProto
.
FLOAT
,
[
3
,
15
])
y3
=
helper
.
make_tensor_value_info
(
'y3'
,
TensorProto
.
FLOAT
,
[
3
,
15
])
y4
=
helper
.
make_tensor_value_info
(
'y4'
,
TensorProto
.
FLOAT
,
[
2
,
15
])
node
=
onnx
.
helper
.
make_node
(
'Split'
,
inputs
=
[
'x'
],
outputs
=
[
'y1'
,
'y2'
,
'y3'
,
'y4'
],
num_outputs
=
5
,
)
return
([
node
],
[
x
],
[
y1
,
y2
,
y3
,
y4
])
@
onnx_test
()
def
sqrt_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
10
,
15
])
...
...
@@ -7718,7 +8833,7 @@ def transpose_gather_test():
@
onnx_test
()
def
tri
l
u_test
():
def
triu_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
3
,
4
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
3
,
4
])
...
...
@@ -7731,7 +8846,7 @@ def trilu_test():
@
onnx_test
()
def
tri
l
u_batch_diff_k_test
():
def
triu_batch_diff_k_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
2
,
2
,
3
])
k
=
np
.
array
([
2
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
2
,
2
,
3
])
...
...
@@ -7749,7 +8864,24 @@ def trilu_batch_diff_k_test():
@
onnx_test
()
def
trilu_lower_test
():
def
tril_batch_diff_k_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
2
,
2
,
3
])
k
=
np
.
array
([
2
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
2
,
2
,
3
])
k_tensor
=
helper
.
make_tensor
(
name
=
'k'
,
data_type
=
TensorProto
.
INT64
,
dims
=
k
.
shape
,
vals
=
k
.
astype
(
np
.
int64
))
node
=
onnx
.
helper
.
make_node
(
'Trilu'
,
inputs
=
[
'x'
,
'k'
],
outputs
=
[
'y'
],
upper
=
0
)
return
([
node
],
[
x
],
[
y
],
[
k_tensor
])
@
onnx_test
()
def
tril_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
3
,
4
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
3
,
4
])
...
...
@@ -7758,7 +8890,7 @@ def trilu_lower_test():
@
onnx_test
()
def
tri
l
u_neg_k_test
():
def
triu_neg_k_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
3
,
4
])
k
=
np
.
array
([
-
1
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
3
,
4
])
...
...
@@ -7772,7 +8904,23 @@ def trilu_neg_k_test():
@
onnx_test
()
def
trilu_out_k_test
():
def
tril_neg_k_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
3
,
4
])
k
=
np
.
array
([
-
1
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
3
,
4
])
k_tensor
=
helper
.
make_tensor
(
name
=
'k'
,
data_type
=
TensorProto
.
INT64
,
dims
=
k
.
shape
,
vals
=
k
.
astype
(
np
.
int64
))
node
=
onnx
.
helper
.
make_node
(
'Trilu'
,
inputs
=
[
'x'
,
'k'
],
outputs
=
[
'y'
],
upper
=
0
)
return
([
node
],
[
x
],
[
y
],
[
k_tensor
])
@
onnx_test
()
def
triu_out_k_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
3
,
4
])
k
=
np
.
array
([
5
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
3
,
4
])
...
...
@@ -7786,7 +8934,23 @@ def trilu_out_k_test():
@
onnx_test
()
def
trilu_row_one_test
():
def
tril_out_k_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
3
,
4
])
k
=
np
.
array
([
5
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
3
,
4
])
k_tensor
=
helper
.
make_tensor
(
name
=
'k'
,
data_type
=
TensorProto
.
INT64
,
dims
=
k
.
shape
,
vals
=
k
.
astype
(
np
.
int64
))
node
=
onnx
.
helper
.
make_node
(
'Trilu'
,
inputs
=
[
'x'
,
'k'
],
outputs
=
[
'y'
],
upper
=
0
)
return
([
node
],
[
x
],
[
y
],
[
k_tensor
])
@
onnx_test
()
def
triu_row_one_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
1
,
4
])
k
=
np
.
array
([
1
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
1
,
4
])
...
...
@@ -7803,6 +8967,23 @@ def trilu_row_one_test():
return
([
node
],
[
x
],
[
y
],
[
k_tensor
])
@
onnx_test
()
def
tril_row_one_test
():
x
=
helper
.
make_tensor_value_info
(
'x'
,
TensorProto
.
FLOAT
,
[
1
,
4
])
k
=
np
.
array
([
1
])
y
=
helper
.
make_tensor_value_info
(
'y'
,
TensorProto
.
FLOAT
,
[
1
,
4
])
k_tensor
=
helper
.
make_tensor
(
name
=
'k'
,
data_type
=
TensorProto
.
INT64
,
dims
=
k
.
shape
,
vals
=
k
.
astype
(
np
.
int64
))
node
=
onnx
.
helper
.
make_node
(
'Trilu'
,
inputs
=
[
'x'
,
'k'
],
outputs
=
[
'y'
],
upper
=
0
)
return
([
node
],
[
x
],
[
y
],
[
k_tensor
])
@
onnx_test
()
def
undefined_test
():
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
[
2
,
3
,
4
,
5
])
...
...
@@ -7886,6 +9067,20 @@ def upsample_test():
return
([
node
],
[
X
],
[
Y
],
[
scale_tensor
])
@
onnx_test
()
def
upsample_ver7_test
():
X
=
helper
.
make_tensor_value_info
(
'X'
,
TensorProto
.
FLOAT
,
[
1
,
1
,
2
,
2
])
Y
=
helper
.
make_tensor_value_info
(
'Y'
,
TensorProto
.
FLOAT
,
[
1
,
1
,
4
,
6
])
node
=
onnx
.
helper
.
make_node
(
'Upsample'
,
inputs
=
[
'X'
],
outputs
=
[
'Y'
],
mode
=
'nearest'
,
scales
=
[
1.0
,
1.0
,
2.0
,
3.0
])
return
([
node
],
[
X
],
[
Y
])
@
onnx_test
()
def
variable_batch_test
():
x
=
helper
.
make_tensor_value_info
(
'0'
,
TensorProto
.
FLOAT
,
...
...
test/onnx/group_norm_3d_half_test.onnx
0 → 100644
View file @
4ea39116
group_norm_3d_half_test:
M
x
scale
biasy"GroupNormalization*
epsilon'7*
num_groupsgroup_norm_3d_half_testZ
x
Z
scale
Z
bias
b
y
B
\ No newline at end of file
Prev
1
…
5
6
7
8
9
10
11
12
13
…
16
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