"examples/transformers/vscode:/vscode.git/clone" did not exist on "6090ad683fe2e595e32f37247a69fd91380a82b5"
rewrite_pooling_test.cpp 6.96 KB
Newer Older
Shucai Xiao's avatar
Shucai Xiao committed
1
#include <migraphx/rewrite_pooling.hpp>
2
#include <migraphx/op/pooling.hpp>
Shucai Xiao's avatar
Shucai Xiao committed
3
4
#include <migraphx/dead_code_elimination.hpp>
#include <migraphx/program.hpp>
5
#include <migraphx/ref/target.hpp>
Shucai Xiao's avatar
Shucai Xiao committed
6
7
8
9
#include <migraphx/instruction.hpp>
#include <migraphx/generate.hpp>
#include <migraphx/ranges.hpp>
#include <test.hpp>
10
11
#include <migraphx/make_op.hpp>

Shucai Xiao's avatar
Shucai Xiao committed
12
13
14
#include <migraphx/verify.hpp>

bool is_pooling(migraphx::instruction& ins) { return ins.name() == "pooling"; }
Paul Fultz II's avatar
Paul Fultz II committed
15
static void opt_pooling(migraphx::module& m)
Shucai Xiao's avatar
Shucai Xiao committed
16
17
18
{
    migraphx::rewrite_pooling rp;
    migraphx::dead_code_elimination dce;
Paul Fultz II's avatar
Paul Fultz II committed
19
20
    rp.apply(m);
    dce.apply(m);
Shucai Xiao's avatar
Shucai Xiao committed
21
22
23
24
25
}

TEST_CASE(rewrite_pooling_test)
{
    migraphx::shape s{migraphx::shape::float_type, {2, 2, 3, 4, 5}};
26
    auto pooling_program = [&](const migraphx::op::pooling_mode mode) {
Paul Fultz II's avatar
Paul Fultz II committed
27
28
29
30
31
32
33
34
35
36
        migraphx::module m;
        auto input = m.add_parameter("x", s);
        auto ret   = m.add_instruction(migraphx::make_op("pooling",
                                                       {{"mode", mode},
                                                        {"padding", {0, 0, 0}},
                                                        {"stride", {1, 1, 1}},
                                                        {"lengths", {3, 4, 5}}}),
                                     input);
        m.add_return({ret});
        return m;
Shucai Xiao's avatar
Shucai Xiao committed
37
38
39
    };

    auto opt_program = [&](const migraphx::operation& reduce_op) {
Paul Fultz II's avatar
Paul Fultz II committed
40
41
42
43
        migraphx::module m;
        auto input = m.add_parameter("x", s);
        auto rsp   = m.add_instruction(migraphx::make_op("reshape", {{"dims", {4, -1}}}), input);
        auto rdm   = m.add_instruction(reduce_op, rsp);
44
        auto ret =
Paul Fultz II's avatar
Paul Fultz II committed
45
46
47
            m.add_instruction(migraphx::make_op("reshape", {{"dims", {2, 2, 1, 1, 1}}}), rdm);
        m.add_return({ret});
        return m;
Shucai Xiao's avatar
Shucai Xiao committed
48
49
    };

50
    auto test_rewrite = [&](const migraphx::op::pooling_mode mode, const migraphx::operation& op) {
Paul Fultz II's avatar
Paul Fultz II committed
51
52
53
54
        migraphx::module m1 = pooling_program(mode);
        migraphx::module m2 = opt_program(op);
        opt_pooling(m1);
        EXPECT(m1 == m2);
Shucai Xiao's avatar
Shucai Xiao committed
55
56
    };

57
58
59
    test_rewrite(migraphx::op::pooling_mode::average,
                 migraphx::make_op("reduce_mean", {{"axes", {1}}}));
    test_rewrite(migraphx::op::pooling_mode::max, migraphx::make_op("reduce_max", {{"axes", {1}}}));
Shucai Xiao's avatar
Shucai Xiao committed
60
61
62
63
64
65
}

TEST_CASE(rewrite_avepooling_na1_test)
{
    migraphx::shape s{migraphx::shape::float_type, {2, 2, 3, 4, 5}};
    auto pooling_program = [&]() {
Paul Fultz II's avatar
Paul Fultz II committed
66
67
68
        migraphx::module m;

        auto input = m.add_parameter("x", s);
69
70
71
72
73
74
75
        auto ret =
            m.add_instruction(migraphx::make_op("pooling",
                                                {{"mode", migraphx::op::pooling_mode::average},
                                                 {"padding", {0, 1, 0}},
                                                 {"stride", {1, 1, 1}},
                                                 {"lengths", {3, 4, 5}}}),
                              input);
Paul Fultz II's avatar
Paul Fultz II committed
76
77
        m.add_return({ret});
        return m;
Shucai Xiao's avatar
Shucai Xiao committed
78
79
    };

Paul Fultz II's avatar
Paul Fultz II committed
80
81
    migraphx::module m1 = pooling_program();
    migraphx::module m2 = m1;
82

Paul Fultz II's avatar
Paul Fultz II committed
83
84
    opt_pooling(m1);
    EXPECT(m1 == m2);
Shucai Xiao's avatar
Shucai Xiao committed
85
86
87
88
89
90
}

