Commit a4f8d30b authored by Paul's avatar Paul
Browse files

Merge branch 'develop' into layout-nhwc

parents d12efcd2 a8d86615
 scatter_test:
9
data
indices
updatey"Scatter*
axis scatter_testZ
data




Z!
indices




Z
update




b
y




B
\ No newline at end of file
......@@ -4,7 +4,6 @@ if sys.version_info < (3, 0):
import argparse
import os
import platform
import unittest
import onnx
import onnx.backend.test
......@@ -173,6 +172,8 @@ def create_backend_test(testname=None, target_device=None):
backend_test.include(r'.*test_reduce.*')
backend_test.include(r'.*test_ReLU*')
backend_test.include(r'.*test_relu.*')
backend_test.include(r'.*test_scatter.*')
backend_test.include(r'.*test_Scatter.*')
backend_test.include(r'.*test_selu.*')
backend_test.include(r'.*test_shape.*')
backend_test.include(r'.*test_Sigmoid*')
......@@ -276,6 +277,7 @@ def create_backend_test(testname=None, target_device=None):
backend_test.exclude(r'test_mean_one_input_cpu')
backend_test.exclude(r'test_mean_two_inputs_cpu')
backend_test.exclude(r'test_negative_log_likelihood_loss_*')
backend_test.exclude(r'test_scatternd_*')
# all reduce ops have dynamic axes inputs
backend_test.exclude(r'test_size_cpu')
......
import migraphx, array, sys
import migraphx
def test_add_op():
......
......@@ -3831,6 +3831,84 @@ TEST_CASE(rsqrt_test)
EXPECT(migraphx::verify_range(results_vector, gold));
}
TEST_CASE(scatter_test)
{
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx::shape sd{migraphx::shape::float_type, {3, 3}};
std::vector<float> vd(sd.elements(), 0.0f);
migraphx::shape si{migraphx::shape::int32_type, {2, 3}};
std::vector<int> vi = {1, 0, 2, 0, 2, 1};
migraphx::shape su{migraphx::shape::float_type, {2, 3}};
std::vector<float> vu = {1.0, 1.1, 1.2, 2.0, 2.1, 2.2};
auto ld = mm->add_literal(migraphx::literal{sd, vd});
auto li = mm->add_literal(migraphx::literal{si, vi});
auto lu = mm->add_literal(migraphx::literal{su, vu});
auto r = mm->add_instruction(migraphx::make_op("scatter", {{"axis", 0}}), ld, li, lu);
mm->add_return({r});
p.compile(migraphx::ref::target{});
auto result = p.eval({}).back();
std::vector<float> results_vector;
result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
std::vector<float> gold = {2.0, 1.1, 0.0, 1.0, 0.0, 2.2, 0.0, 2.1, 1.2};
EXPECT(migraphx::verify_range(results_vector, gold));
}
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx::shape sd{migraphx::shape::float_type, {3, 3}};
std::vector<float> vd(sd.elements(), 0.0f);
migraphx::shape si{migraphx::shape::int32_type, {2, 3}};
std::vector<int> vi = {1, 0, -1, 0, 2, -2};
migraphx::shape su{migraphx::shape::float_type, {2, 3}};
std::vector<float> vu = {1.0, 1.1, 1.2, 2.0, 2.1, 2.2};
auto ld = mm->add_literal(migraphx::literal{sd, vd});
auto li = mm->add_literal(migraphx::literal{si, vi});
auto lu = mm->add_literal(migraphx::literal{su, vu});
auto r = mm->add_instruction(migraphx::make_op("scatter", {{"axis", -2}}), ld, li, lu);
mm->add_return({r});
p.compile(migraphx::ref::target{});
auto result = p.eval({}).back();
std::vector<float> results_vector;
result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
std::vector<float> gold = {2.0, 1.1, 0.0, 1.0, 0.0, 2.2, 0.0, 2.1, 1.2};
EXPECT(migraphx::verify_range(results_vector, gold));
}
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx::shape sd{migraphx::shape::float_type, {3, 3}};
std::vector<float> vd(sd.elements(), 0.0f);
migraphx::shape si{migraphx::shape::int32_type, {2, 3}};
std::vector<int> vi = {1, 0, 2, 0, 2, 1};
migraphx::shape su{migraphx::shape::float_type, {2, 3}};
std::vector<float> vu = {1.0, 1.1, 1.2, 2.0, 2.1, 2.2};
auto ld = mm->add_literal(migraphx::literal{sd, vd});
auto li = mm->add_literal(migraphx::literal{si, vi});
auto lu = mm->add_literal(migraphx::literal{su, vu});
auto r = mm->add_instruction(migraphx::make_op("scatter", {{"axis", 1}}), ld, li, lu);
mm->add_return({r});
p.compile(migraphx::ref::target{});
auto result = p.eval({}).back();
std::vector<float> results_vector;
result.visit([&](auto output) { results_vector.assign(output.begin(), output.end()); });
std::vector<float> gold = {1.1, 1.0, 1.2, 2.0, 2.2, 2.1, 0.0, 0.0, 0.0};
EXPECT(migraphx::verify_range(results_vector, gold));
}
}
TEST_CASE(sigmoid_test)
{
migraphx::program p;
......
# This script generates tf pb files for MIGraphX tf operator tests.
# To generate an individual pb file, you can use the following
# command: python -c "import gen_tf_pb; gen_tf_pb.{test_name}_test()"
import numpy as np
import tensorflow as tf
from tensorflow.core.framework import attr_value_pb2
def tf_test(op_test):
......
#include "verify_program.hpp"
#include <migraphx/program.hpp>
#include <migraphx/generate.hpp>
#include <migraphx/make_op.hpp>
#include <migraphx/instruction.hpp>
struct test_add_broadcast6 : verify_program<test_add_broadcast6>
{
migraphx::program create_program() const
{
migraphx::program p;
auto* mm = p.get_main_module();
auto x = mm->add_parameter("x", {migraphx::shape::float_type, {1, 64, 568, 1328}});
auto y = mm->add_parameter("y", {migraphx::shape::float_type, {64}});
auto by = mm->add_instruction(
migraphx::make_op("broadcast", {{"axis", 1}, {"dims", {1, 64, 568, 1328}}}), y);
mm->add_instruction(migraphx::make_op("add"), x, by);
return p;
}
};
#include "verify_program.hpp"
#include <migraphx/program.hpp>
#include <migraphx/generate.hpp>
#include <migraphx/make_op.hpp>
struct test_scatter0 : verify_program<test_scatter0>
{
migraphx::program create_program() const
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx::shape sd{migraphx::shape::float_type, {3, 3}};
migraphx::shape si{migraphx::shape::int32_type, {2, 3}};
std::vector<int> vi = {1, 0, 2, 0, 2, 1};
migraphx::shape su{migraphx::shape::float_type, {2, 3}};
auto pd = mm->add_parameter("data", sd);
auto li = mm->add_literal(migraphx::literal{si, vi});
auto pu = mm->add_parameter("update", su);
auto r = mm->add_instruction(migraphx::make_op("scatter", {{"axis", -1}}), pd, li, pu);
mm->add_return({r});
return p;
}
};
#include "verify_program.hpp"
#include <migraphx/program.hpp>
#include <migraphx/generate.hpp>
#include <migraphx/make_op.hpp>
struct test_scatter1 : verify_program<test_scatter1>
{
migraphx::program create_program() const
{
migraphx::program p;
auto* mm = p.get_main_module();
migraphx::shape sd{migraphx::shape::float_type, {3, 3}};
migraphx::shape si{migraphx::shape::int32_type, {2, 3}};
std::vector<int> vi = {-2, 0, 2, 0, -1, 1};
migraphx::shape su{migraphx::shape::float_type, {2, 3}};
auto pd = mm->add_parameter("data", sd);
auto li = mm->add_literal(migraphx::literal{si, vi});
auto pu = mm->add_parameter("update", su);
auto r = mm->add_instruction(migraphx::make_op("scatter", {{"axis", -2}}), pd, li, pu);
mm->add_return({r});
return p;
}
};
import string, sys, re, os, runpy
import string, sys, re, runpy
from functools import wraps
type_map = {}
......
import string, sys, re, os
import string, sys, re
trivial = ['std::size_t', 'instruction_ref']
......
import os
import numpy as np
import argparse
import onnx
from onnx import numpy_helper
import migraphx
def parse_args():
parser = argparse.ArgumentParser(description="MIGraphX test runner")
parser.add_argument('test_dir',
type=str,
metavar='test_loc',
help='folder where the test is stored')
parser.add_argument('--target',
type=str,
default='gpu',
help='Specify where the tests execute (ref, gpu)')
args = parser.parse_args()
return args
def get_sub_folders(dir_name):
dir_contents = os.listdir(dir_name)
folders = []
for item in dir_contents:
tmp_item = dir_name + '/' + item
if os.path.isdir(tmp_item):
folders.append(item)
folders.sort()
return folders
def get_test_cases(dir_name):
return get_sub_folders(dir_name)
def get_model_name(dir_name):
dir_contents = os.listdir(dir_name)
for item in dir_contents:
file_name = dir_name + '/' + item
if os.path.isfile(file_name) and file_name.endswith('.onnx'):
return item
return ''
def read_pb_file(filename):
with open(filename, 'rb') as pfile:
data_str = pfile.read()
tensor = onnx.TensorProto()
tensor.ParseFromString(data_str)
np_array = numpy_helper.to_array(tensor)
return np_array
def wrapup_inputs(io_folder, parameter_names):
index = 0
param_map = {}
for param_name in parameter_names:
file_name = io_folder + '/input_' + str(index) + '.pb'
data = read_pb_file(file_name)
param_map[param_name] = data
index = index + 1
return param_map
def read_outputs(io_folder, out_num):
outputs = []
for i in range(out_num):
file_name = io_folder + '/output_' + str(i) + '.pb'
data = read_pb_file(file_name)
outputs.append(data)
return outputs
def run_one_case(model, param_map):
# convert np array to model argument
pp = {}
for key, val in param_map.items():
print("input = {}".format(val))
pp[key] = migraphx.argument(val)
# run the model
model_outputs = model.run(param_map)
# convert argument to np array
outputs = []
for output in model_outputs:
outputs.append(np.array(output))
return outputs
def check_correctness(gold_outputs, outputs, rtol=1e-3, atol=1e-3):
if len(gold_outputs) != len(outputs):
print("Number of outputs {} is not equal to expected number {}".format(
len(outputs), len(gold_outputs)))
return False
out_num = len(gold_outputs)
ret = True
for i in range(out_num):
print("Expected value: \n{}".format(gold_outputs[i]))
print("Actual value: \n{}".format(outputs[i]))
if not np.allclose(gold_outputs[i], outputs[i], rtol, atol):
print("Output {} is incorrect ...".format(i))
print("Expected value: \n{}".format(gold_outputs[i]))
print("Actual value: \n{}".format(outputs[i]))
ret = False
return ret
def tune_input_shape(model, input_data):
param_shapes = model.get_parameter_shapes()
input_shapes = {}
for name, s in param_shapes.items():
assert name in input_data
data_shape = list(input_data[name].shape)
if not np.array_equal(data_shape, s.lens()):
input_shapes[name] = data_shape
return input_shapes
def main():
args = parse_args()
test_loc = args.test_dir
target = args.target
test_name = os.path.basename(os.path.normpath(test_loc))
print("Running test \"{}\" on target \"{}\" ...\n".format(
test_name, target))
# get model full path
model_name = get_model_name(test_loc)
model_path_name = test_loc + '/' + model_name
# read and compile model
model = migraphx.parse_onnx(model_path_name)
param_names = model.get_parameter_names()
output_shapes = model.get_output_shapes()
model.compile(migraphx.get_target(target))
# get test cases
cases = get_test_cases(test_loc)
case_num = len(cases)
correct_num = 0
for case_name in cases:
io_folder = test_loc + '/' + case_name
input_data = wrapup_inputs(io_folder, param_names)
gold_output_data = read_outputs(io_folder, len(output_shapes))
# if input shape is different from model shape, reload and recompile
# model
input_shapes = tune_input_shape(model, input_data)
if not len(input_shapes) == 0:
model = migraphx.parse_onnx(model_path_name,
map_input_dims=input_shapes)
model.compile(migraphx.get_target(target))
# run the model and return outputs
output_data = run_one_case(model, input_data)
# check output correctness
ret = check_correctness(gold_output_data, output_data)
if ret:
correct_num += 1
output_str = "PASSED" if ret else "FAILED"
print("\tCase {}: {}".format(case_name, output_str))
print("\nTest \"{}\" has {} cases:".format(test_name, case_num))
print("\t Passed: {}".format(correct_num))
print("\t Failed: {}".format(case_num - correct_num))
if case_num > correct_num:
error_num = case_num - correct_num
raise ValueError(str(error_num) + " cases failed!")
if __name__ == "__main__":
main()
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment