File: device_test.cc

package info (click to toggle)
pytorch 1.13.1%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 139,252 kB
  • sloc: cpp: 1,100,274; python: 706,454; ansic: 83,052; asm: 7,618; java: 3,273; sh: 2,841; javascript: 612; makefile: 323; xml: 269; ruby: 185; yacc: 144; objc: 68; lex: 44
file content (77 lines) | stat: -rw-r--r-- 2,415 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "caffe2/core/common.h"
#include "caffe2/opt/converter.h"
#include "caffe2/opt/device.h"

#include <gtest/gtest.h>

using namespace nom::repr;

#define ADD_ARG(_op, _name, _type, _val)    \
  {                                         \
    caffe2::Argument* arg = _op->add_arg(); \
    arg->set_name(_name);                   \
    arg->set_##_type(_val);                 \
  }

TEST(DeviceTest, InsertCopies) {
  caffe2::NetDef net;
  for (auto i = 0; i < 9; ++i) {
    if (i % 3 == 0) {
      caffe2::OperatorDef* def = net.add_op();
      def->set_type("Conv");
      def->add_input("X");
      def->add_input("W" + c10::to_string(i));
      def->add_input("b" + c10::to_string(i));
      ADD_ARG(def, "kernel", i, 3);
      ADD_ARG(def, "stride", i, 1);
      ADD_ARG(def, "pad", i, 0);
      ADD_ARG(def, "order", s, "NCHW");
      def->add_output("X");
      def->mutable_device_option()->set_device_type(caffe2::PROTO_CPU);
    } else {
      caffe2::OperatorDef* def = net.add_op();
      def->set_type("Relu");
      def->add_input("X");
      def->add_output("X");
      def->mutable_device_option()->set_device_type(caffe2::PROTO_CPU);
    }
  }
  auto nn = caffe2::convertToNNModule(net);

  for (auto node : nn.dataFlow.getMutableNodes()) {
    if (nn::is<Relu>(node)) {
      auto annot = nn::get<NeuralNetOperator>(node)->getMutableAnnotation();
      auto c2_annot = dyn_cast<caffe2::Caffe2Annotation>(annot);
      c2_annot->setDeviceType(caffe2::PROTO_OPENCL);
    }
  }

  caffe2::opt::insertCopies(
      &nn,
      [](NNGraph::NodeRef node) {
        // Ignore all tensors
        if (!nn::is<NeuralNetOperator>(node)) {
          return true;
        }
        auto annot = nn::get<NeuralNetOperator>(node)->getMutableAnnotation();
        NOM_REQUIRE_OR_RET_FALSE(annot);
        auto c2_annot = dyn_cast<caffe2::Caffe2Annotation>(annot);
        NOM_REQUIRE_OR_RET_FALSE(c2_annot);
        return c2_annot->getDeviceType() == caffe2::PROTO_OPENCL;
      },
      [](NNGraph& g) {
        return g.createNode(std::make_unique<GenericOperator>());
      },
      [](NNGraph& g) {
        return g.createNode(std::make_unique<GenericOperator>());
      });

  auto proto = caffe2::convertToCaffe2Proto(nn, net);

  // Conv -> Relu -> Relu
  // becomes
  // Conv -> Generic -> Relu -> Relu -> Generic
  // thus
  // 9 ops of this pattern becomes 15
  EXPECT_EQ(proto.op().size(), 15);
}