TEST_CASE(rewrite_avepooling_na2_test)
{
    migraphx::shape s{migraphx::shape::float_type, {2, 2, 3, 4, 5}};
    auto pooling_program = [&]() {
Paul Fultz II's avatar
Paul Fultz II committed
91
92
93
        migraphx::module m;

        auto input = m.add_parameter("x", s);
94
95
96
97
98
99
100
        auto ret =
            m.add_instruction(migraphx::make_op("pooling",
                                                {{"mode", migraphx::op::pooling_mode::average},
                                                 {"padding", {0, 0, 0}},
                                                 {"stride", {1, 2, 1}},
                                                 {"lengths", {3, 4, 5}}}),
                              input);
Paul Fultz II's avatar
Paul Fultz II committed
101
102
        m.add_return({ret});
        return m;
Shucai Xiao's avatar
Shucai Xiao committed
103
104
    };

Paul Fultz II's avatar
Paul Fultz II committed
105
106
    migraphx::module m1 = pooling_program();
    migraphx::module m2 = m1;
107

Paul Fultz II's avatar
Paul Fultz II committed
108
109
    opt_pooling(m1);
    EXPECT(m1 == m2);
Shucai Xiao's avatar
Shucai Xiao committed
110
111
112
113
114
115
}

TEST_CASE(rewrite_avepooling_na3_test)
{
    migraphx::shape s{migraphx::shape::float_type, {2, 2, 3, 4, 5}};
    auto pooling_program = [&]() {
Paul Fultz II's avatar
Paul Fultz II committed
116
117
118
119
        migraphx::module m;

        auto input = m.add_parameter("x", s);
        auto ret   = m.add_instruction(migraphx::make_op("pooling",
120
                                                       {{"mode", migraphx::op::pooling_mode::max},
Paul Fultz II's avatar
Paul Fultz II committed
121
122
123
124
125
126
                                                        {"padding", {0, 0, 0}},
                                                        {"stride", {1, 1, 1}},
                                                        {"lengths", {3, 3, 5}}}),
                                     input);
        m.add_return({ret});
        return m;
Shucai Xiao's avatar
Shucai Xiao committed
127
128
    };

Paul Fultz II's avatar
Paul Fultz II committed
129
130
    migraphx::module m1 = pooling_program();
    migraphx::module m2 = m1;
131

Paul Fultz II's avatar
Paul Fultz II committed
132
133
    opt_pooling(m1);
    EXPECT(m1 == m2);
Shucai Xiao's avatar
Shucai Xiao committed
134
135
136
137
138
139
140
141
}

TEST_CASE(literal_rewrite_pooling_test)
{
    migraphx::shape s{migraphx::shape::float_type, {2, 2, 3, 4, 5}};
    std::vector<float> data(s.elements());
    std::iota(data.begin(), data.end(), 1.0f);

142
    auto pooling_program = [&](const migraphx::op::pooling_mode mode) {
Shucai Xiao's avatar
Shucai Xiao committed
143
        migraphx::program p;
144
145
146

        auto* mm   = p.get_main_module();
        auto input = mm->add_literal(migraphx::literal(s, data));
147
148
149
150
151
        auto ret   = mm->add_instruction(migraphx::make_op("pooling",
                                                         {{"mode", mode},
                                                          {"padding", {0, 0, 0}},
                                                          {"stride", {1, 1, 1}},
                                                          {"lengths", {3, 4, 5}}}),
152
153
                                       input);
        mm->add_return({ret});
Shucai Xiao's avatar
Shucai Xiao committed
154
155
156
157
158
        return p;
    };

    auto opt_program = [&](const migraphx::operation& op) {
        migraphx::program p;
159
160
        auto* mm   = p.get_main_module();
        auto input = mm->add_literal(migraphx::literal(s, data));
161
        auto rsp   = mm->add_instruction(migraphx::make_op("reshape", {{"dims", {4, -1}}}), input);
162
        auto rdm   = mm->add_instruction(op, rsp);
163
164
        auto ret =
            mm->add_instruction(migraphx::make_op("reshape", {{"dims", {2, 2, 1, 1, 1}}}), rdm);
165
        mm->add_return({ret});
Shucai Xiao's avatar
Shucai Xiao committed
166
167
168
169

        return p;
    };

170
171
    auto test_rewrite_pooling = [&](const migraphx::op::pooling_mode mode,
                                    const migraphx::operation& op) {
Shucai Xiao's avatar
Shucai Xiao committed
172
173
        migraphx::program p1 = pooling_program(mode);
        migraphx::program p2 = opt_program(op);
174
175
        p1.compile(migraphx::ref::target{});
        p2.compile(migraphx::ref::target{});
Shucai Xiao's avatar
Shucai Xiao committed
176
177
178
179
180
181
        auto result1 = p1.eval({}).back();
        auto result2 = p2.eval({}).back();
        visit_all(result1,
                  result2)([&](auto r1, auto r2) { EXPECT(migraphx::verify_range(r1, r2)); });
    };

182
183
184
185
    test_rewrite_pooling(migraphx::op::pooling_mode::max,
                         migraphx::make_op("reduce_max", {{"axes", {1}}}));
    test_rewrite_pooling(migraphx::op::pooling_mode::average,
                         migraphx::make_op("reduce_mean", {{"axes", {1}}}));
Shucai Xiao's avatar
Shucai Xiao committed
186
187
188
}

int main(int argc, const char* argv[]) { test::run(argc, argv); }