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
f84580ac
"vscode:/vscode.git/clone" did not exist on "ff0cf51c8ea2928743cf0831ba27f24f5c7098c9"
Commit
f84580ac
authored
Sep 03, 2019
by
Shucai Xiao
Browse files
add more unit tests for better code change coverage
parent
99a5995c
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
169 additions
and
0 deletions
+169
-0
src/quantization.cpp
src/quantization.cpp
+3
-0
test/quantization.cpp
test/quantization.cpp
+166
-0
No files found.
src/quantization.cpp
View file @
f84580ac
...
@@ -368,6 +368,9 @@ void quantize_int8(program& prog,
...
@@ -368,6 +368,9 @@ void quantize_int8(program& prog,
input
->
inputs
().
front
()
->
get_shape
().
type
()
==
quant_type
)
input
->
inputs
().
front
()
->
get_shape
().
type
()
==
quant_type
)
{
{
quant_input
=
input
->
inputs
().
front
();
quant_input
=
input
->
inputs
().
front
();
// the scale in this case is not used, so tune the scale
// to 1.0f for this parameter
ins_quant_params
.
back
()
=
std
::
make_pair
<
float
,
float
>
(
1.0
f
,
0.0
f
);
}
}
else
else
{
{
...
...
test/quantization.cpp
View file @
f84580ac
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
#include <migraphx/literal.hpp>
#include <migraphx/literal.hpp>
#include <migraphx/operators.hpp>
#include <migraphx/operators.hpp>
#include <migraphx/instruction.hpp>
#include <migraphx/instruction.hpp>
#include <migraphx/generate.hpp>
#include <migraphx/cpu/target.hpp>
#include <migraphx/cpu/target.hpp>
#include <migraphx/verify.hpp>
#include <migraphx/verify.hpp>
#include <migraphx/quantization.hpp>
#include <migraphx/quantization.hpp>
...
@@ -627,6 +628,58 @@ TEST_CASE(dot_int32)
...
@@ -627,6 +628,58 @@ TEST_CASE(dot_int32)
EXPECT
(
p
==
qp
);
EXPECT
(
p
==
qp
);
}
}
TEST_CASE
(
dot_float_convert
)
{
auto
create_program
=
[]
{
migraphx
::
program
p
;
migraphx
::
shape
sa
{
migraphx
::
shape
::
int8_type
,
{
2
,
16
}};
migraphx
::
shape
sb
{
migraphx
::
shape
::
float_type
,
{
16
,
8
}};
auto
pa
=
p
.
add_parameter
(
"a"
,
sa
);
auto
pb
=
p
.
add_parameter
(
"b"
,
sb
);
auto
fpa
=
p
.
add_instruction
(
migraphx
::
op
::
convert
{
migraphx
::
shape
::
float_type
},
pa
);
p
.
add_instruction
(
migraphx
::
op
::
dot
{
2.0
f
,
5.5
f
},
fpa
,
pb
);
return
p
;
};
auto
create_int8_quantized_prog
=
[]
{
migraphx
::
program
p
;
migraphx
::
shape
sa
{
migraphx
::
shape
::
int8_type
,
{
2
,
16
}};
migraphx
::
shape
sb
{
migraphx
::
shape
::
float_type
,
{
16
,
8
}};
auto
pa
=
p
.
add_parameter
(
"a"
,
sa
);
auto
pb
=
p
.
add_parameter
(
"b"
,
sb
);
// quantize parameter b to int8 type
auto
insert_loc
=
std
::
next
(
pb
);
std
::
vector
<
float
>
vfb
(
sb
.
elements
(),
0.1
f
);
auto
fb
=
p
.
add_literal
(
migraphx
::
literal
({
migraphx
::
shape
::
float_type
,
sb
.
lens
()},
vfb
));
auto
mb
=
p
.
insert_instruction
(
insert_loc
,
migraphx
::
op
::
mul
{},
fb
,
pb
);
auto
rb
=
p
.
insert_instruction
(
insert_loc
,
migraphx
::
op
::
round
{},
mb
);
auto
cb
=
p
.
insert_instruction
(
insert_loc
,
migraphx
::
op
::
clip
{
127.0
f
,
-
128.0
f
},
rb
);
auto
qb
=
p
.
insert_instruction
(
insert_loc
,
migraphx
::
op
::
convert
{
migraphx
::
shape
::
int8_type
},
cb
);
auto
qdot
=
p
.
add_instruction
(
migraphx
::
op
::
quant_dot
{
1
,
0
},
pa
,
qb
);
auto
fr
=
p
.
add_instruction
(
migraphx
::
op
::
convert
{
migraphx
::
shape
::
float_type
},
qdot
);
std
::
vector
<
float
>
v_alpha
(
fr
->
get_shape
().
elements
(),
10.0
f
);
auto
new_alpha
=
p
.
add_literal
(
migraphx
::
literal
(
fr
->
get_shape
(),
v_alpha
));
p
.
add_instruction
(
migraphx
::
op
::
mul
{},
new_alpha
,
fr
);
return
p
;
};
auto
p
=
create_program
();
const
std
::
vector
<
std
::
pair
<
float
,
float
>>&
quant_params
{
{
0.1
f
,
1.0
f
},
{
0.1
f
,
0.0
f
}};
migraphx
::
quantize_int8
(
p
,
{
"dot"
},
quant_params
);
migraphx
::
run_passes
(
p
,
{
migraphx
::
dead_code_elimination
{}});
auto
qp
=
create_int8_quantized_prog
();
EXPECT
(
p
==
qp
);
}
TEST_CASE
(
conv_float
)
TEST_CASE
(
conv_float
)
{
{
auto
create_program
=
[]
{
auto
create_program
=
[]
{
...
@@ -795,4 +848,117 @@ TEST_CASE(conv_half)
...
@@ -795,4 +848,117 @@ TEST_CASE(conv_half)
EXPECT
(
p
==
qp
);
EXPECT
(
p
==
qp
);
}
}
TEST_CASE
(
target_copy
)
{
auto
run_prog
=
[](
migraphx
::
program
p
,
const
migraphx
::
target
&
t
,
migraphx
::
program
::
parameter_map
&
m_in
,
std
::
vector
<
float
>&
res
)
{
p
.
compile
(
t
);
migraphx
::
program
::
parameter_map
m
;
for
(
auto
&&
x
:
p
.
get_parameter_shapes
())
{
if
(
m_in
.
count
(
x
.
first
)
>
0
)
{
m
[
x
.
first
]
=
t
.
copy_to
(
m_in
[
x
.
first
]);
}
else
{
m
[
x
.
first
]
=
t
.
allocate
(
x
.
second
);
}
}
auto
result
=
t
.
copy_from
(
p
.
eval
(
m
));
result
.
visit
([
&
](
auto
v
)
{
res
.
assign
(
v
.
begin
(),
v
.
end
());
});
};
auto
create_program
=
[]
{
migraphx
::
program
p
;
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
3
,
3
}};
auto
p1
=
p
.
add_parameter
(
"x"
,
s
);
auto
p2
=
p
.
add_parameter
(
"y"
,
s
);
p
.
add_instruction
(
migraphx
::
op
::
add
{},
p1
,
p2
);
return
p
;
};
{
auto
p
=
create_program
();
migraphx
::
program
::
parameter_map
m
;
migraphx
::
shape
s
{
migraphx
::
shape
::
float_type
,
{
3
,
3
}};
m
[
"x"
]
=
migraphx
::
generate_argument
(
s
);
std
::
vector
<
float
>
cpu_result
;
migraphx
::
target
cpu_t
=
migraphx
::
cpu
::
target
{};
run_prog
(
p
,
cpu_t
,
m
,
cpu_result
);
std
::
vector
<
float
>
orig_result
;
run_prog
(
p
,
cpu_t
,
m
,
orig_result
);
EXPECT
(
migraphx
::
verify_range
(
cpu_result
,
orig_result
));
}
}
TEST_CASE
(
int8_quantization
)
{
auto
run_prog
=
[](
migraphx
::
program
p
,
const
migraphx
::
target
&
t
,
migraphx
::
program
::
parameter_map
&
m_in
,
std
::
vector
<
float
>&
res
,
bool
b_quantize
=
false
)
{
if
(
b_quantize
)
{
std
::
vector
<
migraphx
::
program
::
parameter_map
>
cali_data
;
cali_data
.
push_back
(
m_in
);
migraphx
::
quantize_int8
(
p
,
t
,
cali_data
);
}
p
.
compile
(
t
);
migraphx
::
program
::
parameter_map
m
;
for
(
auto
&&
x
:
p
.
get_parameter_shapes
())
{
if
(
m_in
.
count
(
x
.
first
)
>
0
)
{
m
[
x
.
first
]
=
t
.
copy_to
(
m_in
[
x
.
first
]);
}
else
{
m
[
x
.
first
]
=
t
.
allocate
(
x
.
second
);
}
}
auto
result
=
t
.
copy_from
(
p
.
eval
(
m
));
result
.
visit
([
&
](
auto
v
)
{
res
.
assign
(
v
.
begin
(),
v
.
end
());
});
};
auto
create_program
=
[]
{
migraphx
::
program
p
;
migraphx
::
shape
sa
{
migraphx
::
shape
::
float_type
,
{
2
,
16
}};
migraphx
::
shape
sb
{
migraphx
::
shape
::
float_type
,
{
16
,
8
}};
migraphx
::
shape
sc
{
migraphx
::
shape
::
float_type
,
{
2
,
8
}};
auto
pa
=
p
.
add_parameter
(
"a"
,
sa
);
auto
pb
=
p
.
add_parameter
(
"b"
,
sb
);
auto
pc
=
p
.
add_parameter
(
"c"
,
sc
);
p
.
add_instruction
(
migraphx
::
op
::
dot
{},
pa
,
pb
,
pc
);
return
p
;
};
{
auto
p
=
create_program
();
migraphx
::
program
::
parameter_map
m
;
migraphx
::
shape
sa
{
migraphx
::
shape
::
float_type
,
{
2
,
16
}};
migraphx
::
shape
sc
{
migraphx
::
shape
::
float_type
,
{
2
,
8
}};
m
[
"a"
]
=
migraphx
::
generate_argument
(
sa
);
m
[
"c"
]
=
migraphx
::
generate_argument
(
sc
);
std
::
vector
<
float
>
quant_result
;
migraphx
::
target
cpu_t
=
migraphx
::
cpu
::
target
{};
run_prog
(
p
,
cpu_t
,
m
,
quant_result
,
true
);
std
::
vector
<
float
>
no_quant_result
;
run_prog
(
p
,
cpu_t
,
m
,
no_quant_result
);
EXPECT
(
migraphx
::
verify_range
(
quant_result
,
no_quant_result
));
}
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
int
main
(
int
argc
,
const
char
*
argv
[])
{
test
::
run
(
argc
,
argv
);
}
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