1# Copyright 2021 Huawei Technologies Co., Ltd 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14# ============================================================================ 15"""Generate the mindir for bprop""" 16import os 17import numpy as np 18 19import mindspore.nn as nn 20from mindspore import Tensor, Parameter 21from mindspore.ops import operations as P 22import mindspore.ops as ops 23from mindspore.ops.operations import _inner_ops as inner 24import mindspore.common.dtype as mstype 25from mindspore.common.initializer import initializer 26import mindspore.ops._grad as g 27from mindspore.ops.bprop_mindir import serializable_bprop_ops 28from mindspore._c_expression import load_mindir 29 30 31class Net(nn.Cell): 32 def __init__(self, op): 33 super(Net, self).__init__() 34 self.op = op 35 36 def construct(self, *inputs, a=0, b=1): 37 c = a + b 38 return c, self.op(*inputs) 39 40 41class TupleInputNet(nn.Cell): 42 def __init__(self, op): 43 super(TupleInputNet, self).__init__() 44 self.op = op 45 46 def construct(self, x): 47 return self.op((x,)) 48 49 50class GradNet(nn.Cell): 51 def __init__(self, network): 52 super(GradNet, self).__init__() 53 self.grad = ops.GradOperation(get_all=True) 54 self.network = network 55 56 def construct(self, *inputs): 57 gout = self.grad(self.network)(*inputs) 58 return gout 59 60 61def test_remove_mindir_dir(): 62 bprop_path = g.__file__ 63 bprop_installed_dir = bprop_path[: bprop_path.rindex('/')] 64 bprop_mindir_export_dir = bprop_installed_dir + "/../bprop_mindir" 65 os.rename(bprop_mindir_export_dir, bprop_mindir_export_dir + "_bak") 66 x = Tensor(np.array([[[[-1, 1, 10], 67 [1, -1, 1], 68 [10, 1, -1]]]]).astype(np.float32)) 69 relu = Net(P.ReLU()) 70 grad = GradNet(relu) 71 grad.compile(x) 72 os.rename(bprop_mindir_export_dir + "_bak", bprop_mindir_export_dir) 73 74 75def test_load_mindir_dir(): 76 bprop_path = g.__file__ 77 bprop_installed_dir = bprop_path[: bprop_path.rindex('/')] 78 bprop_mindir_export_dir = bprop_installed_dir + "/../bprop_mindir" 79 for op in serializable_bprop_ops: 80 file_name = bprop_mindir_export_dir + "/" + op.name + "_bprop.mindir" 81 graph = load_mindir(file_name) 82 assert not graph is None 83 84 85def test_relu(): 86 x = Tensor(np.array([[[[-1, 1, 10], 87 [1, -1, 1], 88 [10, 1, -1]]]]).astype(np.float32)) 89 relu = Net(P.ReLU()) 90 grad = GradNet(relu) 91 grad.compile(x) 92 93 94def test_identity(): 95 x = Tensor(np.array([1, 2, 3, 4]).astype(np.int64)) 96 identity = Net(P.Identity()) 97 grad = GradNet(identity) 98 grad.compile(x) 99 100 101def test_range(): 102 x = Tensor(np.array([1, 2, 3, 2]).astype(np.int64)) 103 range_net = Net(inner.Range(1.0, 8.0, 2.0)) 104 grad = GradNet(range_net) 105 grad.compile(x) 106 107 108def test_ones_like(): 109 x = Tensor(np.array([[0, 1], [2, 1]]).astype(np.int32)) 110 ones_like = Net(P.OnesLike()) 111 grad = GradNet(ones_like) 112 grad.compile(x) 113 114 115def test_zeros_like(): 116 x = Tensor(np.array([[0, 1], [2, 1]]).astype(np.int32)) 117 zeros_like = Net(P.ZerosLike()) 118 grad = GradNet(zeros_like) 119 grad.compile(x) 120 121 122def test_argmax(): 123 x = Tensor(np.array([[1, 20, 5], [67, 8, 9], [130, 24, 15]]).astype(np.float32)) 124 argmax = Net(P.Argmax()) 125 grad = GradNet(argmax) 126 grad.compile(x) 127 128 129def test_argmin(): 130 x = Tensor(np.array([[1, 20, 5], [67, 8, 9], [130, 24, 15]]).astype(np.float32)) 131 argmin = Net(P.Argmin()) 132 grad = GradNet(argmin) 133 grad.compile(x) 134 135 136def test_broadcast(): 137 x = Tensor(np.array([1, 2, 5, 2]).astype(np.float32)) 138 broadcast = TupleInputNet(P.Broadcast(1)) 139 grad = GradNet(broadcast) 140 grad.compile(x) 141 142 143def test_is_finite(): 144 x = Tensor(np.ones([2, 4]).astype(np.int32)) 145 is_finite = Net(P.IsFinite()) 146 grad = GradNet(is_finite) 147 grad.compile(x) 148 149 150def test_approximate_equal(): 151 x = Tensor(np.array([1, 2, 3]).astype(np.float32)) 152 y = Tensor(np.array([2, 4, 6]).astype(np.float32)) 153 approximate_equal = Net(P.ApproximateEqual(2.)) 154 grad = GradNet(approximate_equal) 155 grad.compile(x, y) 156 157 158def test_logical_not(): 159 x = Tensor(np.array([True, False, True]).astype(np.bool)) 160 logical_not = Net(P.LogicalNot()) 161 grad = GradNet(logical_not) 162 grad.compile(x) 163 164 165def test_sign(): 166 x = Tensor(np.array([[2.0, 0.0, -1.0]]).astype(np.float32)) 167 sign = Net(P.Sign()) 168 grad = GradNet(sign) 169 grad.compile(x) 170 171 172def test_round(): 173 x = Tensor(np.array([0.8, 1.5, 2.3, 2.5, -4.5]).astype(np.float32)) 174 round_net = Net(P.Round()) 175 grad = GradNet(round_net) 176 grad.compile(x) 177 178 179def test_lin_space(): 180 start = Tensor(1, mstype.float32) 181 stop = Tensor(10, mstype.float32) 182 num = 5 183 lin_space = Net(P.LinSpace()) 184 grad = GradNet(lin_space) 185 grad.compile(start, stop, num) 186 187 188def test_dropout_gen_mask(): 189 x = (2, 4, 2, 2) 190 keep_prob = Tensor(1.0, mstype.float32) 191 dropout_gen_mask = Net(P.DropoutGenMask(10, 28)) 192 grad = GradNet(dropout_gen_mask) 193 grad.compile(x, keep_prob) 194 195 196def test_onehot(): 197 indices = Tensor(np.array([0, 1, 2]).astype(np.int32)) 198 depth, on_value, off_value = 3, Tensor(1.0, mstype.float32), Tensor(0.0, mstype.float32) 199 one_hot = Net(P.OneHot()) 200 grad = GradNet(one_hot) 201 grad.compile(indices, depth, on_value, off_value) 202 203 204def test_assign(): 205 class AssignNet(nn.Cell): 206 def __init__(self): 207 super(AssignNet, self).__init__() 208 self.assign = P.Assign() 209 self.variable = Parameter(Tensor([1.0], mstype.float32), name="variable") 210 211 def construct(self, x): 212 return self.assign(self.variable, x) 213 214 value = Tensor([2.0], mstype.float32) 215 assign = AssignNet() 216 grad = GradNet(assign) 217 grad.compile(value) 218 219 220def test_assign_add(): 221 class AssignAddNet(nn.Cell): 222 def __init__(self): 223 super(AssignAddNet, self).__init__() 224 self.assign_add = P.AssignAdd() 225 self.variable = Parameter(initializer(1, [1], mstype.int64), name="global_step") 226 227 def construct(self, x): 228 return self.assign_add(self.variable, x) 229 230 value = Tensor(np.ones([1]).astype(np.int64) * 100) 231 assign_add = AssignAddNet() 232 grad = GradNet(assign_add) 233 grad.compile(value) 234 235 236def test_assign_sub(): 237 class AssignSubNet(nn.Cell): 238 def __init__(self): 239 super(AssignSubNet, self).__init__() 240 self.assign = P.AssignSub() 241 self.variable = Parameter(initializer(1, [1], mstype.int32), name="global_step") 242 243 def construct(self, x): 244 return self.assign(self.variable, x) 245 246 value = Tensor(np.ones([1]).astype(np.int32) * 100) 247 assign_sub = AssignSubNet() 248 grad = GradNet(assign_sub) 249 grad.compile(value) 250 251 252def test_iou(): 253 anchor_boxes = Tensor(np.random.randint(1.0, 5.0, [3, 4]).astype(np.float16)) 254 gt_boxes = Tensor(np.random.randint(1.0, 5.0, [3, 4]).astype(np.float16)) 255 iou = Net(P.IOU()) 256 grad = GradNet(iou) 257 grad.compile(anchor_boxes, gt_boxes) 258 259 260def test_bn_training_reduce(): 261 x = Tensor(np.ones([128, 3, 32, 3]).astype(np.float32)) 262 bn_training_reduce = Net(P.BNTrainingReduce()) 263 grad = GradNet(bn_training_reduce) 264 grad.compile(x) 265 266 267def test_equal(): 268 x = Tensor([2.0], mstype.float32) 269 y = Tensor([2.0], mstype.float32) 270 equal = Net(P.Equal()) 271 grad = GradNet(equal) 272 grad.compile(x, y) 273 274 275def test_not_equal(): 276 x = Tensor([2.0], mstype.float32) 277 y = Tensor([2.0], mstype.float32) 278 not_equal = Net(P.NotEqual()) 279 grad = GradNet(not_equal) 280 grad.compile(x, y) 281 282 283def test_greater(): 284 x = Tensor(np.array([1, 2, 3]), mstype.int32) 285 y = Tensor(np.array([1, 1, 4]), mstype.int32) 286 greater = Net(P.Greater()) 287 grad = GradNet(greater) 288 grad.compile(x, y) 289 290 291def test_greater_equal(): 292 x = Tensor(np.array([1, 2, 3]), mstype.int32) 293 y = Tensor(np.array([1, 1, 4]), mstype.int32) 294 greater_equal = Net(P.GreaterEqual()) 295 grad = GradNet(greater_equal) 296 grad.compile(x, y) 297 298 299def test_less(): 300 x = Tensor(np.array([1, 2, 3]), mstype.int32) 301 y = Tensor(np.array([1, 1, 4]), mstype.int32) 302 less = Net(P.Less()) 303 grad = GradNet(less) 304 grad.compile(x, y) 305 306 307def test_less_equal(): 308 x = Tensor(np.array([1, 2, 3]), mstype.int32) 309 y = Tensor(np.array([1, 1, 4]), mstype.int32) 310 less_equal = Net(P.LessEqual()) 311 grad = GradNet(less_equal) 312 grad.compile(x, y) 313 314 315def test_logical_and(): 316 x = Tensor(np.array([True, False, True]), mstype.bool_) 317 y = Tensor(np.array([True, True, False]), mstype.bool_) 318 logical_and = Net(P.LogicalAnd()) 319 grad = GradNet(logical_and) 320 grad.compile(x, y) 321 322 323def test_logical_or(): 324 x = Tensor(np.array([True, False, True]), mstype.bool_) 325 y = Tensor(np.array([True, True, False]), mstype.bool_) 326 logical_or = Net(P.LogicalOr()) 327 grad = GradNet(logical_or) 328 grad.compile(x, y) 329 330 331def test_reduce_all(): 332 x = Tensor(np.array([[True, False], [True, True]])) 333 reduce_all = Net(P.ReduceAll(keep_dims=True)) 334 grad = GradNet(reduce_all) 335 grad.compile(x) 336 337 338def test_reduce_any(): 339 x = Tensor(np.array([[True, False], [True, True]])) 340 reduce_all = Net(P.ReduceAny(keep_dims=True)) 341 grad = GradNet(reduce_all) 342 grad.compile(x) 343 344 345def test_dropout_do_mask(): 346 input_x = Tensor(np.ones([2, 2, 3]), mstype.float32) 347 keep_prob = Tensor(0.5, mstype.float32) 348 mask = Tensor(np.ones([2]), mstype.uint8) 349 dropout_do_mask = Net(P.DropoutDoMask()) 350 grad = GradNet(dropout_do_mask) 351 grad.compile(input_x, mask, keep_prob) 352