1# Copyright 2020 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 16import numpy as np 17import pytest 18 19import mindspore.context as context 20from mindspore.common.tensor import Tensor 21import mindspore.nn as nn 22from mindspore.ops.operations import _quant_ops as Q 23 24context.set_context(mode=context.PYNATIVE_MODE, device_target='GPU', device_id=0) 25 26 27class Net(nn.Cell): 28 def __init__(self, 29 num_bits=8, 30 quant_delay=0, 31 symmetric=False, 32 narrow_range=False, 33 training=True): 34 super(Net, self).__init__() 35 self.fake_quant = Q.FakeQuantPerLayer(num_bits=num_bits, 36 quant_delay=quant_delay, 37 symmetric=symmetric, 38 narrow_range=narrow_range, 39 training=training) 40 41 def construct(self, x, minq, maxq): 42 return self.fake_quant(x, minq, maxq) 43 44 45@pytest.mark.level0 46@pytest.mark.platform_x86_gpu_training 47@pytest.mark.env_onecard 48def test_fake_quant1(): 49 # (8, false, 0.0f, 0.0f, TensorShape({2, 3}), 50 # {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, 51 # {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}); 52 x = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0]).reshape(2, 3).astype(np.float32) 53 min_val = np.array([0]).reshape(1).astype(np.float32) 54 max_val = np.array([0]).reshape(1).astype(np.float32) 55 expect = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0]).astype(np.float32) 56 57 net = Net(num_bits=8, narrow_range=False) 58 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 59 60 error = np.ones(shape=expect.shape) * 1.0e-5 61 diff = output.asnumpy().flatten() - expect 62 print("output: ", output) 63 print("expect: ", expect) 64 assert np.all(np.abs(diff) < error) 65 66 67@pytest.mark.level1 68@pytest.mark.platform_x86_gpu_training 69@pytest.mark.env_onecard 70def test_fake_quant2(): 71 # 8, false, -10.0f, 53.75f, TensorShape({2, 3}), 72 # {-10.1f, -10.0f, -9.9f, -9.75f, 53.75f, 53.8f}, 73 # {-10.0f, -10.0f, -10.0f, -9.75f, 53.75f, 53.75f}); 74 x = np.array([-10.1, -10.0, -9.9, -9.75, 53.75, 53.8]).reshape(2, 3).astype(np.float32) 75 min_val = np.array([-10.0]).reshape(1).astype(np.float32) 76 max_val = np.array([53.75]).reshape(1).astype(np.float32) 77 expect = np.array([-10.0, -10.0, -10.0, -9.75, 53.75, 53.75]).astype(np.float32) 78 79 net = Net(num_bits=8, narrow_range=False) 80 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 81 82 error = np.ones(shape=expect.shape) * 1.0e-5 83 diff = output.asnumpy().flatten() - expect 84 print("output: ", output) 85 print("expect: ", expect) 86 assert np.all(np.abs(diff) < error) 87 88 89@pytest.mark.level1 90@pytest.mark.platform_x86_gpu_training 91@pytest.mark.env_onecard 92def test_fake_quant3(): 93 # WithVarsNoNudging_NarrowRange 94 x = np.array([-10.1, -10.0, -9.90, -9.75, 53.5, 53.6]).reshape(2, 3).astype(np.float32) 95 min_val = np.array([-10.0]).reshape(1).astype(np.float32) 96 max_val = np.array([53.5]).reshape(1).astype(np.float32) 97 expect = np.array([-10.0, -10.0, -10.0, -9.75, 53.5, 53.5]).astype(np.float32) 98 99 net = Net(num_bits=8, narrow_range=True) 100 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 101 102 error = np.ones(shape=expect.shape) * 1.0e-5 103 diff = output.asnumpy().flatten() - expect 104 print("output: ", output) 105 print("expect: ", expect) 106 assert np.all(np.abs(diff) < error) 107 108 109@pytest.mark.level1 110@pytest.mark.platform_x86_gpu_training 111@pytest.mark.env_onecard 112def test_fake_quant4(): 113 # WithVarsNudgedDown_RegularRange 114 x = np.array([-0.1, 0.0, 0.1, 0.25, 63.75, 63.8]).reshape(2, 3).astype(np.float32) 115 min_val = np.array([-0.1]).reshape(1).astype(np.float32) 116 max_val = np.array([63.65]).reshape(1).astype(np.float32) 117 expect = np.array([-0.0, 0.0, 0.0, 0.25, 63.75, 63.75]).astype(np.float32) 118 119 net = Net(num_bits=8, narrow_range=False) 120 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 121 122 error = np.ones(shape=expect.shape) * 1.0e-5 123 diff = output.asnumpy().flatten() - expect 124 print("output: ", output) 125 print("expect: ", expect) 126 assert np.all(np.abs(diff) < error) 127 128 129@pytest.mark.level1 130@pytest.mark.platform_x86_gpu_training 131@pytest.mark.env_onecard 132def test_fake_quant5(): 133 # WithVarsNudgedDown_NarrowRange 134 x = np.array([-0.1, 0.0, 0.1, 0.25, 63.5, 63.6]).reshape(2, 3).astype(np.float32) 135 min_val = np.array([-0.1]).reshape(1).astype(np.float32) 136 max_val = np.array([63.4]).reshape(1).astype(np.float32) 137 expect = np.array([-0.0, 0.0, 0.0, 0.25, 63.5, 63.5]).astype(np.float32) 138 139 net = Net(num_bits=8, narrow_range=True) 140 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 141 142 error = np.ones(shape=expect.shape) * 1.0e-5 143 diff = output.asnumpy().flatten() - expect 144 print("output: ", output) 145 print("expect: ", expect) 146 assert np.all(np.abs(diff) < error) 147 148 149@pytest.mark.level1 150@pytest.mark.platform_x86_gpu_training 151@pytest.mark.env_onecard 152def test_fake_quant6(): 153 # WithVarsNudgedUp_RegularRange 154 x = np.array([-0.26, -0.25, -0.24, 0.0, 63.5, 63.6]).reshape(2, 3).astype(np.float32) 155 min_val = np.array([-0.125]).reshape(1).astype(np.float32) 156 max_val = np.array([63.625]).reshape(1).astype(np.float32) 157 expect = np.array([-0.25, -0.25, -0.25, 0.0, 63.5, 63.5]).astype(np.float32) 158 159 net = Net(num_bits=8, narrow_range=False) 160 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 161 162 error = np.ones(shape=expect.shape) * 1.0e-5 163 diff = output.asnumpy().flatten() - expect 164 print("output: ", output) 165 print("expect: ", expect) 166 assert np.all(np.abs(diff) < error) 167 168 169@pytest.mark.level1 170@pytest.mark.platform_x86_gpu_training 171@pytest.mark.env_onecard 172def test_fake_quant7(): 173 # WithVarsNudgedUp_NarrowRange 174 x = np.array([-0.26, -0.25, -0.24, 0.0, 63.25, 63.3]).reshape(2, 3).astype(np.float32) 175 min_val = np.array([-0.125]).reshape(1).astype(np.float32) 176 max_val = np.array([63.375]).reshape(1).astype(np.float32) 177 expect = np.array([-0.25, -0.25, -0.25, 0.0, 63.25, 63.25]).astype(np.float32) 178 179 net = Net(num_bits=8, narrow_range=True) 180 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 181 182 error = np.ones(shape=expect.shape) * 1.0e-5 183 diff = output.asnumpy().flatten() - expect 184 print("output: ", output) 185 print("expect: ", expect) 186 assert np.all(np.abs(diff) < error) 187 188 189@pytest.mark.level1 190@pytest.mark.platform_x86_gpu_training 191@pytest.mark.env_onecard 192def test_fake_quant8(): 193 # WithVarsNudgedZeroIs255_RegularRange 194 x = np.array([-63.80, -63.75, -63.70, -63.5, 0.0, 0.1]).reshape(2, 3).astype(np.float32) 195 min_val = np.array([-63.65]).reshape(1).astype(np.float32) 196 max_val = np.array([0.1]).reshape(1).astype(np.float32) 197 expect = np.array([-63.75, -63.75, -63.75, -63.5, 0.0, 0.0]).astype(np.float32) 198 199 net = Net(num_bits=8, narrow_range=False) 200 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 201 202 error = np.ones(shape=expect.shape) * 1.0e-5 203 diff = output.asnumpy().flatten() - expect 204 print("output: ", output) 205 print("expect: ", expect) 206 assert np.all(np.abs(diff) < error) 207 208 209@pytest.mark.level1 210@pytest.mark.platform_x86_gpu_training 211@pytest.mark.env_onecard 212def test_fake_quant9(): 213 # WithVarsNudgedZeroIs255_NarrowRange 214 x = np.array([-63.6, -63.5, -63.4, -63.25, 0.0, 0.1]).reshape(2, 3).astype(np.float32) 215 min_val = np.array([-63.4]).reshape(1).astype(np.float32) 216 max_val = np.array([0.1]).reshape(1).astype(np.float32) 217 expect = np.array([-63.5, -63.5, -63.5, -63.25, 0.0, 0.0]).astype(np.float32) 218 219 net = Net(num_bits=8, narrow_range=True) 220 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 221 222 error = np.ones(shape=expect.shape) * 1.0e-5 223 diff = output.asnumpy().flatten() - expect 224 print("output: ", output) 225 print("expect: ", expect) 226 assert np.all(np.abs(diff) < error) 227 228 229@pytest.mark.level1 230@pytest.mark.platform_x86_gpu_training 231@pytest.mark.env_onecard 232def test_fake_quant10(): 233 # WithVarsNoNudging_4Bits_RegularRange 234 x = np.array([-6.1, -6.0, -5.9, -5.5, 1.5, 1.6]).reshape(2, 3).astype(np.float32) 235 min_val = np.array([-6.0]).reshape(1).astype(np.float32) 236 max_val = np.array([1.5]).reshape(1).astype(np.float32) 237 expect = np.array([-6.0, -6.0, -6.0, -5.5, 1.5, 1.5]).astype(np.float32) 238 239 net = Net(num_bits=4, narrow_range=False) 240 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 241 242 error = np.ones(shape=expect.shape) * 1.0e-5 243 diff = output.asnumpy().flatten() - expect 244 print("output: ", output) 245 print("expect: ", expect) 246 assert np.all(np.abs(diff) < error) 247 248 249@pytest.mark.level1 250@pytest.mark.platform_x86_gpu_training 251@pytest.mark.env_onecard 252def test_fake_quant11(): 253 # WithVarsNoNudging_4Bits_NarrowRange 254 x = np.array([-6.1, -6.0, -5.9, -5.5, 1.0, 1.1]).reshape(2, 3).astype(np.float32) 255 min_val = np.array([-6.0]).reshape(1).astype(np.float32) 256 max_val = np.array([1.0]).reshape(1).astype(np.float32) 257 expect = np.array([-6.0, -6.0, -6.0, -5.5, 1.0, 1.0]).astype(np.float32) 258 259 net = Net(num_bits=4, narrow_range=True) 260 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 261 262 error = np.ones(shape=expect.shape) * 1.0e-5 263 diff = output.asnumpy().flatten() - expect 264 print("output: ", output) 265 print("expect: ", expect) 266 assert np.all(np.abs(diff) < error) 267 268 269@pytest.mark.level1 270@pytest.mark.platform_x86_gpu_training 271@pytest.mark.env_onecard 272def test_fake_quant12(): 273 # WithVarsNudgedDown_4Bits_RegularRange 274 x = np.array([-0.1, 0.0, 0.1, 0.5, 7.5, 7.6]).reshape(2, 3).astype(np.float32) 275 min_val = np.array([-0.1]).reshape(1).astype(np.float32) 276 max_val = np.array([7.4]).reshape(1).astype(np.float32) 277 expect = np.array([-0.0, 0.0, 0.0, 0.5, 7.5, 7.5]).astype(np.float32) 278 279 net = Net(num_bits=4, narrow_range=False) 280 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 281 282 error = np.ones(shape=expect.shape) * 1.0e-5 283 diff = output.asnumpy().flatten() - expect 284 print("output: ", output) 285 print("expect: ", expect) 286 assert np.all(np.abs(diff) < error) 287 288 289@pytest.mark.level1 290@pytest.mark.platform_x86_gpu_training 291@pytest.mark.env_onecard 292def test_fake_quant13(): 293 # WithVarsNudgedDown_4Bits_NarrowRange 294 x = np.array([-0.1, 0.0, 0.1, 0.5, 7.0, 7.1]).reshape(2, 3).astype(np.float32) 295 min_val = np.array([-0.1]).reshape(1).astype(np.float32) 296 max_val = np.array([6.9]).reshape(1).astype(np.float32) 297 expect = np.array([-0.0, 0.0, 0.0, 0.5, 7.0, 7.0]).astype(np.float32) 298 299 net = Net(num_bits=4, narrow_range=True) 300 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 301 302 error = np.ones(shape=expect.shape) * 1.0e-5 303 diff = output.asnumpy().flatten() - expect 304 print("output: ", output) 305 print("expect: ", expect) 306 assert np.all(np.abs(diff) < error) 307 308 309@pytest.mark.level1 310@pytest.mark.platform_x86_gpu_training 311@pytest.mark.env_onecard 312def test_fake_quant14(): 313 # WithVarsNudgedUp_4Bits_RegularRange 314 x = np.array([-0.6, -0.5, -0.24, 0.0, 7.0, 7.1]).reshape(2, 3).astype(np.float32) 315 min_val = np.array([-0.4]).reshape(1).astype(np.float32) 316 max_val = np.array([7.1]).reshape(1).astype(np.float32) 317 expect = np.array([-0.5, -0.5, -0.00, 0.0, 7.0, 7.0]).astype(np.float32) 318 319 net = Net(num_bits=4, narrow_range=False) 320 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 321 322 error = np.ones(shape=expect.shape) * 1.0e-5 323 diff = output.asnumpy().flatten() - expect 324 print("output: ", output) 325 print("expect: ", expect) 326 assert np.all(np.abs(diff) < error) 327 328 329@pytest.mark.level1 330@pytest.mark.platform_x86_gpu_training 331@pytest.mark.env_onecard 332def test_fake_quant15(): 333 # WithVarsNudgedUp_4Bits_NarrowRange 334 x = np.array([-0.6, -0.5, -0.24, 0.0, 6.5, 6.6]).reshape(2, 3).astype(np.float32) 335 min_val = np.array([-0.4]).reshape(1).astype(np.float32) 336 max_val = np.array([6.6]).reshape(1).astype(np.float32) 337 expect = np.array([-0.5, -0.5, -0.00, 0.0, 6.5, 6.5]).astype(np.float32) 338 339 net = Net(num_bits=4, narrow_range=True) 340 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 341 342 error = np.ones(shape=expect.shape) * 1.0e-5 343 diff = output.asnumpy().flatten() - expect 344 print("output: ", output) 345 print("expect: ", expect) 346 assert np.all(np.abs(diff) < error) 347 348 349@pytest.mark.level0 350@pytest.mark.platform_x86_gpu_training 351@pytest.mark.env_onecard 352def test_fake_quant16(): 353 # WithVarsNudgedZero15_4Bits_RegularRange 354 x = np.array([-7.6, -7.5, -7.4, -7.2, 0.0, 0.1]).reshape(2, 3).astype(np.float32) 355 min_val = np.array([-7.3]).reshape(1).astype(np.float32) 356 max_val = np.array([0.2]).reshape(1).astype(np.float32) 357 expect = np.array([-7.5, -7.5, -7.5, -7.0, 0.0, 0.0]).astype(np.float32) 358 359 net = Net(num_bits=4, narrow_range=False) 360 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 361 362 error = np.ones(shape=expect.shape) * 1.0e-5 363 diff = output.asnumpy().flatten() - expect 364 print("output: ", output) 365 print("expect: ", expect) 366 assert np.all(np.abs(diff) < error) 367 368 369@pytest.mark.level0 370@pytest.mark.platform_x86_gpu_training 371@pytest.mark.env_onecard 372def test_fake_quant17(): 373 # WithVarsNudgedZero15_4Bits_NarrowRange 374 x = np.array([-7.1, -7.0, -6.9, -6.5, 0.0, 0.1]).reshape(2, 3).astype(np.float32) 375 min_val = np.array([-6.8]).reshape(1).astype(np.float32) 376 max_val = np.array([0.2]).reshape(1).astype(np.float32) 377 expect = np.array([-7.0, -7.0, -7.0, -6.5, 0.0, 0.0]).astype(np.float32) 378 379 net = Net(num_bits=4, narrow_range=True) 380 output = net(Tensor(x), Tensor(min_val), Tensor(max_val)) 381 382 error = np.ones(shape=expect.shape) * 1.0e-5 383 diff = output.asnumpy().flatten() - expect 384 print("output: ", output) 385 print("expect: ", expect) 386 assert np.all(np.abs(diff) < error) 387