已合并
Move UTs on PTA to OP-Plugin Part1 #1477
AtomGit-Bot创建于 2024年4月3日
Move UTs on PTA to OP-Plugin Part1 #1477
已合并
从refs/pull/1477/head合入到master
共 75 个文件变更+7274-19
| @@ -40,20 +40,21 @@ class AccurateTest(metaclass=ABCMeta): | |||
| 40 | return ut_files | 40 | return ut_files |
| 41 | 41 | ||
| 42 | def get_ut_files(self, regex): | 42 | def get_ut_files(self, regex): |
| 43 | - test_base_path = os.path.join(TEST_DIR, 'test_base_ops') | 43 | + test_custom_path = os.path.join(TEST_DIR, 'test_custom_ops') |
| 44 | - check_dir_path_readable(test_base_path) | 44 | + check_dir_path_readable(test_custom_path) |
| 45 | - ut_files = self.find_ut_by_regex(regex, test_base_path) | 45 | + ut_files = self.find_ut_by_regex(regex, test_custom_path) |
| 46 | - | 46 | + |
| 47 | version_path = get_test_torch_version_path() | 47 | version_path = get_test_torch_version_path() |
| 48 | test_version_path = os.path.join(TEST_DIR, version_path) | 48 | test_version_path = os.path.join(TEST_DIR, version_path) |
| 49 | check_dir_path_readable(test_version_path) | 49 | check_dir_path_readable(test_version_path) |
| 50 | version_ut_files = self.find_ut_by_regex(regex, test_version_path) | 50 | version_ut_files = self.find_ut_by_regex(regex, test_version_path) |
| 51 | - ut_files.extend(version_ut_files) | 51 | + if not version_ut_files: |
| 52 | - | 52 | + test_base_path = os.path.join(TEST_DIR, 'test_base_ops') |
| 53 | - test_custom_path = os.path.join(TEST_DIR, 'test_custom_ops') | 53 | + check_dir_path_readable(test_base_path) |
| 54 | - check_dir_path_readable(test_custom_path) | 54 | + base_ut_files = self.find_ut_by_regex(regex, test_base_path) |
| 55 | - custom_ut_files = self.find_ut_by_regex(regex, test_custom_path) | 55 | + ut_files.extend(base_ut_files) |
| 56 | - ut_files.extend(custom_ut_files) | 56 | + else: |
| 57 | + ut_files.extend(version_ut_files) | ||
| 57 | return ut_files | 58 | return ut_files |
| 58 | 59 | ||
| 59 | 60 | ||
| @@ -80,20 +81,28 @@ class OpStrategy(AccurateTest): | |||
| 80 | return [] | 81 | return [] |
| 81 | 82 | ||
| 82 | 83 | ||
| 84 | +modify_file_hash = {} | ||
| 85 | + | ||
| 86 | + | ||
| 83 | class DirectoryStrategy(AccurateTest): | 87 | class DirectoryStrategy(AccurateTest): |
| 84 | """ | 88 | """ |
| 85 | Determine whether the modified files are test cases | 89 | Determine whether the modified files are test cases |
| 86 | """ | 90 | """ |
| 87 | - def identify(self, modify_file): | 91 | + def identify(self, modify_file, ut_files): |
| 88 | is_test_file = str(Path(modify_file).parts[0]) == "test" \ | 92 | is_test_file = str(Path(modify_file).parts[0]) == "test" \ |
| 89 | and re.match("test_(.+).py", Path(modify_file).name) | 93 | and re.match("test_(.+).py", Path(modify_file).name) |
| 90 | - if is_test_file: | 94 | + version_path = get_test_torch_version_path() |
| 91 | - ut_files = [] | 95 | + if is_test_file and str(Path(modify_file).parts[1]) in [version_path, "test_custom_ops", "test_base_ops"]: |
| 92 | - version_path = get_test_torch_version_path() | 96 | + modify_file_path = os.path.join(BASE_DIR, modify_file) |
| 93 | - if str(Path(modify_file).parts[1]) in [version_path, "test_custom_ops", "test_base_ops"]: | 97 | + modify_file_name = Path(modify_file).name |
| 94 | - ut_files.append(os.path.join(BASE_DIR, modify_file)) | 98 | + if modify_file_name in modify_file_hash: |
| 95 | - return ut_files | 99 | + if str(Path(modify_file).parts[1]) == version_path: |
| 96 | - return [] | 100 | + ut_files.remove(modify_file_hash[modify_file_name]) |
| 101 | + modify_file_hash[modify_file_name] = modify_file_path | ||
| 102 | + ut_files.append(modify_file_path) | ||
| 103 | + else: | ||
| 104 | + modify_file_hash[modify_file_name] = modify_file_path | ||
| 105 | + ut_files.append(modify_file_path) | ||
| 97 | 106 | ||
| 98 | 107 | ||
| 99 | class CoreTestStrategy(AccurateTest): | 108 | class CoreTestStrategy(AccurateTest): |
| @@ -127,7 +136,7 @@ class TestMgr(): | |||
| 127 | 136 | ||
| 128 | def analyze(self): | 137 | def analyze(self): |
| 129 | for modify_file in self.modify_files: | 138 | for modify_file in self.modify_files: |
| 130 | - self.test_files['ut_files'] += DirectoryStrategy().identify(modify_file) | 139 | + DirectoryStrategy().identify(modify_file, self.test_files['ut_files']) |
| 131 | self.test_files['ut_files'] += OpStrategy().identify(modify_file) | 140 | self.test_files['ut_files'] += OpStrategy().identify(modify_file) |
| 132 | unique_files = sorted(set(self.test_files['ut_files'])) | 141 | unique_files = sorted(set(self.test_files['ut_files'])) |
| 133 | 142 | ||
| @@ -0,0 +1,248 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | + | ||
| 7 | + | ||
| 8 | +class TestIor(TestCase): | ||
| 9 | + def generate_bool_data(self, shape): | ||
| 10 | + input1 = np.random.uniform(0, 1, shape).astype(np.float32) | ||
| 11 | + input1 = input1 < 0.5 | ||
| 12 | + npu_input1 = torch.from_numpy(input1) | ||
| 13 | + return npu_input1 | ||
| 14 | + | ||
| 15 | + def generate_data(self, min_d, max_d, shape, dtype): | ||
| 16 | + input1 = np.random.uniform(min_d, max_d, shape).astype(dtype) | ||
| 17 | + input2 = np.random.uniform(min_d, max_d, shape).astype(dtype) | ||
| 18 | + npu_input1 = torch.from_numpy(input1) | ||
| 19 | + npu_input2 = torch.from_numpy(input2) | ||
| 20 | + return npu_input1, npu_input2 | ||
| 21 | + | ||
| 22 | + def generate_single_data(self, min_d, max_d, shape, dtype): | ||
| 23 | + input1 = np.random.uniform(min_d, max_d, shape).astype(dtype) | ||
| 24 | + npu_input1 = torch.from_numpy(input1) | ||
| 25 | + return npu_input1 | ||
| 26 | + | ||
| 27 | + def generate_int_scalar(self, min_d, max_d): | ||
| 28 | + scalar = np.random.randint(min_d, max_d) | ||
| 29 | + return scalar | ||
| 30 | + | ||
| 31 | + def cpu_op_exec(self, input1, input2): | ||
| 32 | + output = input1.__ior__(input2) | ||
| 33 | + output = output.numpy() | ||
| 34 | + return output | ||
| 35 | + | ||
| 36 | + def npu_op_exec(self, input1, input2): | ||
| 37 | + input1 = input1.to("npu") | ||
| 38 | + input2 = input2.to("npu") | ||
| 39 | + output = input1.__ior__(input2) | ||
| 40 | + output = output.to("cpu") | ||
| 41 | + output = output.numpy() | ||
| 42 | + return output | ||
| 43 | + | ||
| 44 | + def npu_op_exec_scalar(self, input1, input2): | ||
| 45 | + input1 = input1.to("npu") | ||
| 46 | + output = input1.__ior__(input2) | ||
| 47 | + output = output.to("cpu") | ||
| 48 | + output = output.numpy() | ||
| 49 | + return output | ||
| 50 | + | ||
| 51 | + def test___ior___bool(self, device="npu"): | ||
| 52 | + npu_input1 = self.generate_bool_data((1, 31, 149, 2)) | ||
| 53 | + npu_input2 = self.generate_bool_data((1, 31, 149, 2)) | ||
| 54 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 55 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 56 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 57 | + | ||
| 58 | + def test___ior___bool_scalar(self, device="npu"): | ||
| 59 | + npu_input1 = self.generate_bool_data((1, 31, 149, 2)) | ||
| 60 | + npu_input2 = False | ||
| 61 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 62 | + npu_output = self.npu_op_exec_scalar(npu_input1, npu_input2) | ||
| 63 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 64 | + | ||
| 65 | + def test___ior___uint8(self, device="npu"): | ||
| 66 | + npu_input1, npu_input2 = self.generate_data(0, 255, (1, 31, 149, 2), np.uint8) | ||
| 67 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 68 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 69 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 70 | + | ||
| 71 | + def test___ior___int8(self, device="npu"): | ||
| 72 | + npu_input1, npu_input2 = self.generate_data(-128, 127, (1, 31, 149, 2), np.int8) | ||
| 73 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 74 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 75 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 76 | + | ||
| 77 | + def test___ior___int32_001(self, device="npu"): | ||
| 78 | + npu_input1, npu_input2 = self.generate_data( | ||
| 79 | + -2147483648, -2147483648, (1, 31, 149, 2), np.int32 | ||
| 80 | + ) | ||
| 81 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 82 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 83 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 84 | + | ||
| 85 | + def test___ior___int32_002(self, device="npu"): | ||
| 86 | + npu_input1, npu_input2 = self.generate_data( | ||
| 87 | + 2147483647, 2147483647, (128), np.int32 | ||
| 88 | + ) | ||
| 89 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 90 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 91 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 92 | + | ||
| 93 | + def test___ior___int32_003(self, device="npu"): | ||
| 94 | + npu_input1, npu_input2 = self.generate_data( | ||
| 95 | + -2147483648, 2147483647, (184965, 1), np.int32 | ||
| 96 | + ) | ||
| 97 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 98 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 99 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 100 | + | ||
| 101 | + def test___ior___int32_004(self, device="npu"): | ||
| 102 | + npu_input1, npu_input2 = self.generate_data( | ||
| 103 | + -2147483648, 2147483647, (1, 31, 149, 2), np.int32 | ||
| 104 | + ) | ||
| 105 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 106 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 107 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 108 | + | ||
| 109 | + def test___ior___int32_005(self, device="npu"): | ||
| 110 | + npu_input1, npu_input2 = self.generate_data( | ||
| 111 | + -2147483648, 2147483647, (2, 31, 149, 2), np.int32 | ||
| 112 | + ) | ||
| 113 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 114 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 115 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 116 | + | ||
| 117 | + def test___ior___int32_006(self, device="npu"): | ||
| 118 | + npu_input1, npu_input2 = self.generate_data( | ||
| 119 | + -2147483648, 2147483647, (4, 31, 149, 2), np.int32 | ||
| 120 | + ) | ||
| 121 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 122 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 123 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 124 | + | ||
| 125 | + def test___ior___int32_007(self, device="npu"): | ||
| 126 | + npu_input1, npu_input2 = self.generate_data( | ||
| 127 | + -2147483648, 2147483647, (2048, 31, 1, 2), np.int32 | ||
| 128 | + ) | ||
| 129 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 130 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 131 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 132 | + | ||
| 133 | + def test___ior___int32_008(self, device="npu"): | ||
| 134 | + npu_input1, npu_input2 = self.generate_data( | ||
| 135 | + -2147483648, 2147483647, (8, 7, 149), np.int32 | ||
| 136 | + ) | ||
| 137 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 138 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 139 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 140 | + | ||
| 141 | + def test___ior___int32_009(self, device="npu"): | ||
| 142 | + npu_input1, npu_input2 = self.generate_data( | ||
| 143 | + -2147483648, 2147483647, (65535, 1, 1, 1), np.int32 | ||
| 144 | + ) | ||
| 145 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 146 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 147 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 148 | + | ||
| 149 | + def test___ior___int32_010(self, device="npu"): | ||
| 150 | + npu_input1, npu_input2 = self.generate_data( | ||
| 151 | + -2147483648, 2147483647, (1, 1, 1, 8192), np.int32 | ||
| 152 | + ) | ||
| 153 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 154 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 155 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 156 | + | ||
| 157 | + def test___ior___int32_011(self, device="npu"): | ||
| 158 | + npu_input1, npu_input2 = self.generate_data( | ||
| 159 | + -2147483648, 2147483647, (1, 1, 1, 16384), np.int32 | ||
| 160 | + ) | ||
| 161 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 162 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 163 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 164 | + | ||
| 165 | + def test___ior___int32_012(self, device="npu"): | ||
| 166 | + npu_input1, npu_input2 = self.generate_data( | ||
| 167 | + -2147483648, 2147483647, (1, 1, 1, 32768), np.int32 | ||
| 168 | + ) | ||
| 169 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 170 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 171 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 172 | + | ||
| 173 | + def test___ior___int32_013(self, device="npu"): | ||
| 174 | + npu_input1, npu_input2 = self.generate_data( | ||
| 175 | + -2147483648, 2147483647, (1, 1, 1, 65535), np.int32 | ||
| 176 | + ) | ||
| 177 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 178 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 179 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 180 | + | ||
| 181 | + def test___ior___int32_014(self, device="npu"): | ||
| 182 | + npu_input1, npu_input2 = self.generate_data( | ||
| 183 | + -2147483648, 2147483647, (1, 1, 1, 131072), np.int32 | ||
| 184 | + ) | ||
| 185 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 186 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 187 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 188 | + | ||
| 189 | + def test___ior___int32_015(self, device="npu"): | ||
| 190 | + npu_input1, npu_input2 = self.generate_data( | ||
| 191 | + -2147483648, 2147483647, (1, 1, 1, 196608), np.int32 | ||
| 192 | + ) | ||
| 193 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 194 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 195 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 196 | + | ||
| 197 | + def test___ior___int32_016(self, device="npu"): | ||
| 198 | + npu_input1, npu_input2 = self.generate_data( | ||
| 199 | + -2147483648, 2147483647, (1, 1, 1, 262144), np.int32 | ||
| 200 | + ) | ||
| 201 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 202 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 203 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 204 | + | ||
| 205 | + def test___ior___int32_017(self, device="npu"): | ||
| 206 | + npu_input1, npu_input2 = self.generate_data( | ||
| 207 | + -2147483648, 2147483647, (1, 1, 1, 393216), np.int32 | ||
| 208 | + ) | ||
| 209 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 210 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 211 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 212 | + | ||
| 213 | + def test___ior___int32_018(self, device="npu"): | ||
| 214 | + npu_input1, npu_input2 = self.generate_data( | ||
| 215 | + -2147483648, 2147483647, (1, 1, 1, 524288), np.int32 | ||
| 216 | + ) | ||
| 217 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 218 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 219 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 220 | + | ||
| 221 | + def test___ior___int32_019(self, device="npu"): | ||
| 222 | + npu_input1, npu_input2 = self.generate_data( | ||
| 223 | + -2147483648, 2147483647, (1, 1, 1, 655360), np.int32 | ||
| 224 | + ) | ||
| 225 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 226 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 227 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 228 | + | ||
| 229 | + def test___ior___int32_020(self, device="npu"): | ||
| 230 | + npu_input1, npu_input2 = self.generate_data( | ||
| 231 | + -2147483648, 2147483647, (1, 1, 1, 786432), np.int32 | ||
| 232 | + ) | ||
| 233 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 234 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 235 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 236 | + | ||
| 237 | + def test___ior___int_scalar(self, device="npu"): | ||
| 238 | + npu_input1 = self.generate_single_data( | ||
| 239 | + -2147483648, 2147483647, (1, 31, 149, 2), np.int32 | ||
| 240 | + ) | ||
| 241 | + npu_input2 = self.generate_int_scalar(-2147483648, 2147483647) | ||
| 242 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2) | ||
| 243 | + npu_output = self.npu_op_exec_scalar(npu_input1, npu_input2) | ||
| 244 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 245 | + | ||
| 246 | + | ||
| 247 | +if __name__ == "__main__": | ||
| 248 | + run_tests() | ||
| @@ -0,0 +1,61 @@ | |||
| 1 | +import copy | ||
| 2 | +import torch | ||
| 3 | +import numpy as np | ||
| 4 | +import torch_npu | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class Test__Or__(TestCase): | ||
| 11 | + def cpu_op_exec(self, input1, input2): | ||
| 12 | + output = input1.__or__(input2) | ||
| 13 | + if output.dtype != torch.int32: | ||
| 14 | + output = output.to(torch.int32) | ||
| 15 | + return output.numpy() | ||
| 16 | + | ||
| 17 | + def npu_op_exec(self, input1, input2): | ||
| 18 | + output = input1.__or__(input2) | ||
| 19 | + output = output.to("cpu") | ||
| 20 | + if output.dtype != torch.int32: | ||
| 21 | + output = output.to(torch.int32) | ||
| 22 | + return output.numpy() | ||
| 23 | + | ||
| 24 | + def test___Or___shape_format(self, device="npu"): | ||
| 25 | + shape_format = [ | ||
| 26 | + [[np.int32, 0, [256, 1000]], [1]], | ||
| 27 | + [[np.int32, 0, [256, 1000]], [np.int32, 0, [256, 1000]]], | ||
| 28 | + [[np.int16, 0, [256, 1000]], [2]], | ||
| 29 | + [[np.int16, 0, [256, 1000]], [np.int16, 0, [256, 1000]]], | ||
| 30 | + [[np.int8, 0, [256, 1000]], [3]], | ||
| 31 | + [[np.int8, 0, [256, 1000]], [np.int8, 0, [256, 1000]]], | ||
| 32 | + ] | ||
| 33 | + | ||
| 34 | + for item in shape_format: | ||
| 35 | + if len(item[1]) > 1: | ||
| 36 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 0, 100) | ||
| 37 | + cpu_input2, npu_input2 = create_common_tensor(item[1], 0, 100) | ||
| 38 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 39 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 40 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 41 | + else: | ||
| 42 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 0, 100) | ||
| 43 | + cpu_output = self.cpu_op_exec(cpu_input1, item[1][0]) | ||
| 44 | + npu_output = self.npu_op_exec(npu_input1, item[1][0]) | ||
| 45 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 46 | + | ||
| 47 | + cpu_input1 = torch.tensor([True, False, True, False, True], dtype=torch.bool) | ||
| 48 | + npu_input1 = torch.tensor( | ||
| 49 | + [True, False, True, False, True], dtype=torch.bool, device="npu" | ||
| 50 | + ) | ||
| 51 | + cpu_input2 = torch.tensor([True, False, True, False, False], dtype=torch.bool) | ||
| 52 | + npu_input2 = torch.tensor( | ||
| 53 | + [True, False, True, False, False], dtype=torch.bool, device="npu" | ||
| 54 | + ) | ||
| 55 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 56 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 57 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 58 | + | ||
| 59 | + | ||
| 60 | +if __name__ == "__main__": | ||
| 61 | + run_tests() | ||
| @@ -0,0 +1,123 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAminmax(TestCase): | ||
| 10 | + def cpu_op_exec(self, input0): | ||
| 11 | + output = torch._aminmax(input0) | ||
| 12 | + output0 = output[0].numpy() | ||
| 13 | + output1 = output[1].numpy() | ||
| 14 | + return output0, output1 | ||
| 15 | + | ||
| 16 | + def npu_op_exec(self, input0): | ||
| 17 | + output = torch._aminmax(input0) | ||
| 18 | + output0 = output[0].cpu().numpy() | ||
| 19 | + output1 = output[1].cpu().numpy() | ||
| 20 | + return output0, output1 | ||
| 21 | + | ||
| 22 | + def cpu_op_dim_exec(self, input0, dim, keepdim): | ||
| 23 | + output = torch._aminmax(input0, dim, keepdim) | ||
| 24 | + output0 = output[0].numpy() | ||
| 25 | + output1 = output[1].numpy() | ||
| 26 | + return output0, output1 | ||
| 27 | + | ||
| 28 | + def npu_op_dim_exec(self, input0, dim, keepdim): | ||
| 29 | + output = torch._aminmax(input0, dim, keepdim) | ||
| 30 | + output0 = output[0].cpu().numpy() | ||
| 31 | + output1 = output[1].cpu().numpy() | ||
| 32 | + return output0, output1 | ||
| 33 | + | ||
| 34 | + def cpu_op_exec_out(self, input0, in_dim, in_keepdim, min_in, max_in): | ||
| 35 | + output = torch.aminmax( | ||
| 36 | + input0, dim=in_dim, keepdim=in_keepdim, out=(min_in, max_in) | ||
| 37 | + ) | ||
| 38 | + output0 = output[0].numpy() | ||
| 39 | + output1 = output[1].numpy() | ||
| 40 | + return output0, output1 | ||
| 41 | + | ||
| 42 | + def npu_op_exec_out(self, input0, in_dim, in_keepdim, min_in, max_in): | ||
| 43 | + output = torch.aminmax( | ||
| 44 | + input0, dim=in_dim, keepdim=in_keepdim, out=(min_in, max_in) | ||
| 45 | + ) | ||
| 46 | + output0 = output[0].cpu().numpy() | ||
| 47 | + output1 = output[1].cpu().numpy() | ||
| 48 | + return output0, output1 | ||
| 49 | + | ||
| 50 | + def test__aminmax_shape_format(self): | ||
| 51 | + shape_format = [ | ||
| 52 | + [np.float16, 0, [256, 1000]], | ||
| 53 | + [np.float32, 0, [1000]], | ||
| 54 | + [np.int8, 0, [256, 1000, 4, 4]], | ||
| 55 | + [np.int16, 0, [1000, 128, 3]], | ||
| 56 | + [np.int32, 0, [256]], | ||
| 57 | + [np.uint8, 0, [100, 128, 1000]], | ||
| 58 | + [np.int64, 0, [100, 128, 1000]], | ||
| 59 | + ] | ||
| 60 | + | ||
| 61 | + for item in shape_format: | ||
| 62 | + cpu_input, npu_input = create_common_tensor(item, 0, 100) | ||
| 63 | + if cpu_input.dtype == torch.half: | ||
| 64 | + cpu_input = cpu_input.to(torch.float) | ||
| 65 | + | ||
| 66 | + cpu_output0, cpu_output1 = self.cpu_op_exec(cpu_input) | ||
| 67 | + npu_output0, npu_output1 = self.npu_op_exec(npu_input) | ||
| 68 | + | ||
| 69 | + self.assertRtolEqual(cpu_output0.astype(npu_output0.dtype), npu_output0) | ||
| 70 | + self.assertRtolEqual(cpu_output1.astype(npu_output1.dtype), npu_output1) | ||
| 71 | + | ||
| 72 | + def test__aminmax_dim_shape_format(self): | ||
| 73 | + shape_format = [ | ||
| 74 | + [np.float16, 0, [64, 4]], | ||
| 75 | + [np.float32, 0, [32, 4, 16, 8]], | ||
| 76 | + ] | ||
| 77 | + | ||
| 78 | + for item in shape_format: | ||
| 79 | + cpu_input, npu_input = create_common_tensor(item, 0, 100) | ||
| 80 | + dim = np.random.randint(len(item[2])) | ||
| 81 | + keepdim = np.random.randint(10) > 4 | ||
| 82 | + if cpu_input.dtype == torch.half: | ||
| 83 | + cpu_input = cpu_input.to(torch.float) | ||
| 84 | + | ||
| 85 | + cpu_output0, cpu_output1 = self.cpu_op_dim_exec(cpu_input, dim, keepdim) | ||
| 86 | + npu_output0, npu_output1 = self.npu_op_dim_exec(npu_input, dim, keepdim) | ||
| 87 | + | ||
| 88 | + self.assertRtolEqual(cpu_output0.astype(npu_output0.dtype), npu_output0) | ||
| 89 | + self.assertRtolEqual(cpu_output1.astype(npu_output1.dtype), npu_output1) | ||
| 90 | + | ||
| 91 | + def test__aminmax_out_shape_format(self): | ||
| 92 | + shape_format = [ | ||
| 93 | + [np.float16, 0, [64, 4]], | ||
| 94 | + [np.float32, 0, [32, 4, 16, 8]], | ||
| 95 | + ] | ||
| 96 | + | ||
| 97 | + for item in shape_format: | ||
| 98 | + cpu_input, npu_input = create_common_tensor(item, 0, 100) | ||
| 99 | + dim = np.random.randint(len(item[2])) | ||
| 100 | + keepdim = np.random.randint(10) > 4 | ||
| 101 | + if cpu_input.dtype == torch.half: | ||
| 102 | + cpu_input = cpu_input.to(torch.float) | ||
| 103 | + | ||
| 104 | + out_temp = torch._aminmax(cpu_input, dim, keepdim)[0] | ||
| 105 | + out_size = out_temp.size() | ||
| 106 | + cpu_out_min = torch.zeros(out_size).to(cpu_input.dtype) | ||
| 107 | + cpu_out_max = torch.zeros(out_size).to(cpu_input.dtype) | ||
| 108 | + npu_out_min = torch.zeros(out_size).npu().to(npu_input.dtype) | ||
| 109 | + npu_out_max = torch.zeros(out_size).npu().to(npu_input.dtype) | ||
| 110 | + | ||
| 111 | + cpu_output0, cpu_output1 = self.cpu_op_exec_out( | ||
| 112 | + cpu_input, dim, keepdim, cpu_out_min, cpu_out_max | ||
| 113 | + ) | ||
| 114 | + npu_output0, npu_output1 = self.npu_op_exec_out( | ||
| 115 | + npu_input, dim, keepdim, npu_out_min, npu_out_max | ||
| 116 | + ) | ||
| 117 | + | ||
| 118 | + self.assertRtolEqual(cpu_output0.astype(npu_output0.dtype), npu_output0) | ||
| 119 | + self.assertRtolEqual(cpu_output1.astype(npu_output1.dtype), npu_output1) | ||
| 120 | + | ||
| 121 | + | ||
| 122 | +if __name__ == "__main__": | ||
| 123 | + run_tests() | ||
| @@ -0,0 +1,49 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestiRshift(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1, input2): | ||
| 11 | + input1.__irshift__(input2) | ||
| 12 | + output = input1.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1, input2): | ||
| 16 | + input1.__irshift__(input2) | ||
| 17 | + output = input1.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def test_iRshift_tensor(self, device="npu"): | ||
| 22 | + format_list = [0] | ||
| 23 | + shape_list = [(256, 32, 56)] | ||
| 24 | + shape_format = [[np.int32, i, j] for i in format_list for j in shape_list] | ||
| 25 | + for item in shape_format: | ||
| 26 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 27 | + cpu_input2 = torch.tensor([1]).to(torch.int32) | ||
| 28 | + npu_input2 = cpu_input2.npu() | ||
| 29 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 30 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 31 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 32 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 33 | + | ||
| 34 | + def test_iRshift_scalar(self, device="npu"): | ||
| 35 | + format_list = [0] | ||
| 36 | + shape_list = [(256, 32, 56)] | ||
| 37 | + shape_format = [[np.int32, i, j] for i in format_list for j in shape_list] | ||
| 38 | + for item in shape_format: | ||
| 39 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 40 | + cpu_input2 = torch.tensor(1).to(torch.int32) | ||
| 41 | + npu_input2 = cpu_input2.npu() | ||
| 42 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 43 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 44 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 45 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 46 | + | ||
| 47 | + | ||
| 48 | +if __name__ == "__main__": | ||
| 49 | + run_tests() | ||
| @@ -0,0 +1,49 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestiLshift(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1, input2): | ||
| 11 | + input1.__ilshift__(input2) | ||
| 12 | + output = input1.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1, input2): | ||
| 16 | + input1.__ilshift__(input2) | ||
| 17 | + output = input1.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def test_ilshift_tensor(self, device="npu"): | ||
| 22 | + format_list = [0] | ||
| 23 | + shape_list = [(256, 32, 56)] | ||
| 24 | + shape_format = [[np.int32, i, j] for i in format_list for j in shape_list] | ||
| 25 | + for item in shape_format: | ||
| 26 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 27 | + cpu_input2 = torch.tensor([1]).to(torch.int32) | ||
| 28 | + npu_input2 = cpu_input2.npu() | ||
| 29 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 30 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 31 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 32 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 33 | + | ||
| 34 | + def test_ilshift_scalar(self, device="npu"): | ||
| 35 | + format_list = [0] | ||
| 36 | + shape_list = [(256, 32, 56)] | ||
| 37 | + shape_format = [[np.int32, i, j] for i in format_list for j in shape_list] | ||
| 38 | + for item in shape_format: | ||
| 39 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 40 | + cpu_input2 = torch.tensor(1).to(torch.int32) | ||
| 41 | + npu_input2 = cpu_input2.npu() | ||
| 42 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 43 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 44 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 45 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 46 | + | ||
| 47 | + | ||
| 48 | +if __name__ == "__main__": | ||
| 49 | + run_tests() | ||
| @@ -0,0 +1,49 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestLshift(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1, input2): | ||
| 11 | + output = input1.__lshift__(input2) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1, input2): | ||
| 16 | + output = input1.__lshift__(input2) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def test_lshift_tensor(self, device="npu"): | ||
| 22 | + format_list = [0] | ||
| 23 | + shape_list = [(256, 32, 56)] | ||
| 24 | + shape_format = [[np.int32, i, j] for i in format_list for j in shape_list] | ||
| 25 | + for item in shape_format: | ||
| 26 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 27 | + cpu_input2 = torch.tensor([1]).to(torch.int32) | ||
| 28 | + npu_input2 = cpu_input2.npu() | ||
| 29 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 30 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 31 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 32 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 33 | + | ||
| 34 | + def test_lshift_scalar(self, device="npu"): | ||
| 35 | + format_list = [0] | ||
| 36 | + shape_list = [(256, 32, 56)] | ||
| 37 | + shape_format = [[np.int32, i, j] for i in format_list for j in shape_list] | ||
| 38 | + for item in shape_format: | ||
| 39 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 40 | + cpu_input2 = torch.tensor(1).to(torch.int32) | ||
| 41 | + npu_input2 = cpu_input2.npu() | ||
| 42 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 43 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 44 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 45 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 46 | + | ||
| 47 | + | ||
| 48 | +if __name__ == "__main__": | ||
| 49 | + run_tests() | ||
| @@ -0,0 +1,49 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestRshift(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1, input2): | ||
| 11 | + output = input1.__rshift__(input2) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1, input2): | ||
| 16 | + output = input1.__rshift__(input2) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def test_rshift_tensor(self, device="npu"): | ||
| 22 | + format_list = [0] | ||
| 23 | + shape_list = [(256, 32, 56)] | ||
| 24 | + shape_format = [[np.int32, i, j] for i in format_list for j in shape_list] | ||
| 25 | + for item in shape_format: | ||
| 26 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 27 | + cpu_input2 = torch.tensor([1]).to(torch.int32) | ||
| 28 | + npu_input2 = cpu_input2.npu() | ||
| 29 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 30 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 31 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 32 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 33 | + | ||
| 34 | + def test_rshift_scalar(self, device="npu"): | ||
| 35 | + format_list = [0] | ||
| 36 | + shape_list = [(256, 32, 56)] | ||
| 37 | + shape_format = [[np.int32, i, j] for i in format_list for j in shape_list] | ||
| 38 | + for item in shape_format: | ||
| 39 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 40 | + cpu_input2 = torch.tensor(1).to(torch.int32) | ||
| 41 | + npu_input2 = cpu_input2.npu() | ||
| 42 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 43 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 44 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 45 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 46 | + | ||
| 47 | + | ||
| 48 | +if __name__ == "__main__": | ||
| 49 | + run_tests() | ||
| @@ -0,0 +1,43 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestSvdHelper(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1, some, compute_uv=False): | ||
| 11 | + output_u, output_s, output_v = torch.svd(input1, some, compute_uv) | ||
| 12 | + return output_u, output_s, output_v | ||
| 13 | + | ||
| 14 | + def npu_op_exec(self, input1, some, compute_uv=False): | ||
| 15 | + output_u, output_s, output_v = torch.svd(input1, some, compute_uv) | ||
| 16 | + output_u = output_u.cpu() | ||
| 17 | + output_s = output_s.cpu() | ||
| 18 | + output_v = output_v.cpu() | ||
| 19 | + return output_u, output_s, output_v | ||
| 20 | + | ||
| 21 | + def test_svd_fp32(self): | ||
| 22 | + shape_format = [ | ||
| 23 | + [[np.float32, -1, [5, 3]]], | ||
| 24 | + [[np.float32, -1, [2, 3, 4]]], | ||
| 25 | + ] | ||
| 26 | + for item in shape_format: | ||
| 27 | + cpu_input, npu_input = create_common_tensor(item[0], 0, 100) | ||
| 28 | + | ||
| 29 | + cpu_u, cpu_s, cpu_v = self.cpu_op_exec(cpu_input, some=True) | ||
| 30 | + npu_u, npu_s, npu_v = self.npu_op_exec(npu_input, some=True) | ||
| 31 | + self.assertRtolEqual(cpu_u, npu_u) | ||
| 32 | + self.assertRtolEqual(cpu_s, npu_s) | ||
| 33 | + self.assertRtolEqual(cpu_v, npu_v) | ||
| 34 | + | ||
| 35 | + cpu_u, cpu_s, cpu_v = self.cpu_op_exec(cpu_input, some=False) | ||
| 36 | + npu_u, npu_s, npu_v = self.npu_op_exec(npu_input, some=False) | ||
| 37 | + self.assertRtolEqual(cpu_u, npu_u) | ||
| 38 | + self.assertRtolEqual(cpu_s, npu_s) | ||
| 39 | + self.assertRtolEqual(cpu_v, npu_v) | ||
| 40 | + | ||
| 41 | + | ||
| 42 | +if __name__ == "__main__": | ||
| 43 | + run_tests() | ||
| @@ -0,0 +1,45 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAbs(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1): | ||
| 11 | + output = torch.abs(input1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1): | ||
| 16 | + output = torch.abs(input1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def test_abs_shape_format_fp16(self, device="npu"): | ||
| 22 | + format_list = [0, 3] | ||
| 23 | + shape_list = [[5], [5, 10], [1, 3, 2], [52, 15, 15, 20]] | ||
| 24 | + shape_format = [[np.float16, i, j] for i in format_list for j in shape_list] | ||
| 25 | + for item in shape_format: | ||
| 26 | + cpu_input, npu_input = create_common_tensor(item, -10, 10) | ||
| 27 | + cpu_input = cpu_input.to(torch.float32) | ||
| 28 | + cpu_output = self.cpu_op_exec(cpu_input) | ||
| 29 | + npu_output = self.npu_op_exec(npu_input) | ||
| 30 | + cpu_output = cpu_output.astype(np.float16) | ||
| 31 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 32 | + | ||
| 33 | + def test_abs_shape_format_fp32(self, device="npu"): | ||
| 34 | + format_list = [0, 3] | ||
| 35 | + shape_list = [[5], [5, 10], [1, 3, 2], [52, 15, 15, 20]] | ||
| 36 | + shape_format = [[np.float32, i, j] for i in format_list for j in shape_list] | ||
| 37 | + for item in shape_format: | ||
| 38 | + cpu_input, npu_input = create_common_tensor(item, -10, 10) | ||
| 39 | + cpu_output = self.cpu_op_exec(cpu_input) | ||
| 40 | + npu_output = self.npu_op_exec(npu_input) | ||
| 41 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 42 | + | ||
| 43 | + | ||
| 44 | +if __name__ == "__main__": | ||
| 45 | + run_tests() | ||
| @@ -0,0 +1,45 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAbs(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1): | ||
| 11 | + output = torch.absolute(input1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1): | ||
| 16 | + output = torch.absolute(input1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def test_abs_shape_format_fp16(self): | ||
| 22 | + format_list = [0, 3] | ||
| 23 | + shape_list = [[5], [5, 10], [1, 3, 2], [52, 15, 15, 20]] | ||
| 24 | + shape_format = [[np.float16, i, j] for i in format_list for j in shape_list] | ||
| 25 | + for item in shape_format: | ||
| 26 | + cpu_input, npu_input = create_common_tensor(item, -10, 10) | ||
| 27 | + cpu_input = cpu_input.to(torch.float32) | ||
| 28 | + cpu_output = self.cpu_op_exec(cpu_input) | ||
| 29 | + npu_output = self.npu_op_exec(npu_input) | ||
| 30 | + cpu_output = cpu_output.astype(np.float16) | ||
| 31 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 32 | + | ||
| 33 | + def test_abs_shape_format_fp32(self): | ||
| 34 | + format_list = [0, 3] | ||
| 35 | + shape_list = [[5], [5, 10], [1, 3, 2], [52, 15, 15, 20]] | ||
| 36 | + shape_format = [[np.float32, i, j] for i in format_list for j in shape_list] | ||
| 37 | + for item in shape_format: | ||
| 38 | + cpu_input, npu_input = create_common_tensor(item, -10, 10) | ||
| 39 | + cpu_output = self.cpu_op_exec(cpu_input) | ||
| 40 | + npu_output = self.npu_op_exec(npu_input) | ||
| 41 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 42 | + | ||
| 43 | + | ||
| 44 | +if __name__ == "__main__": | ||
| 45 | + run_tests() | ||
| @@ -0,0 +1,74 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAcosh(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1): | ||
| 11 | + output = torch.acosh(input1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1): | ||
| 16 | + output = torch.acosh(input1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def npu_op_exec_out(self, input1, input2): | ||
| 22 | + torch.acosh(input1, out=input2) | ||
| 23 | + output = input2.to("cpu") | ||
| 24 | + output = output.numpy() | ||
| 25 | + return output | ||
| 26 | + | ||
| 27 | + def cpu_inp_op_exec(self, input1): | ||
| 28 | + output = torch.acosh_(input1) | ||
| 29 | + output = output.numpy() | ||
| 30 | + return output | ||
| 31 | + | ||
| 32 | + def npu_inp_op_exec(self, input1): | ||
| 33 | + output = torch.acosh_(input1) | ||
| 34 | + output = output.to("cpu") | ||
| 35 | + output = output.numpy() | ||
| 36 | + return output | ||
| 37 | + | ||
| 38 | + def test_acosh_common_shape_format(self): | ||
| 39 | + shape_format1 = [ | ||
| 40 | + [[np.float32, 0, (5, 3)]], | ||
| 41 | + ] | ||
| 42 | + for item in shape_format1: | ||
| 43 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -10, 10) | ||
| 44 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 45 | + npu_output = self.npu_op_exec(npu_input1) | ||
| 46 | + mask = ~(np.isnan(cpu_output) | np.isinf(cpu_output)) | ||
| 47 | + self.assertRtolEqual(cpu_output[mask], npu_output[mask], 0.001) | ||
| 48 | + | ||
| 49 | + def test_acosh_out_common_shape_format(self): | ||
| 50 | + shape_format1 = [ | ||
| 51 | + [[np.float32, 0, (4, 3)], [np.float32, 0, (4, 3)]], | ||
| 52 | + ] | ||
| 53 | + for item in shape_format1: | ||
| 54 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -10, 10) | ||
| 55 | + cpu_input2, npu_input2 = create_common_tensor(item[1], -10, 10) | ||
| 56 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 57 | + npu_output = self.npu_op_exec_out(npu_input1, npu_input2) | ||
| 58 | + mask = ~(np.isnan(cpu_output) | np.isinf(cpu_output)) | ||
| 59 | + self.assertRtolEqual(cpu_output[mask], npu_output[mask], 0.001) | ||
| 60 | + | ||
| 61 | + def test_acosh_inp_common_shape_format(self): | ||
| 62 | + shape_format1 = [ | ||
| 63 | + [[np.float32, 0, (5, 3)]], | ||
| 64 | + ] | ||
| 65 | + for item in shape_format1: | ||
| 66 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -10, 10) | ||
| 67 | + cpu_output = self.cpu_inp_op_exec(cpu_input1) | ||
| 68 | + npu_output = self.npu_inp_op_exec(npu_input1) | ||
| 69 | + mask = ~(np.isnan(cpu_output) | np.isinf(cpu_output)) | ||
| 70 | + self.assertRtolEqual(cpu_output[mask], npu_output[mask], 0.001) | ||
| 71 | + | ||
| 72 | + | ||
| 73 | +if __name__ == "__main__": | ||
| 74 | + run_tests() | ||
| @@ -0,0 +1,51 @@ | |||
| 1 | +import torch | ||
| 2 | +import torch.nn as nn | ||
| 3 | +import numpy as np | ||
| 4 | +import torch_npu | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class TestAdaptiveAvgPool1d(TestCase): | ||
| 11 | + def cpu_op_exec(self, input1, output_size): | ||
| 12 | + m = nn.AdaptiveAvgPool1d(output_size) | ||
| 13 | + output = m(input1) | ||
| 14 | + return output | ||
| 15 | + | ||
| 16 | + def npu_op_exec(self, input1, output_size): | ||
| 17 | + m = nn.AdaptiveAvgPool1d(output_size).npu() | ||
| 18 | + output = m(input1) | ||
| 19 | + return output.cpu() | ||
| 20 | + | ||
| 21 | + def test_AdaptiveAvgPool1d_shape_format_fp16(self, device="npu"): | ||
| 22 | + shape_format = [ | ||
| 23 | + [np.float16, 0, (64, 10, 16)], | ||
| 24 | + [np.float16, -1, (256, 2048, 8)], | ||
| 25 | + [np.float16, 3, (32, 16, 16)], | ||
| 26 | + ] | ||
| 27 | + output_list = [(4), (3)] | ||
| 28 | + for item in shape_format: | ||
| 29 | + cpu_input, npu_input = create_common_tensor(item, 1, 10) | ||
| 30 | + for output_size in output_list: | ||
| 31 | + cpu_output = self.cpu_op_exec(cpu_input.float(), output_size).half() | ||
| 32 | + npu_output = self.npu_op_exec(npu_input, output_size) | ||
| 33 | + self.assertRtolEqual(cpu_output, npu_output, prec16=0.002) | ||
| 34 | + | ||
| 35 | + def test_AdaptiveAvgPool1d_shape_format_fp32(self, device="npu"): | ||
| 36 | + shape_format = [ | ||
| 37 | + [np.float32, 0, (64, 10, 16)], | ||
| 38 | + [np.float32, -1, (256, 2048, 8)], | ||
| 39 | + [np.float32, 3, (32, 16, 16)], | ||
| 40 | + ] | ||
| 41 | + output_list = [(4), (3), (1)] | ||
| 42 | + for item in shape_format: | ||
| 43 | + cpu_input, npu_input = create_common_tensor(item, 1, 10) | ||
| 44 | + for output_size in output_list: | ||
| 45 | + cpu_output = self.cpu_op_exec(cpu_input, output_size) | ||
| 46 | + npu_output = self.npu_op_exec(npu_input, output_size) | ||
| 47 | + self.assertRtolEqual(cpu_output, npu_output, 0.001) | ||
| 48 | + | ||
| 49 | + | ||
| 50 | +if __name__ == "__main__": | ||
| 51 | + run_tests() | ||
| @@ -0,0 +1,61 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +from torch.nn import functional as F | ||
| 4 | +import torch_npu | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAdaptiveAvgPool2dBackward(TestCase): | ||
| 10 | + def cpu_op_exec(self, input_x, input_grad): | ||
| 11 | + input_x.requires_grad_(True) | ||
| 12 | + m = torch.nn.AdaptiveAvgPool2d(input_grad) | ||
| 13 | + if input_x.dtype == torch.half: | ||
| 14 | + output = m(input_x.float()).half() | ||
| 15 | + else: | ||
| 16 | + output = m(input_x) | ||
| 17 | + output.backward(output) | ||
| 18 | + out = output.detach(), input_x.grad | ||
| 19 | + return out | ||
| 20 | + | ||
| 21 | + def npu_op_exec(self, input_x, input_grad): | ||
| 22 | + input_x.requires_grad_(True) | ||
| 23 | + m = torch.nn.AdaptiveAvgPool2d(input_grad) | ||
| 24 | + output = m(input_x) | ||
| 25 | + output.backward(output) | ||
| 26 | + out = output.detach().cpu(), input_x.grad.cpu() | ||
| 27 | + return out | ||
| 28 | + | ||
| 29 | + def test_adaptiveAvgPool2d_backward_1(self): | ||
| 30 | + torch.manual_seed(123) | ||
| 31 | + cpu_input = torch.randn((1, 8, 9), dtype=torch.float32) | ||
| 32 | + npu_input = cpu_input.npu() | ||
| 33 | + output_size = np.array((2, 3)) | ||
| 34 | + cpu_output = self.cpu_op_exec(cpu_input, output_size) | ||
| 35 | + npu_output = self.npu_op_exec(npu_input, output_size) | ||
| 36 | + self.assertRtolEqual(cpu_output[0], npu_output[0], prec=1e-3) | ||
| 37 | + self.assertRtolEqual(cpu_output[1], npu_output[1], prec=1e-3) | ||
| 38 | + | ||
| 39 | + def test_adaptiveAvgPool2d_backward_2(self): | ||
| 40 | + torch.manual_seed(123) | ||
| 41 | + cpu_input = torch.randn((1, 3, 3, 3), dtype=torch.float32) | ||
| 42 | + npu_input = cpu_input.npu() | ||
| 43 | + output_size = np.array((2, 2)) | ||
| 44 | + cpu_output = self.cpu_op_exec(cpu_input, output_size) | ||
| 45 | + npu_output = self.npu_op_exec(npu_input, output_size) | ||
| 46 | + self.assertRtolEqual(cpu_output[0], npu_output[0], prec=1e-3) | ||
| 47 | + self.assertRtolEqual(cpu_output[1], npu_output[1], prec=1e-3) | ||
| 48 | + | ||
| 49 | + def test_adaptiveAvgPool2d_backward_fp16(self): | ||
| 50 | + input_x = np.random.uniform(0, 1, (1, 3, 6, 6)).astype(np.float16) | ||
| 51 | + cpu_input = torch.from_numpy(input_x) | ||
| 52 | + npu_input = cpu_input.npu() | ||
| 53 | + output_size = np.array((5, 5)) | ||
| 54 | + cpu_output = self.cpu_op_exec(cpu_input, output_size) | ||
| 55 | + npu_output = self.npu_op_exec(npu_input, output_size) | ||
| 56 | + self.assertRtolEqual(cpu_output[0], npu_output[0]) | ||
| 57 | + self.assertRtolEqual(cpu_output[1], npu_output[1]) | ||
| 58 | + | ||
| 59 | + | ||
| 60 | +if __name__ == "__main__": | ||
| 61 | + run_tests() | ||
| @@ -0,0 +1,55 @@ | |||
| 1 | +import torch | ||
| 2 | +import torch.nn as nn | ||
| 3 | +import numpy as np | ||
| 4 | +import torch_npu | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class TestAdaptiveAvgPool3d(TestCase): | ||
| 11 | + def cpu_op_exec(self, input1, output_size): | ||
| 12 | + m = nn.AdaptiveAvgPool3d(output_size) | ||
| 13 | + output = m(input1) | ||
| 14 | + return output.numpy() | ||
| 15 | + | ||
| 16 | + def npu_op_exec(self, input1, output_size): | ||
| 17 | + m = nn.AdaptiveAvgPool3d(output_size) | ||
| 18 | + output = m(input1).cpu() | ||
| 19 | + return output.numpy() | ||
| 20 | + | ||
| 21 | + def test_adaptive_avg_pool3d_shape_format_fp16(self, device="npu"): | ||
| 22 | + shape_format = [ | ||
| 23 | + [np.float16, -1, (64, 10, 16, 32)], | ||
| 24 | + [np.float16, -1, (4, 16, 8, 4, 2)], | ||
| 25 | + [np.float16, -1, (2, 16, 4, 32)], | ||
| 26 | + [np.float16, -1, (4, 16, 8, 4, 16)], | ||
| 27 | + ] | ||
| 28 | + output_list = [(1, 1, 1)] | ||
| 29 | + for item in shape_format: | ||
| 30 | + cpu_input, npu_input = create_common_tensor(item, 1, 10) | ||
| 31 | + cpu_input = cpu_input.to(torch.float32) | ||
| 32 | + for output_size in output_list: | ||
| 33 | + cpu_output = self.cpu_op_exec(cpu_input, output_size) | ||
| 34 | + npu_output = self.npu_op_exec(npu_input, output_size) | ||
| 35 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 36 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 37 | + | ||
| 38 | + def test_adaptive_avg_pool3d_shape_format_fp32(self, device="npu"): | ||
| 39 | + shape_format = [ | ||
| 40 | + [np.float32, -1, (64, 10, 16, 32)], | ||
| 41 | + [np.float32, -1, (4, 2, 2, 4, 316)], | ||
| 42 | + [np.float32, -1, (2, 16, 4, 32)], | ||
| 43 | + [np.float32, -1, (4, 16, 8, 4, 16)], | ||
| 44 | + ] | ||
| 45 | + output_list = [(1, 1, 1)] | ||
| 46 | + for item in shape_format: | ||
| 47 | + cpu_input, npu_input = create_common_tensor(item, 1, 10) | ||
| 48 | + for output_size in output_list: | ||
| 49 | + cpu_output = self.cpu_op_exec(cpu_input, output_size) | ||
| 50 | + npu_output = self.npu_op_exec(npu_input, output_size) | ||
| 51 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 52 | + | ||
| 53 | + | ||
| 54 | +if __name__ == "__main__": | ||
| 55 | + run_tests() | ||
| @@ -0,0 +1,47 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +from torch.nn import functional as F | ||
| 4 | +import torch_npu | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class TestAdaptiveAvgPool3dBackward(TestCase): | ||
| 11 | + def cpu_op_exec(self, input_x, output_size): | ||
| 12 | + input_x.requires_grad_(True) | ||
| 13 | + m = torch.nn.AdaptiveAvgPool3d(output_size) | ||
| 14 | + output = m(input_x) | ||
| 15 | + ones = torch.ones_like(output) | ||
| 16 | + output.backward(ones) | ||
| 17 | + out = input_x.grad | ||
| 18 | + return out.numpy() | ||
| 19 | + | ||
| 20 | + def npu_op_exec(self, input_x, output_size): | ||
| 21 | + input_x.requires_grad_(True) | ||
| 22 | + m = torch.nn.AdaptiveAvgPool3d(output_size) | ||
| 23 | + output = m(input_x) | ||
| 24 | + ones = torch.ones_like(output) | ||
| 25 | + output.backward(ones) | ||
| 26 | + out = input_x.grad.cpu() | ||
| 27 | + return out.numpy() | ||
| 28 | + | ||
| 29 | + def test_adaptive_avg_pool3d_backward(self, device="npu"): | ||
| 30 | + dtype_list = [np.float16, np.float32] | ||
| 31 | + format_list = [-1] | ||
| 32 | + shape_list = [[2, 3, 7, 7], [1, 2, 3, 6, 6], [6, 5, 8, 10], [2, 5, 6, 8, 9]] | ||
| 33 | + # pylint:disable = complicate-comprehension | ||
| 34 | + shape_format = [ | ||
| 35 | + [i, j, k] for i in dtype_list for j in format_list for k in shape_list | ||
| 36 | + ] | ||
| 37 | + output_sizes = [[1, 1, 1]] | ||
| 38 | + for item in shape_format: | ||
| 39 | + cpu_input, npu_input = create_common_tensor(item, 1, 10) | ||
| 40 | + for output_size in output_sizes: | ||
| 41 | + cpu_output = self.cpu_op_exec(cpu_input, output_size) | ||
| 42 | + npu_output = self.npu_op_exec(npu_input, output_size) | ||
| 43 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 44 | + | ||
| 45 | + | ||
| 46 | +if __name__ == "__main__": | ||
| 47 | + run_tests() | ||
| @@ -0,0 +1,53 @@ | |||
| 1 | +import torch | ||
| 2 | +import torch.nn as nn | ||
| 3 | +import torch.nn.functional as F | ||
| 4 | +import numpy as np | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class TestAdaptiveMaxPool2d(TestCase): | ||
| 11 | + def cpu_op_exec(self, input1, output_size): | ||
| 12 | + m = nn.AdaptiveMaxPool2d(output_size) | ||
| 13 | + output = m(input1) | ||
| 14 | + return output.numpy() | ||
| 15 | + | ||
| 16 | + def npu_op_exec(self, input1, output_size): | ||
| 17 | + m = nn.AdaptiveMaxPool2d(output_size).npu() | ||
| 18 | + output = m(input1) | ||
| 19 | + return output.cpu().numpy() | ||
| 20 | + | ||
| 21 | + def test_adaptiveMaxPool2d_shape_format_fp32_6(self): | ||
| 22 | + format_list = [-1] | ||
| 23 | + # (1, 8, 9) IndexError | ||
| 24 | + shape_list = [(1, 5, 9, 9)] | ||
| 25 | + shape_format = [ | ||
| 26 | + [np.float32, i, j] for i in format_list for j in shape_list | ||
| 27 | + ] | ||
| 28 | + output_list = [(3, 3)] | ||
| 29 | + for item in shape_format: | ||
| 30 | + cpu_input, npu_input = create_common_tensor(item, 0, 100) | ||
| 31 | + for output_size in output_list: | ||
| 32 | + cpu_output = self.cpu_op_exec(cpu_input, output_size) | ||
| 33 | + npu_output = self.npu_op_exec(npu_input, output_size) | ||
| 34 | + | ||
| 35 | + self.assertRtolEqual(cpu_output, npu_output, 0.0004) | ||
| 36 | + | ||
| 37 | + def test_adaptiveMaxPool2d_case_in_photo2cartoon(self): | ||
| 38 | + cpu_x = torch.rand(1, 256, 31, 31) | ||
| 39 | + npu_x = cpu_x.npu() | ||
| 40 | + cpu_out = F.adaptive_max_pool2d(cpu_x, 1) | ||
| 41 | + npu_out = F.adaptive_max_pool2d(npu_x, 1) | ||
| 42 | + self.assertRtolEqual(cpu_out, npu_out.cpu(), 0.0003) | ||
| 43 | + | ||
| 44 | + def test_adaptiveMaxPool2d_case_in_photo2cartoon_fp16(self): | ||
| 45 | + cpu_x = torch.rand(1, 256, 31, 31).half() | ||
| 46 | + npu_x = cpu_x.npu() | ||
| 47 | + cpu_out = F.adaptive_max_pool2d(cpu_x.float(), 1).half() | ||
| 48 | + npu_out = F.adaptive_max_pool2d(npu_x, 1) | ||
| 49 | + self.assertRtolEqual(cpu_out, npu_out.cpu()) | ||
| 50 | + | ||
| 51 | + | ||
| 52 | +if __name__ == "__main__": | ||
| 53 | + run_tests() | ||
| @@ -0,0 +1,66 @@ | |||
| 1 | +import torch | ||
| 2 | +import torch.nn as nn | ||
| 3 | +import torch.nn.functional as F | ||
| 4 | +import numpy as np | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class TestAdaptiveMaxPool2dBackward(TestCase): | ||
| 11 | + def cpu_op_exec(self, input_tensor, output_size): | ||
| 12 | + input_tensor.requires_grad = True | ||
| 13 | + m = nn.AdaptiveMaxPool2d(output_size) | ||
| 14 | + output = m(input_tensor) | ||
| 15 | + output.backward(output) | ||
| 16 | + cpu_grad = input_tensor.grad | ||
| 17 | + return cpu_grad | ||
| 18 | + | ||
| 19 | + def npu_op_exec(self, input_tensor, output_size): | ||
| 20 | + input_tensor.requires_grad = True | ||
| 21 | + m = nn.AdaptiveMaxPool2d(output_size) | ||
| 22 | + output = m(input_tensor) | ||
| 23 | + output.backward(output) | ||
| 24 | + npu_grad = input_tensor.grad | ||
| 25 | + npu_grad = npu_grad.to("cpu") | ||
| 26 | + return npu_grad | ||
| 27 | + | ||
| 28 | + def test_adaptiveMaxPool2d_shape_format_fp32_6(self): | ||
| 29 | + format_list = [0, 3] | ||
| 30 | + shape_list = [(1, 3, 8, 9)] | ||
| 31 | + shape_format = [[np.float16, i, j] for i in format_list for j in shape_list] | ||
| 32 | + output_list = [(2, 3)] | ||
| 33 | + for item in shape_format: | ||
| 34 | + cpu_input, npu_input = create_common_tensor(item, 0, 100) | ||
| 35 | + for output_size in output_list: | ||
| 36 | + cpu_input = cpu_input.to(torch.float32) | ||
| 37 | + cpu_output = self.cpu_op_exec(cpu_input, output_size) | ||
| 38 | + cpu_output = cpu_output.to(torch.float16) | ||
| 39 | + npu_output = self.npu_op_exec(npu_input, output_size) | ||
| 40 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 41 | + | ||
| 42 | + def test_adaptiveMaxPool2d_backward_case_in_photo2cartoon(self): | ||
| 43 | + cpu_x = torch.rand(1, 256, 31, 31) | ||
| 44 | + npu_x = cpu_x.npu() | ||
| 45 | + cpu_x.requires_grad = True | ||
| 46 | + npu_x.requires_grad = True | ||
| 47 | + cpu_out = F.adaptive_max_pool2d(cpu_x, 1) | ||
| 48 | + npu_out = F.adaptive_max_pool2d(npu_x, 1) | ||
| 49 | + cpu_out.backward(torch.ones_like(cpu_out)) | ||
| 50 | + npu_out.backward(torch.ones_like(npu_out)) | ||
| 51 | + self.assertRtolEqual(cpu_x.grad, npu_x.grad.cpu(), 0.0003) | ||
| 52 | + | ||
| 53 | + def test_adaptiveMaxPool2d_backward_case_in_photo2cartoon_fp16(self): | ||
| 54 | + cpu_x = torch.rand(1, 256, 31, 31).half() | ||
| 55 | + npu_x = cpu_x.npu() | ||
| 56 | + cpu_x.requires_grad = True | ||
| 57 | + npu_x.requires_grad = True | ||
| 58 | + cpu_out = F.adaptive_max_pool2d(cpu_x.float(), 1).half() | ||
| 59 | + npu_out = F.adaptive_max_pool2d(npu_x, 1) | ||
| 60 | + cpu_out.backward(torch.ones_like(cpu_out)) | ||
| 61 | + npu_out.backward(torch.ones_like(npu_out)) | ||
| 62 | + self.assertRtolEqual(cpu_x.grad, npu_x.grad.cpu()) | ||
| 63 | + | ||
| 64 | + | ||
| 65 | +if __name__ == "__main__": | ||
| 66 | + run_tests() | ||
| @@ -0,0 +1,471 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | + | ||
| 4 | +import torch_npu | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAdd(TestCase): | ||
| 10 | + def cpu_op_out_exec(self, input1, input2, output): | ||
| 11 | + torch.add(input1, input2, alpha=1, out=output) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_out_exec_new(self, input1, input2, output): | ||
| 16 | + torch.add(input1, input2, alpha=1, out=output) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def cpu_op_exec(self, input1, input2): | ||
| 22 | + output = torch.add(input1, input2, alpha=1) | ||
| 23 | + output = output.numpy() | ||
| 24 | + return output | ||
| 25 | + | ||
| 26 | + def cpu_tensor_op_exec(self, input1, input2): | ||
| 27 | + output = input1.add(input2, alpha=1) | ||
| 28 | + output = output.numpy() | ||
| 29 | + return output | ||
| 30 | + | ||
| 31 | + def npu_tensor_op_exec(self, input1, input2): | ||
| 32 | + output = input1.add(input2, alpha=1) | ||
| 33 | + output = output.to("cpu") | ||
| 34 | + output = output.numpy() | ||
| 35 | + return output | ||
| 36 | + | ||
| 37 | + def npu_op_exec_new(self, input1, input2): | ||
| 38 | + output = torch.add(input1, input2, alpha=1) | ||
| 39 | + output = output.to("cpu") | ||
| 40 | + output = output.numpy() | ||
| 41 | + return output | ||
| 42 | + | ||
| 43 | + def cpu_op_exec_alpha(self, input1, input2): | ||
| 44 | + output = torch.add(input1, input2, alpha=3) | ||
| 45 | + output = output.numpy() | ||
| 46 | + return output | ||
| 47 | + | ||
| 48 | + def npu_op_exec_new_alpha(self, input1, input2): | ||
| 49 | + output = torch.add(input1, input2, alpha=3) | ||
| 50 | + output = output.to("cpu") | ||
| 51 | + output = output.numpy() | ||
| 52 | + return output | ||
| 53 | + | ||
| 54 | + def cpu_op_scalar_exec(self, input1, scalar): | ||
| 55 | + output = torch.add(input1, scalar, alpha=1) | ||
| 56 | + output = output.numpy() | ||
| 57 | + return output | ||
| 58 | + | ||
| 59 | + def npu_op_scalar_exec_new(self, input1, scalar): | ||
| 60 | + output = torch.add(input1, scalar, alpha=1) | ||
| 61 | + output = output.to("cpu") | ||
| 62 | + output = output.numpy() | ||
| 63 | + return output | ||
| 64 | + | ||
| 65 | + def cpu_op_scalar_exec_alpha(self, input1, scalar): | ||
| 66 | + output = torch.add(input1, scalar, alpha=3) | ||
| 67 | + output = output.numpy() | ||
| 68 | + return output | ||
| 69 | + | ||
| 70 | + def npu_op_scalar_exec_new_alpha(self, input1, scalar): | ||
| 71 | + output = torch.add(input1, scalar, alpha=3) | ||
| 72 | + output = output.to("cpu") | ||
| 73 | + output = output.numpy() | ||
| 74 | + return output | ||
| 75 | + | ||
| 76 | + def add_scalar_result(self, shape_format): | ||
| 77 | + for item in shape_format: | ||
| 78 | + cpu_input, npu_input = create_common_tensor(item[0], 0, 100) | ||
| 79 | + if cpu_input.dtype == torch.float16: | ||
| 80 | + cpu_input = cpu_input.to(torch.float32) | ||
| 81 | + cpu_output = self.cpu_op_scalar_exec(cpu_input, item[1]) | ||
| 82 | + npu_output = self.npu_op_exec_new(npu_input, item[1]) | ||
| 83 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 84 | + | ||
| 85 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 86 | + | ||
| 87 | + def add_scalar_alpha_result(self, shape_format): | ||
| 88 | + for item in shape_format: | ||
| 89 | + cpu_input, npu_input = create_common_tensor(item[0], 0, 100) | ||
| 90 | + if cpu_input.dtype == torch.float16: | ||
| 91 | + cpu_input = cpu_input.to(torch.float32) | ||
| 92 | + cpu_output = self.cpu_op_scalar_exec_alpha(cpu_input, item[1]) | ||
| 93 | + npu_output = self.npu_op_scalar_exec_new_alpha(npu_input, item[1]) | ||
| 94 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 95 | + | ||
| 96 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 97 | + | ||
| 98 | + def add_result(self, shape_format): | ||
| 99 | + for item in shape_format: | ||
| 100 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 101 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 102 | + if cpu_input1.dtype == torch.float16: | ||
| 103 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 104 | + cpu_input2 = cpu_input2.to(torch.float32) | ||
| 105 | + | ||
| 106 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 107 | + npu_output = self.npu_op_exec_new(npu_input1, npu_input2) | ||
| 108 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 109 | + | ||
| 110 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 111 | + | ||
| 112 | + def add_out_result(self, shape_format): | ||
| 113 | + for item in shape_format: | ||
| 114 | + cpuout = torch.randn(3) | ||
| 115 | + npuout = torch.randn(3).to("npu") | ||
| 116 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 117 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 118 | + if cpu_input1.dtype == torch.float16: | ||
| 119 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 120 | + cpu_input2 = cpu_input2.to(torch.float32) | ||
| 121 | + | ||
| 122 | + cpu_output = self.cpu_op_out_exec(cpu_input1, cpu_input2, cpuout) | ||
| 123 | + npu_output = self.npu_op_out_exec_new(npu_input1, npu_input2, npuout) | ||
| 124 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 125 | + | ||
| 126 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 127 | + | ||
| 128 | + def add_alpha_result(self, shape_format): | ||
| 129 | + for item in shape_format: | ||
| 130 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 131 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 132 | + if cpu_input1.dtype == torch.float16: | ||
| 133 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 134 | + cpu_input2 = cpu_input2.to(torch.float32) | ||
| 135 | + | ||
| 136 | + cpu_output = self.cpu_op_exec_alpha(cpu_input1, cpu_input2) | ||
| 137 | + npu_output = self.npu_op_exec_new_alpha(npu_input1, npu_input2) | ||
| 138 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 139 | + | ||
| 140 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 141 | + | ||
| 142 | + def test_add_scalar_shape_format_fp16_1d(self): | ||
| 143 | + format_list = [0, 3] | ||
| 144 | + scalar_list = [0, 1] | ||
| 145 | + shape_format = [ | ||
| 146 | + [[np.float16, i, [18]], k] for i in format_list for k in scalar_list | ||
| 147 | + ] | ||
| 148 | + self.add_scalar_result(shape_format) | ||
| 149 | + | ||
| 150 | + def test_add_scalar_shape_format_fp32_1d(self): | ||
| 151 | + format_list = [0, 3] | ||
| 152 | + scalar_list = [0, 1] | ||
| 153 | + shape_format = [ | ||
| 154 | + [[np.float32, i, [18]], k] for i in format_list for k in scalar_list | ||
| 155 | + ] | ||
| 156 | + self.add_scalar_result(shape_format) | ||
| 157 | + | ||
| 158 | + def test_add_scalar_shape_format_fp16_2d(self): | ||
| 159 | + format_list = [0, 3, 29] | ||
| 160 | + scalar_list = [0, 1] | ||
| 161 | + shape_format = [ | ||
| 162 | + [[np.float16, i, [5, 256]], k] for i in format_list for k in scalar_list | ||
| 163 | + ] | ||
| 164 | + self.add_scalar_result(shape_format) | ||
| 165 | + | ||
| 166 | + def test_add_scalar_shape_format_fp32_2d(self): | ||
| 167 | + format_list = [0, 3, 29] | ||
| 168 | + scalar_list = [0, 1] | ||
| 169 | + shape_format = [ | ||
| 170 | + [[np.float32, i, [5, 256]], k] for i in format_list for k in scalar_list | ||
| 171 | + ] | ||
| 172 | + self.add_scalar_result(shape_format) | ||
| 173 | + | ||
| 174 | + def test_add_scalar_shape_format_fp16_3d(self): | ||
| 175 | + format_list = [0, 3, 29] | ||
| 176 | + scalar_list = [0, 1] | ||
| 177 | + shape_format = [ | ||
| 178 | + [[np.float16, i, [32, 3, 3]], k] for i in format_list for k in scalar_list | ||
| 179 | + ] | ||
| 180 | + self.add_scalar_result(shape_format) | ||
| 181 | + | ||
| 182 | + def test_add_scalar_shape_format_fp32_3d(self): | ||
| 183 | + format_list = [0, 3, 29] | ||
| 184 | + scalar_list = [0, 1] | ||
| 185 | + shape_format = [ | ||
| 186 | + [[np.float32, i, [32, 3, 3]], k] for i in format_list for k in scalar_list | ||
| 187 | + ] | ||
| 188 | + self.add_scalar_result(shape_format) | ||
| 189 | + | ||
| 190 | + def test_add_scalar_shape_format_fp16_4d(self): | ||
| 191 | + format_list = [0, 3, 29] | ||
| 192 | + scalar_list = [0, 1] | ||
| 193 | + shape_format = [ | ||
| 194 | + [[np.float16, i, [64, 112, 7, 7]], k] | ||
| 195 | + for i in format_list | ||
| 196 | + for k in scalar_list | ||
| 197 | + ] | ||
| 198 | + self.add_scalar_result(shape_format) | ||
| 199 | + | ||
| 200 | + def test_add_scalar_shape_format_fp32_4d(self): | ||
| 201 | + format_list = [0, 3, 29] | ||
| 202 | + scalar_list = [0, 1] | ||
| 203 | + shape_format = [ | ||
| 204 | + [[np.float32, i, [64, 112, 7, 7]], k] | ||
| 205 | + for i in format_list | ||
| 206 | + for k in scalar_list | ||
| 207 | + ] | ||
| 208 | + self.add_scalar_result(shape_format) | ||
| 209 | + | ||
| 210 | + def test_add_scalar_shape_format_fp16_1d(self): | ||
| 211 | + format_list = [0, 3] | ||
| 212 | + scalar_list = [0, 1] | ||
| 213 | + shape_format = [ | ||
| 214 | + [[np.float16, i, [18]], k] for i in format_list for k in scalar_list | ||
| 215 | + ] | ||
| 216 | + self.add_scalar_alpha_result(shape_format) | ||
| 217 | + | ||
| 218 | + def test_add_scalar_shape_format_fp32_1d(self): | ||
| 219 | + format_list = [0, 3] | ||
| 220 | + scalar_list = [0, 1] | ||
| 221 | + shape_format = [ | ||
| 222 | + [[np.float32, i, [18]], k] for i in format_list for k in scalar_list | ||
| 223 | + ] | ||
| 224 | + self.add_scalar_alpha_result(shape_format) | ||
| 225 | + | ||
| 226 | + def test_add_scalar_shape_format_fp16_2d(self): | ||
| 227 | + format_list = [0, 3, 29] | ||
| 228 | + scalar_list = [0, 1] | ||
| 229 | + shape_format = [ | ||
| 230 | + [[np.float16, i, [5, 256]], k] for i in format_list for k in scalar_list | ||
| 231 | + ] | ||
| 232 | + self.add_scalar_alpha_result(shape_format) | ||
| 233 | + | ||
| 234 | + def test_add_scalar_shape_format_fp32_2d(self): | ||
| 235 | + format_list = [0, 3, 29] | ||
| 236 | + scalar_list = [0, 1] | ||
| 237 | + shape_format = [ | ||
| 238 | + [[np.float32, i, [5, 256]], k] for i in format_list for k in scalar_list | ||
| 239 | + ] | ||
| 240 | + self.add_scalar_alpha_result(shape_format) | ||
| 241 | + | ||
| 242 | + def test_add_scalar_shape_format_fp16_3d(self): | ||
| 243 | + format_list = [0, 3, 29] | ||
| 244 | + scalar_list = [0, 1] | ||
| 245 | + shape_format = [ | ||
| 246 | + [[np.float16, i, [32, 3, 3]], k] for i in format_list for k in scalar_list | ||
| 247 | + ] | ||
| 248 | + self.add_scalar_alpha_result(shape_format) | ||
| 249 | + | ||
| 250 | + def test_add_scalar_shape_format_fp32_3d(self): | ||
| 251 | + format_list = [0, 3, 29] | ||
| 252 | + scalar_list = [0, 1] | ||
| 253 | + shape_format = [ | ||
| 254 | + [[np.float32, i, [32, 3, 3]], k] for i in format_list for k in scalar_list | ||
| 255 | + ] | ||
| 256 | + self.add_scalar_alpha_result(shape_format) | ||
| 257 | + | ||
| 258 | + def test_add_scalar_shape_format_fp16_4d(self): | ||
| 259 | + format_list = [0, 3, 29] | ||
| 260 | + scalar_list = [0, 1] | ||
| 261 | + shape_format = [ | ||
| 262 | + [[np.float16, i, [64, 112, 7, 7]], k] | ||
| 263 | + for i in format_list | ||
| 264 | + for k in scalar_list | ||
| 265 | + ] | ||
| 266 | + self.add_scalar_alpha_result(shape_format) | ||
| 267 | + | ||
| 268 | + def test_add_scalar_shape_format_fp32_4d(self): | ||
| 269 | + format_list = [0, 3, 29] | ||
| 270 | + scalar_list = [0, 1] | ||
| 271 | + shape_format = [ | ||
| 272 | + [[np.float32, i, [64, 112, 7, 7]], k] | ||
| 273 | + for i in format_list | ||
| 274 | + for k in scalar_list | ||
| 275 | + ] | ||
| 276 | + self.add_scalar_alpha_result(shape_format) | ||
| 277 | + | ||
| 278 | + def test_add_shape_format_fp16_1d(self): | ||
| 279 | + format_list = [0, 3] | ||
| 280 | + shape_format = [[np.float16, i, [64]] for i in format_list] | ||
| 281 | + self.add_result(shape_format) | ||
| 282 | + | ||
| 283 | + def test_add_shape_format_fp32_1d(self): | ||
| 284 | + format_list = [0, 3] | ||
| 285 | + shape_format = [[np.float32, i, [64]] for i in format_list] | ||
| 286 | + self.add_result(shape_format) | ||
| 287 | + | ||
| 288 | + def test_add_shape_format_fp16_2d(self): | ||
| 289 | + format_list = [0, 3, 29] | ||
| 290 | + shape_format = [[np.float16, i, [5, 256]] for i in format_list] | ||
| 291 | + self.add_result(shape_format) | ||
| 292 | + | ||
| 293 | + def test_add_shape_format_fp32_2d(self): | ||
| 294 | + format_list = [0, 3, 29] | ||
| 295 | + shape_format = [[np.float32, i, [5, 256]] for i in format_list] | ||
| 296 | + self.add_result(shape_format) | ||
| 297 | + | ||
| 298 | + def test_add_shape_format_fp16_3d(self): | ||
| 299 | + format_list = [0, 3, 29] | ||
| 300 | + shape_format = [[np.float16, i, [32, 3, 3]] for i in format_list] | ||
| 301 | + self.add_result(shape_format) | ||
| 302 | + | ||
| 303 | + def test_add_shape_format_fp32_3d(self): | ||
| 304 | + format_list = [0, 3, 29] | ||
| 305 | + shape_format = [[np.float32, i, [32, 3, 3]] for i in format_list] | ||
| 306 | + self.add_result(shape_format) | ||
| 307 | + | ||
| 308 | + def test_add_shape_format_fp16_4d(self): | ||
| 309 | + format_list = [0, 3, 29] | ||
| 310 | + shape_format = [[np.float16, i, [64, 112, 7, 7]] for i in format_list] | ||
| 311 | + self.add_result(shape_format) | ||
| 312 | + | ||
| 313 | + def test_add_shape_format_fp32_4d(self): | ||
| 314 | + format_list = [0, 3, 29] | ||
| 315 | + shape_format = [[np.float32, i, [64, 112, 7, 7]] for i in format_list] | ||
| 316 | + self.add_result(shape_format) | ||
| 317 | + | ||
| 318 | + def test_add_shape_format_fp16_1d(self): | ||
| 319 | + format_list = [0, 3] | ||
| 320 | + shape_format = [[np.float16, i, [64]] for i in format_list] | ||
| 321 | + self.add_alpha_result(shape_format) | ||
| 322 | + | ||
| 323 | + def test_add_shape_format_fp32_1d(self): | ||
| 324 | + format_list = [0, 3] | ||
| 325 | + shape_format = [[np.float32, i, [64]] for i in format_list] | ||
| 326 | + self.add_alpha_result(shape_format) | ||
| 327 | + | ||
| 328 | + def test_add_shape_format_fp16_2d(self): | ||
| 329 | + format_list = [0, 3, 29] | ||
| 330 | + shape_format = [[np.float16, i, [5, 256]] for i in format_list] | ||
| 331 | + self.add_alpha_result(shape_format) | ||
| 332 | + | ||
| 333 | + def test_add_shape_format_fp32_2d(self): | ||
| 334 | + format_list = [0, 3, 29] | ||
| 335 | + shape_format = [[np.float32, i, [5, 256]] for i in format_list] | ||
| 336 | + self.add_alpha_result(shape_format) | ||
| 337 | + | ||
| 338 | + def test_add_shape_format_fp16_3d(self): | ||
| 339 | + format_list = [0, 3, 29] | ||
| 340 | + shape_format = [[np.float16, i, [32, 3, 3]] for i in format_list] | ||
| 341 | + self.add_alpha_result(shape_format) | ||
| 342 | + | ||
| 343 | + def test_add_shape_format_fp32_3d(self): | ||
| 344 | + format_list = [0, 3, 29] | ||
| 345 | + shape_format = [[np.float32, i, [32, 3, 3]] for i in format_list] | ||
| 346 | + self.add_alpha_result(shape_format) | ||
| 347 | + | ||
| 348 | + def test_add_shape_format_fp16_4d(self): | ||
| 349 | + format_list = [0, 3, 29] | ||
| 350 | + shape_format = [[np.float16, i, [64, 112, 7, 7]] for i in format_list] | ||
| 351 | + self.add_alpha_result(shape_format) | ||
| 352 | + | ||
| 353 | + def test_add_shape_format_fp32_4d(self): | ||
| 354 | + format_list = [0, 3, 29] | ||
| 355 | + shape_format = [[np.float32, i, [64, 112, 7, 7]] for i in format_list] | ||
| 356 | + self.add_alpha_result(shape_format) | ||
| 357 | + | ||
| 358 | + def test_add_mix_dtype(self): | ||
| 359 | + cpu_input1, npu_input1 = create_common_tensor([np.int32, 0, (2, 3)], 1, 100) | ||
| 360 | + cpu_input2, npu_input2 = create_common_tensor([np.float32, 0, (2, 3)], 1, 100) | ||
| 361 | + cpu_output = torch.add(cpu_input1, cpu_input2) | ||
| 362 | + npu_output = torch.add(npu_input1, npu_input2) | ||
| 363 | + npu_output = npu_output.to("cpu") | ||
| 364 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 365 | + | ||
| 366 | + def test_add_scalar_check_5d_5d_match(self): | ||
| 367 | + ca = torch.randn(4) | ||
| 368 | + cb = ca.view(2, 2).transpose(1, 0) | ||
| 369 | + na = ca.npu() | ||
| 370 | + nb = cb.npu() | ||
| 371 | + caout = torch.add(ca, 1) | ||
| 372 | + cbout = torch.add(cb, 1) | ||
| 373 | + naout = torch.add(na, 1) | ||
| 374 | + nbout = torch.add(nb, 1) | ||
| 375 | + naout = naout.to("cpu") | ||
| 376 | + nbout = nbout.to("cpu") | ||
| 377 | + self.assertRtolEqual(caout, naout) | ||
| 378 | + self.assertRtolEqual(cbout, nbout) | ||
| 379 | + | ||
| 380 | + def test_add_different_dtype(self): | ||
| 381 | + cpu_x1 = torch.rand(2, 3, 4) | ||
| 382 | + cpu_other1 = torch.rand(2, 3, 4).uniform_(1, 10).long() | ||
| 383 | + npu_x1 = cpu_x1.npu() | ||
| 384 | + npu_other1 = cpu_other1.npu() | ||
| 385 | + cpu_out1 = cpu_x1 + cpu_other1 | ||
| 386 | + npu_out1 = npu_x1 + npu_other1 | ||
| 387 | + | ||
| 388 | + cpu_x2 = 1.5 | ||
| 389 | + cpu_other2 = torch.rand(2, 3, 4).uniform_(1, 10).long() | ||
| 390 | + npu_x2 = 1.5 | ||
| 391 | + npu_other2 = cpu_other2.npu() | ||
| 392 | + cpu_out2 = cpu_x2 + cpu_other2 | ||
| 393 | + npu_out2 = npu_x2 + npu_other2 | ||
| 394 | + | ||
| 395 | + cpu_x3 = torch.rand(2, 3, 4).int() | ||
| 396 | + cpu_other3 = 3 | ||
| 397 | + npu_x3 = cpu_x3.npu() | ||
| 398 | + npu_other3 = 3 | ||
| 399 | + cpu_out3 = cpu_x3 + cpu_other3 | ||
| 400 | + npu_out3 = npu_x3 + npu_other3 | ||
| 401 | + | ||
| 402 | + self.assertRtolEqual(cpu_out1, npu_out1.cpu()) | ||
| 403 | + self.assertRtolEqual(cpu_out2, npu_out2.cpu()) | ||
| 404 | + self.assertRtolEqual(cpu_out3, npu_out3.cpu()) | ||
| 405 | + | ||
| 406 | + def test_add_inplace_and_out_mix_dtype(self): | ||
| 407 | + dtype_list = [ | ||
| 408 | + [np.int32, np.int64, np.int64], | ||
| 409 | + [np.int64, np.int32, np.int64], | ||
| 410 | + [np.float32, np.float16, np.float32], | ||
| 411 | + [np.float16, np.float32, np.float32], | ||
| 412 | + [np.int64, np.float32, np.float32], | ||
| 413 | + ] | ||
| 414 | + for item in dtype_list: | ||
| 415 | + cpu_input1, npu_input1 = create_common_tensor( | ||
| 416 | + [item[0], 0, (2, 3, 4)], -100, 100 | ||
| 417 | + ) | ||
| 418 | + cpu_input2, npu_input2 = create_common_tensor( | ||
| 419 | + [item[1], 0, (2, 3, 4)], -100, 100 | ||
| 420 | + ) | ||
| 421 | + _, npu_output = create_common_tensor([item[2], 0, (2, 3, 4)], 1, 100) | ||
| 422 | + | ||
| 423 | + if item[0] == np.int64 and item[1] == np.float32: | ||
| 424 | + try: | ||
| 425 | + npu_input1.add_(npu_input2) | ||
| 426 | + except RuntimeError as e: | ||
| 427 | + self.assertRegex( | ||
| 428 | + str(e), | ||
| 429 | + "result type Float can't be cast to the desired output type Long", | ||
| 430 | + ) | ||
| 431 | + else: | ||
| 432 | + cpu_input1.add_(cpu_input2) | ||
| 433 | + npu_input1.add_(npu_input2) | ||
| 434 | + self.assertRtolEqual(cpu_input1, npu_input1.cpu()) | ||
| 435 | + | ||
| 436 | + cpu_output = torch.add(cpu_input1, cpu_input2) | ||
| 437 | + torch.add(npu_input1, npu_input2, out=npu_output) | ||
| 438 | + self.assertRtolEqual(cpu_output, npu_output.cpu()) | ||
| 439 | + | ||
| 440 | + def test_tensor_add_fp16(self): | ||
| 441 | + format_list = [0, 3, 29] | ||
| 442 | + shape_format = [[np.float16, i, [5, 256]] for i in format_list] | ||
| 443 | + for item in shape_format: | ||
| 444 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 445 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 446 | + if cpu_input1.dtype == torch.float16: | ||
| 447 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 448 | + cpu_input2 = cpu_input2.to(torch.float32) | ||
| 449 | + | ||
| 450 | + cpu_output = self.cpu_tensor_op_exec(cpu_input1, cpu_input2) | ||
| 451 | + npu_output = self.npu_tensor_op_exec(npu_input1, npu_input2) | ||
| 452 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 453 | + | ||
| 454 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 455 | + | ||
| 456 | + def test_tensor_add_fp32(self): | ||
| 457 | + format_list = [0, 3, 29] | ||
| 458 | + shape_format = [[np.float32, i, [5, 256]] for i in format_list] | ||
| 459 | + for item in shape_format: | ||
| 460 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 461 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 462 | + | ||
| 463 | + cpu_output = self.cpu_tensor_op_exec(cpu_input1, cpu_input2) | ||
| 464 | + npu_output = self.npu_tensor_op_exec(npu_input1, npu_input2) | ||
| 465 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 466 | + | ||
| 467 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 468 | + | ||
| 469 | + | ||
| 470 | +if __name__ == "__main__": | ||
| 471 | + run_tests() | ||
| @@ -0,0 +1,218 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAddRelu(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1, input2): | ||
| 11 | + output = torch._VF._add_relu(input1, input2, alpha=1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec_new(self, input1, input2): | ||
| 16 | + output = torch._VF._add_relu(input1, input2, alpha=1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def npu_op_exec_new_out(self, input1, input2, output): | ||
| 22 | + torch._VF._add_relu(input1, input2, out=output, alpha=1) | ||
| 23 | + output = output.to("cpu") | ||
| 24 | + output = output.numpy() | ||
| 25 | + return output | ||
| 26 | + | ||
| 27 | + def cpu_op_inp_exec(self, input1, input2): | ||
| 28 | + output = torch._VF._add_relu_(input1, input2, alpha=1) | ||
| 29 | + output = output.numpy() | ||
| 30 | + return output | ||
| 31 | + | ||
| 32 | + def npu_op_inp_exec(self, input1, input2): | ||
| 33 | + output = torch._VF._add_relu_(input1, input2, alpha=1) | ||
| 34 | + output = output.to("cpu") | ||
| 35 | + output = output.numpy() | ||
| 36 | + return output | ||
| 37 | + | ||
| 38 | + def cpu_op_exec_alpha(self, input1, input2): | ||
| 39 | + output = torch._VF._add_relu(input1, input2, alpha=3) | ||
| 40 | + output = output.numpy() | ||
| 41 | + return output | ||
| 42 | + | ||
| 43 | + def npu_op_exec_new_alpha(self, input1, input2): | ||
| 44 | + output = torch._VF._add_relu(input1, input2, alpha=3) | ||
| 45 | + output = output.to("cpu") | ||
| 46 | + output = output.numpy() | ||
| 47 | + return output | ||
| 48 | + | ||
| 49 | + def add_relu_result(self, shape_format): | ||
| 50 | + for item in shape_format: | ||
| 51 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 52 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 53 | + if cpu_input1.dtype == torch.float16: | ||
| 54 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 55 | + cpu_input2 = cpu_input2.to(torch.float32) | ||
| 56 | + | ||
| 57 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 58 | + npu_output = self.npu_op_exec_new(npu_input1, npu_input2) | ||
| 59 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 60 | + | ||
| 61 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 62 | + | ||
| 63 | + def add_relu_out_result(self, shape_format): | ||
| 64 | + for item in shape_format: | ||
| 65 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 66 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 67 | + cpu_input3, npu_input3 = create_common_tensor(item, 0, 100) | ||
| 68 | + if cpu_input1.dtype == torch.float16: | ||
| 69 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 70 | + cpu_input2 = cpu_input2.to(torch.float32) | ||
| 71 | + | ||
| 72 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 73 | + npu_output = self.npu_op_exec_new_out(npu_input1, npu_input2, npu_input3) | ||
| 74 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 75 | + | ||
| 76 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 77 | + | ||
| 78 | + def add_relu_inp_result(self, shape_format): | ||
| 79 | + for item in shape_format: | ||
| 80 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 81 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 82 | + if cpu_input1.dtype == torch.float16: | ||
| 83 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 84 | + cpu_input2 = cpu_input2.to(torch.float32) | ||
| 85 | + | ||
| 86 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 87 | + npu_output = self.npu_op_inp_exec(npu_input1, npu_input2) | ||
| 88 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 89 | + | ||
| 90 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 91 | + | ||
| 92 | + def add_relu_alpha_result(self, shape_format): | ||
| 93 | + for item in shape_format: | ||
| 94 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 95 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 96 | + if cpu_input1.dtype == torch.float16: | ||
| 97 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 98 | + cpu_input2 = cpu_input2.to(torch.float32) | ||
| 99 | + | ||
| 100 | + cpu_output = self.cpu_op_exec_alpha(cpu_input1, cpu_input2) | ||
| 101 | + npu_output = self.npu_op_exec_new_alpha(npu_input1, npu_input2) | ||
| 102 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 103 | + | ||
| 104 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 105 | + | ||
| 106 | + def test_add_relu_shape_format_fp32_1d(self): | ||
| 107 | + format_list = [0, 3] | ||
| 108 | + shape_format = [[np.float32, i, [64]] for i in format_list] | ||
| 109 | + self.add_relu_result(shape_format) | ||
| 110 | + | ||
| 111 | + def test_add_relu_shape_format_fp16_2d(self): | ||
| 112 | + format_list = [0, 3, 29] | ||
| 113 | + shape_format = [[np.float16, i, [5, 256]] for i in format_list] | ||
| 114 | + self.add_relu_result(shape_format) | ||
| 115 | + | ||
| 116 | + def test_add_relu_shape_format_fp32_2d(self): | ||
| 117 | + format_list = [0, 3, 29] | ||
| 118 | + shape_format = [[np.float32, i, [5, 256]] for i in format_list] | ||
| 119 | + self.add_relu_result(shape_format) | ||
| 120 | + | ||
| 121 | + def test_add_relu_shape_format_fp16_3d(self): | ||
| 122 | + format_list = [0, 3, 29] | ||
| 123 | + shape_format = [[np.float16, i, [32, 3, 3]] for i in format_list] | ||
| 124 | + self.add_relu_result(shape_format) | ||
| 125 | + | ||
| 126 | + def test_add_relu_shape_format_fp32_3d(self): | ||
| 127 | + format_list = [0, 3, 29] | ||
| 128 | + shape_format = [[np.float32, i, [32, 3, 3]] for i in format_list] | ||
| 129 | + self.add_relu_result(shape_format) | ||
| 130 | + | ||
| 131 | + def test_add_relu_shape_format_fp16_4d(self): | ||
| 132 | + format_list = [0, 3, 29] | ||
| 133 | + shape_format = [[np.float16, i, [64, 112, 7, 7]] for i in format_list] | ||
| 134 | + self.add_relu_result(shape_format) | ||
| 135 | + | ||
| 136 | + def test_add_relu_shape_format_fp32_4d(self): | ||
| 137 | + format_list = [0, 3, 29] | ||
| 138 | + shape_format = [[np.float32, i, [64, 112, 7, 7]] for i in format_list] | ||
| 139 | + self.add_relu_result(shape_format) | ||
| 140 | + | ||
| 141 | + def test_add_relu_out_shape_format_fp32_1d(self): | ||
| 142 | + format_list = [0, 3] | ||
| 143 | + shape_format = [[np.float32, i, [64]] for i in format_list] | ||
| 144 | + self.add_relu_out_result(shape_format) | ||
| 145 | + | ||
| 146 | + def test_add_relu_out_shape_format_fp16_2d(self): | ||
| 147 | + format_list = [0, 3, 29] | ||
| 148 | + shape_format = [[np.float16, i, [5, 256]] for i in format_list] | ||
| 149 | + self.add_relu_out_result(shape_format) | ||
| 150 | + | ||
| 151 | + def test_add_relu_inp_shape_format_fp32_2d(self): | ||
| 152 | + format_list = [0, 3, 29] | ||
| 153 | + shape_format = [[np.float32, i, [5, 256]] for i in format_list] | ||
| 154 | + self.add_relu_inp_result(shape_format) | ||
| 155 | + | ||
| 156 | + def test_add_relu_inp_shape_format_fp16_3d(self): | ||
| 157 | + format_list = [0, 3, 29] | ||
| 158 | + shape_format = [[np.float16, i, [32, 3, 3]] for i in format_list] | ||
| 159 | + self.add_relu_inp_result(shape_format) | ||
| 160 | + | ||
| 161 | + def test_add_relu_inp_shape_format_fp32_3d(self): | ||
| 162 | + format_list = [0, 3, 29] | ||
| 163 | + shape_format = [[np.float32, i, [32, 3, 3]] for i in format_list] | ||
| 164 | + self.add_relu_inp_result(shape_format) | ||
| 165 | + | ||
| 166 | + def test_add_relu_inp_shape_format_fp16_4d(self): | ||
| 167 | + format_list = [0, 3, 29] | ||
| 168 | + shape_format = [[np.float16, i, [64, 112, 7, 7]] for i in format_list] | ||
| 169 | + self.add_relu_inp_result(shape_format) | ||
| 170 | + | ||
| 171 | + def test_add_relu_inp_shape_format_fp32_4d(self): | ||
| 172 | + format_list = [0, 3, 29] | ||
| 173 | + shape_format = [[np.float32, i, [64, 112, 7, 7]] for i in format_list] | ||
| 174 | + self.add_relu_inp_result(shape_format) | ||
| 175 | + | ||
| 176 | + def test_add_relu_shape_format_fp16_1d(self): | ||
| 177 | + format_list = [0, 3] | ||
| 178 | + shape_format = [[np.float16, i, [64]] for i in format_list] | ||
| 179 | + self.add_relu_alpha_result(shape_format) | ||
| 180 | + | ||
| 181 | + def test_add_relu_alpha_shape_format_fp32_1d(self): | ||
| 182 | + format_list = [0, 3] | ||
| 183 | + shape_format = [[np.float32, i, [64]] for i in format_list] | ||
| 184 | + self.add_relu_alpha_result(shape_format) | ||
| 185 | + | ||
| 186 | + def test_add_relu_alpha_shape_format_fp16_2d(self): | ||
| 187 | + format_list = [0, 3, 29] | ||
| 188 | + shape_format = [[np.float16, i, [5, 256]] for i in format_list] | ||
| 189 | + self.add_relu_alpha_result(shape_format) | ||
| 190 | + | ||
| 191 | + def test_add_relu_alpha_shape_format_fp32_2d(self): | ||
| 192 | + format_list = [0, 3, 29] | ||
| 193 | + shape_format = [[np.float32, i, [5, 256]] for i in format_list] | ||
| 194 | + self.add_relu_alpha_result(shape_format) | ||
| 195 | + | ||
| 196 | + def test_add_relu_alpha_shape_format_fp16_3d(self): | ||
| 197 | + format_list = [0, 3, 29] | ||
| 198 | + shape_format = [[np.float16, i, [32, 3, 3]] for i in format_list] | ||
| 199 | + self.add_relu_alpha_result(shape_format) | ||
| 200 | + | ||
| 201 | + def test_add_relu_alpha_shape_format_fp32_3d(self): | ||
| 202 | + format_list = [0, 3, 29] | ||
| 203 | + shape_format = [[np.float32, i, [32, 3, 3]] for i in format_list] | ||
| 204 | + self.add_relu_alpha_result(shape_format) | ||
| 205 | + | ||
| 206 | + def test_add_relu_alpha_shape_format_fp16_4d(self): | ||
| 207 | + format_list = [0, 3, 29] | ||
| 208 | + shape_format = [[np.float16, i, [64, 112, 7, 7]] for i in format_list] | ||
| 209 | + self.add_relu_alpha_result(shape_format) | ||
| 210 | + | ||
| 211 | + def test_add_relu_alpha_shape_format_fp32_4d(self): | ||
| 212 | + format_list = [0, 3, 29] | ||
| 213 | + shape_format = [[np.float32, i, [64, 112, 7, 7]] for i in format_list] | ||
| 214 | + self.add_relu_alpha_result(shape_format) | ||
| 215 | + | ||
| 216 | + | ||
| 217 | +if __name__ == "__main__": | ||
| 218 | + run_tests() | ||
| @@ -0,0 +1,161 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAddbmm(TestCase): | ||
| 10 | + def generate_scalar(self, dtype, min_d, max_d): | ||
| 11 | + if dtype == "float32": | ||
| 12 | + scalar = np.random.uniform(min_d, max_d) | ||
| 13 | + if dtype == "int32": | ||
| 14 | + scalar = np.random.randint(min_d, max_d) | ||
| 15 | + return scalar | ||
| 16 | + | ||
| 17 | + def cpu_op_exec(self, input1, input2, input3, scalar1, scalar2): | ||
| 18 | + output = torch.addbmm(input1, input2, input3, beta=scalar1, alpha=scalar2) | ||
| 19 | + output = output.numpy() | ||
| 20 | + return output | ||
| 21 | + | ||
| 22 | + def npu_op_exec(self, input1, input2, input3, scalar1, scalar2): | ||
| 23 | + input1 = input1.to("npu") | ||
| 24 | + input2 = input2.to("npu") | ||
| 25 | + input3 = input3.to("npu") | ||
| 26 | + output = torch.addbmm(input1, input2, input3, beta=scalar1, alpha=scalar2) | ||
| 27 | + output = output.to("cpu") | ||
| 28 | + output = output.numpy() | ||
| 29 | + return output | ||
| 30 | + | ||
| 31 | + # pylint:disable = huawei-too-many-arguments | ||
| 32 | + def npu_op_exec_out(self, input1, input2, input3, scalar1, scalar2, input4): | ||
| 33 | + input1 = input1.to("npu") | ||
| 34 | + input2 = input2.to("npu") | ||
| 35 | + input3 = input3.to("npu") | ||
| 36 | + output = input4.to("npu") | ||
| 37 | + torch.addbmm(input1, input2, input3, beta=scalar1, alpha=scalar2, out=output) | ||
| 38 | + output = output.to("cpu") | ||
| 39 | + output = output.numpy() | ||
| 40 | + return output | ||
| 41 | + | ||
| 42 | + def npu_op_exec_inplace(self, input1, input2, input3, scalar1, scalar2): | ||
| 43 | + input1 = input1.to("npu") | ||
| 44 | + input2 = input2.to("npu") | ||
| 45 | + input3 = input3.to("npu") | ||
| 46 | + input1.addbmm_(input2, input3, beta=scalar1, alpha=scalar2) | ||
| 47 | + output = input1.to("cpu") | ||
| 48 | + output = output.numpy() | ||
| 49 | + return output | ||
| 50 | + | ||
| 51 | + def cpu_op_transpose_exec(self, input1, input2, input3, scalar1, scalar2): | ||
| 52 | + input3_t = np.transpose(input3, (0, 2, 1)) | ||
| 53 | + output = torch.addbmm(input1, input2, input3_t, beta=scalar1, alpha=scalar2) | ||
| 54 | + output = output.numpy() | ||
| 55 | + return output | ||
| 56 | + | ||
| 57 | + # pylint:disable = huawei-too-many-arguments | ||
| 58 | + def npu_op_transpose_exec(self, input1, input2, input3, scalar1, scalar2): | ||
| 59 | + input1 = input1.to("npu") | ||
| 60 | + input2 = input2.to("npu") | ||
| 61 | + input3 = input3.to("npu") | ||
| 62 | + input3_t = torch.permute(input3, (0, 2, 1)) | ||
| 63 | + output = torch.addbmm(input1, input2, input3_t, beta=scalar1, alpha=scalar2) | ||
| 64 | + output = output.to("cpu") | ||
| 65 | + output = output.numpy() | ||
| 66 | + return output | ||
| 67 | + | ||
| 68 | + def test_addbmm(self): | ||
| 69 | + shape_format = [ | ||
| 70 | + [ | ||
| 71 | + [np.float16, 0, [3, 5]], | ||
| 72 | + [np.float16, 0, [10, 3, 4]], | ||
| 73 | + [np.float16, 0, [10, 4, 5]], | ||
| 74 | + "float32", | ||
| 75 | + ], | ||
| 76 | + ] | ||
| 77 | + | ||
| 78 | + for item in shape_format: | ||
| 79 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 0, 1) | ||
| 80 | + cpu_input2, npu_input2 = create_common_tensor(item[1], 0, 1) | ||
| 81 | + cpu_input3, npu_input3 = create_common_tensor(item[2], 0, 1) | ||
| 82 | + cpu_input4, npu_input4 = create_common_tensor(item[0], 0, 1) | ||
| 83 | + | ||
| 84 | + scalar1 = self.generate_scalar(item[3], 0, 2) | ||
| 85 | + scalar2 = self.generate_scalar(item[3], 0, 2) | ||
| 86 | + | ||
| 87 | + cpu_output = self.cpu_op_exec( | ||
| 88 | + cpu_input1.float(), | ||
| 89 | + cpu_input2.float(), | ||
| 90 | + cpu_input3.float(), | ||
| 91 | + scalar1, | ||
| 92 | + scalar2, | ||
| 93 | + ) | ||
| 94 | + npu_output = self.npu_op_exec( | ||
| 95 | + npu_input1.float(), | ||
| 96 | + npu_input2.float(), | ||
| 97 | + npu_input3.float(), | ||
| 98 | + scalar1, | ||
| 99 | + scalar2, | ||
| 100 | + ) | ||
| 101 | + | ||
| 102 | + npu_output1 = self.npu_op_exec_out( | ||
| 103 | + npu_input1.float(), | ||
| 104 | + npu_input2.float(), | ||
| 105 | + npu_input3.float(), | ||
| 106 | + scalar1, | ||
| 107 | + scalar2, | ||
| 108 | + npu_input4.float(), | ||
| 109 | + ) | ||
| 110 | + npu_output2 = self.npu_op_exec_inplace( | ||
| 111 | + npu_input1.float(), | ||
| 112 | + npu_input2.float(), | ||
| 113 | + npu_input3.float(), | ||
| 114 | + scalar1, | ||
| 115 | + scalar2, | ||
| 116 | + ) | ||
| 117 | + | ||
| 118 | + self.assertRtolEqual(cpu_output, npu_output, prec=1.0e-3, prec16=1.0e-3) | ||
| 119 | + self.assertRtolEqual(cpu_output, npu_output1, prec=1.0e-3, prec16=1.0e-3) | ||
| 120 | + self.assertRtolEqual(cpu_output, npu_output2, prec=1.0e-3, prec16=1.0e-3) | ||
| 121 | + | ||
| 122 | + def test_addbmm_transpose(self): | ||
| 123 | + shape_format = [ | ||
| 124 | + [ | ||
| 125 | + [np.float16, 0, [4, 5]], | ||
| 126 | + [np.float16, 0, [10, 4, 7]], | ||
| 127 | + [np.float16, 0, [10, 5, 7]], | ||
| 128 | + "float32", | ||
| 129 | + ], | ||
| 130 | + ] | ||
| 131 | + | ||
| 132 | + for item in shape_format: | ||
| 133 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 0, 1) | ||
| 134 | + cpu_input2, npu_input2 = create_common_tensor(item[1], 0, 1) | ||
| 135 | + cpu_input3, npu_input3 = create_common_tensor(item[2], 0, 1) | ||
| 136 | + | ||
| 137 | + scalar1 = self.generate_scalar(item[3], 0, 2) | ||
| 138 | + scalar2 = self.generate_scalar(item[3], 0, 2) | ||
| 139 | + | ||
| 140 | + cpu_transpose_output = self.cpu_op_transpose_exec( | ||
| 141 | + cpu_input1.float(), | ||
| 142 | + cpu_input2.float(), | ||
| 143 | + cpu_input3.float(), | ||
| 144 | + scalar1, | ||
| 145 | + scalar2, | ||
| 146 | + ) | ||
| 147 | + npu_transpose_output = self.npu_op_transpose_exec( | ||
| 148 | + npu_input1.float(), | ||
| 149 | + npu_input2.float(), | ||
| 150 | + npu_input3.float(), | ||
| 151 | + scalar1, | ||
| 152 | + scalar2, | ||
| 153 | + ) | ||
| 154 | + | ||
| 155 | + self.assertRtolEqual( | ||
| 156 | + cpu_transpose_output, npu_transpose_output, prec=1.0e-3, prec16=1.0e-3 | ||
| 157 | + ) | ||
| 158 | + | ||
| 159 | + | ||
| 160 | +if __name__ == "__main__": | ||
| 161 | + run_tests() | ||
| @@ -0,0 +1,288 @@ | |||
| 1 | +import copy | ||
| 2 | +import torch | ||
| 3 | +import numpy as np | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | + | ||
| 7 | + | ||
| 8 | +class TestAddcdiv(TestCase): | ||
| 9 | + def cpu_op_inp_input3_noncontiguous_exec(self, input1, input2, input3, scalar): | ||
| 10 | + input3_strided = input3.as_strided([2, 2], [1, 2], 2) | ||
| 11 | + input1.addcdiv_(input2, input3_strided, value=scalar) | ||
| 12 | + output = input1.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_inp_input3_noncontiguous_exec(self, input1, input2, input3, scalar): | ||
| 16 | + input1 = input1.to("npu") | ||
| 17 | + input2 = input2.to("npu") | ||
| 18 | + input3 = input3.to("npu") | ||
| 19 | + input3_as_strided = input3.as_strided([2, 2], [1, 2], 2) | ||
| 20 | + input1.addcdiv_(input2, input3_as_strided, value=scalar) | ||
| 21 | + output = input1.to("cpu") | ||
| 22 | + output = output.numpy() | ||
| 23 | + return output | ||
| 24 | + | ||
| 25 | + def non_zero_rand(self, size, dtype, device="npu"): | ||
| 26 | + if dtype.is_floating_point: | ||
| 27 | + a = torch.rand(size=size, dtype=dtype, device="cpu") | ||
| 28 | + a = a.to("npu") | ||
| 29 | + elif dtype == torch.uint8: | ||
| 30 | + a = torch.randint(1, 5, size=size, dtype=dtype, device="cpu").to(device) | ||
| 31 | + else: | ||
| 32 | + a = torch.randint(-5, 5, size=size, dtype=dtype, device="cpu").to(device) | ||
| 33 | + return a.type(dtype) | ||
| 34 | + | ||
| 35 | + def cpu_op_exec(self, input1, input2, input3, scalar): | ||
| 36 | + output = torch.addcdiv(input1, input2, input3, value=scalar) | ||
| 37 | + return output | ||
| 38 | + | ||
| 39 | + def npu_op_exec(self, input1, input2, input3, scalar): | ||
| 40 | + input1 = input1.to("npu") | ||
| 41 | + input2 = input2.to("npu") | ||
| 42 | + input3 = input3.to("npu") | ||
| 43 | + output = torch.addcdiv(input1, input2, input3, value=scalar) | ||
| 44 | + output = output.to("cpu") | ||
| 45 | + return output | ||
| 46 | + | ||
| 47 | + def cpu_op_exec_out(self, input1, input2, input3, scalar, output): | ||
| 48 | + torch.addcdiv(input1, input2, input3, value=scalar, out=output) | ||
| 49 | + output = output.numpy() | ||
| 50 | + return output | ||
| 51 | + | ||
| 52 | + def npu_op_exec_out(self, input1, input2, input3, scalar, output): | ||
| 53 | + input1 = input1.to("npu") | ||
| 54 | + input2 = input2.to("npu") | ||
| 55 | + input3 = input3.to("npu") | ||
| 56 | + output = output.to("npu") | ||
| 57 | + torch.addcdiv(input1, input2, input3, value=scalar, out=output) | ||
| 58 | + output = output.to("cpu").numpy() | ||
| 59 | + return output | ||
| 60 | + | ||
| 61 | + def cpu_op_inp_contiguous_exec(self, input1, input2, input3, scalar): | ||
| 62 | + input1.addcdiv_(input2, input3, value=scalar) | ||
| 63 | + output = input1.numpy() | ||
| 64 | + return output | ||
| 65 | + | ||
| 66 | + def npu_op_inp_contiguous_exec(self, input1, input2, input3, scalar): | ||
| 67 | + input1 = input1.to("npu") | ||
| 68 | + input2 = input2.to("npu") | ||
| 69 | + input3 = input3.to("npu") | ||
| 70 | + input1.addcdiv_(input2, input3, value=scalar) | ||
| 71 | + output = input1.to("cpu") | ||
| 72 | + output = output.numpy() | ||
| 73 | + return output | ||
| 74 | + | ||
| 75 | + def cpu_op_inp_input1_noncontiguous_exec(self, input1, input2, input3, scalar): | ||
| 76 | + input1_strided = input1.as_strided([2, 2], [1, 2], 2) | ||
| 77 | + input1_strided.addcdiv_(input2, input3, value=scalar) | ||
| 78 | + output = input1.numpy() | ||
| 79 | + return output | ||
| 80 | + | ||
| 81 | + def npu_op_inp_input1_noncontiguous_exec(self, input1, input2, input3, scalar): | ||
| 82 | + input1 = input1.to("npu") | ||
| 83 | + input2 = input2.to("npu") | ||
| 84 | + input3 = input3.to("npu") | ||
| 85 | + input1_as_strided = input1.as_strided([2, 2], [1, 2], 2) | ||
| 86 | + input1_as_strided.addcdiv_(input2, input3, value=scalar) | ||
| 87 | + output = input1.to("cpu") | ||
| 88 | + output = output.numpy() | ||
| 89 | + return output | ||
| 90 | + | ||
| 91 | + def cpu_op_inp_input2_noncontiguous_exec(self, input1, input2, input3, scalar): | ||
| 92 | + input2_strided = input2.as_strided([2, 2], [1, 2], 2) | ||
| 93 | + input1.addcdiv_(input2_strided, input3, value=scalar) | ||
| 94 | + output = input1.numpy() | ||
| 95 | + return output | ||
| 96 | + | ||
| 97 | + def npu_op_inp_input2_noncontiguous_exec(self, input1, input2, input3, scalar): | ||
| 98 | + input1 = input1.to("npu") | ||
| 99 | + input3 = input3.to("npu") | ||
| 100 | + input2 = input2.to("npu") | ||
| 101 | + input2_as_strided = input2.as_strided([2, 2], [1, 2], 2) | ||
| 102 | + input1.addcdiv_(input2_as_strided, input3, value=scalar) | ||
| 103 | + output = input1.to("cpu") | ||
| 104 | + output = output.numpy() | ||
| 105 | + return output | ||
| 106 | + | ||
| 107 | + def generate_data(self, min1, max1, shape, dtype): | ||
| 108 | + input1 = np.random.uniform(min1, max1, shape).astype(dtype) | ||
| 109 | + input2 = np.random.uniform(min1, max1, shape).astype(dtype) | ||
| 110 | + input3 = np.random.uniform(min1, max1, shape).astype(dtype) | ||
| 111 | + npu_input1 = torch.from_numpy(input1) | ||
| 112 | + npu_input2 = torch.from_numpy(input2) | ||
| 113 | + npu_input3 = torch.from_numpy(input3) | ||
| 114 | + return npu_input1, npu_input2, npu_input3 | ||
| 115 | + | ||
| 116 | + def generate_single_data(self, min1, max1, shape, dtype): | ||
| 117 | + inputs = np.random.uniform(min1, max1, shape).astype(dtype) | ||
| 118 | + npu_input = torch.from_numpy(inputs) | ||
| 119 | + return npu_input | ||
| 120 | + | ||
| 121 | + def generate_scalar(self, min1, max1): | ||
| 122 | + scalar = np.random.uniform(min1, max1) | ||
| 123 | + return scalar | ||
| 124 | + | ||
| 125 | + def generate_int_scalar(self, min1, max1): | ||
| 126 | + scalar = np.random.randint(min1, max1) | ||
| 127 | + return scalar | ||
| 128 | + | ||
| 129 | + def _test_addcdiv(self, a, alpha, b, c): | ||
| 130 | + actual = torch.addcdiv(a, b, c, value=alpha) | ||
| 131 | + if not actual.dtype.is_floating_point: | ||
| 132 | + alpha = int(alpha) | ||
| 133 | + try: | ||
| 134 | + expected = a + (alpha * b) / c | ||
| 135 | + except ZeroDivisionError: | ||
| 136 | + print("Divide-by-Zero Error!!") | ||
| 137 | + self.assertTrue( | ||
| 138 | + torch.allclose(expected.to("cpu"), actual.to("cpu"), equal_nan=True) | ||
| 139 | + ) | ||
| 140 | + self.assertRtolEqual(actual.to("cpu"), torch.addcdiv(a, alpha, b, c).to("cpu")) | ||
| 141 | + | ||
| 142 | + def test_addcdiv(self, device="npu"): | ||
| 143 | + """NPU does not support numpy.bool. | ||
| 144 | + | ||
| 145 | + with self.maybeWarnsRegex(UserWarning, "This overload of addcdiv is deprecated"): | ||
| 146 | + self.assertRtolEqual(actual.to("cpu"), torch.addcdiv(a, alpha, b, c).to("cpu")) | ||
| 147 | + | ||
| 148 | + """ | ||
| 149 | + dtype_list = [ | ||
| 150 | + torch.uint8, | ||
| 151 | + torch.int8, | ||
| 152 | + torch.int16, | ||
| 153 | + torch.int32, | ||
| 154 | + torch.int64, | ||
| 155 | + torch.float64, | ||
| 156 | + torch.complex64, | ||
| 157 | + torch.complex128, | ||
| 158 | + ] | ||
| 159 | + for dtype in torch.testing._internal.common_dtype.get_all_math_dtypes(device): | ||
| 160 | + if dtype in dtype_list: | ||
| 161 | + continue | ||
| 162 | + self._test_addcdiv( | ||
| 163 | + self.non_zero_rand((2, 2), dtype=dtype, device=device), | ||
| 164 | + 0.5, | ||
| 165 | + self.non_zero_rand((2, 2), dtype=dtype, device=device), | ||
| 166 | + self.non_zero_rand((2, 2), dtype=dtype, device=device), | ||
| 167 | + ) | ||
| 168 | + | ||
| 169 | + def test_addcdiv_float32(self): | ||
| 170 | + npu_input1, npu_input2, npu_input3 = self.generate_data( | ||
| 171 | + 1, 100, (5, 3), np.float32 | ||
| 172 | + ) | ||
| 173 | + scalar = self.generate_scalar(1, 10) | ||
| 174 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2, npu_input3, scalar) | ||
| 175 | + npu_output = self.npu_op_exec(npu_input1, npu_input2, npu_input3, scalar) | ||
| 176 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 177 | + | ||
| 178 | + def test_addcdiv_float32_out(self): | ||
| 179 | + npu_input1, npu_input2, npu_input3 = self.generate_data( | ||
| 180 | + 1, 100, (5, 3), np.float32 | ||
| 181 | + ) | ||
| 182 | + scalar = self.generate_scalar(1, 10) | ||
| 183 | + npu_input4 = self.generate_single_data(1, 100, (5, 3), np.float32) | ||
| 184 | + cpu_output = self.cpu_op_exec_out( | ||
| 185 | + npu_input1, npu_input2, npu_input3, scalar, npu_input4 | ||
| 186 | + ) | ||
| 187 | + npu_output = self.npu_op_exec_out( | ||
| 188 | + npu_input1, npu_input2, npu_input3, scalar, npu_input4 | ||
| 189 | + ) | ||
| 190 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 191 | + | ||
| 192 | + def test_addcdiv_float32_broadcast(self): | ||
| 193 | + npu_input1 = self.generate_single_data(1, 100, (5, 3, 1), np.float32) | ||
| 194 | + npu_input2 = self.generate_single_data(1, 100, (5, 1, 5), np.float32) | ||
| 195 | + npu_input3 = self.generate_single_data(1, 100, (1, 1, 5), np.float32) | ||
| 196 | + scalar = self.generate_scalar(1, 10) | ||
| 197 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2, npu_input3, scalar) | ||
| 198 | + npu_output = self.npu_op_exec(npu_input1, npu_input2, npu_input3, scalar) | ||
| 199 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 200 | + | ||
| 201 | + def test_addcdiv_inp_contiguous_float32(self): | ||
| 202 | + npu_input1, npu_input2, npu_input3 = self.generate_data( | ||
| 203 | + 1, 100, (5, 3), np.float32 | ||
| 204 | + ) | ||
| 205 | + cpu_input1 = copy.deepcopy(npu_input1) | ||
| 206 | + cpu_input2 = copy.deepcopy(npu_input2) | ||
| 207 | + cpu_input3 = copy.deepcopy(npu_input3) | ||
| 208 | + scalar = self.generate_int_scalar(1, 10) | ||
| 209 | + cpu_output = self.cpu_op_inp_contiguous_exec( | ||
| 210 | + cpu_input1, cpu_input2, cpu_input3, scalar | ||
| 211 | + ) | ||
| 212 | + npu_output = self.npu_op_inp_contiguous_exec( | ||
| 213 | + npu_input1, npu_input2, npu_input3, scalar | ||
| 214 | + ) | ||
| 215 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 216 | + | ||
| 217 | + def test_addcdiv_inp_input1_noncontiguous_float32(self): | ||
| 218 | + npu_input1 = self.generate_single_data(1, 100, (4, 3), np.float32) | ||
| 219 | + npu_input2 = self.generate_single_data(1, 100, (2, 2), np.float32) | ||
| 220 | + npu_input3 = self.generate_single_data(1, 100, (2, 2), np.float32) | ||
| 221 | + cpu_input1 = copy.deepcopy(npu_input1) | ||
| 222 | + cpu_input2 = copy.deepcopy(npu_input2) | ||
| 223 | + cpu_input3 = copy.deepcopy(npu_input3) | ||
| 224 | + scalar = self.generate_int_scalar(1, 10) | ||
| 225 | + cpu_output = self.cpu_op_inp_input1_noncontiguous_exec( | ||
| 226 | + cpu_input1, cpu_input2, cpu_input3, scalar | ||
| 227 | + ) | ||
| 228 | + npu_output = self.npu_op_inp_input1_noncontiguous_exec( | ||
| 229 | + npu_input1, npu_input2, npu_input3, scalar | ||
| 230 | + ) | ||
| 231 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 232 | + | ||
| 233 | + def test_addcdiv_inp_input2_noncontiguous_float32(self): | ||
| 234 | + npu_input1 = self.generate_single_data(1, 100, (2, 2), np.float32) | ||
| 235 | + npu_input2 = self.generate_single_data(1, 100, (4, 3), np.float32) | ||
| 236 | + npu_input3 = self.generate_single_data(1, 100, (2, 2), np.float32) | ||
| 237 | + cpu_input1 = copy.deepcopy(npu_input1) | ||
| 238 | + cpu_input2 = copy.deepcopy(npu_input2) | ||
| 239 | + cpu_input3 = copy.deepcopy(npu_input3) | ||
| 240 | + scalar = self.generate_int_scalar(1, 10) | ||
| 241 | + cpu_output = self.cpu_op_inp_input2_noncontiguous_exec( | ||
| 242 | + cpu_input1, cpu_input2, cpu_input3, scalar | ||
| 243 | + ) | ||
| 244 | + npu_output = self.npu_op_inp_input2_noncontiguous_exec( | ||
| 245 | + npu_input1, npu_input2, npu_input3, scalar | ||
| 246 | + ) | ||
| 247 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 248 | + | ||
| 249 | + def test_addcdiv_inp_input3_noncontiguous_float32(self): | ||
| 250 | + npu_input1 = self.generate_single_data(1, 100, (2, 2), np.float32) | ||
| 251 | + npu_input2 = self.generate_single_data(1, 100, (2, 2), np.float32) | ||
| 252 | + npu_input3 = self.generate_single_data(1, 100, (4, 3), np.float32) | ||
| 253 | + cpu_input1 = copy.deepcopy(npu_input1) | ||
| 254 | + cpu_input2 = copy.deepcopy(npu_input2) | ||
| 255 | + cpu_input3 = copy.deepcopy(npu_input3) | ||
| 256 | + scalar = self.generate_int_scalar(1, 10) | ||
| 257 | + cpu_output = self.cpu_op_inp_input3_noncontiguous_exec( | ||
| 258 | + cpu_input1, cpu_input2, cpu_input3, scalar | ||
| 259 | + ) | ||
| 260 | + npu_output = self.npu_op_inp_input3_noncontiguous_exec( | ||
| 261 | + npu_input1, npu_input2, npu_input3, scalar | ||
| 262 | + ) | ||
| 263 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 264 | + | ||
| 265 | + def test_addcdiv_float64(self): | ||
| 266 | + cpu_input1, cpu_input2, cpu_input3 = self.generate_data( | ||
| 267 | + 1, 100, (5, 3), np.float64 | ||
| 268 | + ) | ||
| 269 | + scalar = self.generate_scalar(1, 10) | ||
| 270 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2, cpu_input3, scalar) | ||
| 271 | + npu_output = self.npu_op_exec(cpu_input1, cpu_input2, cpu_input3, scalar) | ||
| 272 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 273 | + | ||
| 274 | + def test_addcdiv_float16(self): | ||
| 275 | + cpu_input1, cpu_input2, cpu_input3 = self.generate_data( | ||
| 276 | + 1, 100, (5, 3), np.float16 | ||
| 277 | + ) | ||
| 278 | + scalar = self.generate_scalar(1, 10) | ||
| 279 | + cpu_output = self.cpu_op_exec( | ||
| 280 | + cpu_input1.float(), cpu_input2.float(), cpu_input3.float(), scalar | ||
| 281 | + ) | ||
| 282 | + npu_output = self.npu_op_exec(cpu_input1, cpu_input2, cpu_input3, scalar) | ||
| 283 | + cpu_output = cpu_output.to(npu_output.dtype) | ||
| 284 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 285 | + | ||
| 286 | + | ||
| 287 | +if __name__ == "__main__": | ||
| 288 | + run_tests() | ||
| @@ -0,0 +1,136 @@ | |||
| 1 | +import sys | ||
| 2 | + | ||
| 3 | +import torch | ||
| 4 | +import numpy as np | ||
| 5 | + | ||
| 6 | +import torch_npu | ||
| 7 | + | ||
| 8 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 9 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 10 | + | ||
| 11 | + | ||
| 12 | +class TestAddCMul(TestCase): | ||
| 13 | + def generate_data(self, min_d, max_d, shape, dtype): | ||
| 14 | + input1 = np.random.uniform(min_d, max_d, shape).astype(dtype) | ||
| 15 | + input2 = np.random.uniform(min_d, max_d, shape).astype(dtype) | ||
| 16 | + input3 = np.random.uniform(min_d, max_d, shape).astype(dtype) | ||
| 17 | + npu_input1 = torch.from_numpy(input1) | ||
| 18 | + npu_input2 = torch.from_numpy(input2) | ||
| 19 | + npu_input3 = torch.from_numpy(input3) | ||
| 20 | + | ||
| 21 | + return npu_input1, npu_input2, npu_input3 | ||
| 22 | + | ||
| 23 | + def generate_output_data(self, min_d, max_d, shape, dtype): | ||
| 24 | + output_y = np.random.uniform(min_d, max_d, shape).astype(dtype) | ||
| 25 | + npu_output_y = torch.from_numpy(output_y) | ||
| 26 | + return npu_output_y | ||
| 27 | + | ||
| 28 | + def cpu_op_exec(self, input1, input2, input3, scalar): | ||
| 29 | + output = torch.addcmul(input1, input2, input3, value=scalar) | ||
| 30 | + output = output.numpy() | ||
| 31 | + return output | ||
| 32 | + | ||
| 33 | + def cpu_op_exec_out(self, input1, input2, input3, scalar, output_y): | ||
| 34 | + output = output_y | ||
| 35 | + torch.addcmul(input1, input2, input3, value=scalar, out=output_y) | ||
| 36 | + output = output.numpy() | ||
| 37 | + return output | ||
| 38 | + | ||
| 39 | + def npu_op_exec(self, input1, input2, input3, scalar): | ||
| 40 | + input1 = input1.to("npu") | ||
| 41 | + input2 = input2.to("npu") | ||
| 42 | + input3 = input3.to("npu") | ||
| 43 | + output = torch.addcmul(input1, input2, input3, value=scalar) | ||
| 44 | + output = output.to("cpu") | ||
| 45 | + output = output.numpy() | ||
| 46 | + return output | ||
| 47 | + | ||
| 48 | + def npu_op_exec_out(self, input1, input2, input3, scalar, output_y): | ||
| 49 | + input1 = input1.to("npu") | ||
| 50 | + input2 = input2.to("npu") | ||
| 51 | + input3 = input3.to("npu") | ||
| 52 | + output = output_y.to("npu") | ||
| 53 | + torch.addcmul(input1, input2, input3, value=scalar, out=output) | ||
| 54 | + output = output.to("cpu") | ||
| 55 | + output = output.numpy() | ||
| 56 | + return output | ||
| 57 | + | ||
| 58 | + def test_addcmul_3_3_float32(self, device="npu"): | ||
| 59 | + input1, input2, input3 = self.generate_data(0, 100, (3, 3), np.float32) | ||
| 60 | + cpu_output = self.cpu_op_exec(input1, input2, input3, 0.5) | ||
| 61 | + npu_output = self.npu_op_exec(input1, input2, input3, 0.5) | ||
| 62 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 63 | + | ||
| 64 | + def test_addcmul_10_10_float32(self, device="npu"): | ||
| 65 | + input1, input2, input3 = self.generate_data(0, 100, (10, 10), np.float32) | ||
| 66 | + cpu_output = self.cpu_op_exec(input1, input2, input3, 0.5) | ||
| 67 | + npu_output = self.npu_op_exec(input1, input2, input3, 0.5) | ||
| 68 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 69 | + | ||
| 70 | + def test_addcmul_3_3_float16(self, device="npu"): | ||
| 71 | + input1, input2, input3 = self.generate_data(0, 100, (3, 3), np.float16) | ||
| 72 | + input1_cpu = input1.float() | ||
| 73 | + input2_cpu = input2.float() | ||
| 74 | + input3_cpu = input3.float() | ||
| 75 | + cpu_output = self.cpu_op_exec(input1_cpu, input2_cpu, input3_cpu, 0.5).astype( | ||
| 76 | + np.float16 | ||
| 77 | + ) | ||
| 78 | + npu_output = self.npu_op_exec(input1, input2, input3, 0.5) | ||
| 79 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 80 | + | ||
| 81 | + def test_addcmul_10_10_float16(self, device="npu"): | ||
| 82 | + input1, input2, input3 = self.generate_data(0, 100, (10, 10), np.float16) | ||
| 83 | + input1_cpu = input1.float() | ||
| 84 | + input2_cpu = input2.float() | ||
| 85 | + input3_cpu = input3.float() | ||
| 86 | + cpu_output = self.cpu_op_exec(input1_cpu, input2_cpu, input3_cpu, 0.5).astype( | ||
| 87 | + np.float16 | ||
| 88 | + ) | ||
| 89 | + npu_output = self.npu_op_exec(input1, input2, input3, 0.5) | ||
| 90 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 91 | + | ||
| 92 | + def test_addcmul_10_23_float32(self, device="npu"): | ||
| 93 | + input1, input2, input3 = self.generate_data(0, 100, (10, 23), np.float32) | ||
| 94 | + cpu_output = self.cpu_op_exec(input1, input2, input3, 0.5) | ||
| 95 | + npu_output = self.npu_op_exec(input1, input2, input3, 0.5) | ||
| 96 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 97 | + | ||
| 98 | + def test_tensor_addcmul_3_3_float32(self, device="npu"): | ||
| 99 | + input1, input2, input3 = self.generate_data(0, 100, (3, 3), np.float32) | ||
| 100 | + input1_npu = input1.npu() | ||
| 101 | + input2_npu = input2.npu() | ||
| 102 | + input3_npu = input3.npu() | ||
| 103 | + input1.addcmul_(input2, input3, value=0.5) | ||
| 104 | + input1_npu.addcmul_(input2_npu, input3_npu, value=0.5) | ||
| 105 | + self.assertRtolEqual(input1, input1_npu) | ||
| 106 | + | ||
| 107 | + def test_tensor_addcmul_10_10_float32(self, device="npu"): | ||
| 108 | + input1, input2, input3 = self.generate_data(0, 100, (10, 10), np.float32) | ||
| 109 | + input1_npu = input1.npu() | ||
| 110 | + input2_npu = input2.npu() | ||
| 111 | + input3_npu = input3.npu() | ||
| 112 | + input1.addcmul_(input2, input3, value=0.5) | ||
| 113 | + input1_npu.addcmul_(input2_npu, input3_npu, value=0.5) | ||
| 114 | + self.assertRtolEqual(input1, input1_npu) | ||
| 115 | + | ||
| 116 | + def test_tensor_addcmul_3_3_float16(self, device="npu"): | ||
| 117 | + input1, input2, input3 = self.generate_data(0, 100, (3, 3), np.float16) | ||
| 118 | + input1_npu = input1.npu() | ||
| 119 | + input2_npu = input2.npu() | ||
| 120 | + input3_npu = input3.npu() | ||
| 121 | + input1.addcmul_(input2, input3, value=0.5) | ||
| 122 | + input1_npu.addcmul_(input2_npu, input3_npu, value=0.5) | ||
| 123 | + self.assertRtolEqual(input1, input1_npu) | ||
| 124 | + | ||
| 125 | + def test_tensor_addcmul_10_10_float16(self, device="npu"): | ||
| 126 | + input1, input2, input3 = self.generate_data(0, 100, (10, 10), np.float16) | ||
| 127 | + input1_npu = input1.npu() | ||
| 128 | + input2_npu = input2.npu() | ||
| 129 | + input3_npu = input3.npu() | ||
| 130 | + input1.addcmul_(input2, input3, value=0.5) | ||
| 131 | + input1_npu.addcmul_(input2_npu, input3_npu, value=0.5) | ||
| 132 | + self.assertRtolEqual(input1, input1_npu) | ||
| 133 | + | ||
| 134 | + | ||
| 135 | +if __name__ == "__main__": | ||
| 136 | + run_tests() | ||
| @@ -0,0 +1,102 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAddmv(TestCase): | ||
| 10 | + def cpu_op_exec(self, a, b, c, alpha, beta): | ||
| 11 | + output = torch.addmv(c, a, b, alpha=alpha, beta=beta) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, a, b, c, alpha, beta): | ||
| 16 | + output = torch.addmv(c, a, b, alpha=alpha, beta=beta) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + # pylint:disable = huawei-too-many-arguments | ||
| 22 | + def npu_op_exec_out(self, a, b, c, beta, alpha, input1): | ||
| 23 | + torch.addmv(c, a, b, alpha=alpha, beta=beta, out=input1) | ||
| 24 | + output = input1.to("cpu") | ||
| 25 | + output = output.numpy() | ||
| 26 | + return output | ||
| 27 | + | ||
| 28 | + def test_addmv_fp16(self): | ||
| 29 | + shape_format = [ | ||
| 30 | + [[np.float16, 3, (2, 3)], [np.float16, 3, (3,)], [np.float16, 3, (2,)]] | ||
| 31 | + ] | ||
| 32 | + for item in shape_format: | ||
| 33 | + | ||
| 34 | + input_a, npu_input_a = create_common_tensor(item[0], -2, 2) | ||
| 35 | + input_b, npu_input_b = create_common_tensor(item[1], -2, 2) | ||
| 36 | + input_c, npu_input_c = create_common_tensor(item[2], -2, 2) | ||
| 37 | + | ||
| 38 | + input_a = input_a.to(torch.float32) | ||
| 39 | + input_b = input_b.to(torch.float32) | ||
| 40 | + input_c = input_c.to(torch.float32) | ||
| 41 | + | ||
| 42 | + cpu_output = self.cpu_op_exec(input_a, input_b, input_c, 1, 1) | ||
| 43 | + npu_output = self.npu_op_exec(npu_input_a, npu_input_b, npu_input_c, 1, 1) | ||
| 44 | + | ||
| 45 | + cpu_output = cpu_output.astype(np.float16) | ||
| 46 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 47 | + | ||
| 48 | + def test_addmv_out_fp16(self): | ||
| 49 | + shape_format = [ | ||
| 50 | + [ | ||
| 51 | + [np.float16, 3, (2, 3)], | ||
| 52 | + [np.float16, 3, (3,)], | ||
| 53 | + [np.float16, 3, (2,)], | ||
| 54 | + [np.float16, 3, (10,)], | ||
| 55 | + ] | ||
| 56 | + ] | ||
| 57 | + for item in shape_format: | ||
| 58 | + | ||
| 59 | + input_a, npu_input_a = create_common_tensor(item[0], -2, 2) | ||
| 60 | + input_b, npu_input_b = create_common_tensor(item[1], -2, 2) | ||
| 61 | + input_c, npu_input_c = create_common_tensor(item[2], -2, 2) | ||
| 62 | + _, npu_input = create_common_tensor(item[3], -2, 2) | ||
| 63 | + | ||
| 64 | + input_a = input_a.to(torch.float32) | ||
| 65 | + input_b = input_b.to(torch.float32) | ||
| 66 | + input_c = input_c.to(torch.float32) | ||
| 67 | + | ||
| 68 | + cpu_output = self.cpu_op_exec(input_a, input_b, input_c, 1, 1) | ||
| 69 | + npu_output = self.npu_op_exec_out( | ||
| 70 | + npu_input_a, npu_input_b, npu_input_c, 1, 1, npu_input | ||
| 71 | + ) | ||
| 72 | + cpu_output = cpu_output.astype(np.float16) | ||
| 73 | + | ||
| 74 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 75 | + | ||
| 76 | + def test_addmv_fp32(self): | ||
| 77 | + shape_format = [ | ||
| 78 | + [[np.float16, 0, (2, 3)], [np.float16, 0, (3,)], [np.float16, 0, (2,)]], | ||
| 79 | + [ | ||
| 80 | + [np.float16, 0, (3168, 320)], | ||
| 81 | + [np.float16, 0, (320,)], | ||
| 82 | + [np.float16, 0, (3168,)], | ||
| 83 | + ], | ||
| 84 | + ] | ||
| 85 | + for item in shape_format: | ||
| 86 | + | ||
| 87 | + input_a, npu_input_a = create_common_tensor(item[0], -2, 2) | ||
| 88 | + input_b, npu_input_b = create_common_tensor(item[1], -2, 2) | ||
| 89 | + input_c, npu_input_c = create_common_tensor(item[2], -2, 2) | ||
| 90 | + | ||
| 91 | + cpu_output = self.cpu_op_exec( | ||
| 92 | + input_a.float(), input_b.float(), input_c.float(), 1, 1 | ||
| 93 | + ) | ||
| 94 | + npu_output = self.npu_op_exec( | ||
| 95 | + npu_input_a.float(), npu_input_b.float(), npu_input_c.float(), 1, 1 | ||
| 96 | + ) | ||
| 97 | + | ||
| 98 | + self.assertRtolEqual(cpu_output, npu_output, prec=1.0e-3, prec16=1.0e-3) | ||
| 99 | + | ||
| 100 | + | ||
| 101 | +if __name__ == "__main__": | ||
| 102 | + run_tests() | ||
| @@ -0,0 +1,83 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAddr(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1, vec1, vec2, beta, alpha): | ||
| 11 | + output = torch.addr(input1, vec1, vec2, beta=beta, alpha=alpha) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1, vec1, vec2, beta, alpha): | ||
| 16 | + output = torch.addr(input1, vec1, vec2, beta=beta, alpha=alpha) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + # pylint:disable = huawei-too-many-arguments | ||
| 22 | + def npu_op_exec_out(self, input1, input2, vec1, vec2, beta, alpha): | ||
| 23 | + torch.addr(input1, vec1, vec2, beta=beta, alpha=alpha, out=input2) | ||
| 24 | + output = input2.to("cpu") | ||
| 25 | + output = output.numpy() | ||
| 26 | + return output | ||
| 27 | + | ||
| 28 | + def test_addr_common_shape_format(self): | ||
| 29 | + shape_format = [ | ||
| 30 | + [[np.bool_, 0, (5, 3)], [np.bool_, 0, (5)], [np.bool_, 0, (3)]], | ||
| 31 | + [[np.bool_, 0, (5, 3)], [np.int32, 0, (5)], [np.int32, 0, (3)]], | ||
| 32 | + [[np.bool_, 0, (5, 3)], [np.float32, 0, (5)], [np.float32, 0, (3)]], | ||
| 33 | + [[np.bool_, 0, (5, 3)], [np.int32, 0, (5)], [np.float32, 0, (3)]], | ||
| 34 | + [[np.int32, 0, (5, 3)], [np.int32, 0, (5)], [np.int32, 0, (3)]], | ||
| 35 | + [[np.int32, 0, (5, 3)], [np.int32, 0, (5)], [np.float32, 0, (3)]], | ||
| 36 | + [[np.int32, 0, (5, 3)], [np.float32, 0, (5)], [np.float32, 0, (3)]], | ||
| 37 | + [[np.int32, 0, (5, 3)], [np.bool_, 0, (5)], [np.float32, 0, (3)]], | ||
| 38 | + [[np.float32, 0, (5, 3)], [np.float32, 0, (5)], [np.float32, 0, (3)]], | ||
| 39 | + [[np.float32, 0, (5, 3)], [np.int32, 0, (5)], [np.float32, 0, (3)]], | ||
| 40 | + [[np.float32, 0, (5, 3)], [np.int32, 0, (5)], [np.int32, 0, (3)]], | ||
| 41 | + [[np.float32, 0, (5, 3)], [np.int32, 0, (5)], [np.bool_, 0, (3)]], | ||
| 42 | + ] | ||
| 43 | + for item in shape_format: | ||
| 44 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 1, 100) | ||
| 45 | + cpu_vec1, npu_vec1 = create_common_tensor(item[1], 1, 100) | ||
| 46 | + cpu_vec2, npu_vec2 = create_common_tensor(item[2], 1, 100) | ||
| 47 | + beta = 1 | ||
| 48 | + alpha = 1 | ||
| 49 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_vec1, cpu_vec2, beta, alpha) | ||
| 50 | + npu_output = self.npu_op_exec(npu_input1, npu_vec1, npu_vec2, beta, alpha) | ||
| 51 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 52 | + | ||
| 53 | + def test_addr_out_common_shape_format(self): | ||
| 54 | + shape_format = [ | ||
| 55 | + [ | ||
| 56 | + [np.float32, 0, (5, 3)], | ||
| 57 | + [np.float32, 0, (5, 3)], | ||
| 58 | + [np.float32, 0, (5)], | ||
| 59 | + [np.float32, 0, (3)], | ||
| 60 | + ], | ||
| 61 | + [ | ||
| 62 | + [np.int32, 0, (5, 3)], | ||
| 63 | + [np.int32, 0, (5, 3)], | ||
| 64 | + [np.int32, 0, (5)], | ||
| 65 | + [np.int32, 0, (3)], | ||
| 66 | + ], | ||
| 67 | + ] | ||
| 68 | + for item in shape_format: | ||
| 69 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 1, 100) | ||
| 70 | + cpu_input2, npu_input2 = create_common_tensor(item[1], 1, 100) | ||
| 71 | + cpu_vec1, npu_vec1 = create_common_tensor(item[2], 1, 100) | ||
| 72 | + cpu_vec2, npu_vec2 = create_common_tensor(item[3], 1, 100) | ||
| 73 | + beta = 1 | ||
| 74 | + alpha = 1 | ||
| 75 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_vec1, cpu_vec2, beta, alpha) | ||
| 76 | + npu_output = self.npu_op_exec_out( | ||
| 77 | + npu_input1, npu_input2, npu_vec1, npu_vec2, beta, alpha | ||
| 78 | + ) | ||
| 79 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 80 | + | ||
| 81 | + | ||
| 82 | +if __name__ == "__main__": | ||
| 83 | + run_tests() | ||
| @@ -0,0 +1,68 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +from torch.nn import functional as F | ||
| 4 | +import torch_npu | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAffineGridGenerator(TestCase): | ||
| 10 | + def cpu_op_exec(self, theta, size, align_corners): | ||
| 11 | + output = F.affine_grid(theta, torch.Size(size), align_corners) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, theta, size, align_corners): | ||
| 16 | + theta = theta.npu() | ||
| 17 | + output = torch.affine_grid_generator(theta, size, align_corners) | ||
| 18 | + output = output.cpu().numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def test_affine_grid_generator_2D(self, device="npu"): | ||
| 22 | + theta_list = [ | ||
| 23 | + [1, 0, 0], | ||
| 24 | + [0, 1, 0], | ||
| 25 | + ] | ||
| 26 | + size = (1, 3, 10, 10) | ||
| 27 | + align_corners_list = [True, False] | ||
| 28 | + dtype_list = [torch.float32, torch.float16] | ||
| 29 | + shape_format = [ | ||
| 30 | + [theta_list, size, i, j] for i in align_corners_list for j in dtype_list | ||
| 31 | + ] | ||
| 32 | + for item in shape_format: | ||
| 33 | + theta = torch.tensor([item[0]], dtype=item[3]) | ||
| 34 | + cpu_input = theta | ||
| 35 | + npu_input = theta | ||
| 36 | + if cpu_input.dtype == torch.float16: | ||
| 37 | + cpu_input = cpu_input.to(torch.float32) | ||
| 38 | + cpu_output = self.cpu_op_exec(cpu_input, item[1], item[2]) | ||
| 39 | + npu_output = self.npu_op_exec(npu_input, item[1], item[2]) | ||
| 40 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 41 | + self.assertRtolEqual(cpu_output, npu_output, 0.001) | ||
| 42 | + | ||
| 43 | + def test_affine_grid_generator_3D(self, device="npu"): | ||
| 44 | + theta_list = [ | ||
| 45 | + [1, 0, 0, 0], | ||
| 46 | + [0, 1, 0, 0], | ||
| 47 | + [0, 0, 1, 0], | ||
| 48 | + ] | ||
| 49 | + size = (1, 3, 10, 10, 10) | ||
| 50 | + align_corners_list = [True, False] | ||
| 51 | + dtype_list = [torch.float16, torch.float32] | ||
| 52 | + shape_format = [ | ||
| 53 | + [theta_list, size, i, j] for i in align_corners_list for j in dtype_list | ||
| 54 | + ] | ||
| 55 | + for item in shape_format: | ||
| 56 | + theta = torch.tensor([item[0]], dtype=item[3]) | ||
| 57 | + cpu_input = theta | ||
| 58 | + npu_input = theta | ||
| 59 | + if cpu_input.dtype == torch.float16: | ||
| 60 | + cpu_input = cpu_input.to(torch.float32) | ||
| 61 | + cpu_output = self.cpu_op_exec(cpu_input, item[1], item[2]) | ||
| 62 | + npu_output = self.npu_op_exec(npu_input, item[1], item[2]) | ||
| 63 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 64 | + self.assertRtolEqual(cpu_output, npu_output, 0.001) | ||
| 65 | + | ||
| 66 | + | ||
| 67 | +if __name__ == "__main__": | ||
| 68 | + run_tests() | ||
| @@ -0,0 +1,57 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +from torch.nn import functional as F | ||
| 4 | +import torch_npu | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class TestAffineGridGeneratorBackward(TestCase): | ||
| 11 | + def test_affine_grid_generator_backward_common_shape(self, device="npu"): | ||
| 12 | + shape_list = [[100, 2, 3], [10, 2, 3]] | ||
| 13 | + shape_format = [[np.float32, -1, j] for j in shape_list] | ||
| 14 | + for item in shape_format: | ||
| 15 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 1) | ||
| 16 | + size = torch.Size((item[2][0], 2, 28, 2)) | ||
| 17 | + cpu_input1.requires_grad = True | ||
| 18 | + cpu_output = self.cpu_op_exec(cpu_input1, size) | ||
| 19 | + npu_input1.requires_grad = True | ||
| 20 | + npu_output = self.npu_op_exec(npu_input1, size) | ||
| 21 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 22 | + | ||
| 23 | + def test_affine_grid_generator_backward_fp16(self, device="npu"): | ||
| 24 | + shape_list = [[100, 2, 3], [10, 2, 3]] | ||
| 25 | + shape_format = [[np.float16, -1, j] for j in shape_list] | ||
| 26 | + for item in shape_format: | ||
| 27 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 1) | ||
| 28 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 29 | + npu_input1 = npu_input1.to(torch.float32) | ||
| 30 | + size = torch.Size((item[2][0], 2, 28, 2)) | ||
| 31 | + cpu_input1.requires_grad = True | ||
| 32 | + cpu_output = self.cpu_op_exec(cpu_input1, size) | ||
| 33 | + npu_input1.requires_grad = True | ||
| 34 | + npu_output = self.npu_op_exec(npu_input1, size) | ||
| 35 | + self.assertRtolEqual( | ||
| 36 | + cpu_output.astype(np.float16), npu_output.astype(np.float16) | ||
| 37 | + ) | ||
| 38 | + | ||
| 39 | + def cpu_op_exec(self, input1, size): | ||
| 40 | + out = F.affine_grid(input1, size, True) | ||
| 41 | + input1.requires_grad = True | ||
| 42 | + grad_output = torch.ones(out.size(), dtype=torch.float) | ||
| 43 | + out.backward(gradient=grad_output) | ||
| 44 | + output = input1.grad.numpy() | ||
| 45 | + return output | ||
| 46 | + | ||
| 47 | + def npu_op_exec(self, input1, size): | ||
| 48 | + input1.requires_grad = True | ||
| 49 | + out = F.affine_grid(input1, size, True) | ||
| 50 | + grad_output = torch.ones(out.size(), dtype=torch.float).npu() | ||
| 51 | + out.backward(gradient=grad_output) | ||
| 52 | + output = input1.grad.to("cpu").numpy() | ||
| 53 | + return output | ||
| 54 | + | ||
| 55 | + | ||
| 56 | +if __name__ == "__main__": | ||
| 57 | + run_tests() | ||
| @@ -0,0 +1,94 @@ | |||
| 1 | +import itertools | ||
| 2 | +import torch | ||
| 3 | +import numpy as np | ||
| 4 | + | ||
| 5 | +import torch_npu | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class TestAll(TestCase): | ||
| 11 | + def create_bool_tensor(self, shape, minValue, maxValue): | ||
| 12 | + input1 = np.random.uniform(minValue, maxValue, shape) | ||
| 13 | + input1 = input1 > 0.5 | ||
| 14 | + cpu_input = torch.from_numpy(input1) | ||
| 15 | + npu_input = torch.from_numpy(input1).to("npu") | ||
| 16 | + return cpu_input, npu_input | ||
| 17 | + | ||
| 18 | + def cpu_op_exec(self, input1): | ||
| 19 | + output = input1.all() | ||
| 20 | + output = output.numpy() | ||
| 21 | + return output | ||
| 22 | + | ||
| 23 | + def npu_op_exec(self, input1): | ||
| 24 | + output = input1.all() | ||
| 25 | + output = output.to("cpu").numpy() | ||
| 26 | + return output | ||
| 27 | + | ||
| 28 | + def test_all_shape_format(self): | ||
| 29 | + shape_list = [[1024], [32, 1024], [32, 8, 1024], [128, 32, 8, 1024], [2, 0, 2]] | ||
| 30 | + for item in shape_list: | ||
| 31 | + cpu_input, npu_input = self.create_bool_tensor(item, 0, 1) | ||
| 32 | + cpu_output = self.cpu_op_exec(cpu_input) | ||
| 33 | + npu_output = self.npu_op_exec(npu_input) | ||
| 34 | + self.assertRtolEqual( | ||
| 35 | + cpu_output.astype(np.int32), npu_output.astype(np.int32) | ||
| 36 | + ) | ||
| 37 | + | ||
| 38 | + def cpu_op_dim_exec(self, input1, dim): | ||
| 39 | + output = input1.all(dim=dim) | ||
| 40 | + output = output.numpy() | ||
| 41 | + return output | ||
| 42 | + | ||
| 43 | + def npu_op_dim_exec(self, input1, dim): | ||
| 44 | + output = input1.all(dim=dim) | ||
| 45 | + output = output.to("cpu").numpy() | ||
| 46 | + return output | ||
| 47 | + | ||
| 48 | + def npu_op_out_exec(self, input1, dim, output): | ||
| 49 | + torch.all(input1, dim=dim, keepdim=False, out=output) | ||
| 50 | + output = output.to("cpu").numpy() | ||
| 51 | + return output | ||
| 52 | + | ||
| 53 | + def test_alld_shape_format(self): | ||
| 54 | + shape_list = [[1024], [32, 1024], [32, 8, 1024], [128, 32, 8, 1024]] | ||
| 55 | + dtype_list = [ | ||
| 56 | + np.float16, | ||
| 57 | + np.float32, | ||
| 58 | + np.float64, | ||
| 59 | + np.uint8, | ||
| 60 | + np.int16, | ||
| 61 | + np.int32, | ||
| 62 | + np.int64, | ||
| 63 | + np.bool_, | ||
| 64 | + ] | ||
| 65 | + format_list = [-1] | ||
| 66 | + for item in itertools.product(dtype_list, format_list, shape_list): | ||
| 67 | + cpu_input, npu_input = create_common_tensor(item, 0, 1) | ||
| 68 | + _, npu_output1 = self.create_bool_tensor(item[2], 0, 1) | ||
| 69 | + if item[0] == np.float16: | ||
| 70 | + cpu_input = cpu_input.to(torch.float32) | ||
| 71 | + cpu_output = self.cpu_op_dim_exec(cpu_input, 0) | ||
| 72 | + if item[0] == np.float16: | ||
| 73 | + cpu_output = cpu_output.astype(np.float16) | ||
| 74 | + npu_output0 = self.npu_op_dim_exec(npu_input, 0) | ||
| 75 | + npu_output1 = self.npu_op_out_exec(npu_input, 0, npu_output1) | ||
| 76 | + self.assertRtolEqual( | ||
| 77 | + cpu_output.astype(np.int32), npu_output0.astype(np.int32) | ||
| 78 | + ) | ||
| 79 | + self.assertRtolEqual( | ||
| 80 | + cpu_output.astype(np.int32), npu_output1.astype(np.int32) | ||
| 81 | + ) | ||
| 82 | + | ||
| 83 | + def test_all_tensor_numel_0(self): | ||
| 84 | + ca = torch.rand(1, 2, 0, 3, 4).bool() | ||
| 85 | + na = ca.npu() | ||
| 86 | + cout = ca.all(2) | ||
| 87 | + nout = na.all(2) | ||
| 88 | + cout = cout.numpy() | ||
| 89 | + nout = nout.to("cpu").numpy() | ||
| 90 | + self.assertRtolEqual(cout, nout) | ||
| 91 | + | ||
| 92 | + | ||
| 93 | +if __name__ == "__main__": | ||
| 94 | + run_tests() | ||
| @@ -0,0 +1,55 @@ | |||
| 1 | +import copy | ||
| 2 | +import sys | ||
| 3 | + | ||
| 4 | +import torch | ||
| 5 | +import numpy as np | ||
| 6 | + | ||
| 7 | +import torch_npu | ||
| 8 | + | ||
| 9 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 10 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 11 | + | ||
| 12 | + | ||
| 13 | +class Test_AmpForeachNonFiniteCheckAndUnscale_(TestCase): | ||
| 14 | + def generate_data(self, min_d, max_d, shape, dtype, input3): | ||
| 15 | + input1 = np.random.uniform(min_d, max_d, shape).astype(dtype) | ||
| 16 | + input1 = torch.from_numpy(input1) | ||
| 17 | + input2 = np.array([0.0]).astype(dtype) | ||
| 18 | + input2 = torch.from_numpy(input2) | ||
| 19 | + input3 = np.array([input3]).astype(dtype) | ||
| 20 | + input3 = torch.from_numpy(input3) | ||
| 21 | + return input1, input2, input3 | ||
| 22 | + | ||
| 23 | + def cpu_op_exec(self, input1, input2, input3): | ||
| 24 | + input1 = input1.numpy() | ||
| 25 | + input2 = input2.numpy() | ||
| 26 | + input3 = input3.numpy() | ||
| 27 | + res = np.multiply(input1, input3) | ||
| 28 | + return res | ||
| 29 | + | ||
| 30 | + def npu_op_exec(self, input1, input2, input3): | ||
| 31 | + input1 = input1.to("npu") | ||
| 32 | + input2 = input2.to("npu") | ||
| 33 | + input3 = input3.to("npu") | ||
| 34 | + torch._amp_foreach_non_finite_check_and_unscale_((input1,), input2, input3) | ||
| 35 | + input1 = input1.to("cpu") | ||
| 36 | + input1 = input1.numpy() | ||
| 37 | + return input1 | ||
| 38 | + | ||
| 39 | + def test_AmpForeachNonFiniteCheckAndUnscale_float32_case1(self, device="npu"): | ||
| 40 | + params = [ | ||
| 41 | + (0, 100, (4, 3), np.float32, 1.5), | ||
| 42 | + (0, 100, (2, 5, 6), np.float32, 3.7), | ||
| 43 | + (0, 100, (5, 7), np.float32, 1.9), | ||
| 44 | + (0, 100, (2, 8, 1), np.float32, 3.2), | ||
| 45 | + ] | ||
| 46 | + torch_npu.npu.utils.clear_npu_overflow_flag() | ||
| 47 | + for param in params: | ||
| 48 | + input1, input2, input3 = self.generate_data(*param) | ||
| 49 | + cpu_output = self.cpu_op_exec(input1, input2, input3) | ||
| 50 | + npu_output = self.npu_op_exec(input1, input2, input3) | ||
| 51 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 52 | + | ||
| 53 | + | ||
| 54 | +if __name__ == "__main__": | ||
| 55 | + run_tests() | ||
| @@ -0,0 +1,55 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +from torch.nn import functional as F | ||
| 4 | +import torch_npu | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class TestAnchorResponseFlags(TestCase): | ||
| 11 | + def cpu_op_exec(self, gt_bboxes, featmap_size, strides, num_base_anchors): | ||
| 12 | + feat_h, feat_w = featmap_size | ||
| 13 | + gt_bboxes_cx = (gt_bboxes[:, 0] + gt_bboxes[:, 2]) * 0.5 | ||
| 14 | + gt_bboxes_cy = (gt_bboxes[:, 1] + gt_bboxes[:, 3]) * 0.5 | ||
| 15 | + try: | ||
| 16 | + gt_bboxes_grid_x = torch.floor(gt_bboxes_cx / strides[0]).int() | ||
| 17 | + gt_bboxes_grid_y = torch.floor(gt_bboxes_cy / strides[1]).int() | ||
| 18 | + except ZeroDivisionError: | ||
| 19 | + print("There is 0 in strides.") | ||
| 20 | + gt_bboxes_grid_idx = gt_bboxes_grid_y * feat_w + gt_bboxes_grid_x | ||
| 21 | + responsible_grid = torch.zeros(feat_h * feat_w, dtype=torch.uint8) | ||
| 22 | + gt_bboxes_grid_idx = gt_bboxes_grid_idx.long() | ||
| 23 | + responsible_grid[gt_bboxes_grid_idx] = 1 | ||
| 24 | + responsible_grid = ( | ||
| 25 | + responsible_grid[:, None] | ||
| 26 | + .expand(responsible_grid.size(0), num_base_anchors) | ||
| 27 | + .contiguous() | ||
| 28 | + .view(-1) | ||
| 29 | + ) | ||
| 30 | + return responsible_grid.numpy() | ||
| 31 | + | ||
| 32 | + def npu_op_exec(self, input_npu, featmap_size, strides, num_base_anchors): | ||
| 33 | + out = torch_npu.npu_anchor_response_flags( | ||
| 34 | + input_npu, featmap_size, strides, num_base_anchors | ||
| 35 | + ) | ||
| 36 | + out = out.to("cpu") | ||
| 37 | + return out.detach().numpy() | ||
| 38 | + | ||
| 39 | + def test_anchor_response_flags(self, device="npu"): | ||
| 40 | + shape_format = [ | ||
| 41 | + [[np.float32, -1, [100, 4]], [60, 60], [2, 2], 9], | ||
| 42 | + [[np.float16, -1, [200, 4]], [10, 10], [32, 32], 3], | ||
| 43 | + [[np.float16, -1, [500, 4]], [32, 32], [16, 16], 5], | ||
| 44 | + ] | ||
| 45 | + for item in shape_format: | ||
| 46 | + cpu_input, npu_input = create_common_tensor(item[0], 0, 100) | ||
| 47 | + if cpu_input.dtype == torch.float16: | ||
| 48 | + cpu_input = cpu_input.to(torch.float32) | ||
| 49 | + cpu_output = self.cpu_op_exec(cpu_input, *item[1:]) | ||
| 50 | + npu_output = self.npu_op_exec(npu_input, *item[1:]) | ||
| 51 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 52 | + | ||
| 53 | + | ||
| 54 | +if __name__ == "__main__": | ||
| 55 | + run_tests() | ||
| @@ -0,0 +1,81 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | + | ||
| 7 | + | ||
| 8 | +class TestAny(TestCase): | ||
| 9 | + def create_bool_tensor(self, shape, minValue, maxValue): | ||
| 10 | + input1 = np.random.uniform(minValue, maxValue, shape) | ||
| 11 | + cpu_input = torch.from_numpy(input1) > 0.5 | ||
| 12 | + npu_input = (torch.from_numpy(input1) > 0.5).to("npu") | ||
| 13 | + return cpu_input, npu_input | ||
| 14 | + | ||
| 15 | + def cpu_op_exec(self, input1): | ||
| 16 | + output = input1.any() | ||
| 17 | + output = output.numpy() | ||
| 18 | + return output | ||
| 19 | + | ||
| 20 | + def npu_op_exec(self, input1): | ||
| 21 | + output = input1.any() | ||
| 22 | + output = output.to("cpu") | ||
| 23 | + output = output.numpy() | ||
| 24 | + return output | ||
| 25 | + | ||
| 26 | + def test_any_shape_format(self, device="npu"): | ||
| 27 | + shape_list = [[], [1024], [32, 1024], [32, 8, 1024], [128, 32, 8, 1024]] | ||
| 28 | + | ||
| 29 | + for item in shape_list: | ||
| 30 | + cpu_input, npu_input = self.create_bool_tensor(item, 0, 1) | ||
| 31 | + cpu_output = self.cpu_op_exec(cpu_input) | ||
| 32 | + npu_output = self.npu_op_exec(npu_input) | ||
| 33 | + self.assertRtolEqual( | ||
| 34 | + cpu_output.astype(np.int32), npu_output.astype(np.int32) | ||
| 35 | + ) | ||
| 36 | + | ||
| 37 | + def cpu_op_exec1(self, input1, dim, keepdim): | ||
| 38 | + output = input1.any(dim=dim, keepdim=keepdim) | ||
| 39 | + output = output.numpy() | ||
| 40 | + return output | ||
| 41 | + | ||
| 42 | + def npu_op_exec1(self, input1, dim, keepdim): | ||
| 43 | + output = input1.any(dim=dim, keepdim=keepdim) | ||
| 44 | + output = output.to("cpu") | ||
| 45 | + output = output.numpy() | ||
| 46 | + return output | ||
| 47 | + | ||
| 48 | + def npu_op_out_exec1(self, input1, dim, keepdim): | ||
| 49 | + shape = list(input1.shape) | ||
| 50 | + output0 = torch.randn(shape) > 0 | ||
| 51 | + output1 = torch.randn(shape.pop()) > 0 | ||
| 52 | + output0 = output0.npu() | ||
| 53 | + output1 = output1.npu() | ||
| 54 | + torch.any(input1, dim=dim, keepdim=keepdim, out=output0) | ||
| 55 | + torch.any(input1, dim=dim, keepdim=keepdim, out=output1) | ||
| 56 | + output0 = output0.to("cpu").numpy() | ||
| 57 | + output1 = output1.to("cpu").numpy() | ||
| 58 | + return output0, output1 | ||
| 59 | + | ||
| 60 | + def test_anyd_shape_format(self, device="npu"): | ||
| 61 | + shape_list = [ | ||
| 62 | + [[1024], 0, False], | ||
| 63 | + [[32, 1024], 1, False], | ||
| 64 | + [[32, 8, 1024], 2, True], | ||
| 65 | + [[128, 32, 8, 1024], 3, True], | ||
| 66 | + ] | ||
| 67 | + | ||
| 68 | + for item in shape_list: | ||
| 69 | + cpu_input, npu_input = self.create_bool_tensor(item[0], 0, 1) | ||
| 70 | + cpu_output = self.cpu_op_exec1(cpu_input, item[1], item[2]) | ||
| 71 | + npu_output = self.npu_op_exec1(npu_input, item[1], item[2]) | ||
| 72 | + npu_out0, npu_out1 = self.npu_op_out_exec1(npu_input, item[1], item[2]) | ||
| 73 | + self.assertRtolEqual( | ||
| 74 | + cpu_output.astype(np.int32), npu_output.astype(np.int32) | ||
| 75 | + ) | ||
| 76 | + self.assertRtolEqual(cpu_output.astype(np.int32), npu_out0.astype(np.int32)) | ||
| 77 | + self.assertRtolEqual(cpu_output.astype(np.int32), npu_out1.astype(np.int32)) | ||
| 78 | + | ||
| 79 | + | ||
| 80 | +if __name__ == "__main__": | ||
| 81 | + run_tests() | ||
| @@ -0,0 +1,191 @@ | |||
| 1 | +import unittest | ||
| 2 | +import torch | ||
| 3 | +import numpy as np | ||
| 4 | + | ||
| 5 | +import torch_npu | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor, SupportedDevices | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +DEVICE_NAME = torch_npu.npu.get_device_name(0)[:10] | ||
| 11 | +torch_npu.npu.set_compile_mode(jit_compile=False) | ||
| 12 | + | ||
| 13 | + | ||
| 14 | +class TestApiCommon(TestCase): | ||
| 15 | + # test input tensor | ||
| 16 | + def cpu_op_out_exec_add(self, input1, input2, output): | ||
| 17 | + torch.add(input1, input2, alpha=1, out=output) | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def npu_op_out_exec_add(self, input1, input2, output): | ||
| 22 | + torch.add(input1, input2, alpha=1, out=output) | ||
| 23 | + output = output.to("cpu").numpy() | ||
| 24 | + return output | ||
| 25 | + | ||
| 26 | + def test_add_out_result(self): | ||
| 27 | + cpuout = torch.randn(18) | ||
| 28 | + npuout = torch.randn(18).to("npu") | ||
| 29 | + item = [np.float32, 0, [18]] | ||
| 30 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 31 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 32 | + | ||
| 33 | + cpu_output = self.cpu_op_out_exec_add(cpu_input1, cpu_input2, cpuout) | ||
| 34 | + npu_output = self.npu_op_out_exec_add(npu_input1, npu_input2, npuout) | ||
| 35 | + | ||
| 36 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 37 | + | ||
| 38 | + # test input scalar | ||
| 39 | + def cpu_op_scalar_exec_add(self, input1, scalar): | ||
| 40 | + output = torch.add(input1, scalar, alpha=1) | ||
| 41 | + output = output.numpy() | ||
| 42 | + return output | ||
| 43 | + | ||
| 44 | + def npu_op_scalar_exec_add(self, input1, scalar): | ||
| 45 | + output = torch.add(input1, scalar, alpha=1) | ||
| 46 | + output = output.to("cpu") | ||
| 47 | + output = output.numpy() | ||
| 48 | + return output | ||
| 49 | + | ||
| 50 | + def test_add_saclar_alpha_result(self): | ||
| 51 | + format_list = [0, 3] | ||
| 52 | + scalar_list = [0, 1] | ||
| 53 | + shape_format = [ | ||
| 54 | + [[np.float16, i, [18]], k] for i in format_list for k in scalar_list | ||
| 55 | + ] | ||
| 56 | + for item in shape_format: | ||
| 57 | + cpu_input, npu_input = create_common_tensor(item[0], 0, 100) | ||
| 58 | + if cpu_input.dtype == torch.float16: | ||
| 59 | + cpu_input = cpu_input.to(torch.float32) | ||
| 60 | + cpu_output = self.cpu_op_scalar_exec_add(cpu_input, item[1]) | ||
| 61 | + npu_output = self.npu_op_scalar_exec_add(npu_input, item[1]) | ||
| 62 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 63 | + | ||
| 64 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 65 | + | ||
| 66 | + # test input IntArray | ||
| 67 | + def cpu_op_exec_AdaptiveAvgPool2d(self, input_x, input_grad): | ||
| 68 | + input_x.requires_grad_(True) | ||
| 69 | + m = torch.nn.AdaptiveAvgPool2d(input_grad) | ||
| 70 | + output = m(input_x) | ||
| 71 | + output.backward(output) | ||
| 72 | + out = output.detach(), input_x.grad | ||
| 73 | + return out | ||
| 74 | + | ||
| 75 | + def npu_op_exec_AdaptiveAvgPool2d(self, input_x, input_grad): | ||
| 76 | + input_x.requires_grad_(True) | ||
| 77 | + m = torch.nn.AdaptiveAvgPool2d(input_grad) | ||
| 78 | + output = m(input_x) | ||
| 79 | + output.backward(output) | ||
| 80 | + out = output.detach().cpu(), input_x.grad.cpu() | ||
| 81 | + return out | ||
| 82 | + | ||
| 83 | + def test_adaptiveAvgPool2d_backward(self): | ||
| 84 | + torch.manual_seed(123) | ||
| 85 | + cpu_input = torch.randn((1, 8, 9), dtype=torch.float32) | ||
| 86 | + npu_input = cpu_input.npu() | ||
| 87 | + output_size = np.array((2, 3)) | ||
| 88 | + cpu_output = self.cpu_op_exec_AdaptiveAvgPool2d(cpu_input, output_size) | ||
| 89 | + npu_output = self.npu_op_exec_AdaptiveAvgPool2d(npu_input, output_size) | ||
| 90 | + self.assertRtolEqual(cpu_output[0], npu_output[0], prec=1e-3) | ||
| 91 | + self.assertRtolEqual(cpu_output[1], npu_output[1], prec=1e-3) | ||
| 92 | + | ||
| 93 | + # test input TensorList | ||
| 94 | + | ||
| 95 | + def test_foreach_add(self, device="npu"): | ||
| 96 | + input1 = torch.randn((1, 8, 9), dtype=torch.float32).npu() | ||
| 97 | + input2 = torch.randn((1, 8, 9), dtype=torch.float32).npu() | ||
| 98 | + npu_input_list = (input1, input2) | ||
| 99 | + npu_input_list2 = (input1, input2) | ||
| 100 | + scalar1 = torch.tensor(0.5, dtype=torch.float32).npu() | ||
| 101 | + npu_output = torch._foreach_add(npu_input_list, scalar1) | ||
| 102 | + | ||
| 103 | + # test input ScalarList | ||
| 104 | + # test input c10::ArrayRef<at::Scalar> | ||
| 105 | + | ||
| 106 | + def test_foreach_add_ScalarList(self, device="npu"): | ||
| 107 | + input1 = torch.randn((1, 8, 9), dtype=torch.float32).npu() | ||
| 108 | + input2 = torch.randn((1, 8, 9), dtype=torch.float32).npu() | ||
| 109 | + npu_input_list = (input1, input2) | ||
| 110 | + scalar1 = torch.tensor(0.5, dtype=torch.float32).npu() | ||
| 111 | + scalar2 = torch.tensor(0.5, dtype=torch.float32).npu() | ||
| 112 | + scalar_list = (scalar1, scalar2) | ||
| 113 | + npu_output = torch._foreach_add(npu_input_list, scalar_list) | ||
| 114 | + | ||
| 115 | + # test c10::optional<at::Tensor> | ||
| 116 | + def test_batch_norm_backward_elemt_4d(self): | ||
| 117 | + grad_output = torch.ones([2, 3, 1, 4]).npu() | ||
| 118 | + input1 = torch.ones([2, 3, 1, 4]).npu() | ||
| 119 | + mean = torch.tensor([8.0, 5.0, 9.0]).npu() | ||
| 120 | + invstd = torch.tensor([2.0, 1.0, 2.0]).npu() | ||
| 121 | + weight = torch.tensor([1.0, 1.0, 4.0]).npu() | ||
| 122 | + mean_dy = torch.tensor([2.0, 2.0, 6.0]).npu() | ||
| 123 | + mean_dy_xmn = torch.tensor([2.0, 3.0, 11.0]).npu() | ||
| 124 | + count_tensor = torch.tensor([5, 5, 5], dtype=torch.int32).npu() | ||
| 125 | + | ||
| 126 | + grad_input = torch.batch_norm_backward_elemt( | ||
| 127 | + grad_output, | ||
| 128 | + input1, | ||
| 129 | + mean, | ||
| 130 | + invstd, | ||
| 131 | + weight, | ||
| 132 | + mean_dy, | ||
| 133 | + mean_dy_xmn, | ||
| 134 | + count_tensor, | ||
| 135 | + ) | ||
| 136 | + cuda_expect_out = torch.tensor( | ||
| 137 | + [ | ||
| 138 | + [ | ||
| 139 | + [[9.2000, 9.2000, 9.2000, 9.2000]], | ||
| 140 | + [[1.6667, 1.6667, 1.6667, 1.6667]], | ||
| 141 | + [[192.5333, 192.5333, 192.5333, 192.5333]], | ||
| 142 | + ], | ||
| 143 | + [ | ||
| 144 | + [[9.2000, 9.2000, 9.2000, 9.2000]], | ||
| 145 | + [[1.6667, 1.6667, 1.6667, 1.6667]], | ||
| 146 | + [[192.5333, 192.5333, 192.5333, 192.5333]], | ||
| 147 | + ], | ||
| 148 | + ] | ||
| 149 | + ) | ||
| 150 | + self.assertRtolEqual(grad_input.cpu(), cuda_expect_out) | ||
| 151 | + | ||
| 152 | + # test c10::optional<at::IntArrayRef>、at::OptionalIntArrayRef | ||
| 153 | + def cpu_op_exec_mean(self, input1, dtype): | ||
| 154 | + output = torch.mean(input1, [2, 3], keepdim=True, dtype=dtype) | ||
| 155 | + output = output.numpy() | ||
| 156 | + return output | ||
| 157 | + | ||
| 158 | + def npu_op_exec_mean(self, input1, dtype): | ||
| 159 | + input1 = input1.to("npu") | ||
| 160 | + output = torch.mean(input1, [2, 3], keepdim=True, dtype=dtype) | ||
| 161 | + output = output.to("cpu") | ||
| 162 | + output = output.numpy() | ||
| 163 | + return output | ||
| 164 | + | ||
| 165 | + def test_mean_shape_format(self): | ||
| 166 | + item = [[np.float32, 3, (256, 1280, 7, 7)], torch.float32] | ||
| 167 | + cpu_input, npu_input = create_common_tensor(item[0], 0, 100) | ||
| 168 | + cpu_output = self.cpu_op_exec_mean(cpu_input, dtype=item[-1]) | ||
| 169 | + npu_output = self.npu_op_exec_mean(npu_input, dtype=item[-1]) | ||
| 170 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 171 | + | ||
| 172 | + # test String | ||
| 173 | + # test c10::optional<at::Scalar> | ||
| 174 | + def test_clamp(self): | ||
| 175 | + item = [ | ||
| 176 | + [np.float32, 0, (4, 3)], | ||
| 177 | + [np.float32, 0, (4, 3)], | ||
| 178 | + [np.float32, 0, (4, 3)], | ||
| 179 | + ] | ||
| 180 | + input_cpu, input_npu = create_common_tensor(item[0], 0, 10) | ||
| 181 | + min_cpu, min_npu = create_common_tensor(item[1], 1, 50) | ||
| 182 | + max_cpu, max_npu = create_common_tensor(item[2], 50, 100) | ||
| 183 | + _, out_npu = create_common_tensor(item[0], 1, 100) | ||
| 184 | + | ||
| 185 | + cpu_output = torch.clamp(input_cpu, min_cpu, max_cpu).numpy() | ||
| 186 | + npu_output = torch.clamp(input_npu, min_npu, max_npu).cpu().numpy() | ||
| 187 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 188 | + | ||
| 189 | + | ||
| 190 | +if __name__ == "__main__": | ||
| 191 | + run_tests() | ||
| @@ -0,0 +1,75 @@ | |||
| 1 | +import torch | ||
| 2 | +import torch_npu | ||
| 3 | + | ||
| 4 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 5 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 6 | + | ||
| 7 | + | ||
| 8 | +class TestApplyAdam(TestCase): | ||
| 9 | + def test_apply_adam(self): | ||
| 10 | + var1 = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 11 | + m1 = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 12 | + v1 = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 13 | + grad1 = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 14 | + var2 = var1.to(torch.half) | ||
| 15 | + m2 = m1.to(torch.half) | ||
| 16 | + v2 = v1.to(torch.half) | ||
| 17 | + grad2 = grad1.to(torch.half) | ||
| 18 | + res1, _, v1_o = torch_npu.npu_apply_adam(1, 1, 0.2, 0.2, 0.2, 0.2, grad1, False, False, out=(var1, m1, v1)) | ||
| 19 | + res2, _, v2_o = torch_npu.npu_apply_adam(1, 1, 0.2, 0.2, 0.2, 0.2, grad2, False, False, out=(var2, m2, v2)) | ||
| 20 | + expect_vo = torch.tensor([[[[2.2156, -0.1393], | ||
| 21 | + [0.6441, 0.3087]], | ||
| 22 | + [[0.9008, -0.0295], | ||
| 23 | + [0.0776, 0.0773]]], | ||
| 24 | + [[[0.1105, 1.0725], | ||
| 25 | + [0.8731, 0.4582]], | ||
| 26 | + [[0.1653, 0.3091], | ||
| 27 | + [0.3175, 0.0998]]]], dtype=torch.float32) | ||
| 28 | + self.assertRtolEqual(expect_vo, v1_o.cpu()) | ||
| 29 | + self.assertRtolEqual(expect_vo.to(torch.half), v2_o.cpu()) | ||
| 30 | + | ||
| 31 | + def test_apply_adam_out_fp32(self): | ||
| 32 | + var = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 33 | + m = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 34 | + v = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 35 | + grad = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 36 | + bt1p = 0.9 | ||
| 37 | + bt2p = 0.9 | ||
| 38 | + lr = 0.2 | ||
| 39 | + bt1 = 0.2 | ||
| 40 | + bt2 = 0.2 | ||
| 41 | + ep = 0.2 | ||
| 42 | + ul = False | ||
| 43 | + un = False | ||
| 44 | + var_o, m_o, v_o = torch_npu.npu_apply_adam(bt1p, bt2p, lr, bt1, bt2, ep, grad, ul, un, out=(var, m, v)) | ||
| 45 | + expect_varo = torch.tensor([[[[-0.1842, 0.6028], | ||
| 46 | + [0.4803, -0.3156]], | ||
| 47 | + [[0.9466, -0.9984], | ||
| 48 | + [-0.1592, -0.1908]]], | ||
| 49 | + [[[-0.9448, 0.6290], | ||
| 50 | + [0.0694, 0.3411]], | ||
| 51 | + [[-0.0987, 0.5370], | ||
| 52 | + [-0.5744, 0.3317]]]]) | ||
| 53 | + expect_mo = torch.tensor([[[[-1.4744, 0.1481], | ||
| 54 | + [-0.6954, 0.1557]], | ||
| 55 | + [[-0.6090, 0.4566], | ||
| 56 | + [-0.4863, 0.7218]]], | ||
| 57 | + [[[0.5437, -1.1527], | ||
| 58 | + [0.6547, -0.5491]], | ||
| 59 | + [[-0.2247, -0.7165], | ||
| 60 | + [0.7963, -0.1283]]]]) | ||
| 61 | + expect_vo = torch.tensor([[[[2.2156, -0.1393], | ||
| 62 | + [0.6441, 0.3087]], | ||
| 63 | + [[0.9008, -0.0295], | ||
| 64 | + [0.0776, 0.0773]]], | ||
| 65 | + [[[0.1105, 1.0725], | ||
| 66 | + [0.8731, 0.4582]], | ||
| 67 | + [[0.1653, 0.3091], | ||
| 68 | + [0.3175, 0.0998]]]]) | ||
| 69 | + self.assertRtolEqual(expect_varo, var_o.cpu()) | ||
| 70 | + self.assertRtolEqual(expect_mo, m_o.cpu()) | ||
| 71 | + self.assertRtolEqual(expect_vo, v_o.cpu()) | ||
| 72 | + | ||
| 73 | + | ||
| 74 | +if __name__ == "__main__": | ||
| 75 | + run_tests() | ||
| @@ -0,0 +1,220 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | + | ||
| 4 | +import torch_npu | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestApplyAdam(TestCase): | ||
| 10 | + # pylint:disable = huawei-too-many-arguments | ||
| 11 | + def cpu_op_exec( | ||
| 12 | + self, | ||
| 13 | + var, | ||
| 14 | + m, | ||
| 15 | + v, | ||
| 16 | + beta1_power, | ||
| 17 | + beta2_power, | ||
| 18 | + lr, | ||
| 19 | + weight_decay, | ||
| 20 | + beta1, | ||
| 21 | + beta2, | ||
| 22 | + eps, | ||
| 23 | + grad, | ||
| 24 | + max_grad_norm, | ||
| 25 | + amsgrad, | ||
| 26 | + maximize, | ||
| 27 | + ): | ||
| 28 | + if amsgrad: | ||
| 29 | + max_grad_norm = np.random.uniform(-5.0, 5.0, var.shape) | ||
| 30 | + gt = -grad if maximize else grad | ||
| 31 | + m_out = m * beta1 - (beta1 + (-1)) * gt | ||
| 32 | + v_out = v * beta2 - (beta2 + (-1)) * gt * gt | ||
| 33 | + var_t = var * (1 + (-lr * weight_decay)) | ||
| 34 | + beta1_power_out = beta1_power * beta1 | ||
| 35 | + beta2_power_out = beta2_power * beta2 | ||
| 36 | + if amsgrad: | ||
| 37 | + max_grad_norm_out = np.maximum(max_grad_norm, v_out) | ||
| 38 | + try: | ||
| 39 | + denom = np.sqrt(max_grad_norm_out / (1 - beta2_power_out)) + eps | ||
| 40 | + except ZeroDivisionError: | ||
| 41 | + print("Divide-by-Zero Error!") | ||
| 42 | + else: | ||
| 43 | + max_grad_norm_out = None | ||
| 44 | + try: | ||
| 45 | + denom = np.sqrt(v_out / (1 - beta2_power_out)) + eps | ||
| 46 | + except ZeroDivisionError: | ||
| 47 | + print("Divide-by-Zero Error!") | ||
| 48 | + try: | ||
| 49 | + var_out = var_t + (-lr * m_out / (1 - beta1_power_out)) / denom | ||
| 50 | + except ZeroDivisionError: | ||
| 51 | + print("Divide-by-Zero Error!") | ||
| 52 | + return var_out, m_out, v_out | ||
| 53 | + | ||
| 54 | + # pylint:disable = huawei-too-many-arguments | ||
| 55 | + def npu_op_exec( | ||
| 56 | + self, | ||
| 57 | + var_tensor, | ||
| 58 | + m_tensor, | ||
| 59 | + v_tensor, | ||
| 60 | + beta1_power, | ||
| 61 | + beta2_power, | ||
| 62 | + lr, | ||
| 63 | + weight_decay, | ||
| 64 | + beta1, | ||
| 65 | + beta2, | ||
| 66 | + eps, | ||
| 67 | + grad, | ||
| 68 | + max_grad_norm, | ||
| 69 | + amsgrad, | ||
| 70 | + maximize, | ||
| 71 | + ): | ||
| 72 | + var_out_npu, m_out_npu, v_out_npu = torch_npu.npu_apply_adam_w( | ||
| 73 | + beta1_power[0], | ||
| 74 | + beta2_power[0], | ||
| 75 | + lr[0], | ||
| 76 | + weight_decay[0], | ||
| 77 | + beta1[0], | ||
| 78 | + beta2[0], | ||
| 79 | + eps[0], | ||
| 80 | + grad, | ||
| 81 | + max_grad_norm, | ||
| 82 | + amsgrad, | ||
| 83 | + maximize, | ||
| 84 | + out=(var_tensor, m_tensor, v_tensor), | ||
| 85 | + ) | ||
| 86 | + return var_out_npu, m_out_npu, v_out_npu | ||
| 87 | + | ||
| 88 | + def test_apply_adam_w_maximize_true(self): | ||
| 89 | + amsgrad = False # at present, the operator supports only false. | ||
| 90 | + maximize = True | ||
| 91 | + scalar_shape = [1] | ||
| 92 | + dtype = np.float32 | ||
| 93 | + shape_format = [ | ||
| 94 | + [np.float32, 2, (21130, 512)], | ||
| 95 | + ] | ||
| 96 | + var_cpu, var_npu = create_common_tensor(shape_format[0], 10.0, 20.0) | ||
| 97 | + m_cpu, m_npu = create_common_tensor(shape_format[0], 5.0, 10.0) | ||
| 98 | + v_cpu, v_npu = create_common_tensor(shape_format[0], 0.1, 5.0) | ||
| 99 | + grad_cpu, grad_npu = create_common_tensor(shape_format[0], -5.0, 5.0) | ||
| 100 | + | ||
| 101 | + var_cpu = var_cpu.numpy() | ||
| 102 | + m_cpu = m_cpu.numpy() | ||
| 103 | + v_cpu = v_cpu.numpy() | ||
| 104 | + grad_cpu = grad_cpu.numpy() | ||
| 105 | + | ||
| 106 | + beta1_power = np.random.uniform(0.0, 1.0, scalar_shape) | ||
| 107 | + beta2_power = np.random.uniform(0.0, 1.0, scalar_shape) | ||
| 108 | + lr = np.random.uniform(0.0001, 0.1, scalar_shape) | ||
| 109 | + weight_decay = np.random.uniform(0.001, 0.1, scalar_shape) | ||
| 110 | + beta1 = np.random.uniform(0.5, 1.0, scalar_shape) | ||
| 111 | + beta2 = np.random.uniform(0.5, 1.0, scalar_shape) | ||
| 112 | + eps = np.random.uniform(0.00001, 0.01, scalar_shape) | ||
| 113 | + max_grad_norm = None | ||
| 114 | + | ||
| 115 | + var_ret_cpu, m_ret_cpu, v_ret_cpu = self.cpu_op_exec( | ||
| 116 | + var_cpu, | ||
| 117 | + m_cpu, | ||
| 118 | + v_cpu, | ||
| 119 | + beta1_power, | ||
| 120 | + beta2_power, | ||
| 121 | + lr, | ||
| 122 | + weight_decay, | ||
| 123 | + beta1, | ||
| 124 | + beta2, | ||
| 125 | + eps, | ||
| 126 | + grad_cpu, | ||
| 127 | + max_grad_norm, | ||
| 128 | + amsgrad, | ||
| 129 | + maximize, | ||
| 130 | + ) | ||
| 131 | + | ||
| 132 | + var_ret_npu, m_ret_npu, v_ret_npu = self.npu_op_exec( | ||
| 133 | + var_npu, | ||
| 134 | + m_npu, | ||
| 135 | + v_npu, | ||
| 136 | + beta1_power, | ||
| 137 | + beta2_power, | ||
| 138 | + lr, | ||
| 139 | + weight_decay, | ||
| 140 | + beta1, | ||
| 141 | + beta2, | ||
| 142 | + eps, | ||
| 143 | + grad_npu, | ||
| 144 | + max_grad_norm, | ||
| 145 | + amsgrad, | ||
| 146 | + maximize, | ||
| 147 | + ) | ||
| 148 | + | ||
| 149 | + self.assertRtolEqual(var_ret_cpu.astype(dtype), var_ret_npu.cpu().numpy()) | ||
| 150 | + self.assertRtolEqual(m_ret_cpu.astype(dtype), m_ret_npu.cpu().numpy()) | ||
| 151 | + self.assertRtolEqual(v_ret_cpu.astype(dtype), v_ret_npu.cpu().numpy()) | ||
| 152 | + | ||
| 153 | + def test_apply_adam_w_maximize_false(self): | ||
| 154 | + amsgrad = False # at present, the operator supports only false. | ||
| 155 | + maximize = False | ||
| 156 | + scalar_shape = [1] | ||
| 157 | + dtype = np.float32 | ||
| 158 | + shape_format = [ | ||
| 159 | + [np.float32, 2, (21130, 512)], | ||
| 160 | + ] | ||
| 161 | + var_cpu, var_npu = create_common_tensor(shape_format[0], 10.0, 20.0) | ||
| 162 | + m_cpu, m_npu = create_common_tensor(shape_format[0], 5.0, 10.0) | ||
| 163 | + v_cpu, v_npu = create_common_tensor(shape_format[0], 0.1, 5.0) | ||
| 164 | + grad_cpu, grad_npu = create_common_tensor(shape_format[0], -5.0, 5.0) | ||
| 165 | + | ||
| 166 | + var_cpu = var_cpu.numpy() | ||
| 167 | + m_cpu = m_cpu.numpy() | ||
| 168 | + v_cpu = v_cpu.numpy() | ||
| 169 | + grad_cpu = grad_cpu.numpy() | ||
| 170 | + | ||
| 171 | + beta1_power = np.random.uniform(0.0, 1.0, scalar_shape) | ||
| 172 | + beta2_power = np.random.uniform(0.0, 1.0, scalar_shape) | ||
| 173 | + lr = np.random.uniform(0.0001, 0.1, scalar_shape) | ||
| 174 | + weight_decay = np.random.uniform(0.001, 0.1, scalar_shape) | ||
| 175 | + beta1 = np.random.uniform(0.5, 1.0, scalar_shape) | ||
| 176 | + beta2 = np.random.uniform(0.5, 1.0, scalar_shape) | ||
| 177 | + eps = np.random.uniform(0.00001, 0.01, scalar_shape) | ||
| 178 | + max_grad_norm = None | ||
| 179 | + | ||
| 180 | + var_ret_cpu, m_ret_cpu, v_ret_cpu = self.cpu_op_exec( | ||
| 181 | + var_cpu, | ||
| 182 | + m_cpu, | ||
| 183 | + v_cpu, | ||
| 184 | + beta1_power, | ||
| 185 | + beta2_power, | ||
| 186 | + lr, | ||
| 187 | + weight_decay, | ||
| 188 | + beta1, | ||
| 189 | + beta2, | ||
| 190 | + eps, | ||
| 191 | + grad_cpu, | ||
| 192 | + max_grad_norm, | ||
| 193 | + amsgrad, | ||
| 194 | + maximize, | ||
| 195 | + ) | ||
| 196 | + | ||
| 197 | + var_ret_npu, m_ret_npu, v_ret_npu = self.npu_op_exec( | ||
| 198 | + var_npu, | ||
| 199 | + m_npu, | ||
| 200 | + v_npu, | ||
| 201 | + beta1_power, | ||
| 202 | + beta2_power, | ||
| 203 | + lr, | ||
| 204 | + weight_decay, | ||
| 205 | + beta1, | ||
| 206 | + beta2, | ||
| 207 | + eps, | ||
| 208 | + grad_npu, | ||
| 209 | + max_grad_norm, | ||
| 210 | + amsgrad, | ||
| 211 | + maximize, | ||
| 212 | + ) | ||
| 213 | + | ||
| 214 | + self.assertRtolEqual(var_ret_cpu.astype(dtype), var_ret_npu.cpu().numpy()) | ||
| 215 | + self.assertRtolEqual(m_ret_cpu.astype(dtype), m_ret_npu.cpu().numpy()) | ||
| 216 | + self.assertRtolEqual(v_ret_cpu.astype(dtype), v_ret_npu.cpu().numpy()) | ||
| 217 | + | ||
| 218 | + | ||
| 219 | +if __name__ == "__main__": | ||
| 220 | + run_tests() | ||
| @@ -0,0 +1,72 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestArange(TestCase): | ||
| 10 | + def test_arange_default(self): | ||
| 11 | + shape_format = [ | ||
| 12 | + [0, 100, 2], | ||
| 13 | + [1, 100, 1], | ||
| 14 | + [5, 100, 3], | ||
| 15 | + ] | ||
| 16 | + | ||
| 17 | + for item in shape_format: | ||
| 18 | + cpu_output_default = torch.arange( | ||
| 19 | + item[0], item[1], item[2], device="cpu" | ||
| 20 | + ).numpy() | ||
| 21 | + npu_output_default = ( | ||
| 22 | + torch.arange(item[0], item[1], item[2], device="npu").cpu().numpy() | ||
| 23 | + ) | ||
| 24 | + self.assertRtolEqual(cpu_output_default, npu_output_default) | ||
| 25 | + | ||
| 26 | + def test_arange(self): | ||
| 27 | + shape_format = [ | ||
| 28 | + [0, 100, 2, torch.float32], | ||
| 29 | + [1, 100, 1, torch.int32], | ||
| 30 | + [5, 100, 3, torch.int64], | ||
| 31 | + ] | ||
| 32 | + | ||
| 33 | + for item in shape_format: | ||
| 34 | + cpu_output = torch.arange( | ||
| 35 | + item[0], item[1], item[2], dtype=item[3], device="cpu" | ||
| 36 | + ).numpy() | ||
| 37 | + npu_output = ( | ||
| 38 | + torch.arange(item[0], item[1], item[2], dtype=item[3], device="npu") | ||
| 39 | + .cpu() | ||
| 40 | + .numpy() | ||
| 41 | + ) | ||
| 42 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 43 | + | ||
| 44 | + def test_arange_out(self): | ||
| 45 | + shape_format = [ | ||
| 46 | + [0, 100, 1, torch.float32, [np.float32, 0, [10]]], | ||
| 47 | + [1, 100, 2, torch.int32, [np.int32, 0, [20]]], | ||
| 48 | + [5, 100, 3, torch.int64, [np.int64, 0, [30]]], | ||
| 49 | + ] | ||
| 50 | + | ||
| 51 | + for item in shape_format: | ||
| 52 | + cpu_input1, npu_input1 = create_common_tensor(item[4], 0, 10) | ||
| 53 | + cpu_output = torch.arange( | ||
| 54 | + item[0], item[1], item[2], dtype=item[3], device="cpu" | ||
| 55 | + ).numpy() | ||
| 56 | + npu_output = ( | ||
| 57 | + torch.arange( | ||
| 58 | + item[0], | ||
| 59 | + item[1], | ||
| 60 | + item[2], | ||
| 61 | + out=npu_input1, | ||
| 62 | + dtype=item[3], | ||
| 63 | + device="npu", | ||
| 64 | + ) | ||
| 65 | + .cpu() | ||
| 66 | + .numpy() | ||
| 67 | + ) | ||
| 68 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 69 | + | ||
| 70 | + | ||
| 71 | +if __name__ == "__main__": | ||
| 72 | + run_tests() | ||
| @@ -0,0 +1,74 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestArccosh(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1): | ||
| 11 | + output = torch.arccosh(input1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1): | ||
| 16 | + output = torch.arccosh(input1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def npu_op_exec_out(self, input1, input2): | ||
| 22 | + torch.arccosh(input1, out=input2) | ||
| 23 | + output = input2.to("cpu") | ||
| 24 | + output = output.numpy() | ||
| 25 | + return output | ||
| 26 | + | ||
| 27 | + def cpu_inp_op_exec(self, input1): | ||
| 28 | + output = torch.arccosh_(input1) | ||
| 29 | + output = output.numpy() | ||
| 30 | + return output | ||
| 31 | + | ||
| 32 | + def npu_inp_op_exec(self, input1): | ||
| 33 | + output = torch.arccosh_(input1) | ||
| 34 | + output = output.to("cpu") | ||
| 35 | + output = output.numpy() | ||
| 36 | + return output | ||
| 37 | + | ||
| 38 | + def test_arccosh_common_shape_format(self): | ||
| 39 | + shape_format = [ | ||
| 40 | + [[np.float32, 0, (5, 3)]], | ||
| 41 | + ] | ||
| 42 | + for item in shape_format: | ||
| 43 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -10, 10) | ||
| 44 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 45 | + npu_output = self.npu_op_exec(npu_input1) | ||
| 46 | + mask = ~(np.isnan(cpu_output) | np.isinf(cpu_output)) | ||
| 47 | + self.assertRtolEqual(cpu_output[mask], npu_output[mask], 0.001) | ||
| 48 | + | ||
| 49 | + def test_arccosh_out_common_shape_format(self): | ||
| 50 | + shape_format = [ | ||
| 51 | + [[np.float32, 0, (4, 3)], [np.float32, 0, (4, 3)]], | ||
| 52 | + ] | ||
| 53 | + for item in shape_format: | ||
| 54 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -10, 10) | ||
| 55 | + cpu_input2, npu_input2 = create_common_tensor(item[1], -10, 10) | ||
| 56 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 57 | + npu_output = self.npu_op_exec_out(npu_input1, npu_input2) | ||
| 58 | + mask = ~(np.isnan(cpu_output) | np.isinf(cpu_output)) | ||
| 59 | + self.assertRtolEqual(cpu_output[mask], npu_output[mask], 0.001) | ||
| 60 | + | ||
| 61 | + def test_arccosh_inp_common_shape_format(self): | ||
| 62 | + shape_format = [ | ||
| 63 | + [[np.float32, 0, (5, 3)]], | ||
| 64 | + ] | ||
| 65 | + for item in shape_format: | ||
| 66 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -10, 10) | ||
| 67 | + cpu_output = self.cpu_inp_op_exec(cpu_input1) | ||
| 68 | + npu_output = self.npu_inp_op_exec(npu_input1) | ||
| 69 | + mask = ~(np.isnan(cpu_output) | np.isinf(cpu_output)) | ||
| 70 | + self.assertRtolEqual(cpu_output[mask], npu_output[mask], 0.001) | ||
| 71 | + | ||
| 72 | + | ||
| 73 | +if __name__ == "__main__": | ||
| 74 | + run_tests() | ||
| @@ -0,0 +1,71 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestArcsin(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1): | ||
| 11 | + output = torch.arcsin(input1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1): | ||
| 16 | + output = torch.arcsin(input1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def npu_op_exec_out(self, input1, input2): | ||
| 22 | + torch.arcsin(input1, out=input2) | ||
| 23 | + output = input2.to("cpu") | ||
| 24 | + output = output.numpy() | ||
| 25 | + return output | ||
| 26 | + | ||
| 27 | + def cpu_inp_op_exec(self, input1): | ||
| 28 | + output = torch.arcsin_(input1) | ||
| 29 | + output = output.numpy() | ||
| 30 | + return output | ||
| 31 | + | ||
| 32 | + def npu_inp_op_exec(self, input1): | ||
| 33 | + output = torch.arcsin_(input1) | ||
| 34 | + output = output.to("cpu") | ||
| 35 | + output = output.numpy() | ||
| 36 | + return output | ||
| 37 | + | ||
| 38 | + def test_arcsin_common_shape_format(self): | ||
| 39 | + shape_format = [ | ||
| 40 | + [[np.float32, 0, (5, 3)]], | ||
| 41 | + ] | ||
| 42 | + for item in shape_format: | ||
| 43 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 44 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 45 | + npu_output = self.npu_op_exec(npu_input1) | ||
| 46 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 47 | + | ||
| 48 | + def test_arcsin_out_common_shape_format(self): | ||
| 49 | + shape_format = [ | ||
| 50 | + [[np.float32, 0, (4, 3)], [np.float32, 0, (4, 3)]], | ||
| 51 | + ] | ||
| 52 | + for item in shape_format: | ||
| 53 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 54 | + cpu_input2, npu_input2 = create_common_tensor(item[1], -1, 1) | ||
| 55 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 56 | + npu_output = self.npu_op_exec_out(npu_input1, npu_input2) | ||
| 57 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 58 | + | ||
| 59 | + def test_arcsin_inp_common_shape_format(self): | ||
| 60 | + shape_format = [ | ||
| 61 | + [[np.float32, 0, (5, 3)]], | ||
| 62 | + ] | ||
| 63 | + for item in shape_format: | ||
| 64 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 65 | + cpu_output = self.cpu_inp_op_exec(cpu_input1) | ||
| 66 | + npu_output = self.npu_inp_op_exec(npu_input1) | ||
| 67 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 68 | + | ||
| 69 | + | ||
| 70 | +if __name__ == "__main__": | ||
| 71 | + run_tests() | ||
| @@ -0,0 +1,71 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestArcsinh(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1): | ||
| 11 | + output = torch.arcsinh(input1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1): | ||
| 16 | + output = torch.arcsinh(input1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def npu_op_exec_out(self, input1, input2): | ||
| 22 | + torch.arcsinh(input1, out=input2) | ||
| 23 | + output = input2.to("cpu") | ||
| 24 | + output = output.numpy() | ||
| 25 | + return output | ||
| 26 | + | ||
| 27 | + def cpu_inp_op_exec(self, input1): | ||
| 28 | + output = torch.arcsinh_(input1) | ||
| 29 | + output = output.numpy() | ||
| 30 | + return output | ||
| 31 | + | ||
| 32 | + def npu_inp_op_exec(self, input1): | ||
| 33 | + output = torch.arcsinh_(input1) | ||
| 34 | + output = output.to("cpu") | ||
| 35 | + output = output.numpy() | ||
| 36 | + return output | ||
| 37 | + | ||
| 38 | + def test_arcsinh_common_shape_format(self): | ||
| 39 | + shape_format = [ | ||
| 40 | + [[np.float32, 0, (5, 3)]], | ||
| 41 | + ] | ||
| 42 | + for item in shape_format: | ||
| 43 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 44 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 45 | + npu_output = self.npu_op_exec(npu_input1) | ||
| 46 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 47 | + | ||
| 48 | + def test_arcsinh_out_common_shape_format(self): | ||
| 49 | + shape_format = [ | ||
| 50 | + [[np.float32, 0, (4, 3)], [np.float32, 0, (4, 3)]], | ||
| 51 | + ] | ||
| 52 | + for item in shape_format: | ||
| 53 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 54 | + cpu_input2, npu_input2 = create_common_tensor(item[1], -1, 1) | ||
| 55 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 56 | + npu_output = self.npu_op_exec_out(npu_input1, npu_input2) | ||
| 57 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 58 | + | ||
| 59 | + def test_arcsinh_inp_common_shape_format(self): | ||
| 60 | + shape_format = [ | ||
| 61 | + [[np.float32, 0, (5, 3)]], | ||
| 62 | + ] | ||
| 63 | + for item in shape_format: | ||
| 64 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 65 | + cpu_output = self.cpu_inp_op_exec(cpu_input1) | ||
| 66 | + npu_output = self.npu_inp_op_exec(npu_input1) | ||
| 67 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 68 | + | ||
| 69 | + | ||
| 70 | +if __name__ == "__main__": | ||
| 71 | + run_tests() | ||
| @@ -0,0 +1,83 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestArctan(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1): | ||
| 11 | + output = torch.arctan(input1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1): | ||
| 16 | + output = torch.arctan(input1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def npu_op_exec_out(self, input1, input2): | ||
| 22 | + torch.arctan(input1, out=input2) | ||
| 23 | + output = input2.to("cpu") | ||
| 24 | + output = output.numpy() | ||
| 25 | + return output | ||
| 26 | + | ||
| 27 | + def cpu_inp_op_exec(self, input1): | ||
| 28 | + output = torch.arctan_(input1) | ||
| 29 | + output = output.numpy() | ||
| 30 | + return output | ||
| 31 | + | ||
| 32 | + def npu_inp_op_exec(self, input1): | ||
| 33 | + output = torch.arctan_(input1) | ||
| 34 | + output = output.to("cpu") | ||
| 35 | + output = output.numpy() | ||
| 36 | + return output | ||
| 37 | + | ||
| 38 | + def test_arctan_shape_format(self): | ||
| 39 | + shape_format1 = [ | ||
| 40 | + [[np.float32, 0, 1]], | ||
| 41 | + [[np.float32, 0, (64, 10)]], | ||
| 42 | + [[np.float32, 3, (256, 2048, 7, 7)]], | ||
| 43 | + [[np.float32, 4, (32, 1, 3, 3)]], | ||
| 44 | + [[np.float32, 29, (10, 128)]], | ||
| 45 | + ] | ||
| 46 | + for item in shape_format1: | ||
| 47 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 48 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 49 | + npu_output = self.npu_op_exec(npu_input1) | ||
| 50 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 51 | + | ||
| 52 | + def test_arctan_out_shape_format(self): | ||
| 53 | + shape_format1 = [ | ||
| 54 | + [[np.float32, 0, 1]], | ||
| 55 | + [[np.float32, 0, (64, 10)]], | ||
| 56 | + [[np.float32, 3, (256, 2048, 7, 7)]], | ||
| 57 | + [[np.float32, 4, (32, 1, 3, 3)]], | ||
| 58 | + [[np.float32, 29, (10, 128)]], | ||
| 59 | + ] | ||
| 60 | + for item in shape_format1: | ||
| 61 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 62 | + cpu_input2, npu_input2 = create_common_tensor(item[0], -1, 1) | ||
| 63 | + cpu_output1 = self.cpu_op_exec(cpu_input1) | ||
| 64 | + npu_output1 = self.npu_op_exec_out(npu_input1, npu_input2) | ||
| 65 | + self.assertRtolEqual(cpu_output1, npu_output1) | ||
| 66 | + | ||
| 67 | + def test_arctan_inp_shape_format(self): | ||
| 68 | + shape_format1 = [ | ||
| 69 | + [[np.float32, 0, 1]], | ||
| 70 | + [[np.float32, 0, (64, 10)]], | ||
| 71 | + [[np.float32, 3, (256, 2048, 7, 7)]], | ||
| 72 | + [[np.float32, 4, (32, 1, 3, 3)]], | ||
| 73 | + [[np.float32, 29, (10, 128)]], | ||
| 74 | + ] | ||
| 75 | + for item in shape_format1: | ||
| 76 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 77 | + cpu_output1 = self.cpu_inp_op_exec(cpu_input1) | ||
| 78 | + npu_output1 = self.npu_inp_op_exec(npu_input1) | ||
| 79 | + self.assertRtolEqual(cpu_output1, npu_output1) | ||
| 80 | + | ||
| 81 | + | ||
| 82 | +if __name__ == "__main__": | ||
| 83 | + run_tests() | ||
| @@ -0,0 +1,83 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestArctanh(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1): | ||
| 11 | + output = torch.arctanh(input1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1): | ||
| 16 | + output = torch.arctanh(input1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def npu_op_exec_out(self, input1, input2): | ||
| 22 | + torch.arctanh(input1, out=input2) | ||
| 23 | + output = input2.to("cpu") | ||
| 24 | + output = output.numpy() | ||
| 25 | + return output | ||
| 26 | + | ||
| 27 | + def cpu_inp_op_exec(self, input1): | ||
| 28 | + output = torch.arctanh_(input1) | ||
| 29 | + output = output.numpy() | ||
| 30 | + return output | ||
| 31 | + | ||
| 32 | + def npu_inp_op_exec(self, input1): | ||
| 33 | + output = torch.arctanh_(input1) | ||
| 34 | + output = output.to("cpu") | ||
| 35 | + output = output.numpy() | ||
| 36 | + return output | ||
| 37 | + | ||
| 38 | + def test_arctan_shape_format(self): | ||
| 39 | + shape_format = [ | ||
| 40 | + [[np.float32, 0, 1]], | ||
| 41 | + [[np.float32, 0, (64, 10)]], | ||
| 42 | + [[np.float32, 3, (256, 2048, 7, 7)]], | ||
| 43 | + [[np.float32, 4, (32, 1, 3, 3)]], | ||
| 44 | + [[np.float32, 29, (10, 128)]], | ||
| 45 | + ] | ||
| 46 | + for item in shape_format: | ||
| 47 | + cpu_input, npu_input = create_common_tensor(item[0], -1, 1) | ||
| 48 | + cpu_output = self.cpu_op_exec(cpu_input) | ||
| 49 | + npu_output = self.npu_op_exec(npu_input) | ||
| 50 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 51 | + | ||
| 52 | + def test_arctan_out_shape_format(self): | ||
| 53 | + shape_format = [ | ||
| 54 | + [[np.float32, 0, 1]], | ||
| 55 | + [[np.float32, 0, (64, 10)]], | ||
| 56 | + [[np.float32, 3, (256, 2048, 7, 7)]], | ||
| 57 | + [[np.float32, 4, (32, 1, 3, 3)]], | ||
| 58 | + [[np.float32, 29, (10, 128)]], | ||
| 59 | + ] | ||
| 60 | + for item in shape_format: | ||
| 61 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 62 | + cpu_input2, npu_input2 = create_common_tensor(item[0], -1, 1) | ||
| 63 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 64 | + npu_output = self.npu_op_exec_out(npu_input1, npu_input2) | ||
| 65 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 66 | + | ||
| 67 | + def test_arctan_inp_shape_format(self): | ||
| 68 | + shape_format = [ | ||
| 69 | + [[np.float32, 0, 1]], | ||
| 70 | + [[np.float32, 0, (64, 10)]], | ||
| 71 | + [[np.float32, 3, (256, 2048, 7, 7)]], | ||
| 72 | + [[np.float32, 4, (32, 1, 3, 3)]], | ||
| 73 | + [[np.float32, 29, (10, 128)]], | ||
| 74 | + ] | ||
| 75 | + for item in shape_format: | ||
| 76 | + cpu_input, npu_input = create_common_tensor(item[0], -1, 1) | ||
| 77 | + cpu_output = self.cpu_inp_op_exec(cpu_input) | ||
| 78 | + npu_output = self.npu_inp_op_exec(npu_input) | ||
| 79 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 80 | + | ||
| 81 | + | ||
| 82 | +if __name__ == "__main__": | ||
| 83 | + run_tests() | ||
| @@ -0,0 +1,80 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestArgmax(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1): | ||
| 11 | + output = torch.argmax(input1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1): | ||
| 16 | + output = torch.argmax(input1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def test_argmax_shape_format_fp16(self, device="npu"): | ||
| 22 | + format_list = [0] | ||
| 23 | + shape_list = [[5], [2, 4], [2, 2, 4], [2, 3, 3, 4]] | ||
| 24 | + shape_format = [[np.float16, i, j] for i in format_list for j in shape_list] | ||
| 25 | + for item in shape_format: | ||
| 26 | + cpu_input, npu_input = create_common_tensor(item, -10, 10) | ||
| 27 | + cpu_input = cpu_input.to(torch.float32) | ||
| 28 | + cpu_output = self.cpu_op_exec(cpu_input) | ||
| 29 | + npu_output = self.npu_op_exec(npu_input) | ||
| 30 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 31 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 32 | + | ||
| 33 | + def test_argmax_shape_format_fp32(self, device="npu"): | ||
| 34 | + format_list = [0] | ||
| 35 | + shape_list = [[5], [2, 4], [2, 2, 4], [2, 3, 3, 4]] | ||
| 36 | + shape_format = [[np.float32, i, j] for i in format_list for j in shape_list] | ||
| 37 | + for item in shape_format: | ||
| 38 | + cpu_input, npu_input = create_common_tensor(item, -10, 10) | ||
| 39 | + cpu_output = self.cpu_op_exec(cpu_input) | ||
| 40 | + npu_output = self.npu_op_exec(npu_input) | ||
| 41 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 42 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 43 | + | ||
| 44 | + def cpu_op_exec1(self, input1, dim): | ||
| 45 | + output = torch.argmax(input1, dim) | ||
| 46 | + output = output.numpy() | ||
| 47 | + return output | ||
| 48 | + | ||
| 49 | + def npu_op_exec1(self, input1, dim): | ||
| 50 | + output = torch.argmax(input1, dim) | ||
| 51 | + output = output.to("cpu") | ||
| 52 | + output = output.numpy() | ||
| 53 | + return output | ||
| 54 | + | ||
| 55 | + def test_argmaxd_shape_format_fp16(self, device="npu"): | ||
| 56 | + format_list = [0] | ||
| 57 | + shape_list = [[5], [2, 4], [2, 2, 4], [2, 3, 3, 4]] | ||
| 58 | + shape_format = [[np.float16, i, j] for i in format_list for j in shape_list] | ||
| 59 | + for item in shape_format: | ||
| 60 | + cpu_input, npu_input = create_common_tensor(item, -10, 10) | ||
| 61 | + cpu_input = cpu_input.to(torch.float32) | ||
| 62 | + cpu_output = self.cpu_op_exec1(cpu_input, -1) | ||
| 63 | + npu_output = self.npu_op_exec1(npu_input, -1) | ||
| 64 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 65 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 66 | + | ||
| 67 | + def test_argmaxd_shape_format_fp32(self, device="npu"): | ||
| 68 | + format_list = [0] | ||
| 69 | + shape_list = [[5], [2, 4], [2, 2, 4], [2, 3, 3, 4]] | ||
| 70 | + shape_format = [[np.float32, i, j] for i in format_list for j in shape_list] | ||
| 71 | + for item in shape_format: | ||
| 72 | + cpu_input, npu_input = create_common_tensor(item, -10, 10) | ||
| 73 | + cpu_output = self.cpu_op_exec1(cpu_input, -1) | ||
| 74 | + npu_output = self.npu_op_exec1(npu_input, -1) | ||
| 75 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 76 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 77 | + | ||
| 78 | + | ||
| 79 | +if __name__ == "__main__": | ||
| 80 | + run_tests() | ||
| @@ -0,0 +1,62 @@ | |||
| 1 | +# coding: utf-8 | ||
| 2 | + | ||
| 3 | +import torch | ||
| 4 | +import numpy as np | ||
| 5 | +import torch_npu | ||
| 6 | + | ||
| 7 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 8 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 9 | +from torch_npu.testing.decorator import Dtypes, instantiate_tests | ||
| 10 | + | ||
| 11 | + | ||
| 12 | + | ||
| 13 | +class TestArgmin(TestCase): | ||
| 14 | + | ||
| 15 | + def test_argmin(self, device, dtype): | ||
| 16 | + inputValues = [-1000, -1, 0, 0.5, 1, 2, 1000] | ||
| 17 | + expectedOutput = [0.0000, 0.2689, 0.5, 0.6225, 0.7311, 0.8808, 1.000] | ||
| 18 | + precision_4dps = 0.0002 | ||
| 19 | + a = torch.tensor(inputValues, dtype=dtype, device=device) | ||
| 20 | + self.assertRtolEqual( | ||
| 21 | + torch.tensor(inputValues, dtype=dtype, device=device).sigmoid().cpu(), | ||
| 22 | + torch.tensor(expectedOutput, dtype=dtype, device=device).cpu(), | ||
| 23 | + precision_4dps, | ||
| 24 | + ) | ||
| 25 | + | ||
| 26 | + def cpu_op_exec(self, input1, dims, keepdim=False): | ||
| 27 | + output = torch.argmin(input1, dim=dims, keepdim=keepdim) | ||
| 28 | + if output.dtype != torch.int32: | ||
| 29 | + output = output.to(torch.int32) | ||
| 30 | + output = output.numpy() | ||
| 31 | + return output | ||
| 32 | + | ||
| 33 | + def npu_op_exec(self, input1, dims, keepdim=False): | ||
| 34 | + output = torch.argmin(input1, dim=dims, keepdim=keepdim) | ||
| 35 | + output = output.to("cpu") | ||
| 36 | + if output.dtype != torch.int32: | ||
| 37 | + output = output.to(torch.int32) | ||
| 38 | + output = output.numpy() | ||
| 39 | + return output | ||
| 40 | + | ||
| 41 | + def test_argmin_shape_format(self): | ||
| 42 | + shape_format = [ | ||
| 43 | + [[np.float32, 0, (6, 4)], 0, False], | ||
| 44 | + [[np.float32, 2, (6, 4)], 1, True], | ||
| 45 | + [[np.float32, 0, (2, 4, 5)], 2, True], | ||
| 46 | + [[np.float32, 0, (1, 2, 3, 3)], 2, False], | ||
| 47 | + [[np.float32, 0, (1, 2, 3, 3)], 3, True], | ||
| 48 | + [[np.float16, 0, (6, 4)], 0, False], | ||
| 49 | + [[np.float16, 2, (6, 4)], 1, True], | ||
| 50 | + [[np.float16, 0, (2, 4, 5)], 2, True], | ||
| 51 | + [[np.float16, 3, (1, 2, 3, 3)], 2, False], | ||
| 52 | + [[np.float16, 0, (1, 2, 3, 3)], 3, True], | ||
| 53 | + ] | ||
| 54 | + for item in shape_format: | ||
| 55 | + cpu_input, npu_input = create_common_tensor(item[0], 1, 100) | ||
| 56 | + cpu_output = self.cpu_op_exec(cpu_input, item[1], keepdim=item[2]) | ||
| 57 | + npu_output = self.npu_op_exec(npu_input, item[1], keepdim=item[2]) | ||
| 58 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 59 | + | ||
| 60 | + | ||
| 61 | +if __name__ == "__main__": | ||
| 62 | + run_tests() | ||
| @@ -0,0 +1,67 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | + | ||
| 4 | +import torch_npu | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestArgSort(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1, dim, descending): | ||
| 11 | + output = torch.argsort(input1, dim=dim, descending=descending) | ||
| 12 | + return output.numpy() | ||
| 13 | + | ||
| 14 | + def npu_op_exec(self, input1, dim, descending): | ||
| 15 | + output = torch.argsort(input1, dim=dim, descending=descending) | ||
| 16 | + | ||
| 17 | + return output.cpu().numpy() | ||
| 18 | + | ||
| 19 | + def cpu_default_op_exec(self, input1): | ||
| 20 | + output = torch.argsort(input1) | ||
| 21 | + return output.numpy() | ||
| 22 | + | ||
| 23 | + def npu_default_op_exec(self, input1): | ||
| 24 | + output = torch.argsort(input1) | ||
| 25 | + return output.cpu().numpy() | ||
| 26 | + | ||
| 27 | + def test_sort_shape_format_fp32(self): | ||
| 28 | + shape_format = [ | ||
| 29 | + [[np.float32, 0, (8, 4, 3, 9)], 2, False], | ||
| 30 | + [[np.float32, 0, (2, 3)]], | ||
| 31 | + [[np.float32, 0, (1, 7)], 0, True], | ||
| 32 | + [[np.float32, 0, (1, 5, 6)], 1, False], | ||
| 33 | + ] | ||
| 34 | + | ||
| 35 | + for item in shape_format: | ||
| 36 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -100, 100) | ||
| 37 | + if len(item) > 1: | ||
| 38 | + cpu_output = self.cpu_op_exec(cpu_input1, item[1], item[2]) | ||
| 39 | + npu_output = self.npu_op_exec(npu_input1, item[1], item[2]) | ||
| 40 | + else: | ||
| 41 | + cpu_output = self.cpu_default_op_exec(cpu_input1) | ||
| 42 | + npu_output = self.npu_default_op_exec(npu_input1) | ||
| 43 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 44 | + | ||
| 45 | + def test_sort_shape_format_fp16(self): | ||
| 46 | + shape_format = [ | ||
| 47 | + [[np.float16, 0, (8, 4, 3, 9)], 2, False], | ||
| 48 | + [[np.float16, 0, (2, 3)]], | ||
| 49 | + [[np.float16, 0, (1, 7)], 0, True], | ||
| 50 | + [[np.float16, 0, (1, 5, 6)], 1, False], | ||
| 51 | + ] | ||
| 52 | + | ||
| 53 | + for item in shape_format: | ||
| 54 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -100, 100) | ||
| 55 | + if len(item) > 1: | ||
| 56 | + cpu_output = self.cpu_op_exec( | ||
| 57 | + cpu_input1.to(torch.float32), item[1], item[2] | ||
| 58 | + ) | ||
| 59 | + npu_output = self.npu_op_exec(npu_input1, item[1], item[2]) | ||
| 60 | + else: | ||
| 61 | + cpu_output = self.cpu_default_op_exec(cpu_input1.to(torch.float32)) | ||
| 62 | + npu_output = self.npu_default_op_exec(npu_input1) | ||
| 63 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 64 | + | ||
| 65 | + | ||
| 66 | +if __name__ == "__main__": | ||
| 67 | + run_tests() | ||
| @@ -0,0 +1,38 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | + | ||
| 4 | +import torch_npu | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class TestAsStrided(TestCase): | ||
| 11 | + def cpu_op_exec(self, input1, size, stride, storage_offset): | ||
| 12 | + output = torch.as_strided(input1, size, stride, storage_offset) | ||
| 13 | + output = output.numpy() | ||
| 14 | + return output | ||
| 15 | + | ||
| 16 | + def npu_op_exec(self, input1, size, stride, storage_offset): | ||
| 17 | + output = torch.as_strided(input1, size, stride, storage_offset) | ||
| 18 | + output = output.cpu().numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def test_as_strided(self): | ||
| 22 | + shape_format = [ | ||
| 23 | + [[np.float32, 0, [3, 3]], (2, 2), (1, 2), 0], | ||
| 24 | + [[np.float16, 0, [13, 23]], (10, 15), (1, 2), 1], | ||
| 25 | + [[np.int32, 0, [5, 5]], (3, 3), (1, 2), 1], | ||
| 26 | + [[np.float32, 2, [32, 8, 2]], (8, 6, 2), (5, 4, 1), 1], | ||
| 27 | + [[np.int32, 2, [8, 16]], (6, 3), (8, 2), 0], | ||
| 28 | + ] | ||
| 29 | + | ||
| 30 | + for item in shape_format: | ||
| 31 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -100, 100) | ||
| 32 | + cpu_output = self.cpu_op_exec(cpu_input1, item[1], item[2], item[3]) | ||
| 33 | + npu_output = self.npu_op_exec(npu_input1, item[1], item[2], item[3]) | ||
| 34 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 35 | + | ||
| 36 | + | ||
| 37 | +if __name__ == "__main__": | ||
| 38 | + run_tests() | ||
| @@ -0,0 +1,50 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAsin(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1): | ||
| 11 | + output = torch.asin(input1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1): | ||
| 16 | + output = torch.asin(input1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def npu_op_exec_out(self, input1, input2): | ||
| 22 | + torch.asin(input1, out=input2) | ||
| 23 | + output = input2.to("cpu") | ||
| 24 | + output = output.numpy() | ||
| 25 | + return output | ||
| 26 | + | ||
| 27 | + def test_asin_common_shape_format(self, device="npu"): | ||
| 28 | + shape_format = [ | ||
| 29 | + [[np.float32, 0, (5, 3)]], | ||
| 30 | + ] | ||
| 31 | + for item in shape_format: | ||
| 32 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 33 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 34 | + npu_output = self.npu_op_exec(npu_input1) | ||
| 35 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 36 | + | ||
| 37 | + def test_asin_out_common_shape_format(self, device="npu"): | ||
| 38 | + shape_format = [ | ||
| 39 | + [[np.float32, 0, (4, 3)], [np.float32, 0, (4, 3)]], | ||
| 40 | + ] | ||
| 41 | + for item in shape_format: | ||
| 42 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 43 | + cpu_input2, npu_input2 = create_common_tensor(item[1], -1, 1) | ||
| 44 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 45 | + npu_output = self.npu_op_exec_out(npu_input1, npu_input2) | ||
| 46 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 47 | + | ||
| 48 | + | ||
| 49 | +if __name__ == "__main__": | ||
| 50 | + run_tests() | ||
| @@ -0,0 +1,71 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAsinh(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1): | ||
| 11 | + output = torch.asinh(input1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1): | ||
| 16 | + output = torch.asinh(input1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def npu_op_exec_out(self, input1, input2): | ||
| 22 | + torch.asinh(input1, out=input2) | ||
| 23 | + output = input2.to("cpu") | ||
| 24 | + output = output.numpy() | ||
| 25 | + return output | ||
| 26 | + | ||
| 27 | + def cpu_inp_op_exec(self, input1): | ||
| 28 | + output = torch.asinh_(input1) | ||
| 29 | + output = output.numpy() | ||
| 30 | + return output | ||
| 31 | + | ||
| 32 | + def npu_inp_op_exec(self, input1): | ||
| 33 | + output = torch.asinh_(input1) | ||
| 34 | + output = output.to("cpu") | ||
| 35 | + output = output.numpy() | ||
| 36 | + return output | ||
| 37 | + | ||
| 38 | + def test_asinh_common_shape_format(self): | ||
| 39 | + shape_format1 = [ | ||
| 40 | + [[np.float32, 0, (5, 3)]], | ||
| 41 | + ] | ||
| 42 | + for item in shape_format1: | ||
| 43 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 44 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 45 | + npu_output = self.npu_op_exec(npu_input1) | ||
| 46 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 47 | + | ||
| 48 | + def test_asinh_out_common_shape_format(self): | ||
| 49 | + shape_format1 = [ | ||
| 50 | + [[np.float32, 0, (4, 3)], [np.float32, 0, (4, 3)]], | ||
| 51 | + ] | ||
| 52 | + for item in shape_format1: | ||
| 53 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 54 | + cpu_input2, npu_input2 = create_common_tensor(item[1], -1, 1) | ||
| 55 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 56 | + npu_output = self.npu_op_exec_out(npu_input1, npu_input2) | ||
| 57 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 58 | + | ||
| 59 | + def test_asinh_inp_common_shape_format(self): | ||
| 60 | + shape_format1 = [ | ||
| 61 | + [[np.float32, 0, (5, 3)]], | ||
| 62 | + ] | ||
| 63 | + for item in shape_format1: | ||
| 64 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 65 | + cpu_output = self.cpu_inp_op_exec(cpu_input1) | ||
| 66 | + npu_output = self.npu_inp_op_exec(npu_input1) | ||
| 67 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 68 | + | ||
| 69 | + | ||
| 70 | +if __name__ == "__main__": | ||
| 71 | + run_tests() | ||
| @@ -0,0 +1,62 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAtan2(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1, input2): | ||
| 11 | + output = torch.atan2(input1, input2) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1, input2): | ||
| 16 | + output = torch.atan2(input1, input2) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def npu_op_exec_out(self, input1, input2, out): | ||
| 22 | + torch.atan2(input1, input2, out=out) | ||
| 23 | + output = out.to("cpu") | ||
| 24 | + output = output.numpy() | ||
| 25 | + return output | ||
| 26 | + | ||
| 27 | + def test_atan2_common_shape_format(self): | ||
| 28 | + shape_format = [ | ||
| 29 | + [[np.float16, 0, [4, 12, 12, 128]], [np.float16, 0, [4]]], | ||
| 30 | + [[np.float16, 0, [4, 128]], [np.float16, 0, [4, 256, 12]]], | ||
| 31 | + [[np.float32, 0, [4, 12, 12, 128]], [np.float32, 0, [4]]], | ||
| 32 | + [[np.float32, 0, [4, 128]], [np.float32, 0, [4, 256, 12]]], | ||
| 33 | + [[np.float16, 2, [4, 12, 12, 128]], [np.float16, 0, [4]]], | ||
| 34 | + [[np.float16, 3, [4, 128]], [np.float16, 0, [4, 256, 12]]], | ||
| 35 | + [[np.float32, 2, [4, 12, 12, 128]], [np.float32, 0, [4]]], | ||
| 36 | + [[np.float32, 3, [4, 128]], [np.float32, 0, [4, 256, 12]]], | ||
| 37 | + ] | ||
| 38 | + for item in shape_format: | ||
| 39 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 40 | + cpu_input2, npu_input2 = create_common_tensor(item[0], -1, 1) | ||
| 41 | + cpu_out, npu_out = create_common_tensor(item[1], -1, 1) | ||
| 42 | + if cpu_input1.dtype == torch.float16: | ||
| 43 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 44 | + if cpu_input2.dtype == torch.float16: | ||
| 45 | + cpu_input2 = cpu_input2.to(torch.float32) | ||
| 46 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 47 | + npu_output = self.npu_op_exec(npu_input1, npu_input2) | ||
| 48 | + npu_output_out = self.npu_op_exec_out(npu_input1, npu_input2, npu_out) | ||
| 49 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 50 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 51 | + self.assertRtolEqual(cpu_output, npu_output_out) | ||
| 52 | + | ||
| 53 | + def test_atan2_mix_dtype(self): | ||
| 54 | + npu_input1, npu_input2 = create_common_tensor([np.float32, 0, (2, 3)], 1, 100) | ||
| 55 | + npu_input3, npu_input4 = create_common_tensor([np.float16, 0, (2, 3)], 1, 100) | ||
| 56 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input3) | ||
| 57 | + npu_output = self.npu_op_exec(npu_input2, npu_input4) | ||
| 58 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 59 | + | ||
| 60 | + | ||
| 61 | +if __name__ == "__main__": | ||
| 62 | + run_tests() | ||
| @@ -0,0 +1,83 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAtanh(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1): | ||
| 11 | + output = torch.atanh(input1) | ||
| 12 | + output = output.numpy() | ||
| 13 | + return output | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, input1): | ||
| 16 | + output = torch.atanh(input1) | ||
| 17 | + output = output.to("cpu") | ||
| 18 | + output = output.numpy() | ||
| 19 | + return output | ||
| 20 | + | ||
| 21 | + def npu_op_exec_out(self, input1, input2): | ||
| 22 | + torch.atanh(input1, out=input2) | ||
| 23 | + output = input2.to("cpu") | ||
| 24 | + output = output.numpy() | ||
| 25 | + return output | ||
| 26 | + | ||
| 27 | + def cpu_inp_op_exec(self, input1): | ||
| 28 | + output = torch.atanh_(input1) | ||
| 29 | + output = output.numpy() | ||
| 30 | + return output | ||
| 31 | + | ||
| 32 | + def npu_inp_op_exec(self, input1): | ||
| 33 | + output = torch.atanh_(input1) | ||
| 34 | + output = output.to("cpu") | ||
| 35 | + output = output.numpy() | ||
| 36 | + return output | ||
| 37 | + | ||
| 38 | + def test_atanh_shape_format(self): | ||
| 39 | + shape_format1 = [ | ||
| 40 | + [[np.float32, 0, 1]], | ||
| 41 | + [[np.float32, 0, (64, 10)]], | ||
| 42 | + [[np.float32, 3, (256, 2048, 7, 7)]], | ||
| 43 | + [[np.float32, 4, (32, 1, 3, 3)]], | ||
| 44 | + [[np.float32, 29, (10, 128)]], | ||
| 45 | + ] | ||
| 46 | + for item in shape_format1: | ||
| 47 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 48 | + cpu_output1 = self.cpu_op_exec(cpu_input1) | ||
| 49 | + npu_output1 = self.npu_op_exec(npu_input1) | ||
| 50 | + self.assertRtolEqual(cpu_output1, npu_output1) | ||
| 51 | + | ||
| 52 | + def test_atanh_out_shape_format(self): | ||
| 53 | + shape_format = [ | ||
| 54 | + [[np.float32, 0, 1]], | ||
| 55 | + [[np.float32, 0, (64, 10)]], | ||
| 56 | + [[np.float32, 3, (256, 2048, 7, 7)]], | ||
| 57 | + [[np.float32, 4, (32, 1, 3, 3)]], | ||
| 58 | + [[np.float32, 29, (10, 128)]], | ||
| 59 | + ] | ||
| 60 | + for item in shape_format: | ||
| 61 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -1, 1) | ||
| 62 | + cpu_input, npu_input = create_common_tensor(item[0], -1, 1) | ||
| 63 | + cpu_output = self.cpu_op_exec(cpu_input1) | ||
| 64 | + npu_output = self.npu_op_exec_out(npu_input1, npu_input) | ||
| 65 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 66 | + | ||
| 67 | + def test_atanh_inp_shape_format(self): | ||
| 68 | + shape_format1 = [ | ||
| 69 | + [[np.float32, 0, 1]], | ||
| 70 | + [[np.float32, 0, (64, 10)]], | ||
| 71 | + [[np.float32, 3, (256, 2048, 7, 7)]], | ||
| 72 | + [[np.float32, 4, (32, 1, 3, 3)]], | ||
| 73 | + [[np.float32, 29, (10, 128)]], | ||
| 74 | + ] | ||
| 75 | + for item in shape_format1: | ||
| 76 | + cpu_input, npu_input = create_common_tensor(item[0], -1, 1) | ||
| 77 | + cpu_output = self.cpu_inp_op_exec(cpu_input) | ||
| 78 | + npu_output = self.npu_inp_op_exec(npu_input) | ||
| 79 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 80 | + | ||
| 81 | + | ||
| 82 | +if __name__ == "__main__": | ||
| 83 | + run_tests() | ||
| @@ -0,0 +1,78 @@ | |||
| 1 | +import unittest | ||
| 2 | +import torch | ||
| 3 | +import torch.nn as nn | ||
| 4 | +import numpy as np | ||
| 5 | +import torch_npu | ||
| 6 | + | ||
| 7 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 8 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 9 | + | ||
| 10 | + | ||
| 11 | +class TestAvgPool2d(TestCase): | ||
| 12 | + def cpu_op_exec(self, input1, ceil_mode): | ||
| 13 | + m = nn.AvgPool2d(3, stride=(6, 5), padding=0, ceil_mode=ceil_mode) | ||
| 14 | + output = m(input1) | ||
| 15 | + output = output.detach().numpy() | ||
| 16 | + return output | ||
| 17 | + | ||
| 18 | + def npu_op_exec(self, input1, ceil_mode): | ||
| 19 | + m = nn.AvgPool2d(3, stride=(6, 5), padding=0, ceil_mode=ceil_mode).npu() | ||
| 20 | + output = m(input1) | ||
| 21 | + output = output.to("cpu") | ||
| 22 | + output = output.detach().numpy() | ||
| 23 | + return output | ||
| 24 | + | ||
| 25 | + def test_avg_pool2d_backward_shape_format_fp16(self): | ||
| 26 | + shape_format = [ | ||
| 27 | + [[np.float16, 0, (1, 3, 147, 147)], True], | ||
| 28 | + [[np.float16, 0, (1, 3, 147, 147)], True], | ||
| 29 | + ] | ||
| 30 | + | ||
| 31 | + for item in shape_format: | ||
| 32 | + cpu_input, npu_input = create_common_tensor(item[0], 0, 1) | ||
| 33 | + cpu_input = cpu_input.to(torch.float32) | ||
| 34 | + cpu_output = self.cpu_op_exec(cpu_input.float(), item[1]).astype(np.float16) | ||
| 35 | + npu_output = self.npu_op_exec(npu_input, item[1]) | ||
| 36 | + self.assertRtolEqual(cpu_output, npu_output, prec16=0.002) | ||
| 37 | + | ||
| 38 | + | ||
| 39 | + def test_avg_pool2d_backward_shape_format_fp32(self): | ||
| 40 | + shape_format = [ | ||
| 41 | + [[np.float32, 0, (1, 3, 147, 147)], True], | ||
| 42 | + [[np.float32, 0, (1, 3, 147, 147)], True], | ||
| 43 | + ] | ||
| 44 | + | ||
| 45 | + for item in shape_format: | ||
| 46 | + cpu_input, npu_input = create_common_tensor(item[0], 0, 1) | ||
| 47 | + cpu_output = self.cpu_op_exec(cpu_input, item[1]) | ||
| 48 | + npu_output = self.npu_op_exec(npu_input, item[1]) | ||
| 49 | + self.assertRtolEqual(cpu_output, npu_output, 0.0009) | ||
| 50 | + | ||
| 51 | + def test_avg_pool2d_3d_fp32(self): | ||
| 52 | + cinput = torch.randn(128, 32, 7) | ||
| 53 | + ninput = cinput.npu() | ||
| 54 | + cmodel = torch.nn.AvgPool2d((4, 5)) | ||
| 55 | + nmodel = cmodel.npu() | ||
| 56 | + cpu_output = cmodel(cinput) | ||
| 57 | + npu_output = nmodel(ninput) | ||
| 58 | + self.assertRtolEqual(cpu_output.numpy(), npu_output.cpu().numpy(), 0.0009) | ||
| 59 | + | ||
| 60 | + | ||
| 61 | + def test_avg_pool2d_4d_fp32(self): | ||
| 62 | + cinput = torch.randn(18, 43, 12, 400) | ||
| 63 | + ninput = cinput.npu() | ||
| 64 | + kernel = 13 | ||
| 65 | + padding = 6 | ||
| 66 | + stride = 10 | ||
| 67 | + ceil_mode = True | ||
| 68 | + cmodel = torch.nn.AvgPool2d( | ||
| 69 | + kernel, stride=stride, padding=padding, ceil_mode=ceil_mode | ||
| 70 | + ) | ||
| 71 | + nmodel = cmodel.npu() | ||
| 72 | + cpu_output = cmodel(cinput) | ||
| 73 | + npu_output = nmodel(ninput) | ||
| 74 | + self.assertRtolEqual(cpu_output.numpy(), npu_output.cpu().numpy(), 0.0009) | ||
| 75 | + | ||
| 76 | + | ||
| 77 | +if __name__ == "__main__": | ||
| 78 | + run_tests() | ||
| @@ -0,0 +1,69 @@ | |||
| 1 | +import torch | ||
| 2 | +import torch.nn as nn | ||
| 3 | +import numpy as np | ||
| 4 | +import torch_npu | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class TestAvgPool2dBackward(TestCase): | ||
| 11 | + def cpu_op_exec(self, input1): | ||
| 12 | + m = nn.AvgPool2d(kernel_size=2, stride=2) | ||
| 13 | + input1.requires_grad = True | ||
| 14 | + output = m(input1) | ||
| 15 | + output.backward(torch.ones_like(output)) | ||
| 16 | + output_grad = input1.grad | ||
| 17 | + output_grad = output_grad.detach().numpy() | ||
| 18 | + output = output.detach().numpy() | ||
| 19 | + | ||
| 20 | + return output_grad, output | ||
| 21 | + | ||
| 22 | + def npu_op_exec(self, input1): | ||
| 23 | + m = nn.AvgPool2d(kernel_size=2, stride=2).npu() | ||
| 24 | + input1.requires_grad = True | ||
| 25 | + output = m(input1) | ||
| 26 | + output.backward(torch.ones_like(output)) | ||
| 27 | + output_grad = input1.grad | ||
| 28 | + output_grad = output_grad.to("cpu") | ||
| 29 | + output_grad = output_grad.detach().numpy() | ||
| 30 | + output = output.to("cpu") | ||
| 31 | + output = output.detach().numpy() | ||
| 32 | + | ||
| 33 | + return output_grad, output | ||
| 34 | + | ||
| 35 | + def test_avg_pool2d_backward_shape_format_fp16(self): | ||
| 36 | + format_list = [0, 3] | ||
| 37 | + shape_list = [(5, 20, 8, 8)] | ||
| 38 | + shape_format = [[np.float16, i, j] for i in format_list for j in shape_list] | ||
| 39 | + for item in shape_format: | ||
| 40 | + cpu_input, npu_input = create_common_tensor(item, 0, 100) | ||
| 41 | + cpu_input = cpu_input.to(torch.float32) | ||
| 42 | + cpu_output_grad, cpu_output = self.cpu_op_exec(cpu_input) | ||
| 43 | + npu_output_grad, npu_output = self.npu_op_exec(npu_input) | ||
| 44 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 45 | + cpu_output_grad = cpu_output_grad.astype(npu_output_grad.dtype) | ||
| 46 | + | ||
| 47 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 48 | + self.assertRtolEqual(cpu_output_grad, npu_output_grad) | ||
| 49 | + | ||
| 50 | + def test_avg_pool2d_backward_shape_format_fp32(self): | ||
| 51 | + format_list = [0, 3] | ||
| 52 | + shape_list = [(5, 20, 8, 8)] | ||
| 53 | + shape_format = [[np.float32, i, j] for i in format_list for j in shape_list] | ||
| 54 | + for item in shape_format: | ||
| 55 | + cpu_input, npu_input = create_common_tensor(item, 0, 100) | ||
| 56 | + cpu_output_grad, cpu_output = self.cpu_op_exec(cpu_input) | ||
| 57 | + npu_output_grad, npu_output = self.npu_op_exec(npu_input) | ||
| 58 | + | ||
| 59 | + cpu_output = cpu_output.astype(np.float16) | ||
| 60 | + cpu_output_grad = cpu_output_grad.astype(np.float16) | ||
| 61 | + npu_output = npu_output.astype(np.float16) | ||
| 62 | + npu_output_grad = npu_output_grad.astype(np.float16) | ||
| 63 | + | ||
| 64 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 65 | + self.assertRtolEqual(cpu_output_grad, npu_output_grad) | ||
| 66 | + | ||
| 67 | + | ||
| 68 | +if __name__ == "__main__": | ||
| 69 | + run_tests() | ||
| @@ -0,0 +1,55 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAvgPool3D(TestCase): | ||
| 10 | + def cpu_op_exec(self, kernel_size, stride, input1): | ||
| 11 | + m = torch.nn.AvgPool3d(kernel_size, stride) | ||
| 12 | + output_data = m(input1) | ||
| 13 | + return output_data | ||
| 14 | + | ||
| 15 | + def cpu_op_exec_fp16(self, kernel_size, stride, input1): | ||
| 16 | + m = torch.nn.AvgPool3d(kernel_size, stride) | ||
| 17 | + output_data = m(input1.float()) | ||
| 18 | + return output_data.half() | ||
| 19 | + | ||
| 20 | + def npu_op_exec(self, kernel_size, stride, input1): | ||
| 21 | + m = torch.nn.AvgPool3d(kernel_size, stride).npu() | ||
| 22 | + output_data = m(input1) | ||
| 23 | + return output_data | ||
| 24 | + | ||
| 25 | + def test_avg_pool_3d_fp32(self): | ||
| 26 | + shape_format = [ | ||
| 27 | + [[np.float32, -1, (20, 16, 50, 44, 31)], (3, 2, 2), (2, 1, 2)], | ||
| 28 | + [[np.float32, -1, (2, 1, 4, 4, 4)], 3, 2], | ||
| 29 | + [[np.float32, -1, (2, 1, 4, 4, 4)], 2, 2], | ||
| 30 | + [[np.float32, -1, (2, 4, 4, 4)], 2, 2], | ||
| 31 | + ] | ||
| 32 | + | ||
| 33 | + for item in shape_format: | ||
| 34 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 1, 100) | ||
| 35 | + npu_output = self.npu_op_exec(item[1], item[2], npu_input1) | ||
| 36 | + cpu_output = self.cpu_op_exec(item[1], item[2], cpu_input1) | ||
| 37 | + self.assertRtolEqual(cpu_output, npu_output.cpu(), 1.0e-3) | ||
| 38 | + | ||
| 39 | + def test_avg_pool_3d_fp16(self): | ||
| 40 | + shape_format = [ | ||
| 41 | + [[np.float16, -1, (20, 16, 50, 44, 31)], (3, 2, 2), (2, 1, 2)], | ||
| 42 | + [[np.float16, -1, (2, 1, 4, 4, 4)], 3, 2], | ||
| 43 | + [[np.float16, -1, (2, 1, 4, 4, 4)], 2, 2], | ||
| 44 | + [[np.float16, -1, (2, 4, 4, 4)], 2, 2], | ||
| 45 | + ] | ||
| 46 | + | ||
| 47 | + for item in shape_format: | ||
| 48 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 1, 100) | ||
| 49 | + npu_output = self.npu_op_exec(item[1], item[2], npu_input1) | ||
| 50 | + cpu_output = self.cpu_op_exec_fp16(item[1], item[2], cpu_input1) | ||
| 51 | + self.assertRtolEqual(cpu_output, npu_output.cpu()) | ||
| 52 | + | ||
| 53 | + | ||
| 54 | +if __name__ == "__main__": | ||
| 55 | + run_tests() | ||
| @@ -0,0 +1,77 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestAvgPool3DBackward(TestCase): | ||
| 10 | + def cpu_op_exec(self, kernel_size, stride, input1): | ||
| 11 | + m = torch.nn.AvgPool3d(kernel_size, stride) | ||
| 12 | + input1.requires_grad = True | ||
| 13 | + output = m(input1) | ||
| 14 | + output.backward(torch.ones_like(output)) | ||
| 15 | + output_grad = input1.grad | ||
| 16 | + output_grad = output_grad.detach().numpy() | ||
| 17 | + output = output.detach().numpy() | ||
| 18 | + return output_grad, output | ||
| 19 | + | ||
| 20 | + def cpu_op_exec_fp16(self, kernel_size, stride, input1): | ||
| 21 | + m = torch.nn.AvgPool3d(kernel_size, stride) | ||
| 22 | + input1.requires_grad = True | ||
| 23 | + output = m(input1.float()) | ||
| 24 | + output.backward(torch.ones_like(output)) | ||
| 25 | + output_grad = input1.grad | ||
| 26 | + output_grad = output_grad.detach().numpy() | ||
| 27 | + output = output.half() | ||
| 28 | + output = output.detach().numpy() | ||
| 29 | + return output_grad, output | ||
| 30 | + | ||
| 31 | + def npu_op_exec(self, kernel_size, stride, input1): | ||
| 32 | + m = torch.nn.AvgPool3d(kernel_size, stride).npu() | ||
| 33 | + input1.requires_grad = True | ||
| 34 | + output = m(input1) | ||
| 35 | + output.backward(torch.ones_like(output)) | ||
| 36 | + output_grad = input1.grad | ||
| 37 | + output_grad = output_grad.to("cpu") | ||
| 38 | + output_grad = output_grad.detach().numpy() | ||
| 39 | + output = output.to("cpu") | ||
| 40 | + output = output.detach().numpy() | ||
| 41 | + return output_grad, output | ||
| 42 | + | ||
| 43 | + def test_avg_pool_3d_fp32(self): | ||
| 44 | + shape_format = [ | ||
| 45 | + [[np.float32, -1, (20, 16, 50, 44, 31)], (3, 2, 2), (2, 1, 2)], | ||
| 46 | + [[np.float32, -1, (2, 1, 4, 4, 4)], 3, 2], | ||
| 47 | + [[np.float32, -1, (2, 1, 4, 4, 4)], 2, 2], | ||
| 48 | + [[np.float32, -1, (2, 4, 4, 4)], 2, 2], | ||
| 49 | + ] | ||
| 50 | + | ||
| 51 | + for item in shape_format: | ||
| 52 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 1, 100) | ||
| 53 | + npu_output_grad, npu_output = self.npu_op_exec(item[1], item[2], npu_input1) | ||
| 54 | + cpu_output_grad, cpu_output = self.cpu_op_exec(item[1], item[2], cpu_input1) | ||
| 55 | + self.assertRtolEqual(cpu_output, npu_output, 1.0e-3) | ||
| 56 | + self.assertRtolEqual(cpu_output_grad, npu_output_grad, 1.0e-3) | ||
| 57 | + | ||
| 58 | + def test_avg_pool_3d_fp16(self): | ||
| 59 | + shape_format = [ | ||
| 60 | + [[np.float16, -1, (20, 16, 50, 44, 31)], (3, 2, 2), (2, 1, 2)], | ||
| 61 | + [[np.float16, -1, (2, 1, 4, 4, 4)], 3, 2], | ||
| 62 | + [[np.float16, -1, (2, 1, 4, 4, 4)], 2, 2], | ||
| 63 | + [[np.float16, -1, (2, 4, 4, 4)], 2, 2], | ||
| 64 | + ] | ||
| 65 | + | ||
| 66 | + for item in shape_format: | ||
| 67 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 1, 100) | ||
| 68 | + npu_output_grad, npu_output = self.npu_op_exec(item[1], item[2], npu_input1) | ||
| 69 | + cpu_output_grad, cpu_output = self.cpu_op_exec_fp16( | ||
| 70 | + item[1], item[2], cpu_input1 | ||
| 71 | + ) | ||
| 72 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 73 | + self.assertRtolEqual(cpu_output_grad, npu_output_grad) | ||
| 74 | + | ||
| 75 | + | ||
| 76 | +if __name__ == "__main__": | ||
| 77 | + run_tests() | ||
| @@ -0,0 +1,160 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +from torch.nn import functional as F | ||
| 4 | +import torch_npu | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class TestBaddBmm(TestCase): | ||
| 11 | + def generate_scalar(self, dtype, min1, max1): | ||
| 12 | + if dtype == "float32": | ||
| 13 | + scalar = np.random.uniform(min1, max1) | ||
| 14 | + if dtype == "float16": | ||
| 15 | + scalar = np.random.uniform(min1, max1) | ||
| 16 | + if dtype == "int32": | ||
| 17 | + scalar = np.random.randint(min1, max1) | ||
| 18 | + return scalar | ||
| 19 | + | ||
| 20 | + def cpu_op_exec(self, input1, input2, input3, scalar1, scalar2): | ||
| 21 | + output = torch.baddbmm(input1, input2, input3, beta=scalar1, alpha=scalar2) | ||
| 22 | + output = output.numpy() | ||
| 23 | + return output | ||
| 24 | + | ||
| 25 | + def cpu_op_exec_(self, input1, input2, input3, scalar1, scalar2): | ||
| 26 | + input1.baddbmm_(input2, input3, beta=scalar1, alpha=scalar2) | ||
| 27 | + input1 = input1.numpy() | ||
| 28 | + return input1 | ||
| 29 | + | ||
| 30 | + def npu_op_exec(self, input1, input2, input3, scalar1, scalar2): | ||
| 31 | + output = torch.baddbmm(input1, input2, input3, beta=scalar1, alpha=scalar2) | ||
| 32 | + output = output.to("cpu") | ||
| 33 | + output = output.numpy() | ||
| 34 | + return output | ||
| 35 | + | ||
| 36 | + def npu_op_exec_(self, input1, input2, input3, scalar1, scalar2): | ||
| 37 | + input1.baddbmm_(input2, input3, beta=scalar1, alpha=scalar2) | ||
| 38 | + input1 = input1.to("cpu") | ||
| 39 | + input1 = input1.numpy() | ||
| 40 | + return input1 | ||
| 41 | + | ||
| 42 | + def test_baddbmm_common_shape_format(self): | ||
| 43 | + shape_format = [ | ||
| 44 | + [ | ||
| 45 | + [np.float16, -1, (1, 3, 5)], | ||
| 46 | + [np.float16, -1, (1, 3, 4)], | ||
| 47 | + [np.float16, -1, (1, 4, 5)], | ||
| 48 | + "float32", | ||
| 49 | + ], | ||
| 50 | + [ | ||
| 51 | + [np.float16, -1, (6, 4, 3)], | ||
| 52 | + [np.float16, -1, (6, 4, 5)], | ||
| 53 | + [np.float16, -1, (6, 5, 3)], | ||
| 54 | + "float32", | ||
| 55 | + ], | ||
| 56 | + [ | ||
| 57 | + [np.float16, -1, (175, 455, 22)], | ||
| 58 | + [np.float16, -1, (175, 455, 116)], | ||
| 59 | + [np.float16, -1, (175, 116, 22)], | ||
| 60 | + "float32", | ||
| 61 | + ], | ||
| 62 | + [ | ||
| 63 | + [np.float16, -1, (25, 56, 12)], | ||
| 64 | + [np.float16, -1, (25, 56, 51)], | ||
| 65 | + [np.float16, -1, (25, 51, 12)], | ||
| 66 | + "float32", | ||
| 67 | + ], | ||
| 68 | + ] | ||
| 69 | + | ||
| 70 | + for item in shape_format: | ||
| 71 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 0, 1) | ||
| 72 | + cpu_input2, npu_input2 = create_common_tensor(item[1], 0, 1) | ||
| 73 | + cpu_input3, npu_input3 = create_common_tensor(item[2], 0, 1) | ||
| 74 | + scalar1 = self.generate_scalar(item[3], 0, 2) | ||
| 75 | + scalar2 = self.generate_scalar(item[3], 0, 2) | ||
| 76 | + cpu_output = self.cpu_op_exec( | ||
| 77 | + cpu_input1.float(), | ||
| 78 | + cpu_input2.float(), | ||
| 79 | + cpu_input3.float(), | ||
| 80 | + scalar1, | ||
| 81 | + scalar2, | ||
| 82 | + ) | ||
| 83 | + npu_output = self.npu_op_exec( | ||
| 84 | + npu_input1.float(), | ||
| 85 | + npu_input2.float(), | ||
| 86 | + npu_input3.float(), | ||
| 87 | + scalar1, | ||
| 88 | + scalar2, | ||
| 89 | + ) | ||
| 90 | + self.assertRtolEqual(cpu_output, npu_output, prec=1.0e-3, prec16=1.0e-3) | ||
| 91 | + cpu_output_ = self.cpu_op_exec_( | ||
| 92 | + cpu_input1.float(), | ||
| 93 | + cpu_input2.float(), | ||
| 94 | + cpu_input3.float(), | ||
| 95 | + scalar1, | ||
| 96 | + scalar2, | ||
| 97 | + ) | ||
| 98 | + npu_output_ = self.npu_op_exec_( | ||
| 99 | + npu_input1.float(), | ||
| 100 | + npu_input2.float(), | ||
| 101 | + npu_input3.float(), | ||
| 102 | + scalar1, | ||
| 103 | + scalar2, | ||
| 104 | + ) | ||
| 105 | + self.assertRtolEqual(cpu_output_, npu_output_, prec=1.0e-3, prec16=1.0e-3) | ||
| 106 | + | ||
| 107 | + def test_baddbmm_float16_shape_format(self): | ||
| 108 | + def cpu_op_exec_fp16(input1, input2, input3, scalar1, scalar2): | ||
| 109 | + input1 = input1.to(torch.float32) | ||
| 110 | + input2 = input2.to(torch.float32) | ||
| 111 | + input3 = input3.to(torch.float32) | ||
| 112 | + output = torch.baddbmm(input1, input2, input3, beta=scalar1, alpha=scalar2) | ||
| 113 | + output = output.numpy() | ||
| 114 | + output = output.astype(np.float16) | ||
| 115 | + return output | ||
| 116 | + | ||
| 117 | + shape_format = [ | ||
| 118 | + [ | ||
| 119 | + [np.float16, -1, (1, 3, 5)], | ||
| 120 | + [np.float16, -1, (1, 3, 4)], | ||
| 121 | + [np.float16, -1, (1, 4, 5)], | ||
| 122 | + "float16", | ||
| 123 | + ], | ||
| 124 | + [ | ||
| 125 | + [np.float16, -1, (500, 40, 300)], | ||
| 126 | + [np.float16, -1, (500, 40, 500)], | ||
| 127 | + [np.float16, -1, (500, 500, 300)], | ||
| 128 | + "float16", | ||
| 129 | + ], | ||
| 130 | + [ | ||
| 131 | + [np.float16, -1, (175, 455, 22)], | ||
| 132 | + [np.float16, -1, (175, 455, 116)], | ||
| 133 | + [np.float16, -1, (175, 116, 22)], | ||
| 134 | + "float16", | ||
| 135 | + ], | ||
| 136 | + [ | ||
| 137 | + [np.float16, -1, (25, 21, 11)], | ||
| 138 | + [np.float16, -1, (25, 21, 34)], | ||
| 139 | + [np.float16, -1, (25, 34, 11)], | ||
| 140 | + "float16", | ||
| 141 | + ], | ||
| 142 | + ] | ||
| 143 | + | ||
| 144 | + for item in shape_format: | ||
| 145 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 0, 1) | ||
| 146 | + cpu_input2, npu_input2 = create_common_tensor(item[1], 0, 1) | ||
| 147 | + cpu_input3, npu_input3 = create_common_tensor(item[2], 0, 1) | ||
| 148 | + scalar1 = self.generate_scalar(item[3], 0, 2) | ||
| 149 | + scalar2 = self.generate_scalar(item[3], 0, 2) | ||
| 150 | + cpu_output = cpu_op_exec_fp16( | ||
| 151 | + cpu_input1, cpu_input2, cpu_input3, scalar1, scalar2 | ||
| 152 | + ) | ||
| 153 | + npu_output = self.npu_op_exec( | ||
| 154 | + npu_input1, npu_input2, npu_input3, scalar1, scalar2 | ||
| 155 | + ) | ||
| 156 | + self.assertRtolEqual(cpu_output, npu_output, prec=1.0e-3, prec16=1.0e-2) | ||
| 157 | + | ||
| 158 | + | ||
| 159 | +if __name__ == "__main__": | ||
| 160 | + run_tests() | ||
| @@ -0,0 +1,38 @@ | |||
| 1 | +import torch | ||
| 2 | +import torch_npu | ||
| 3 | + | ||
| 4 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 5 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 6 | + | ||
| 7 | + | ||
| 8 | +class TesBatchNms(TestCase): | ||
| 9 | + def test_batch_nms_shape_format(self): | ||
| 10 | + boxes = torch.randn(8, 4, 1, 4).npu() | ||
| 11 | + scores = torch.randn(8, 4, 1).npu() | ||
| 12 | + boxes_fp16 = boxes.half() | ||
| 13 | + scores_fp16 = scores.half() | ||
| 14 | + nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_num = torch_npu.npu_batch_nms( | ||
| 15 | + boxes, scores, 0.3, 0.5, 4, 4 | ||
| 16 | + ) | ||
| 17 | + boxes1, scores1, classes1, num1 = torch_npu.npu_batch_nms( | ||
| 18 | + boxes_fp16, scores_fp16, 0.3, 0.5, 4, 4 | ||
| 19 | + ) | ||
| 20 | + expedt_nmsed_classes = torch.tensor( | ||
| 21 | + [ | ||
| 22 | + [0.0000, 0.0000, 0.0000, 0.0000], | ||
| 23 | + [0.0000, 0.0000, 0.0000, 0.0000], | ||
| 24 | + [0.0000, 0.0000, 0.0000, 0.0000], | ||
| 25 | + [0.0000, 0.0000, 0.0000, 0.0000], | ||
| 26 | + [0.0000, 0.0000, 0.0000, 0.0000], | ||
| 27 | + [0.0000, 0.0000, 0.0000, 0.0000], | ||
| 28 | + [0.0000, 0.0000, 0.0000, 0.0000], | ||
| 29 | + [0.0000, 0.0000, 0.0000, 0.0000], | ||
| 30 | + ], | ||
| 31 | + dtype=torch.float32, | ||
| 32 | + ) | ||
| 33 | + self.assertRtolEqual(expedt_nmsed_classes, nmsed_classes.cpu()) | ||
| 34 | + self.assertRtolEqual(expedt_nmsed_classes.half(), classes1.cpu()) | ||
| 35 | + | ||
| 36 | + | ||
| 37 | +if __name__ == "__main__": | ||
| 38 | + run_tests() | ||
| @@ -0,0 +1,96 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestBatchNorm(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1, num_features, affine): | ||
| 11 | + flag = False | ||
| 12 | + if input1.dtype == torch.float16: | ||
| 13 | + input1 = input1.to(torch.float32) | ||
| 14 | + flag = True | ||
| 15 | + m = torch.nn.BatchNorm2d(num_features, affine=affine) | ||
| 16 | + output = m(input1) | ||
| 17 | + if flag: | ||
| 18 | + output = output.to(torch.float16) | ||
| 19 | + output_cpu = output.detach().numpy() | ||
| 20 | + return output_cpu | ||
| 21 | + | ||
| 22 | + def npu_op_exec_new(self, input1, num_features, affine): | ||
| 23 | + m = torch.nn.BatchNorm2d(num_features, affine=affine) | ||
| 24 | + m = m.to("npu") | ||
| 25 | + output = m(input1) | ||
| 26 | + output = output.to("cpu").detach().numpy() | ||
| 27 | + return output | ||
| 28 | + | ||
| 29 | + def test_batchnorm_shape_format(self): | ||
| 30 | + format_list = [-1, 3, 0] | ||
| 31 | + shape_list = [ | ||
| 32 | + (10, 32, 35, 45), | ||
| 33 | + (256, 100, 7, 7), | ||
| 34 | + (256, 100, 14, 14), | ||
| 35 | + (10, 56, 28, 28), | ||
| 36 | + (10, 56, 56, 56), | ||
| 37 | + ] | ||
| 38 | + affine_list = [True] | ||
| 39 | + dtype_list = [np.float16, np.float32] | ||
| 40 | + # pylint:disable = complicate-comprehension | ||
| 41 | + shape_format = [ | ||
| 42 | + [[z, i, j], h] | ||
| 43 | + for z in dtype_list | ||
| 44 | + for i in format_list | ||
| 45 | + for j in shape_list | ||
| 46 | + for h in affine_list | ||
| 47 | + ] | ||
| 48 | + | ||
| 49 | + for item in shape_format: | ||
| 50 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 0, 10) | ||
| 51 | + cpu_output = self.cpu_op_exec(cpu_input1, item[0][2][1], item[1]) | ||
| 52 | + npu_output = self.npu_op_exec_new(npu_input1, item[0][2][1], item[1]) | ||
| 53 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 54 | + | ||
| 55 | + def cpu_op_exec_3d(self, input1, num_features, affine): | ||
| 56 | + flag = False | ||
| 57 | + if input1.dtype == torch.float16: | ||
| 58 | + input1 = input1.to(torch.float32) | ||
| 59 | + flag = True | ||
| 60 | + m = torch.nn.BatchNorm3d(num_features, affine=affine) | ||
| 61 | + output = m(input1) | ||
| 62 | + if flag: | ||
| 63 | + output = output.to(torch.float16) | ||
| 64 | + output_cpu = output.detach().numpy() | ||
| 65 | + return output_cpu | ||
| 66 | + | ||
| 67 | + def npu_op_exec_new_3d(self, input1, num_features, affine): | ||
| 68 | + m = torch.nn.BatchNorm3d(num_features, affine=affine) | ||
| 69 | + m = m.to("npu") | ||
| 70 | + output = m(input1) | ||
| 71 | + output = output.to("cpu").detach().numpy() | ||
| 72 | + return output | ||
| 73 | + | ||
| 74 | + def test_batchnorm_shape_format_3d(self): | ||
| 75 | + format_list = [-1] | ||
| 76 | + shape_list = [[8, 512, 4, 28, 28], [8, 256, 8, 56, 56]] | ||
| 77 | + affine_list = [True] | ||
| 78 | + dtype_list = [np.float16, np.float32] | ||
| 79 | + # pylint:disable = complicate-comprehension | ||
| 80 | + shape_format = [ | ||
| 81 | + [[z, i, j], h] | ||
| 82 | + for z in dtype_list | ||
| 83 | + for i in format_list | ||
| 84 | + for j in shape_list | ||
| 85 | + for h in affine_list | ||
| 86 | + ] | ||
| 87 | + | ||
| 88 | + for item in shape_format: | ||
| 89 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 0, 10) | ||
| 90 | + cpu_output = self.cpu_op_exec_3d(cpu_input1, item[0][2][1], item[1]) | ||
| 91 | + npu_output = self.npu_op_exec_new_3d(npu_input1, item[0][2][1], item[1]) | ||
| 92 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 93 | + | ||
| 94 | + | ||
| 95 | +if __name__ == "__main__": | ||
| 96 | + run_tests() | ||
| @@ -0,0 +1,33 @@ | |||
| 1 | +import torch | ||
| 2 | +import torch_npu | ||
| 3 | + | ||
| 4 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +class TestBatchNormElemt(TestCase): | ||
| 8 | + def test_batch_norm_elent(self): | ||
| 9 | + input1 = torch.tensor([[1.0], [2.0], [3.0]]).npu() | ||
| 10 | + weight = torch.tensor([1.0]).npu() | ||
| 11 | + bias = torch.tensor([10.0]).npu() | ||
| 12 | + mean = torch.tensor([2.0]).npu() | ||
| 13 | + invstd = torch.tensor([2.0]).npu() | ||
| 14 | + eps = 1e-5 | ||
| 15 | + out = torch.batch_norm_elemt(input1, weight, bias, mean, invstd, eps) | ||
| 16 | + expect_out = torch.tensor([[8.0], [10.0], [12.0]]) | ||
| 17 | + self.assertRtolEqual(expect_out, out.cpu()) | ||
| 18 | + | ||
| 19 | + def test_batch_norm_elent_out(self): | ||
| 20 | + input1 = torch.tensor([[1.0], [2.0], [3.0]]).npu() | ||
| 21 | + weight = torch.tensor([1.0]).npu() | ||
| 22 | + bias = torch.tensor([10.0]).npu() | ||
| 23 | + mean = torch.tensor([2.0]).npu() | ||
| 24 | + invstd = torch.tensor([2.0]).npu() | ||
| 25 | + eps = 1e-5 | ||
| 26 | + out = torch.randn((3, 1), dtype=torch.float32).npu() | ||
| 27 | + torch.batch_norm_elemt(input1, weight, bias, mean, invstd, eps, out=out) | ||
| 28 | + expect_out = torch.tensor([[8.0], [10.0], [12.0]]) | ||
| 29 | + self.assertRtolEqual(expect_out, out.cpu()) | ||
| 30 | + | ||
| 31 | + | ||
| 32 | +if __name__ == "__main__": | ||
| 33 | + run_tests() | ||
| @@ -0,0 +1,36 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | + | ||
| 4 | +import torch_npu | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestBatchNormReduce(TestCase): | ||
| 10 | + def cuda_op_exec(self, input_data): | ||
| 11 | + cpu_sum = torch.sum(input_data, dim=[0, 2, 3]) | ||
| 12 | + cpu_square_sum = torch.sum(input_data * input_data, dim=[0, 2, 3]) | ||
| 13 | + return cpu_sum.numpy(), cpu_square_sum.numpy() | ||
| 14 | + | ||
| 15 | + def npu_op_exec(self, *args): | ||
| 16 | + npu_sum, npu_square_sum = torch_npu.batch_norm_reduce(*args) | ||
| 17 | + out_sum = npu_sum.cpu().numpy() | ||
| 18 | + out_square_sum = npu_square_sum.cpu().numpy() | ||
| 19 | + return out_sum, out_square_sum | ||
| 20 | + | ||
| 21 | + def test_batch_norm_reduce(self): | ||
| 22 | + np.random.seed(1234) | ||
| 23 | + shape_format = [ | ||
| 24 | + [[np.float32, -1, [2, 3, 12, 12]], 1e-5], | ||
| 25 | + ] | ||
| 26 | + for item in shape_format: | ||
| 27 | + cpu_input1, npu_inputfp32 = create_common_tensor(item[0], 1, 10) | ||
| 28 | + cpu_output = self.cuda_op_exec(cpu_input1) | ||
| 29 | + npu_outputfp32 = self.npu_op_exec(npu_inputfp32, item[-1]) | ||
| 30 | + | ||
| 31 | + self.assertRtolEqual(cpu_output[0], npu_outputfp32[0]) | ||
| 32 | + self.assertRtolEqual(cpu_output[1], npu_outputfp32[1], 1e-2) | ||
| 33 | + | ||
| 34 | + | ||
| 35 | +if __name__ == "__main__": | ||
| 36 | + run_tests() | ||
| @@ -0,0 +1,48 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestBatchNormStats(TestCase): | ||
| 10 | + def cuda_op_exec(self, *args): | ||
| 11 | + cpu_mean, cpu_invstd = torch.batch_norm_stats(*args) | ||
| 12 | + return cpu_mean.numpy(), cpu_invstd.numpy() | ||
| 13 | + | ||
| 14 | + def cuda_expect_result(self): | ||
| 15 | + cpu_output0 = np.array([5.401827, 5.444219, 5.7656665], dtype=np.float32) | ||
| 16 | + cpu_output1 = np.array([0.37123242, 0.38706362, 0.37435925], dtype=np.float32) | ||
| 17 | + return cpu_output0, cpu_output1 | ||
| 18 | + | ||
| 19 | + def npu_op_exec(self, *args): | ||
| 20 | + npu_mean, npu_invstd = torch.batch_norm_stats(*args) | ||
| 21 | + out_mean = npu_mean.cpu().numpy() | ||
| 22 | + out_invstd = npu_invstd.cpu().numpy() | ||
| 23 | + return out_mean, out_invstd | ||
| 24 | + | ||
| 25 | + def test_batch_norm_stats(self): | ||
| 26 | + np.random.seed(1234) | ||
| 27 | + shape_format = [ | ||
| 28 | + [[np.float16, -1, [2, 3, 12, 12]], 1e-5], | ||
| 29 | + ] | ||
| 30 | + for item in shape_format: | ||
| 31 | + cpu_input1, npu_inputfp16 = create_common_tensor(item[0], 1, 10) | ||
| 32 | + npu_input1fp32 = npu_inputfp16.float() | ||
| 33 | + if torch.cuda.is_available(): | ||
| 34 | + cpu_output = self.cuda_op_exec(cpu_input1.cuda(), item[-1]) | ||
| 35 | + else: | ||
| 36 | + cpu_output = self.cuda_expect_result() | ||
| 37 | + npu_outputfp16 = self.npu_op_exec(npu_inputfp16, item[-1]) | ||
| 38 | + npu_outputfp32 = self.npu_op_exec(npu_inputfp16, item[-1]) | ||
| 39 | + | ||
| 40 | + self.assertRtolEqual(cpu_output[0], npu_outputfp16[0]) | ||
| 41 | + self.assertRtolEqual(cpu_output[1], npu_outputfp16[1], 1e-2) | ||
| 42 | + | ||
| 43 | + self.assertRtolEqual(cpu_output[0], npu_outputfp32[0]) | ||
| 44 | + self.assertRtolEqual(cpu_output[1], npu_outputfp32[1], 1e-2) | ||
| 45 | + | ||
| 46 | + | ||
| 47 | +if __name__ == "__main__": | ||
| 48 | + run_tests() | ||
| @@ -0,0 +1,95 @@ | |||
| 1 | +import torch | ||
| 2 | +import torch_npu | ||
| 3 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 4 | + | ||
| 5 | + | ||
| 6 | +class TestBatchNormBackwardElemt(TestCase): | ||
| 7 | + def test_batch_norm_backward_elemt_4d(self): | ||
| 8 | + grad_output = torch.ones([2, 3, 1, 4]).npu() | ||
| 9 | + input1 = torch.ones([2, 3, 1, 4]).npu() | ||
| 10 | + mean = torch.tensor([8.0, 5.0, 9.0]).npu() | ||
| 11 | + invstd = torch.tensor([2.0, 1.0, 2.0]).npu() | ||
| 12 | + weight = torch.tensor([1.0, 1.0, 4.0]).npu() | ||
| 13 | + mean_dy = torch.tensor([2.0, 2.0, 6.0]).npu() | ||
| 14 | + mean_dy_xmn = torch.tensor([2.0, 3.0, 11.0]).npu() | ||
| 15 | + count_tensor = torch.tensor([5, 5, 5], dtype=torch.int32).npu() | ||
| 16 | + | ||
| 17 | + grad_input = torch.batch_norm_backward_elemt( | ||
| 18 | + grad_output, | ||
| 19 | + input1, | ||
| 20 | + mean, | ||
| 21 | + invstd, | ||
| 22 | + weight, | ||
| 23 | + mean_dy, | ||
| 24 | + mean_dy_xmn, | ||
| 25 | + count_tensor, | ||
| 26 | + ) | ||
| 27 | + cuda_expect_out = torch.tensor( | ||
| 28 | + [ | ||
| 29 | + [ | ||
| 30 | + [[9.2000, 9.2000, 9.2000, 9.2000]], | ||
| 31 | + [[1.6667, 1.6667, 1.6667, 1.6667]], | ||
| 32 | + [[192.5333, 192.5333, 192.5333, 192.5333]], | ||
| 33 | + ], | ||
| 34 | + [ | ||
| 35 | + [[9.2000, 9.2000, 9.2000, 9.2000]], | ||
| 36 | + [[1.6667, 1.6667, 1.6667, 1.6667]], | ||
| 37 | + [[192.5333, 192.5333, 192.5333, 192.5333]], | ||
| 38 | + ], | ||
| 39 | + ] | ||
| 40 | + ) | ||
| 41 | + self.assertRtolEqual(grad_input.cpu(), cuda_expect_out) | ||
| 42 | + | ||
| 43 | + def test_batch_norm_backward_elemt_2d(self): | ||
| 44 | + grad_output = torch.ones([2, 3]).npu() | ||
| 45 | + input1 = torch.ones([2, 3]).npu() | ||
| 46 | + mean = torch.tensor([8.0, 5.0, 9.0]).npu() | ||
| 47 | + invstd = torch.tensor([2.0, 1.0, 2.0]).npu() | ||
| 48 | + weight = torch.tensor([1.0, 1.0, 4.0]).npu() | ||
| 49 | + mean_dy = torch.tensor([2.0, 2.0, 6.0]).npu() | ||
| 50 | + mean_dy_xmn = torch.tensor([2.0, 3.0, 11.0]).npu() | ||
| 51 | + count_tensor = torch.tensor([5, 5, 5], dtype=torch.int32).npu() | ||
| 52 | + | ||
| 53 | + grad_input = torch.batch_norm_backward_elemt( | ||
| 54 | + grad_output, | ||
| 55 | + input1, | ||
| 56 | + mean, | ||
| 57 | + invstd, | ||
| 58 | + weight, | ||
| 59 | + mean_dy, | ||
| 60 | + mean_dy_xmn, | ||
| 61 | + count_tensor, | ||
| 62 | + ) | ||
| 63 | + cuda_expect_out = torch.tensor( | ||
| 64 | + [[9.2000, 1.6667, 192.5333], [9.2000, 1.6667, 192.5333]] | ||
| 65 | + ) | ||
| 66 | + self.assertRtolEqual(grad_input.cpu(), cuda_expect_out) | ||
| 67 | + | ||
| 68 | + def test_batch_norm_backward_elemt_2d_fp(self): | ||
| 69 | + grad_output = torch.ones([2, 3]).npu() | ||
| 70 | + input1 = torch.ones([2, 3]).npu() | ||
| 71 | + mean = torch.tensor([8.123456, 5.147125, 9.365778]).npu() | ||
| 72 | + invstd = torch.tensor([2.65485, 1.36541, 2.25879]).npu() | ||
| 73 | + weight = torch.tensor([1.36987, 1.36944, 4.25774]).npu() | ||
| 74 | + mean_dy = torch.tensor([2.0, 2.0, 6.0]).npu() | ||
| 75 | + mean_dy_xmn = torch.tensor([2.0, 3.0, 11.0]).npu() | ||
| 76 | + count_tensor = torch.tensor([5, 5, 5], dtype=torch.int32).npu() | ||
| 77 | + | ||
| 78 | + grad_input = torch.batch_norm_backward_elemt( | ||
| 79 | + grad_output, | ||
| 80 | + input1, | ||
| 81 | + mean, | ||
| 82 | + invstd, | ||
| 83 | + weight, | ||
| 84 | + mean_dy, | ||
| 85 | + mean_dy_xmn, | ||
| 86 | + count_tensor, | ||
| 87 | + ) | ||
| 88 | + cuda_expect_out = torch.tensor( | ||
| 89 | + [[27.4980, 4.5119, 306.8037], [27.4980, 4.5119, 306.8037]] | ||
| 90 | + ) | ||
| 91 | + self.assertRtolEqual(grad_input.cpu(), cuda_expect_out) | ||
| 92 | + | ||
| 93 | + | ||
| 94 | +if __name__ == "__main__": | ||
| 95 | + run_tests() | ||
| @@ -0,0 +1,64 @@ | |||
| 1 | +import torch | ||
| 2 | +import torch.nn as nn | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | + | ||
| 7 | + | ||
| 8 | +class Model(nn.Module): | ||
| 9 | + def __init__(self, in_channels): | ||
| 10 | + super(Model, self).__init__() | ||
| 11 | + self.op1 = nn.Conv2d(in_channels, in_channels, 1) | ||
| 12 | + self.op2 = nn.BatchNorm2d(in_channels) | ||
| 13 | + self.op2.running_mean = torch.tensor([i / 1000 for i in range(in_channels)]) | ||
| 14 | + self.op2.running_var = torch.tensor([i / 1000 for i in range(in_channels)]) | ||
| 15 | + self.op3 = nn.Conv2d(in_channels, in_channels, 1) | ||
| 16 | + | ||
| 17 | + def forward(self, x): | ||
| 18 | + self.op2.eval() | ||
| 19 | + x = self.op1(x) | ||
| 20 | + x = self.op2(x) | ||
| 21 | + x = self.op3(x) | ||
| 22 | + return x | ||
| 23 | + | ||
| 24 | + | ||
| 25 | +class TestBn2dEval(TestCase): | ||
| 26 | + def test_batchnorm_backward_eval(self, device="npu"): | ||
| 27 | + model = Model(in_channels=64) | ||
| 28 | + cpu_tensor = torch.randn(32, 64, 14, 14) | ||
| 29 | + npu_tensor = cpu_tensor.npu() | ||
| 30 | + cpu_tensor.requires_grad = True | ||
| 31 | + npu_tensor.requires_grad = True | ||
| 32 | + | ||
| 33 | + for i in range(1): | ||
| 34 | + out = model(cpu_tensor) | ||
| 35 | + loss = out.sum() | ||
| 36 | + loss.backward() | ||
| 37 | + cpuout = out | ||
| 38 | + cpu_grad_list = [] | ||
| 39 | + for name, module in model.named_parameters(): | ||
| 40 | + cpu_grad_list.append(module.grad) | ||
| 41 | + module.grad = None | ||
| 42 | + | ||
| 43 | + model = model.npu() | ||
| 44 | + out = model(npu_tensor) | ||
| 45 | + loss = out.sum() | ||
| 46 | + loss.backward() | ||
| 47 | + npu_grad_list = [] | ||
| 48 | + for name, module in model.named_parameters(): | ||
| 49 | + npu_grad_list.append(module.grad.cpu()) | ||
| 50 | + | ||
| 51 | + cpu_grad = cpu_tensor.grad | ||
| 52 | + npu_grad = npu_tensor.grad | ||
| 53 | + # TODO(ascend): Insufficient precision | ||
| 54 | + # 精度未满足 self.assertRtolEqual(cpu_grad.numpy(), npu_grad.cpu().numpy()) | ||
| 55 | + self.assertRtolEqual(cpu_grad.numpy(), npu_grad.cpu().numpy(), 0.01) | ||
| 56 | + | ||
| 57 | + for cpu_grad, npu_grad in zip(cpu_grad_list, npu_grad_list): | ||
| 58 | + # TODO(ascend): Insufficient precision | ||
| 59 | + # 精度未满足 self.assertRtolEqual(cpu_grad.numpy(), npu_grad.numpy()) | ||
| 60 | + self.assertRtolEqual(cpu_grad.numpy(), npu_grad.numpy(), 0.1) | ||
| 61 | + | ||
| 62 | + | ||
| 63 | +if __name__ == "__main__": | ||
| 64 | + run_tests() | ||
| @@ -0,0 +1,95 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestBatchNormBackwardReduce(TestCase): | ||
| 10 | + def expect_result(self): | ||
| 11 | + cpu_output0 = np.array([449.18185, 464.78906, 471.87485], dtype=np.float32) | ||
| 12 | + cpu_output1 = np.array([831.08484, 2112.0908, 259.91568], dtype=np.float32) | ||
| 13 | + cpu_output2 = np.array([6091.88, 3367.45, 1824.8948], dtype=np.float32) | ||
| 14 | + cpu_output3 = np.array([449.18185, 464.78906, 471.87485], dtype=np.float32) | ||
| 15 | + list1 = [cpu_output0, cpu_output1, cpu_output2, cpu_output3] | ||
| 16 | + return list1 | ||
| 17 | + | ||
| 18 | + def npu_op_exec(self, *args): | ||
| 19 | + ( | ||
| 20 | + npu_sum_dy, | ||
| 21 | + npu_sum_dy_xmu, | ||
| 22 | + npu_grad_weight, | ||
| 23 | + npu_grad_bias, | ||
| 24 | + ) = torch.batch_norm_backward_reduce(*args) | ||
| 25 | + list2 = [ | ||
| 26 | + npu_sum_dy.cpu().numpy(), | ||
| 27 | + npu_sum_dy_xmu.cpu().numpy(), | ||
| 28 | + npu_grad_weight.cpu().numpy(), | ||
| 29 | + npu_grad_bias.cpu().numpy(), | ||
| 30 | + ] | ||
| 31 | + return list2 | ||
| 32 | + | ||
| 33 | + def test_batch_norm_backward_reduce_mix_precision(self): | ||
| 34 | + np.random.seed(1234) | ||
| 35 | + shape_format = [ | ||
| 36 | + [[np.float16, -1, [1, 3, 9, 9]], [np.float32, -1, [3]], True, True, True], | ||
| 37 | + ] | ||
| 38 | + for item in shape_format: | ||
| 39 | + _, npu_grad_output_fp16 = create_common_tensor(item[0], 1, 10) | ||
| 40 | + _, npu_input1_fp16 = create_common_tensor(item[0], 1, 10) | ||
| 41 | + _, npu_mean = create_common_tensor(item[1], 1, 10) | ||
| 42 | + _, npu_invstd = create_common_tensor(item[1], 1, 10) | ||
| 43 | + _, npu_weight = create_common_tensor(item[1], 1, 10) | ||
| 44 | + npu_grad_output_fp32 = npu_grad_output_fp16.float() | ||
| 45 | + npu_input1_fp32 = npu_input1_fp16.float() | ||
| 46 | + | ||
| 47 | + npu_output_fp16 = self.npu_op_exec( | ||
| 48 | + npu_grad_output_fp16, | ||
| 49 | + npu_input1_fp16, | ||
| 50 | + npu_mean, | ||
| 51 | + npu_invstd, | ||
| 52 | + npu_weight, | ||
| 53 | + *item[-3:] | ||
| 54 | + ) | ||
| 55 | + npu_output_fp32 = self.npu_op_exec( | ||
| 56 | + npu_grad_output_fp32, | ||
| 57 | + npu_input1_fp32, | ||
| 58 | + npu_mean, | ||
| 59 | + npu_invstd, | ||
| 60 | + npu_weight, | ||
| 61 | + *item[-3:] | ||
| 62 | + ) | ||
| 63 | + for out16, out32 in zip(npu_output_fp16, npu_output_fp32): | ||
| 64 | + self.assertRtolEqual(out16, out32) | ||
| 65 | + | ||
| 66 | + def test_batch_norm_backward_reduce(self): | ||
| 67 | + np.random.seed(1234) | ||
| 68 | + shape_format = [ | ||
| 69 | + [[np.float32, -1, [1, 3, 9, 9]], [np.float32, -1, [3]], True, True, True], | ||
| 70 | + ] | ||
| 71 | + for item in shape_format: | ||
| 72 | + _, npu_grad_output = create_common_tensor(item[0], 1, 10) | ||
| 73 | + _, npu_input1 = create_common_tensor(item[0], 1, 10) | ||
| 74 | + _, npu_mean = create_common_tensor(item[1], 1, 10) | ||
| 75 | + _, npu_invstd = create_common_tensor(item[1], 1, 10) | ||
| 76 | + _, npu_weight = create_common_tensor(item[1], 1, 10) | ||
| 77 | + | ||
| 78 | + list1 = self.expect_result() | ||
| 79 | + list2 = self.npu_op_exec( | ||
| 80 | + npu_grad_output, | ||
| 81 | + npu_input1, | ||
| 82 | + npu_mean, | ||
| 83 | + npu_invstd, | ||
| 84 | + npu_weight, | ||
| 85 | + *item[-3:] | ||
| 86 | + ) | ||
| 87 | + | ||
| 88 | + self.assertRtolEqual(list1[0], list2[0]) | ||
| 89 | + self.assertRtolEqual(list1[1], list2[1]) | ||
| 90 | + self.assertRtolEqual(list1[2], list2[2]) | ||
| 91 | + self.assertRtolEqual(list1[3], list2[3]) | ||
| 92 | + | ||
| 93 | + | ||
| 94 | +if __name__ == "__main__": | ||
| 95 | + run_tests() | ||
| @@ -0,0 +1,465 @@ | |||
| 1 | +# Copyright (c) 2020, Huawei Technologies.All rights reserved. | ||
| 2 | +# | ||
| 3 | +# Licensed under the BSD 3-Clause License (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 | +# https://opensource.org/licenses/BSD-3-Clause | ||
| 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 | + | ||
| 16 | +import torch | ||
| 17 | +import numpy as np | ||
| 18 | + | ||
| 19 | +import torch_npu | ||
| 20 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 21 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 22 | + | ||
| 23 | + | ||
| 24 | +class TestAdd(TestCase): | ||
| 25 | + | ||
| 26 | + def cpu_op_out_exec(self, input1, input2, output): | ||
| 27 | + torch.add(input1, input2, alpha=1, out=output) | ||
| 28 | + output = output.numpy() | ||
| 29 | + return output | ||
| 30 | + | ||
| 31 | + def npu_op_out_exec_new(self, input1, input2, output): | ||
| 32 | + torch.add(input1, input2, alpha=1, out=output) | ||
| 33 | + output = output.to("cpu") | ||
| 34 | + output = output.numpy() | ||
| 35 | + return output | ||
| 36 | + | ||
| 37 | + def cpu_op_exec(self, input1, input2): | ||
| 38 | + output = torch.add(input1, input2, alpha=1) | ||
| 39 | + output = output.numpy() | ||
| 40 | + return output | ||
| 41 | + | ||
| 42 | + def npu_op_exec_new(self, input1, input2): | ||
| 43 | + output = torch.add(input1, input2, alpha=1) | ||
| 44 | + output = output.to("cpu") | ||
| 45 | + output = output.numpy() | ||
| 46 | + return output | ||
| 47 | + | ||
| 48 | + def cpu_op_exec_alpha(self, input1, input2): | ||
| 49 | + output = torch.add(input1, input2, alpha=3) | ||
| 50 | + output = output.numpy() | ||
| 51 | + return output | ||
| 52 | + | ||
| 53 | + def npu_op_exec_new_alpha(self, input1, input2): | ||
| 54 | + output = torch.add(input1, input2, alpha=3) | ||
| 55 | + output = output.to("cpu") | ||
| 56 | + output = output.numpy() | ||
| 57 | + return output | ||
| 58 | + | ||
| 59 | + def cpu_op_scalar_exec(self, input1, scalar): | ||
| 60 | + output = torch.add(input1, scalar, alpha=1) | ||
| 61 | + output = output.numpy() | ||
| 62 | + return output | ||
| 63 | + | ||
| 64 | + def npu_op_scalar_exec_new(self, input1, scalar): | ||
| 65 | + output = torch.add(input1, scalar, alpha=1) | ||
| 66 | + output = output.to("cpu") | ||
| 67 | + output = output.numpy() | ||
| 68 | + return output | ||
| 69 | + | ||
| 70 | + def cpu_op_scalar_exec_alpha(self, input1, scalar): | ||
| 71 | + output = torch.add(input1, scalar, alpha=3) | ||
| 72 | + output = output.numpy() | ||
| 73 | + return output | ||
| 74 | + | ||
| 75 | + def npu_op_scalar_exec_new_alpha(self, input1, scalar): | ||
| 76 | + output = torch.add(input1, scalar, alpha=3) | ||
| 77 | + output = output.to("cpu") | ||
| 78 | + output = output.numpy() | ||
| 79 | + return output | ||
| 80 | + | ||
| 81 | + def add_scalar_result(self, shape_format): | ||
| 82 | + for item in shape_format: | ||
| 83 | + cpu_input, npu_input = create_common_tensor(item[0], 0, 100) | ||
| 84 | + if cpu_input.dtype == torch.float16: | ||
| 85 | + cpu_input = cpu_input.to(torch.float32) | ||
| 86 | + cpu_output = self.cpu_op_scalar_exec(cpu_input, item[1]) | ||
| 87 | + npu_output = self.npu_op_exec_new(npu_input, item[1]) | ||
| 88 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 89 | + | ||
| 90 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 91 | + | ||
| 92 | + def add_scalar_alpha_result(self, shape_format): | ||
| 93 | + for item in shape_format: | ||
| 94 | + cpu_input, npu_input = create_common_tensor(item[0], 0, 100) | ||
| 95 | + if cpu_input.dtype == torch.float16: | ||
| 96 | + cpu_input = cpu_input.to(torch.float32) | ||
| 97 | + cpu_output = self.cpu_op_scalar_exec_alpha(cpu_input, item[1]) | ||
| 98 | + npu_output = self.npu_op_scalar_exec_new_alpha(npu_input, item[1]) | ||
| 99 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 100 | + | ||
| 101 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 102 | + | ||
| 103 | + def add_result(self, shape_format): | ||
| 104 | + for item in shape_format: | ||
| 105 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 106 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 107 | + if cpu_input1.dtype == torch.float16: | ||
| 108 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 109 | + cpu_input2 = cpu_input2.to(torch.float32) | ||
| 110 | + | ||
| 111 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) | ||
| 112 | + npu_output = self.npu_op_exec_new(npu_input1, npu_input2) | ||
| 113 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 114 | + | ||
| 115 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 116 | + | ||
| 117 | + def add_out_result(self, shape_format): | ||
| 118 | + for item in shape_format: | ||
| 119 | + cpuout = torch.randn(3) | ||
| 120 | + npuout = torch.randn(3).to("npu") | ||
| 121 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 122 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 123 | + if cpu_input1.dtype == torch.float16: | ||
| 124 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 125 | + cpu_input2 = cpu_input2.to(torch.float32) | ||
| 126 | + | ||
| 127 | + cpu_output = self.cpu_op_out_exec(cpu_input1, cpu_input2, cpuout) | ||
| 128 | + npu_output = self.npu_op_out_exec_new(npu_input1, npu_input2, npuout) | ||
| 129 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 130 | + | ||
| 131 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 132 | + | ||
| 133 | + def add_alpha_result(self, shape_format): | ||
| 134 | + for item in shape_format: | ||
| 135 | + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) | ||
| 136 | + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) | ||
| 137 | + if cpu_input1.dtype == torch.float16: | ||
| 138 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 139 | + cpu_input2 = cpu_input2.to(torch.float32) | ||
| 140 | + | ||
| 141 | + cpu_output = self.cpu_op_exec_alpha(cpu_input1, cpu_input2) | ||
| 142 | + npu_output = self.npu_op_exec_new_alpha(npu_input1, npu_input2) | ||
| 143 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 144 | + | ||
| 145 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 146 | + | ||
| 147 | + def test_add_scalar_shape_format_fp16_1d(self): | ||
| 148 | + format_list = [0, 3] | ||
| 149 | + scalar_list = [0, 1] | ||
| 150 | + shape_format = [ | ||
| 151 | + [[np.float16, i, [18]], k] for i in format_list for k in scalar_list | ||
| 152 | + ] | ||
| 153 | + self.add_scalar_result(shape_format) | ||
| 154 | + | ||
| 155 | + def test_add_scalar_shape_format_fp32_1d(self): | ||
| 156 | + format_list = [0, 3] | ||
| 157 | + scalar_list = [0, 1] | ||
| 158 | + shape_format = [ | ||
| 159 | + [[np.float32, i, [18]], k] for i in format_list for k in scalar_list | ||
| 160 | + ] | ||
| 161 | + self.add_scalar_result(shape_format) | ||
| 162 | + | ||
| 163 | + def test_add_scalar_shape_format_fp16_2d(self): | ||
| 164 | + format_list = [0, 3, 29] | ||
| 165 | + scalar_list = [0, 1] | ||
| 166 | + shape_format = [ | ||
| 167 | + [[np.float16, i, [5, 256]], k] for i in format_list for k in scalar_list | ||
| 168 | + ] | ||
| 169 | + self.add_scalar_result(shape_format) | ||
| 170 | + | ||
| 171 | + def test_add_scalar_shape_format_fp32_2d(self): | ||
| 172 | + format_list = [0, 3, 29] | ||
| 173 | + scalar_list = [0, 1] | ||
| 174 | + shape_format = [ | ||
| 175 | + [[np.float32, i, [5, 256]], k] for i in format_list for k in scalar_list | ||
| 176 | + ] | ||
| 177 | + self.add_scalar_result(shape_format) | ||
| 178 | + | ||
| 179 | + def test_add_scalar_shape_format_fp16_3d(self): | ||
| 180 | + format_list = [0, 3, 29] | ||
| 181 | + scalar_list = [0, 1] | ||
| 182 | + shape_format = [ | ||
| 183 | + [[np.float16, i, [32, 3, 3]], k] for i in format_list for k in scalar_list | ||
| 184 | + ] | ||
| 185 | + self.add_scalar_result(shape_format) | ||
| 186 | + | ||
| 187 | + def test_add_scalar_shape_format_fp32_3d(self): | ||
| 188 | + format_list = [0, 3, 29] | ||
| 189 | + scalar_list = [0, 1] | ||
| 190 | + shape_format = [ | ||
| 191 | + [[np.float32, i, [32, 3, 3]], k] for i in format_list for k in scalar_list | ||
| 192 | + ] | ||
| 193 | + self.add_scalar_result(shape_format) | ||
| 194 | + | ||
| 195 | + def test_add_scalar_shape_format_fp16_4d(self): | ||
| 196 | + format_list = [0, 3, 29] | ||
| 197 | + scalar_list = [0, 1] | ||
| 198 | + shape_format = [ | ||
| 199 | + [[np.float16, i, [64, 112, 7, 7]], k] for i in format_list for k in scalar_list | ||
| 200 | + ] | ||
| 201 | + self.add_scalar_result(shape_format) | ||
| 202 | + | ||
| 203 | + def test_add_scalar_shape_format_fp32_4d(self): | ||
| 204 | + format_list = [0, 3, 29] | ||
| 205 | + scalar_list = [0, 1] | ||
| 206 | + shape_format = [ | ||
| 207 | + [[np.float32, i, [64, 112, 7, 7]], k] for i in format_list for k in scalar_list | ||
| 208 | + ] | ||
| 209 | + self.add_scalar_result(shape_format) | ||
| 210 | + | ||
| 211 | + def test_add_scalar_shape_format_fp16_1d(self): | ||
| 212 | + format_list = [0, 3] | ||
| 213 | + scalar_list = [0, 1] | ||
| 214 | + shape_format = [ | ||
| 215 | + [[np.float16, i, [18]], k] for i in format_list for k in scalar_list | ||
| 216 | + ] | ||
| 217 | + self.add_scalar_alpha_result(shape_format) | ||
| 218 | + | ||
| 219 | + def test_add_scalar_shape_format_fp32_1d(self): | ||
| 220 | + format_list = [0, 3] | ||
| 221 | + scalar_list = [0, 1] | ||
| 222 | + shape_format = [ | ||
| 223 | + [[np.float32, i, [18]], k] for i in format_list for k in scalar_list | ||
| 224 | + ] | ||
| 225 | + self.add_scalar_alpha_result(shape_format) | ||
| 226 | + | ||
| 227 | + def test_add_scalar_shape_format_fp16_2d(self): | ||
| 228 | + format_list = [0, 3, 29] | ||
| 229 | + scalar_list = [0, 1] | ||
| 230 | + shape_format = [ | ||
| 231 | + [[np.float16, i, [5, 256]], k] for i in format_list for k in scalar_list | ||
| 232 | + ] | ||
| 233 | + self.add_scalar_alpha_result(shape_format) | ||
| 234 | + | ||
| 235 | + def test_add_scalar_shape_format_fp32_2d(self): | ||
| 236 | + format_list = [0, 3, 29] | ||
| 237 | + scalar_list = [0, 1] | ||
| 238 | + shape_format = [ | ||
| 239 | + [[np.float32, i, [5, 256]], k] for i in format_list for k in scalar_list | ||
| 240 | + ] | ||
| 241 | + self.add_scalar_alpha_result(shape_format) | ||
| 242 | + | ||
| 243 | + def test_add_scalar_shape_format_fp16_3d(self): | ||
| 244 | + format_list = [0, 3, 29] | ||
| 245 | + scalar_list = [0, 1] | ||
| 246 | + shape_format = [ | ||
| 247 | + [[np.float16, i, [32, 3, 3]], k] for i in format_list for k in scalar_list | ||
| 248 | + ] | ||
| 249 | + self.add_scalar_alpha_result(shape_format) | ||
| 250 | + | ||
| 251 | + def test_add_scalar_shape_format_fp32_3d(self): | ||
| 252 | + format_list = [0, 3, 29] | ||
| 253 | + scalar_list = [0, 1] | ||
| 254 | + shape_format = [ | ||
| 255 | + [[np.float32, i, [32, 3, 3]], k] for i in format_list for k in scalar_list | ||
| 256 | + ] | ||
| 257 | + self.add_scalar_alpha_result(shape_format) | ||
| 258 | + | ||
| 259 | + def test_add_scalar_shape_format_fp16_4d(self): | ||
| 260 | + format_list = [0, 3, 29] | ||
| 261 | + scalar_list = [0, 1] | ||
| 262 | + shape_format = [ | ||
| 263 | + [[np.float16, i, [64, 112, 7, 7]], k] for i in format_list for k in scalar_list | ||
| 264 | + ] | ||
| 265 | + self.add_scalar_alpha_result(shape_format) | ||
| 266 | + | ||
| 267 | + def test_add_scalar_shape_format_fp32_4d(self): | ||
| 268 | + format_list = [0, 3, 29] | ||
| 269 | + scalar_list = [0, 1] | ||
| 270 | + shape_format = [ | ||
| 271 | + [[np.float32, i, [64, 112, 7, 7]], k] for i in format_list for k in scalar_list | ||
| 272 | + ] | ||
| 273 | + self.add_scalar_alpha_result(shape_format) | ||
| 274 | + | ||
| 275 | + def test_add_shape_format_fp16_1d(self): | ||
| 276 | + format_list = [0, 3] | ||
| 277 | + shape_format = [ | ||
| 278 | + [np.float16, i, [64]] for i in format_list | ||
| 279 | + ] | ||
| 280 | + self.add_result(shape_format) | ||
| 281 | + | ||
| 282 | + def test_add_shape_format_fp32_1d(self): | ||
| 283 | + format_list = [0, 3] | ||
| 284 | + shape_format = [ | ||
| 285 | + [np.float32, i, [64]] for i in format_list | ||
| 286 | + ] | ||
| 287 | + self.add_result(shape_format) | ||
| 288 | + | ||
| 289 | + def test_add_shape_format_fp16_2d(self): | ||
| 290 | + format_list = [0, 3, 29] | ||
| 291 | + shape_format = [ | ||
| 292 | + [np.float16, i, [5, 256]] for i in format_list | ||
| 293 | + ] | ||
| 294 | + self.add_result(shape_format) | ||
| 295 | + | ||
| 296 | + def test_add_shape_format_fp32_2d(self): | ||
| 297 | + format_list = [0, 3, 29] | ||
| 298 | + shape_format = [ | ||
| 299 | + [np.float32, i, [5, 256]] for i in format_list | ||
| 300 | + ] | ||
| 301 | + self.add_result(shape_format) | ||
| 302 | + | ||
| 303 | + def test_add_shape_format_fp16_3d(self): | ||
| 304 | + format_list = [0, 3, 29] | ||
| 305 | + shape_format = [ | ||
| 306 | + [np.float16, i, [32, 3, 3]] for i in format_list | ||
| 307 | + ] | ||
| 308 | + self.add_result(shape_format) | ||
| 309 | + | ||
| 310 | + def test_add_shape_format_fp32_3d(self): | ||
| 311 | + format_list = [0, 3, 29] | ||
| 312 | + shape_format = [ | ||
| 313 | + [np.float32, i, [32, 3, 3]] for i in format_list | ||
| 314 | + ] | ||
| 315 | + self.add_result(shape_format) | ||
| 316 | + | ||
| 317 | + def test_add_shape_format_fp16_4d(self): | ||
| 318 | + format_list = [0, 3, 29] | ||
| 319 | + shape_format = [ | ||
| 320 | + [np.float16, i, [64, 112, 7, 7]] for i in format_list | ||
| 321 | + ] | ||
| 322 | + self.add_result(shape_format) | ||
| 323 | + | ||
| 324 | + def test_add_shape_format_fp32_4d(self): | ||
| 325 | + format_list = [0, 3, 29] | ||
| 326 | + shape_format = [ | ||
| 327 | + [np.float32, i, [64, 112, 7, 7]] for i in format_list | ||
| 328 | + ] | ||
| 329 | + self.add_result(shape_format) | ||
| 330 | + | ||
| 331 | + def test_add_shape_format_fp16_1d(self): | ||
| 332 | + format_list = [0, 3] | ||
| 333 | + shape_format = [ | ||
| 334 | + [np.float16, i, [64]] for i in format_list | ||
| 335 | + ] | ||
| 336 | + self.add_alpha_result(shape_format) | ||
| 337 | + | ||
| 338 | + def test_add_shape_format_fp32_1d(self): | ||
| 339 | + format_list = [0, 3] | ||
| 340 | + shape_format = [ | ||
| 341 | + [np.float32, i, [64]] for i in format_list | ||
| 342 | + ] | ||
| 343 | + self.add_alpha_result(shape_format) | ||
| 344 | + | ||
| 345 | + def test_add_shape_format_fp16_2d(self): | ||
| 346 | + format_list = [0, 3, 29] | ||
| 347 | + shape_format = [ | ||
| 348 | + [np.float16, i, [5, 256]] for i in format_list | ||
| 349 | + ] | ||
| 350 | + self.add_alpha_result(shape_format) | ||
| 351 | + | ||
| 352 | + def test_add_shape_format_fp32_2d(self): | ||
| 353 | + format_list = [0, 3, 29] | ||
| 354 | + shape_format = [ | ||
| 355 | + [np.float32, i, [5, 256]] for i in format_list | ||
| 356 | + ] | ||
| 357 | + self.add_alpha_result(shape_format) | ||
| 358 | + | ||
| 359 | + def test_add_shape_format_fp16_3d(self): | ||
| 360 | + format_list = [0, 3, 29] | ||
| 361 | + shape_format = [ | ||
| 362 | + [np.float16, i, [32, 3, 3]] for i in format_list | ||
| 363 | + ] | ||
| 364 | + self.add_alpha_result(shape_format) | ||
| 365 | + | ||
| 366 | + def test_add_shape_format_fp32_3d(self): | ||
| 367 | + format_list = [0, 3, 29] | ||
| 368 | + shape_format = [ | ||
| 369 | + [np.float32, i, [32, 3, 3]] for i in format_list | ||
| 370 | + ] | ||
| 371 | + self.add_alpha_result(shape_format) | ||
| 372 | + | ||
| 373 | + def test_add_shape_format_fp16_4d(self): | ||
| 374 | + format_list = [0, 3, 29] | ||
| 375 | + shape_format = [ | ||
| 376 | + [np.float16, i, [64, 112, 7, 7]] for i in format_list | ||
| 377 | + ] | ||
| 378 | + self.add_alpha_result(shape_format) | ||
| 379 | + | ||
| 380 | + def test_add_shape_format_fp32_4d(self): | ||
| 381 | + format_list = [0, 3, 29] | ||
| 382 | + shape_format = [ | ||
| 383 | + [np.float32, i, [64, 112, 7, 7]] for i in format_list | ||
| 384 | + ] | ||
| 385 | + self.add_alpha_result(shape_format) | ||
| 386 | + | ||
| 387 | + def test_add_mix_dtype(self): | ||
| 388 | + cpu_input1, npu_input1 = create_common_tensor([np.int32, 0, (2, 3)], 1, 100) | ||
| 389 | + cpu_input2, npu_input2 = create_common_tensor([np.float32, 0, (2, 3)], 1, 100) | ||
| 390 | + cpu_output = torch.add(cpu_input1, cpu_input2) | ||
| 391 | + npu_output = torch.add(npu_input1, npu_input2) | ||
| 392 | + npu_output = npu_output.to("cpu") | ||
| 393 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 394 | + | ||
| 395 | + def test_add_scalar_check_5d_5d_match(self): | ||
| 396 | + ca = torch.randn(4) | ||
| 397 | + cb = ca.view(2, 2).transpose(1, 0) | ||
| 398 | + na = ca.npu() | ||
| 399 | + nb = cb.npu() | ||
| 400 | + caout = torch.add(ca, 1) | ||
| 401 | + cbout = torch.add(cb, 1) | ||
| 402 | + naout = torch.add(na, 1) | ||
| 403 | + nbout = torch.add(nb, 1) | ||
| 404 | + naout = naout.to("cpu") | ||
| 405 | + nbout = nbout.to("cpu") | ||
| 406 | + self.assertRtolEqual(caout, naout) | ||
| 407 | + self.assertRtolEqual(cbout, nbout) | ||
| 408 | + | ||
| 409 | + def test_add_different_dtype(self): | ||
| 410 | + cpu_x1 = torch.rand(2, 3, 4) | ||
| 411 | + cpu_other1 = torch.rand(2, 3, 4).uniform_(1, 10).long() | ||
| 412 | + npu_x1 = cpu_x1.npu() | ||
| 413 | + npu_other1 = cpu_other1.npu() | ||
| 414 | + cpu_out1 = cpu_x1 + cpu_other1 | ||
| 415 | + npu_out1 = npu_x1 + npu_other1 | ||
| 416 | + | ||
| 417 | + cpu_x2 = 1.5 | ||
| 418 | + cpu_other2 = torch.rand(2, 3, 4).uniform_(1, 10).long() | ||
| 419 | + npu_x2 = 1.5 | ||
| 420 | + npu_other2 = cpu_other2.npu() | ||
| 421 | + cpu_out2 = cpu_x2 + cpu_other2 | ||
| 422 | + npu_out2 = npu_x2 + npu_other2 | ||
| 423 | + | ||
| 424 | + cpu_x3 = torch.rand(2, 3, 4).int() | ||
| 425 | + cpu_other3 = 3 | ||
| 426 | + npu_x3 = cpu_x3.npu() | ||
| 427 | + npu_other3 = 3 | ||
| 428 | + cpu_out3 = cpu_x3 + cpu_other3 | ||
| 429 | + npu_out3 = npu_x3 + npu_other3 | ||
| 430 | + | ||
| 431 | + self.assertRtolEqual(cpu_out1, npu_out1.cpu()) | ||
| 432 | + self.assertRtolEqual(cpu_out2, npu_out2.cpu()) | ||
| 433 | + self.assertRtolEqual(cpu_out3, npu_out3.cpu()) | ||
| 434 | + | ||
| 435 | + def test_add_inplace_and_out_mix_dtype(self): | ||
| 436 | + dtype_list = [ | ||
| 437 | + [np.int32, np.int64, np.int64], | ||
| 438 | + [np.int64, np.int32, np.int64], | ||
| 439 | + [np.float32, np.float16, np.float32], | ||
| 440 | + [np.float16, np.float32, np.float32], | ||
| 441 | + [np.int64, np.float32, np.float32] | ||
| 442 | + ] | ||
| 443 | + for item in dtype_list: | ||
| 444 | + cpu_input1, npu_input1 = create_common_tensor([item[0], 0, (2, 3, 4)], -100, 100) | ||
| 445 | + cpu_input2, npu_input2 = create_common_tensor([item[1], 0, (2, 3, 4)], -100, 100) | ||
| 446 | + _, npu_output = create_common_tensor([item[2], 0, (2, 3, 4)], 1, 100) | ||
| 447 | + | ||
| 448 | + if item[0] == np.int64 and item[1] == np.float32: | ||
| 449 | + try: | ||
| 450 | + npu_input1.add_(npu_input2) | ||
| 451 | + except RuntimeError as e: | ||
| 452 | + self.assertRegex( | ||
| 453 | + str(e), "result type Float can't be cast to the desired output type Long") | ||
| 454 | + else: | ||
| 455 | + cpu_input1.add_(cpu_input2) | ||
| 456 | + npu_input1.add_(npu_input2) | ||
| 457 | + self.assertRtolEqual(cpu_input1, npu_input1.cpu()) | ||
| 458 | + | ||
| 459 | + cpu_output = torch.add(cpu_input1, cpu_input2) | ||
| 460 | + torch.add(npu_input1, npu_input2, out=npu_output) | ||
| 461 | + self.assertRtolEqual(cpu_output, npu_output.cpu()) | ||
| 462 | + | ||
| 463 | + | ||
| 464 | +if __name__ == "__main__": | ||
| 465 | + run_tests() | ||
| @@ -0,0 +1,120 @@ | |||
| 1 | +# Copyright (c) 2020 Huawei Technologies Co., Ltd | ||
| 2 | +# All rights reserved. | ||
| 3 | +# | ||
| 4 | +# Licensed under the BSD 3-Clause License (the "License"); | ||
| 5 | +# you may not use this file except in compliance with the License. | ||
| 6 | +# You may obtain a copy of the License at | ||
| 7 | +# | ||
| 8 | +# https://opensource.org/licenses/BSD-3-Clause | ||
| 9 | +# | ||
| 10 | +# Unless required by applicable law or agreed to in writing, software | ||
| 11 | +# distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | +# See the License for the specific language governing permissions and | ||
| 14 | +# limitations under the License. | ||
| 15 | + | ||
| 16 | + | ||
| 17 | +import torch | ||
| 18 | +import numpy as np | ||
| 19 | +import torch_npu | ||
| 20 | + | ||
| 21 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 22 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 23 | + | ||
| 24 | + | ||
| 25 | +torch.npu.set_compile_mode(jit_compile=False) | ||
| 26 | +torch.npu.config.allow_internal_format = False | ||
| 27 | + | ||
| 28 | + | ||
| 29 | +class TestAddbmm(TestCase): | ||
| 30 | + | ||
| 31 | + def cpu_op_exec(self, input1, input2, input3, scalar1, scalar2): | ||
| 32 | + output = torch.addbmm(input1, input2, input3, beta=scalar1, alpha=scalar2) | ||
| 33 | + output = output.numpy() | ||
| 34 | + return output | ||
| 35 | + | ||
| 36 | + def npu_op_exec(self, input1, input2, input3, scalar1, scalar2): | ||
| 37 | + output = torch.addbmm(input1, input2, input3, beta=scalar1, alpha=scalar2) | ||
| 38 | + output = output.to("cpu") | ||
| 39 | + output = output.numpy() | ||
| 40 | + return output | ||
| 41 | + | ||
| 42 | + def npu_op_exec_out(self, input1, input2, input3, scalar1, scalar2): | ||
| 43 | + output = torch.ones_like(input1) | ||
| 44 | + torch.addbmm(input1, input2, input3, beta=scalar1, alpha=scalar2, out=output) | ||
| 45 | + output = output.to("cpu") | ||
| 46 | + output = output.numpy() | ||
| 47 | + return output | ||
| 48 | + | ||
| 49 | + def npu_op_exec_inplace(self, input1, input2, input3, scalar1, scalar2): | ||
| 50 | + input1.addbmm_(input2, input3, beta=scalar1, alpha=scalar2) | ||
| 51 | + output = input1.to("cpu") | ||
| 52 | + output = output.numpy() | ||
| 53 | + return output | ||
| 54 | + | ||
| 55 | + def cpu_op_transpose_exec(self, input1, input2, input3, scalar1, scalar2): | ||
| 56 | + input3_t = input3.permute(0, 2, 1) | ||
| 57 | + output = torch.addbmm(input1, input2, input3_t, beta=scalar1, alpha=scalar2) | ||
| 58 | + output = output.numpy() | ||
| 59 | + return output | ||
| 60 | + | ||
| 61 | + def npu_op_transpose_exec(self, input1, input2, input3, scalar1, scalar2): | ||
| 62 | + input3_t = input3.permute(0, 2, 1) | ||
| 63 | + output = torch.addbmm(input1, input2, input3_t, beta=scalar1, alpha=scalar2) | ||
| 64 | + output = output.to("cpu") | ||
| 65 | + output = output.numpy() | ||
| 66 | + return output | ||
| 67 | + | ||
| 68 | + def test_addbmm(self): | ||
| 69 | + shape_format = [ | ||
| 70 | + [[np.float16, 0, [3, 5]], [np.float16, 0, [10, 3, 4]], [np.float16, 0, [10, 4, 5]]], | ||
| 71 | + ] | ||
| 72 | + | ||
| 73 | + for item in shape_format: | ||
| 74 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 0, 100) | ||
| 75 | + cpu_input2, npu_input2 = create_common_tensor(item[1], 0, 100) | ||
| 76 | + cpu_input3, npu_input3 = create_common_tensor(item[2], 0, 100) | ||
| 77 | + | ||
| 78 | + scalar1 = np.random.uniform(0, 10) | ||
| 79 | + scalar2 = np.random.uniform(0, 10) | ||
| 80 | + | ||
| 81 | + cpu_input1 = cpu_input1.float() | ||
| 82 | + cpu_input2 = cpu_input2.float() | ||
| 83 | + cpu_input3 = cpu_input3.float() | ||
| 84 | + npu_input1 = npu_input1.float() | ||
| 85 | + npu_input2 = npu_input2.float() | ||
| 86 | + npu_input3 = npu_input3.float() | ||
| 87 | + | ||
| 88 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2, cpu_input3, scalar1, scalar2) | ||
| 89 | + npu_output = self.npu_op_exec(npu_input1, npu_input2, npu_input3, scalar1, scalar2) | ||
| 90 | + | ||
| 91 | + npu_output1 = self.npu_op_exec_out(npu_input1, npu_input2, npu_input3, scalar1, scalar2) | ||
| 92 | + npu_output2 = self.npu_op_exec_inplace(npu_input1, npu_input2, npu_input3, scalar1, scalar2) | ||
| 93 | + | ||
| 94 | + self.assertRtolEqual(cpu_output, npu_output, prec=1.e-3) | ||
| 95 | + self.assertRtolEqual(cpu_output, npu_output1, prec=1.e-3) | ||
| 96 | + self.assertRtolEqual(cpu_output, npu_output2, prec=1.e-3) | ||
| 97 | + | ||
| 98 | + def test_addbmm_transpose(self): | ||
| 99 | + shape_format = [ | ||
| 100 | + [[np.float16, 0, [4, 5]], [np.float16, 0, [10, 4, 7]], [np.float16, 0, [10, 5, 7]]], | ||
| 101 | + ] | ||
| 102 | + | ||
| 103 | + for item in shape_format: | ||
| 104 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 0, 100) | ||
| 105 | + cpu_input2, npu_input2 = create_common_tensor(item[1], 0, 100) | ||
| 106 | + cpu_input3, npu_input3 = create_common_tensor(item[2], 0, 100) | ||
| 107 | + | ||
| 108 | + scalar1 = np.random.uniform(0, 10) | ||
| 109 | + scalar2 = np.random.uniform(0, 10) | ||
| 110 | + | ||
| 111 | + cpu_transpose_output = self.cpu_op_transpose_exec( | ||
| 112 | + cpu_input1.float(), cpu_input2.float(), cpu_input3.float(), scalar1, scalar2) | ||
| 113 | + npu_transpose_output = self.npu_op_transpose_exec( | ||
| 114 | + npu_input1.float(), npu_input2.float(), npu_input3.float(), scalar1, scalar2) | ||
| 115 | + | ||
| 116 | + self.assertRtolEqual(cpu_transpose_output, npu_transpose_output, prec=1.e-3) | ||
| 117 | + | ||
| 118 | + | ||
| 119 | +if __name__ == "__main__": | ||
| 120 | + run_tests() | ||
| @@ -0,0 +1,263 @@ | |||
| 1 | +# Copyright (c) 2020 Huawei Technologies Co., Ltd | ||
| 2 | +# Copyright (c) 2019, Facebook CORPORATION. | ||
| 3 | +# All rights reserved. | ||
| 4 | +# | ||
| 5 | +# Licensed under the BSD 3-Clause License (the "License"); | ||
| 6 | +# you may not use this file except in compliance with the License. | ||
| 7 | +# You may obtain a copy of the License at | ||
| 8 | +# | ||
| 9 | +# https://opensource.org/licenses/BSD-3-Clause | ||
| 10 | +# | ||
| 11 | +# Unless required by applicable law or agreed to in writing, software | ||
| 12 | +# distributed under the License is distributed on an "AS IS" BASIS, | ||
| 13 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 14 | +# See the License for the specific language governing permissions and | ||
| 15 | +# limitations under the License. | ||
| 16 | + | ||
| 17 | + | ||
| 18 | +import copy | ||
| 19 | +import torch | ||
| 20 | +import numpy as np | ||
| 21 | + | ||
| 22 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 23 | + | ||
| 24 | + | ||
| 25 | +class TestAddcdiv(TestCase): | ||
| 26 | + | ||
| 27 | + def cpu_op_inp_input3_noncontiguous_exec(self, input1, input2, input3, scalar): | ||
| 28 | + input3_strided = input3.as_strided([2, 2], [1, 2], 2) | ||
| 29 | + input1.addcdiv_(input2, input3_strided, value=scalar) | ||
| 30 | + output = input1.numpy() | ||
| 31 | + return output | ||
| 32 | + | ||
| 33 | + def npu_op_inp_input3_noncontiguous_exec(self, input1, input2, input3, scalar): | ||
| 34 | + input1 = input1.to("npu") | ||
| 35 | + input2 = input2.to("npu") | ||
| 36 | + input3 = input3.to("npu") | ||
| 37 | + input3_as_strided = input3.as_strided([2, 2], [1, 2], 2) | ||
| 38 | + input1.addcdiv_(input2, input3_as_strided, value=scalar) | ||
| 39 | + output = input1.to("cpu") | ||
| 40 | + output = output.numpy() | ||
| 41 | + return output | ||
| 42 | + | ||
| 43 | + def non_zero_rand(self, size, dtype, device="npu"): | ||
| 44 | + if dtype.is_floating_point: | ||
| 45 | + a = torch.rand(size=size, dtype=dtype, device="cpu") | ||
| 46 | + a = a.to("npu") | ||
| 47 | + elif dtype == torch.uint8: | ||
| 48 | + a = torch.randint(1, 5, size=size, dtype=dtype, device="cpu").to(device) | ||
| 49 | + else: | ||
| 50 | + a = torch.randint(-5, 5, size=size, dtype=dtype, device="cpu").to(device) | ||
| 51 | + return a.type(dtype) | ||
| 52 | + | ||
| 53 | + def cpu_op_exec(self, input1, input2, input3, scalar): | ||
| 54 | + output = torch.addcdiv(input1, input2, input3, value=scalar) | ||
| 55 | + return output | ||
| 56 | + | ||
| 57 | + def npu_op_exec(self, input1, input2, input3, scalar): | ||
| 58 | + input1 = input1.to("npu") | ||
| 59 | + input2 = input2.to("npu") | ||
| 60 | + input3 = input3.to("npu") | ||
| 61 | + output = torch.addcdiv(input1, input2, input3, value=scalar) | ||
| 62 | + output = output.to("cpu") | ||
| 63 | + return output | ||
| 64 | + | ||
| 65 | + def cpu_op_exec_out(self, input1, input2, input3, scalar, output): | ||
| 66 | + torch.addcdiv(input1, input2, input3, value=scalar, out=output) | ||
| 67 | + output = output.numpy() | ||
| 68 | + return output | ||
| 69 | + | ||
| 70 | + def npu_op_exec_out(self, input1, input2, input3, scalar, output): | ||
| 71 | + input1 = input1.to("npu") | ||
| 72 | + input2 = input2.to("npu") | ||
| 73 | + input3 = input3.to("npu") | ||
| 74 | + output = output.to("npu") | ||
| 75 | + torch.addcdiv(input1, input2, input3, value=scalar, out=output) | ||
| 76 | + output = output.to("cpu").numpy() | ||
| 77 | + return output | ||
| 78 | + | ||
| 79 | + def cpu_op_inp_contiguous_exec(self, input1, input2, input3, scalar): | ||
| 80 | + input1.addcdiv_(input2, input3, value=scalar) | ||
| 81 | + output = input1.numpy() | ||
| 82 | + return output | ||
| 83 | + | ||
| 84 | + def npu_op_inp_contiguous_exec(self, input1, input2, input3, scalar): | ||
| 85 | + input1 = input1.to("npu") | ||
| 86 | + input2 = input2.to("npu") | ||
| 87 | + input3 = input3.to("npu") | ||
| 88 | + input1.addcdiv_(input2, input3, value=scalar) | ||
| 89 | + output = input1.to("cpu") | ||
| 90 | + output = output.numpy() | ||
| 91 | + return output | ||
| 92 | + | ||
| 93 | + def cpu_op_inp_input1_noncontiguous_exec(self, input1, input2, input3, scalar): | ||
| 94 | + input1_strided = input1.as_strided([2, 2], [1, 2], 2) | ||
| 95 | + input1_strided.addcdiv_(input2, input3, value=scalar) | ||
| 96 | + output = input1.numpy() | ||
| 97 | + return output | ||
| 98 | + | ||
| 99 | + def npu_op_inp_input1_noncontiguous_exec(self, input1, input2, input3, scalar): | ||
| 100 | + input1 = input1.to("npu") | ||
| 101 | + input2 = input2.to("npu") | ||
| 102 | + input3 = input3.to("npu") | ||
| 103 | + input1_as_strided = input1.as_strided([2, 2], [1, 2], 2) | ||
| 104 | + input1_as_strided.addcdiv_(input2, input3, value=scalar) | ||
| 105 | + output = input1.to("cpu") | ||
| 106 | + output = output.numpy() | ||
| 107 | + return output | ||
| 108 | + | ||
| 109 | + def cpu_op_inp_input2_noncontiguous_exec(self, input1, input2, input3, scalar): | ||
| 110 | + input2_strided = input2.as_strided([2, 2], [1, 2], 2) | ||
| 111 | + input1.addcdiv_(input2_strided, input3, value=scalar) | ||
| 112 | + output = input1.numpy() | ||
| 113 | + return output | ||
| 114 | + | ||
| 115 | + def npu_op_inp_input2_noncontiguous_exec(self, input1, input2, input3, scalar): | ||
| 116 | + input1 = input1.to("npu") | ||
| 117 | + input3 = input3.to("npu") | ||
| 118 | + input2 = input2.to("npu") | ||
| 119 | + input2_as_strided = input2.as_strided([2, 2], [1, 2], 2) | ||
| 120 | + input1.addcdiv_(input2_as_strided, input3, value=scalar) | ||
| 121 | + output = input1.to("cpu") | ||
| 122 | + output = output.numpy() | ||
| 123 | + return output | ||
| 124 | + | ||
| 125 | + def generate_data(self, min1, max1, shape, dtype): | ||
| 126 | + input1 = np.random.uniform(min1, max1, shape).astype(dtype) | ||
| 127 | + input2 = np.random.uniform(min1, max1, shape).astype(dtype) | ||
| 128 | + input3 = np.random.uniform(min1, max1, shape).astype(dtype) | ||
| 129 | + npu_input1 = torch.from_numpy(input1) | ||
| 130 | + npu_input2 = torch.from_numpy(input2) | ||
| 131 | + npu_input3 = torch.from_numpy(input3) | ||
| 132 | + return npu_input1, npu_input2, npu_input3 | ||
| 133 | + | ||
| 134 | + def generate_single_data(self, min1, max1, shape, dtype): | ||
| 135 | + inputs = np.random.uniform(min1, max1, shape).astype(dtype) | ||
| 136 | + npu_input = torch.from_numpy(inputs) | ||
| 137 | + return npu_input | ||
| 138 | + | ||
| 139 | + def generate_scalar(self, min1, max1): | ||
| 140 | + scalar = np.random.uniform(min1, max1) | ||
| 141 | + return scalar | ||
| 142 | + | ||
| 143 | + def generate_int_scalar(self, min1, max1): | ||
| 144 | + scalar = np.random.randint(min1, max1) | ||
| 145 | + return scalar | ||
| 146 | + | ||
| 147 | + def _test_addcdiv(self, a, alpha, b, c): | ||
| 148 | + actual = torch.addcdiv(a, b, c, value=alpha) | ||
| 149 | + if not actual.dtype.is_floating_point: | ||
| 150 | + alpha = int(alpha) | ||
| 151 | + try: | ||
| 152 | + expected = a + (alpha * b) / c | ||
| 153 | + except ZeroDivisionError: | ||
| 154 | + print("Divide-by-Zero Error!!") | ||
| 155 | + self.assertTrue(torch.allclose(expected.to("cpu"), actual.to("cpu"), equal_nan=True)) | ||
| 156 | + self.assertRtolEqual(actual.to("cpu"), torch.addcdiv(a, alpha, b, c).to("cpu")) | ||
| 157 | + | ||
| 158 | + def test_addcdiv(self, device="npu"): | ||
| 159 | + """NPU does not support numpy.bool. | ||
| 160 | + | ||
| 161 | + with self.maybeWarnsRegex(UserWarning, "This overload of addcdiv is deprecated"): | ||
| 162 | + self.assertRtolEqual(actual.to("cpu"), torch.addcdiv(a, alpha, b, c).to("cpu")) | ||
| 163 | + | ||
| 164 | + """ | ||
| 165 | + dtype_list = [torch.uint8, torch.int8, torch.int16, torch.int32, torch.int64, | ||
| 166 | + torch.float64, torch.complex64, torch.complex128] | ||
| 167 | + for dtype in torch.testing.get_all_math_dtypes(device): | ||
| 168 | + if dtype in dtype_list: | ||
| 169 | + continue | ||
| 170 | + self._test_addcdiv( | ||
| 171 | + self.non_zero_rand((2, 2), dtype=dtype, device=device), | ||
| 172 | + 0.5, | ||
| 173 | + self.non_zero_rand((2, 2), dtype=dtype, device=device), | ||
| 174 | + self.non_zero_rand((2, 2), dtype=dtype, device=device)) | ||
| 175 | + | ||
| 176 | + def test_addcdiv_float32(self): | ||
| 177 | + npu_input1, npu_input2, npu_input3 = self.generate_data(1, 100, (5, 3), np.float32) | ||
| 178 | + scalar = self.generate_scalar(1, 10) | ||
| 179 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2, npu_input3, scalar) | ||
| 180 | + npu_output = self.npu_op_exec(npu_input1, npu_input2, npu_input3, scalar) | ||
| 181 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 182 | + | ||
| 183 | + def test_addcdiv_float32_out(self): | ||
| 184 | + npu_input1, npu_input2, npu_input3 = self.generate_data(1, 100, (5, 3), np.float32) | ||
| 185 | + scalar = self.generate_scalar(1, 10) | ||
| 186 | + npu_input4 = self.generate_single_data(1, 100, (5, 3), np.float32) | ||
| 187 | + cpu_output = self.cpu_op_exec_out(npu_input1, npu_input2, npu_input3, scalar, npu_input4) | ||
| 188 | + npu_output = self.npu_op_exec_out(npu_input1, npu_input2, npu_input3, scalar, npu_input4) | ||
| 189 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 190 | + | ||
| 191 | + def test_addcdiv_float32_broadcast(self): | ||
| 192 | + npu_input1 = self.generate_single_data(1, 100, (5, 3, 1), np.float32) | ||
| 193 | + npu_input2 = self.generate_single_data(1, 100, (5, 1, 5), np.float32) | ||
| 194 | + npu_input3 = self.generate_single_data(1, 100, (1, 1, 5), np.float32) | ||
| 195 | + scalar = self.generate_scalar(1, 10) | ||
| 196 | + cpu_output = self.cpu_op_exec(npu_input1, npu_input2, npu_input3, scalar) | ||
| 197 | + npu_output = self.npu_op_exec(npu_input1, npu_input2, npu_input3, scalar) | ||
| 198 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 199 | + | ||
| 200 | + def test_addcdiv_inp_contiguous_float32(self): | ||
| 201 | + npu_input1, npu_input2, npu_input3 = self.generate_data(1, 100, (5, 3), np.float32) | ||
| 202 | + cpu_input1 = copy.deepcopy(npu_input1) | ||
| 203 | + cpu_input2 = copy.deepcopy(npu_input2) | ||
| 204 | + cpu_input3 = copy.deepcopy(npu_input3) | ||
| 205 | + scalar = self.generate_int_scalar(1, 10) | ||
| 206 | + cpu_output = self.cpu_op_inp_contiguous_exec(cpu_input1, cpu_input2, cpu_input3, scalar) | ||
| 207 | + npu_output = self.npu_op_inp_contiguous_exec(npu_input1, npu_input2, npu_input3, scalar) | ||
| 208 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 209 | + | ||
| 210 | + def test_addcdiv_inp_input1_noncontiguous_float32(self): | ||
| 211 | + npu_input1 = self.generate_single_data(1, 100, (4, 3), np.float32) | ||
| 212 | + npu_input2 = self.generate_single_data(1, 100, (2, 2), np.float32) | ||
| 213 | + npu_input3 = self.generate_single_data(1, 100, (2, 2), np.float32) | ||
| 214 | + cpu_input1 = copy.deepcopy(npu_input1) | ||
| 215 | + cpu_input2 = copy.deepcopy(npu_input2) | ||
| 216 | + cpu_input3 = copy.deepcopy(npu_input3) | ||
| 217 | + scalar = self.generate_int_scalar(1, 10) | ||
| 218 | + cpu_output = self.cpu_op_inp_input1_noncontiguous_exec(cpu_input1, cpu_input2, cpu_input3, scalar) | ||
| 219 | + npu_output = self.npu_op_inp_input1_noncontiguous_exec(npu_input1, npu_input2, npu_input3, scalar) | ||
| 220 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 221 | + | ||
| 222 | + def test_addcdiv_inp_input2_noncontiguous_float32(self): | ||
| 223 | + npu_input1 = self.generate_single_data(1, 100, (2, 2), np.float32) | ||
| 224 | + npu_input2 = self.generate_single_data(1, 100, (4, 3), np.float32) | ||
| 225 | + npu_input3 = self.generate_single_data(1, 100, (2, 2), np.float32) | ||
| 226 | + cpu_input1 = copy.deepcopy(npu_input1) | ||
| 227 | + cpu_input2 = copy.deepcopy(npu_input2) | ||
| 228 | + cpu_input3 = copy.deepcopy(npu_input3) | ||
| 229 | + scalar = self.generate_int_scalar(1, 10) | ||
| 230 | + cpu_output = self.cpu_op_inp_input2_noncontiguous_exec(cpu_input1, cpu_input2, cpu_input3, scalar) | ||
| 231 | + npu_output = self.npu_op_inp_input2_noncontiguous_exec(npu_input1, npu_input2, npu_input3, scalar) | ||
| 232 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 233 | + | ||
| 234 | + def test_addcdiv_inp_input3_noncontiguous_float32(self): | ||
| 235 | + npu_input1 = self.generate_single_data(1, 100, (2, 2), np.float32) | ||
| 236 | + npu_input2 = self.generate_single_data(1, 100, (2, 2), np.float32) | ||
| 237 | + npu_input3 = self.generate_single_data(1, 100, (4, 3), np.float32) | ||
| 238 | + cpu_input1 = copy.deepcopy(npu_input1) | ||
| 239 | + cpu_input2 = copy.deepcopy(npu_input2) | ||
| 240 | + cpu_input3 = copy.deepcopy(npu_input3) | ||
| 241 | + scalar = self.generate_int_scalar(1, 10) | ||
| 242 | + cpu_output = self.cpu_op_inp_input3_noncontiguous_exec(cpu_input1, cpu_input2, cpu_input3, scalar) | ||
| 243 | + npu_output = self.npu_op_inp_input3_noncontiguous_exec(npu_input1, npu_input2, npu_input3, scalar) | ||
| 244 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 245 | + | ||
| 246 | + def test_addcdiv_float64(self): | ||
| 247 | + cpu_input1, cpu_input2, cpu_input3 = self.generate_data(1, 100, (5, 3), np.float64) | ||
| 248 | + scalar = self.generate_scalar(1, 10) | ||
| 249 | + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2, cpu_input3, scalar) | ||
| 250 | + npu_output = self.npu_op_exec(cpu_input1, cpu_input2, cpu_input3, scalar) | ||
| 251 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 252 | + | ||
| 253 | + def test_addcdiv_float16(self): | ||
| 254 | + cpu_input1, cpu_input2, cpu_input3 = self.generate_data(1, 100, (5, 3), np.float16) | ||
| 255 | + scalar = self.generate_scalar(1, 10) | ||
| 256 | + cpu_output = self.cpu_op_exec(cpu_input1.float(), cpu_input2.float(), cpu_input3.float(), scalar) | ||
| 257 | + npu_output = self.npu_op_exec(cpu_input1, cpu_input2, cpu_input3, scalar) | ||
| 258 | + cpu_output = cpu_output.to(npu_output.dtype) | ||
| 259 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 260 | + | ||
| 261 | + | ||
| 262 | +if __name__ == "__main__": | ||
| 263 | + run_tests() | ||
| @@ -0,0 +1,110 @@ | |||
| 1 | +# Copyright (c) 2020, Huawei Technologies.All rights reserved. | ||
| 2 | +# | ||
| 3 | +# Licensed under the BSD 3-Clause License (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 | +# https://opensource.org/licenses/BSD-3-Clause | ||
| 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 | +import sys | ||
| 16 | + | ||
| 17 | +import torch | ||
| 18 | +import numpy as np | ||
| 19 | + | ||
| 20 | +import torch_npu | ||
| 21 | + | ||
| 22 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 23 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 24 | + | ||
| 25 | + | ||
| 26 | +class TestAddCMul(TestCase): | ||
| 27 | + def generate_data(self, min_d, max_d, shape, dtype): | ||
| 28 | + input1 = np.random.uniform(min_d, max_d, shape).astype(dtype) | ||
| 29 | + input2 = np.random.uniform(min_d, max_d, shape).astype(dtype) | ||
| 30 | + input3 = np.random.uniform(min_d, max_d, shape).astype(dtype) | ||
| 31 | + npu_input1 = torch.from_numpy(input1) | ||
| 32 | + npu_input2 = torch.from_numpy(input2) | ||
| 33 | + npu_input3 = torch.from_numpy(input3) | ||
| 34 | + | ||
| 35 | + return npu_input1, npu_input2, npu_input3 | ||
| 36 | + | ||
| 37 | + def generate_output_data(self, min_d, max_d, shape, dtype): | ||
| 38 | + output_y = np.random.uniform(min_d, max_d, shape).astype(dtype) | ||
| 39 | + npu_output_y = torch.from_numpy(output_y) | ||
| 40 | + return npu_output_y | ||
| 41 | + | ||
| 42 | + def cpu_op_exec(self, input1, input2, input3, scalar): | ||
| 43 | + output = torch.addcmul(input1, input2, input3, value=scalar) | ||
| 44 | + output = output.numpy() | ||
| 45 | + return output | ||
| 46 | + | ||
| 47 | + def cpu_op_exec_out(self, input1, input2, input3, scalar, output_y): | ||
| 48 | + output = output_y | ||
| 49 | + torch.addcmul(input1, input2, input3, value=scalar, out=output_y) | ||
| 50 | + output = output.numpy() | ||
| 51 | + return output | ||
| 52 | + | ||
| 53 | + def npu_op_exec(self, input1, input2, input3, scalar): | ||
| 54 | + input1 = input1.to("npu") | ||
| 55 | + input2 = input2.to("npu") | ||
| 56 | + input3 = input3.to("npu") | ||
| 57 | + output = torch.addcmul(input1, input2, input3, value=scalar) | ||
| 58 | + output = output.to("cpu") | ||
| 59 | + output = output.numpy() | ||
| 60 | + return output | ||
| 61 | + | ||
| 62 | + def npu_op_exec_out(self, input1, input2, input3, scalar, output_y): | ||
| 63 | + input1 = input1.to("npu") | ||
| 64 | + input2 = input2.to("npu") | ||
| 65 | + input3 = input3.to("npu") | ||
| 66 | + output = output_y.to("npu") | ||
| 67 | + torch.addcmul(input1, input2, input3, value=scalar, out=output) | ||
| 68 | + output = output.to("cpu") | ||
| 69 | + output = output.numpy() | ||
| 70 | + return output | ||
| 71 | + | ||
| 72 | + def test_addcmul_3_3_float32(self, device="npu"): | ||
| 73 | + input1, input2, input3 = self.generate_data(0, 100, (3, 3), np.float32) | ||
| 74 | + cpu_output = self.cpu_op_exec(input1, input2, input3, 0.5) | ||
| 75 | + npu_output = self.npu_op_exec(input1, input2, input3, 0.5) | ||
| 76 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 77 | + | ||
| 78 | + def test_addcmul_10_10_float32(self, device="npu"): | ||
| 79 | + input1, input2, input3 = self.generate_data(0, 100, (10, 10), np.float32) | ||
| 80 | + cpu_output = self.cpu_op_exec(input1, input2, input3, 0.5) | ||
| 81 | + npu_output = self.npu_op_exec(input1, input2, input3, 0.5) | ||
| 82 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 83 | + | ||
| 84 | + def test_addcmul_3_3_float16(self, device="npu"): | ||
| 85 | + input1, input2, input3 = self.generate_data(0, 100, (3, 3), np.float16) | ||
| 86 | + input1_cpu = input1.float() | ||
| 87 | + input2_cpu = input2.float() | ||
| 88 | + input3_cpu = input3.float() | ||
| 89 | + cpu_output = self.cpu_op_exec(input1_cpu, input2_cpu, input3_cpu, 0.5).astype(np.float16) | ||
| 90 | + npu_output = self.npu_op_exec(input1, input2, input3, 0.5) | ||
| 91 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 92 | + | ||
| 93 | + def test_addcmul_10_10_float16(self, device="npu"): | ||
| 94 | + input1, input2, input3 = self.generate_data(0, 100, (10, 10), np.float16) | ||
| 95 | + input1_cpu = input1.float() | ||
| 96 | + input2_cpu = input2.float() | ||
| 97 | + input3_cpu = input3.float() | ||
| 98 | + cpu_output = self.cpu_op_exec(input1_cpu, input2_cpu, input3_cpu, 0.5).astype(np.float16) | ||
| 99 | + npu_output = self.npu_op_exec(input1, input2, input3, 0.5) | ||
| 100 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 101 | + | ||
| 102 | + def test_addcmul_10_23_float32(self, device="npu"): | ||
| 103 | + input1, input2, input3 = self.generate_data(0, 100, (10, 23), np.float32) | ||
| 104 | + cpu_output = self.cpu_op_exec(input1, input2, input3, 0.5) | ||
| 105 | + npu_output = self.npu_op_exec(input1, input2, input3, 0.5) | ||
| 106 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 107 | + | ||
| 108 | + | ||
| 109 | +if __name__ == "__main__": | ||
| 110 | + run_tests() | ||
| @@ -0,0 +1,103 @@ | |||
| 1 | +# Copyright (c) 2020, Huawei Technologies.All rights reserved. | ||
| 2 | +# | ||
| 3 | +# Licensed under the BSD 3-Clause License (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 | +# https://opensource.org/licenses/BSD-3-Clause | ||
| 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 | + | ||
| 16 | +import torch | ||
| 17 | +import numpy as np | ||
| 18 | +import torch_npu | ||
| 19 | + | ||
| 20 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 21 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 22 | + | ||
| 23 | + | ||
| 24 | +torch.npu.set_compile_mode(jit_compile=False) | ||
| 25 | +torch.npu.config.allow_internal_format = False | ||
| 26 | + | ||
| 27 | + | ||
| 28 | +class TestAddmv(TestCase): | ||
| 29 | + def cpu_op_exec(self, a, b, c, alpha, beta): | ||
| 30 | + output = torch.addmv(c, a, b, alpha=alpha, beta=beta) | ||
| 31 | + output = output.numpy() | ||
| 32 | + return output | ||
| 33 | + | ||
| 34 | + def npu_op_exec(self, a, b, c, alpha, beta): | ||
| 35 | + output = torch.addmv(c, a, b, alpha=alpha, beta=beta) | ||
| 36 | + output = output.to('cpu') | ||
| 37 | + output = output.numpy() | ||
| 38 | + return output | ||
| 39 | + | ||
| 40 | + # pylint:disable = huawei-too-many-arguments | ||
| 41 | + def npu_op_exec_out(self, a, b, c, beta, alpha, input1): | ||
| 42 | + torch.addmv(c, a, b, alpha=alpha, beta=beta, out=input1) | ||
| 43 | + output = input1.to("cpu") | ||
| 44 | + output = output.numpy() | ||
| 45 | + return output | ||
| 46 | + | ||
| 47 | + def test_addmv_fp16(self): | ||
| 48 | + shape_format = [ | ||
| 49 | + [[np.float16, 3, (2, 3)], [np.float16, 3, (3,)], [np.float16, 3, (2,)]] | ||
| 50 | + ] | ||
| 51 | + for item in shape_format: | ||
| 52 | + input_a, npu_input_a = create_common_tensor(item[0], -2, 2) | ||
| 53 | + input_b, npu_input_b = create_common_tensor(item[1], -2, 2) | ||
| 54 | + input_c, npu_input_c = create_common_tensor(item[2], -2, 2) | ||
| 55 | + | ||
| 56 | + input_a = input_a.to(torch.float32) | ||
| 57 | + input_b = input_b.to(torch.float32) | ||
| 58 | + input_c = input_c.to(torch.float32) | ||
| 59 | + | ||
| 60 | + cpu_output = self.cpu_op_exec(input_a, input_b, input_c, 1, 1) | ||
| 61 | + npu_output = self.npu_op_exec(npu_input_a, npu_input_b, npu_input_c, 1, 1) | ||
| 62 | + | ||
| 63 | + cpu_output = cpu_output.astype(np.float16) | ||
| 64 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 65 | + | ||
| 66 | + def test_addmv_out_fp16(self): | ||
| 67 | + shape_format = [ | ||
| 68 | + [[np.float16, 3, (2, 3)], [np.float16, 3, (3,)], [np.float16, 3, (2,)], [np.float16, 3, (10,)]] | ||
| 69 | + ] | ||
| 70 | + for item in shape_format: | ||
| 71 | + input_a, npu_input_a = create_common_tensor(item[0], -2, 2) | ||
| 72 | + input_b, npu_input_b = create_common_tensor(item[1], -2, 2) | ||
| 73 | + input_c, npu_input_c = create_common_tensor(item[2], -2, 2) | ||
| 74 | + _, npu_input = create_common_tensor(item[3], -2, 2) | ||
| 75 | + | ||
| 76 | + input_a = input_a.to(torch.float32) | ||
| 77 | + input_b = input_b.to(torch.float32) | ||
| 78 | + input_c = input_c.to(torch.float32) | ||
| 79 | + | ||
| 80 | + cpu_output = self.cpu_op_exec(input_a, input_b, input_c, 1, 1) | ||
| 81 | + npu_output = self.npu_op_exec_out(npu_input_a, npu_input_b, npu_input_c, 1, 1, npu_input) | ||
| 82 | + cpu_output = cpu_output.astype(np.float16) | ||
| 83 | + | ||
| 84 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 85 | + | ||
| 86 | + def test_addmv_fp32(self): | ||
| 87 | + shape_format = [ | ||
| 88 | + [[np.float16, 0, (2, 3)], [np.float16, 0, (3,)], [np.float16, 0, (2,)]], | ||
| 89 | + [[np.float16, 0, (3168, 320)], [np.float16, 0, (320,)], [np.float16, 0, (3168,)]], | ||
| 90 | + ] | ||
| 91 | + for item in shape_format: | ||
| 92 | + input_a, npu_input_a = create_common_tensor(item[0], -2, 2) | ||
| 93 | + input_b, npu_input_b = create_common_tensor(item[1], -2, 2) | ||
| 94 | + input_c, npu_input_c = create_common_tensor(item[2], -2, 2) | ||
| 95 | + | ||
| 96 | + cpu_output = self.cpu_op_exec(input_a.float(), input_b.float(), input_c.float(), 1, 1) | ||
| 97 | + npu_output = self.npu_op_exec(npu_input_a.float(), npu_input_b.float(), npu_input_c.float(), 1, 1) | ||
| 98 | + | ||
| 99 | + self.assertRtolEqual(cpu_output, npu_output, prec=1.e-3) | ||
| 100 | + | ||
| 101 | + | ||
| 102 | +if __name__ == "__main__": | ||
| 103 | + run_tests() | ||
| @@ -0,0 +1,89 @@ | |||
| 1 | +# Copyright (c) 2020, Huawei Technologies.All rights reserved. | ||
| 2 | +# | ||
| 3 | +# Licensed under the BSD 3-Clause License (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 | +# https://opensource.org/licenses/BSD-3-Clause | ||
| 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 | +import torch | ||
| 16 | +import torch_npu | ||
| 17 | + | ||
| 18 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 19 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 20 | + | ||
| 21 | + | ||
| 22 | +class TestApplyAdam(TestCase): | ||
| 23 | + def test_apply_adam(self): | ||
| 24 | + var1 = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 25 | + m1 = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 26 | + v1 = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 27 | + grad1 = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 28 | + var2 = var1.to(torch.half) | ||
| 29 | + m2 = m1.to(torch.half) | ||
| 30 | + v2 = v1.to(torch.half) | ||
| 31 | + grad2 = grad1.to(torch.half) | ||
| 32 | + res1, _, v1_o = torch_npu.npu_apply_adam(1, 1, 0.2, 0.2, 0.2, 0.2, grad1, False, False, out=(var1, m1, v1)) | ||
| 33 | + res2, _, v2_o = torch_npu.npu_apply_adam(1, 1, 0.2, 0.2, 0.2, 0.2, grad2, False, False, out=(var2, m2, v2)) | ||
| 34 | + expect_vo = torch.tensor([[[[2.2156, -0.1393], | ||
| 35 | + [0.6441, 0.3087]], | ||
| 36 | + [[0.9008, -0.0295], | ||
| 37 | + [0.0776, 0.0773]]], | ||
| 38 | + [[[0.1105, 1.0725], | ||
| 39 | + [0.8731, 0.4582]], | ||
| 40 | + [[0.1653, 0.3091], | ||
| 41 | + [0.3175, 0.0998]]]], dtype=torch.float32) | ||
| 42 | + self.assertRtolEqual(expect_vo, v1_o.cpu()) | ||
| 43 | + self.assertRtolEqual(expect_vo.to(torch.half), v2_o.cpu()) | ||
| 44 | + | ||
| 45 | + def test_apply_adam_out_fp32(self): | ||
| 46 | + var = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 47 | + m = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 48 | + v = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 49 | + grad = torch.randn(2, 2, 2, 2, dtype=torch.float32).to("npu") | ||
| 50 | + bt1p = 0.9 | ||
| 51 | + bt2p = 0.9 | ||
| 52 | + lr = 0.2 | ||
| 53 | + bt1 = 0.2 | ||
| 54 | + bt2 = 0.2 | ||
| 55 | + ep = 0.2 | ||
| 56 | + ul = False | ||
| 57 | + un = False | ||
| 58 | + var_o, m_o, v_o = torch.npu_apply_adam(bt1p, bt2p, lr, bt1, bt2, ep, grad, ul, un, out=(var, m, v)) | ||
| 59 | + expect_varo = torch.tensor([[[[-0.1842, 0.6028], | ||
| 60 | + [0.4803, -0.3156]], | ||
| 61 | + [[0.9466, -0.9984], | ||
| 62 | + [-0.1592, -0.1908]]], | ||
| 63 | + [[[-0.9448, 0.6290], | ||
| 64 | + [0.0694, 0.3411]], | ||
| 65 | + [[-0.0987, 0.5370], | ||
| 66 | + [-0.5744, 0.3317]]]]) | ||
| 67 | + expect_mo = torch.tensor([[[[-1.4744, 0.1481], | ||
| 68 | + [-0.6954, 0.1557]], | ||
| 69 | + [[-0.6090, 0.4566], | ||
| 70 | + [-0.4863, 0.7218]]], | ||
| 71 | + [[[0.5437, -1.1527], | ||
| 72 | + [0.6547, -0.5491]], | ||
| 73 | + [[-0.2247, -0.7165], | ||
| 74 | + [0.7963, -0.1283]]]]) | ||
| 75 | + expect_vo = torch.tensor([[[[2.2156, -0.1393], | ||
| 76 | + [0.6441, 0.3087]], | ||
| 77 | + [[0.9008, -0.0295], | ||
| 78 | + [0.0776, 0.0773]]], | ||
| 79 | + [[[0.1105, 1.0725], | ||
| 80 | + [0.8731, 0.4582]], | ||
| 81 | + [[0.1653, 0.3091], | ||
| 82 | + [0.3175, 0.0998]]]]) | ||
| 83 | + self.assertRtolEqual(expect_varo, var_o.cpu()) | ||
| 84 | + self.assertRtolEqual(expect_mo, m_o.cpu()) | ||
| 85 | + self.assertRtolEqual(expect_vo, v_o.cpu()) | ||
| 86 | + | ||
| 87 | + | ||
| 88 | +if __name__ == "__main__": | ||
| 89 | + run_tests() | ||
| @@ -0,0 +1,145 @@ | |||
| 1 | +# Copyright (c) 2023, Huawei Technologies.All rights reserved. | ||
| 2 | +# | ||
| 3 | +# Licensed under the BSD 3-Clause License (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 | +# https://opensource.org/licenses/BSD-3-Clause | ||
| 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 | + | ||
| 16 | +import torch | ||
| 17 | +import numpy as np | ||
| 18 | + | ||
| 19 | +import torch_npu | ||
| 20 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 21 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 22 | + | ||
| 23 | + | ||
| 24 | +class TestApplyAdam(TestCase): | ||
| 25 | + | ||
| 26 | + # pylint:disable = huawei-too-many-arguments | ||
| 27 | + def cpu_op_exec(self, var, m, v, beta1_power, beta2_power, lr, weight_decay, | ||
| 28 | + beta1, beta2, eps, grad, max_grad_norm, amsgrad, maximize): | ||
| 29 | + if amsgrad: | ||
| 30 | + max_grad_norm = np.random.uniform(-5.0, 5.0, var_shape).astype(dtype) | ||
| 31 | + gt = -grad if maximize else grad | ||
| 32 | + m_out = m * beta1 - (beta1 + (-1)) * gt | ||
| 33 | + v_out = v * beta2 - (beta2 + (-1)) * gt * gt | ||
| 34 | + var_t = var * (1 + (-lr * weight_decay)) | ||
| 35 | + beta1_power_out = beta1_power * beta1 | ||
| 36 | + beta2_power_out = beta2_power * beta2 | ||
| 37 | + if amsgrad: | ||
| 38 | + max_grad_norm_out = np.maximum(max_grad_norm, v_out) | ||
| 39 | + try: | ||
| 40 | + denom = np.sqrt(max_grad_norm_out / (1 - beta2_power_out)) + eps | ||
| 41 | + except ZeroDivisionError: | ||
| 42 | + print("Divide-by-Zero Error!") | ||
| 43 | + else: | ||
| 44 | + max_grad_norm_out = None | ||
| 45 | + try: | ||
| 46 | + denom = np.sqrt(v_out / (1 - beta2_power_out)) + eps | ||
| 47 | + except ZeroDivisionError: | ||
| 48 | + print("Divide-by-Zero Error!") | ||
| 49 | + try: | ||
| 50 | + var_out = var_t + (-lr * m_out / (1 - beta1_power_out)) / denom | ||
| 51 | + except ZeroDivisionError: | ||
| 52 | + print("Divide-by-Zero Error!") | ||
| 53 | + return var_out, m_out, v_out | ||
| 54 | + | ||
| 55 | + # pylint:disable = huawei-too-many-arguments | ||
| 56 | + def npu_op_exec(self, var_tensor, m_tensor, v_tensor, beta1_power, beta2_power, lr, weight_decay, | ||
| 57 | + beta1, beta2, eps, grad, max_grad_norm, amsgrad, maximize): | ||
| 58 | + var_out_npu, m_out_npu, v_out_npu = torch_npu.npu_apply_adam_w(beta1_power[0], | ||
| 59 | + beta2_power[0], lr[0], weight_decay[0], beta1[0], | ||
| 60 | + beta2[0], eps[0], grad, max_grad_norm, | ||
| 61 | + amsgrad, maximize, | ||
| 62 | + out=(var_tensor, m_tensor, v_tensor)) | ||
| 63 | + return var_out_npu, m_out_npu, v_out_npu | ||
| 64 | + | ||
| 65 | + def test_apply_adam_w_maximize_true(self): | ||
| 66 | + amsgrad = False # at present, the operator supports only false. | ||
| 67 | + maximize = True | ||
| 68 | + scalar_shape = [1] | ||
| 69 | + dtype = np.float32 | ||
| 70 | + shape_format = [ | ||
| 71 | + [np.float32, 2, (21130, 512)], | ||
| 72 | + ] | ||
| 73 | + var_cpu, var_npu = create_common_tensor(shape_format[0], 10.0, 20.0) | ||
| 74 | + m_cpu, m_npu = create_common_tensor(shape_format[0], 5.0, 10.0) | ||
| 75 | + v_cpu, v_npu = create_common_tensor(shape_format[0], 0.1, 5.0) | ||
| 76 | + grad_cpu, grad_npu = create_common_tensor(shape_format[0], -5.0, 5.0) | ||
| 77 | + | ||
| 78 | + var_cpu = var_cpu.numpy() | ||
| 79 | + m_cpu = m_cpu.numpy() | ||
| 80 | + v_cpu = v_cpu.numpy() | ||
| 81 | + grad_cpu = grad_cpu.numpy() | ||
| 82 | + | ||
| 83 | + beta1_power = np.random.uniform(0.0, 1.0, scalar_shape).astype(dtype) | ||
| 84 | + beta2_power = np.random.uniform(0.0, 1.0, scalar_shape).astype(dtype) | ||
| 85 | + lr = np.random.uniform(0.0001, 0.1, scalar_shape).astype(dtype) | ||
| 86 | + weight_decay = np.random.uniform(0.001, 0.1, scalar_shape).astype(dtype) | ||
| 87 | + beta1 = np.random.uniform(0.5, 1.0, scalar_shape).astype(dtype) | ||
| 88 | + beta2 = np.random.uniform(0.5, 1.0, scalar_shape).astype(dtype) | ||
| 89 | + eps = np.random.uniform(0.00001, 0.01, scalar_shape).astype(dtype) | ||
| 90 | + max_grad_norm = None | ||
| 91 | + | ||
| 92 | + var_ret_cpu, m_ret_cpu, v_ret_cpu = self.cpu_op_exec(var_cpu, m_cpu, v_cpu, beta1_power, beta2_power, lr, | ||
| 93 | + weight_decay, beta1, beta2, eps, grad_cpu, max_grad_norm, | ||
| 94 | + amsgrad, maximize) | ||
| 95 | + | ||
| 96 | + var_ret_npu, m_ret_npu, v_ret_npu = self.npu_op_exec(var_npu, m_npu, v_npu, beta1_power, | ||
| 97 | + beta2_power, lr, weight_decay, beta1, beta2, eps, grad_npu, | ||
| 98 | + max_grad_norm, amsgrad, maximize) | ||
| 99 | + | ||
| 100 | + self.assertRtolEqual(var_ret_cpu, var_ret_npu.cpu().numpy()) | ||
| 101 | + self.assertRtolEqual(m_ret_cpu, m_ret_npu.cpu().numpy()) | ||
| 102 | + self.assertRtolEqual(v_ret_cpu, v_ret_npu.cpu().numpy()) | ||
| 103 | + | ||
| 104 | + def test_apply_adam_w_maximize_false(self): | ||
| 105 | + amsgrad = False # at present, the operator supports only false. | ||
| 106 | + maximize = False | ||
| 107 | + scalar_shape = [1] | ||
| 108 | + dtype = np.float32 | ||
| 109 | + shape_format = [ | ||
| 110 | + [np.float32, 2, (21130, 512)], | ||
| 111 | + ] | ||
| 112 | + var_cpu, var_npu = create_common_tensor(shape_format[0], 10.0, 20.0) | ||
| 113 | + m_cpu, m_npu = create_common_tensor(shape_format[0], 5.0, 10.0) | ||
| 114 | + v_cpu, v_npu = create_common_tensor(shape_format[0], 0.1, 5.0) | ||
| 115 | + grad_cpu, grad_npu = create_common_tensor(shape_format[0], -5.0, 5.0) | ||
| 116 | + | ||
| 117 | + var_cpu = var_cpu.numpy() | ||
| 118 | + m_cpu = m_cpu.numpy() | ||
| 119 | + v_cpu = v_cpu.numpy() | ||
| 120 | + grad_cpu = grad_cpu.numpy() | ||
| 121 | + | ||
| 122 | + beta1_power = np.random.uniform(0.0, 1.0, scalar_shape).astype(dtype) | ||
| 123 | + beta2_power = np.random.uniform(0.0, 1.0, scalar_shape).astype(dtype) | ||
| 124 | + lr = np.random.uniform(0.0001, 0.1, scalar_shape).astype(dtype) | ||
| 125 | + weight_decay = np.random.uniform(0.001, 0.1, scalar_shape).astype(dtype) | ||
| 126 | + beta1 = np.random.uniform(0.5, 1.0, scalar_shape).astype(dtype) | ||
| 127 | + beta2 = np.random.uniform(0.5, 1.0, scalar_shape).astype(dtype) | ||
| 128 | + eps = np.random.uniform(0.00001, 0.01, scalar_shape).astype(dtype) | ||
| 129 | + max_grad_norm = None | ||
| 130 | + | ||
| 131 | + var_ret_cpu, m_ret_cpu, v_ret_cpu = self.cpu_op_exec(var_cpu, m_cpu, v_cpu, beta1_power, beta2_power, lr, | ||
| 132 | + weight_decay, beta1, beta2, eps, grad_cpu, max_grad_norm, | ||
| 133 | + amsgrad, maximize) | ||
| 134 | + | ||
| 135 | + var_ret_npu, m_ret_npu, v_ret_npu = self.npu_op_exec(var_npu, m_npu, v_npu, beta1_power, | ||
| 136 | + beta2_power, lr, weight_decay, beta1, beta2, eps, grad_npu, | ||
| 137 | + max_grad_norm, amsgrad, maximize) | ||
| 138 | + | ||
| 139 | + self.assertRtolEqual(var_ret_cpu, var_ret_npu.cpu().numpy()) | ||
| 140 | + self.assertRtolEqual(m_ret_cpu, m_ret_npu.cpu().numpy()) | ||
| 141 | + self.assertRtolEqual(v_ret_cpu, v_ret_npu.cpu().numpy()) | ||
| 142 | + | ||
| 143 | + | ||
| 144 | +if __name__ == "__main__": | ||
| 145 | + run_tests() | ||
| @@ -0,0 +1,38 @@ | |||
| 1 | +# Copyright (c) 2020, Huawei Technologies.All rights reserved. | ||
| 2 | +# | ||
| 3 | +# Licensed under the BSD 3-Clause License (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 | +# https://opensource.org/licenses/BSD-3-Clause | ||
| 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 | +import torch | ||
| 15 | +import numpy as np | ||
| 16 | +import torch_npu | ||
| 17 | + | ||
| 18 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 19 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 20 | + | ||
| 21 | + | ||
| 22 | +class TestAsarray(TestCase): | ||
| 23 | + def test_asarray_default(self): | ||
| 24 | + np_input = np.random.randn(1) | ||
| 25 | + cpu_output_default = torch.asarray(np_input, device="cpu").numpy() | ||
| 26 | + npu_output_default = torch.asarray(np_input, device="npu").cpu().numpy() | ||
| 27 | + self.assertRtolEqual(cpu_output_default, npu_output_default) | ||
| 28 | + | ||
| 29 | + def test_asarray_device_none(self): | ||
| 30 | + npu_input = torch.tensor([1, 2, 3]).npu() | ||
| 31 | + npu_input_device = npu_input.device | ||
| 32 | + npu_output = torch.asarray(npu_input) | ||
| 33 | + npu_output_device = npu_output.device | ||
| 34 | + if npu_input_device != npu_output_device: | ||
| 35 | + raise ValueError("The device of input and output must be the same") | ||
| 36 | + | ||
| 37 | +if __name__ == "__main__": | ||
| 38 | + run_tests() | ||
| @@ -0,0 +1,103 @@ | |||
| 1 | +# Copyright (c) 2020, Huawei Technologies.All rights reserved. | ||
| 2 | +# | ||
| 3 | +# Licensed under the BSD 3-Clause License (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 | +# https://opensource.org/licenses/BSD-3-Clause | ||
| 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 | + | ||
| 16 | +import torch | ||
| 17 | +import torch.nn as nn | ||
| 18 | +import numpy as np | ||
| 19 | +import torch_npu | ||
| 20 | + | ||
| 21 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 22 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 23 | + | ||
| 24 | +torch.npu.set_compile_mode(jit_compile=False) | ||
| 25 | +torch.npu.config.allow_internal_format = False | ||
| 26 | + | ||
| 27 | + | ||
| 28 | +class TestAvgPool2dBackward(TestCase): | ||
| 29 | + def cpu_op_exec(self, input1): | ||
| 30 | + m = nn.AvgPool2d(kernel_size=2, stride=2) | ||
| 31 | + input1.requires_grad = True | ||
| 32 | + output = m(input1) | ||
| 33 | + output.backward(torch.ones_like(output)) | ||
| 34 | + output_grad = input1.grad | ||
| 35 | + output_grad = output_grad.detach().numpy() | ||
| 36 | + output = output.detach().numpy() | ||
| 37 | + | ||
| 38 | + return output_grad, output | ||
| 39 | + | ||
| 40 | + def npu_op_exec(self, input1): | ||
| 41 | + m = nn.AvgPool2d(kernel_size=2, stride=2).npu() | ||
| 42 | + input1.requires_grad = True | ||
| 43 | + output = m(input1) | ||
| 44 | + output.backward(torch.ones_like(output)) | ||
| 45 | + output_grad = input1.grad | ||
| 46 | + output_grad = output_grad.to("cpu") | ||
| 47 | + output_grad = output_grad.detach().numpy() | ||
| 48 | + output = output.to("cpu") | ||
| 49 | + output = output.detach().numpy() | ||
| 50 | + | ||
| 51 | + return output_grad, output | ||
| 52 | + | ||
| 53 | + def test_avg_pool2d_backward_shape_format_fp16(self): | ||
| 54 | + format_list = [0, 3] | ||
| 55 | + shape_list = [(5, 20, 8, 8)] | ||
| 56 | + shape_format = [ | ||
| 57 | + [np.float16, i, j] for i in format_list for j in shape_list | ||
| 58 | + ] | ||
| 59 | + for item in shape_format: | ||
| 60 | + cpu_input, npu_input = create_common_tensor(item, 0, 100) | ||
| 61 | + cpu_input = cpu_input.to(torch.float32) | ||
| 62 | + cpu_output_grad, cpu_output = self.cpu_op_exec(cpu_input) | ||
| 63 | + npu_output_grad, npu_output = self.npu_op_exec(npu_input) | ||
| 64 | + cpu_output = cpu_output.astype(npu_output.dtype) | ||
| 65 | + cpu_output_grad = cpu_output_grad.astype(npu_output_grad.dtype) | ||
| 66 | + | ||
| 67 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 68 | + self.assertRtolEqual(cpu_output_grad, npu_output_grad) | ||
| 69 | + | ||
| 70 | + def test_avg_pool2d_backward_shape_format_fp32(self): | ||
| 71 | + format_list = [0, 3] | ||
| 72 | + shape_list = [(5, 20, 8, 8)] | ||
| 73 | + shape_format = [ | ||
| 74 | + [np.float32, i, j] for i in format_list for j in shape_list | ||
| 75 | + ] | ||
| 76 | + for item in shape_format: | ||
| 77 | + cpu_input, npu_input = create_common_tensor(item, 0, 100) | ||
| 78 | + cpu_output_grad, cpu_output = self.cpu_op_exec(cpu_input) | ||
| 79 | + npu_output_grad, npu_output = self.npu_op_exec(npu_input) | ||
| 80 | + | ||
| 81 | + cpu_output = cpu_output.astype(np.float16) | ||
| 82 | + cpu_output_grad = cpu_output_grad.astype(np.float16) | ||
| 83 | + npu_output = npu_output.astype(np.float16) | ||
| 84 | + npu_output_grad = npu_output_grad.astype(np.float16) | ||
| 85 | + | ||
| 86 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 87 | + self.assertRtolEqual(cpu_output_grad, npu_output_grad) | ||
| 88 | + | ||
| 89 | + def test_avg_pool2d_backward_3d_fp32(self): | ||
| 90 | + cpu_input, npu_input = create_common_tensor([np.float32, 0, (1, 13, 13)], 0, 1) | ||
| 91 | + cpu_output_grad, _ = self.cpu_op_exec(cpu_input) | ||
| 92 | + npu_output_grad, _ = self.npu_op_exec(npu_input) | ||
| 93 | + self.assertRtolEqual(cpu_output_grad, npu_output_grad, 0.0009) | ||
| 94 | + | ||
| 95 | + def test_avg_pool2d_backward_4d_fp32(self): | ||
| 96 | + cpu_input, npu_input = create_common_tensor([np.float32, 0, (5, 1, 8, 8)], 0, 1) | ||
| 97 | + cpu_output_grad, _ = self.cpu_op_exec(cpu_input) | ||
| 98 | + npu_output_grad, _ = self.npu_op_exec(npu_input) | ||
| 99 | + self.assertRtolEqual(cpu_output_grad, npu_output_grad, 0.0009) | ||
| 100 | + | ||
| 101 | + | ||
| 102 | +if __name__ == "__main__": | ||
| 103 | + run_tests() | ||
| @@ -0,0 +1,94 @@ | |||
| 1 | +# Copyright (c) 2020 Huawei Technologies Co., Ltd | ||
| 2 | +# Copyright (c) 2019, Facebook CORPORATION. | ||
| 3 | +# All rights reserved. | ||
| 4 | +# | ||
| 5 | +# Licensed under the BSD 3-Clause License (the "License"); | ||
| 6 | +# you may not use this file except in compliance with the License. | ||
| 7 | +# You may obtain a copy of the License at | ||
| 8 | +# | ||
| 9 | +# https://opensource.org/licenses/BSD-3-Clause | ||
| 10 | +# | ||
| 11 | +# Unless required by applicable law or agreed to in writing, software | ||
| 12 | +# distributed under the License is distributed on an "AS IS" BASIS, | ||
| 13 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 14 | +# See the License for the specific language governing permissions and | ||
| 15 | +# limitations under the License. | ||
| 16 | + | ||
| 17 | + | ||
| 18 | +import copy | ||
| 19 | +import torch | ||
| 20 | +import numpy as np | ||
| 21 | + | ||
| 22 | +import torch_npu | ||
| 23 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 24 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 25 | + | ||
| 26 | + | ||
| 27 | +class TestAvgPool3D(TestCase): | ||
| 28 | + | ||
| 29 | + def cpu_op_exec(self, kernel_size, stride, input1): | ||
| 30 | + m = torch.nn.AvgPool3d(kernel_size, stride) | ||
| 31 | + output_data = m(input1) | ||
| 32 | + return output_data | ||
| 33 | + | ||
| 34 | + def cpu_op_exec_fp16(self, kernel_size, stride, input1): | ||
| 35 | + m = torch.nn.AvgPool3d(kernel_size, stride) | ||
| 36 | + output_data = m(input1.float()) | ||
| 37 | + return output_data.half() | ||
| 38 | + | ||
| 39 | + def npu_op_exec(self, kernel_size, stride, input1): | ||
| 40 | + m = torch.nn.AvgPool3d(kernel_size, stride).npu() | ||
| 41 | + output_data = m(input1) | ||
| 42 | + return output_data | ||
| 43 | + | ||
| 44 | + def test_avg_pool_3d_fp32(self): | ||
| 45 | + shape_format = [ | ||
| 46 | + [[np.float32, -1, (20, 16, 50, 44, 31)], (3, 2, 2), (2, 1, 2)], | ||
| 47 | + [[np.float32, -1, (2, 1, 4, 4, 4)], 3, 2], | ||
| 48 | + [[np.float32, -1, (2, 1, 4, 4, 4)], 2, 2], | ||
| 49 | + [[np.float32, -1, (2, 4, 4, 4)], 2, 2] | ||
| 50 | + ] | ||
| 51 | + | ||
| 52 | + for item in shape_format: | ||
| 53 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 1, 100) | ||
| 54 | + npu_output = self.npu_op_exec(item[1], item[2], npu_input1) | ||
| 55 | + cpu_output = self.cpu_op_exec(item[1], item[2], cpu_input1) | ||
| 56 | + self.assertRtolEqual(cpu_output, npu_output.cpu(), 1.e-3) | ||
| 57 | + | ||
| 58 | + def test_avg_pool_3d_fp16(self): | ||
| 59 | + shape_format = [ | ||
| 60 | + [[np.float16, -1, (20, 16, 50, 44, 31)], (3, 2, 2), (2, 1, 2)], | ||
| 61 | + [[np.float16, -1, (2, 1, 4, 4, 4)], 3, 2], | ||
| 62 | + [[np.float16, -1, (2, 1, 4, 4, 4)], 2, 2], | ||
| 63 | + [[np.float16, -1, (2, 4, 4, 4)], 2, 2] | ||
| 64 | + ] | ||
| 65 | + | ||
| 66 | + for item in shape_format: | ||
| 67 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 1, 100) | ||
| 68 | + npu_output = self.npu_op_exec(item[1], item[2], npu_input1) | ||
| 69 | + cpu_output = self.cpu_op_exec_fp16(item[1], item[2], cpu_input1) | ||
| 70 | + self.assertRtolEqual(cpu_output, npu_output.cpu()) | ||
| 71 | + | ||
| 72 | + def test_avg_pool_3d(self): | ||
| 73 | + shape_format = [ | ||
| 74 | + [np.float16, -1, (512, 88, 64, 31)], | ||
| 75 | + [np.float16, -1, (2, 1, 4, 4, 6)], | ||
| 76 | + [np.float32, -1, (512, 88, 64, 31)], | ||
| 77 | + [np.float16, -1, (2, 1, 4, 4, 6)] | ||
| 78 | + ] | ||
| 79 | + cmodel = torch.nn.AvgPool3d((3, 3, 5), (6, 9, 3), (1, 1, 2), True) | ||
| 80 | + nmodel = copy.deepcopy(cmodel).npu() | ||
| 81 | + for item in shape_format: | ||
| 82 | + np.random.seed(123) | ||
| 83 | + cpu_input1, npu_input1 = create_common_tensor(item, 1, 100) | ||
| 84 | + if item[0] == np.float16: | ||
| 85 | + cpu_input1 = cpu_input1.to(torch.float32) | ||
| 86 | + cpu_output = cmodel(cpu_input1) | ||
| 87 | + npu_output = nmodel(npu_input1) | ||
| 88 | + if item[0] == np.float16: | ||
| 89 | + cpu_output = cpu_output.to(torch.float16) | ||
| 90 | + self.assertRtolEqual(cpu_output, npu_output.cpu(), 0.001, 0.0015) | ||
| 91 | + | ||
| 92 | + | ||
| 93 | +if __name__ == "__main__": | ||
| 94 | + run_tests() | ||
| @@ -0,0 +1,113 @@ | |||
| 1 | +# Copyright (c) 2020 Huawei Technologies Co., Ltd | ||
| 2 | +# | ||
| 3 | +# Licensed under the BSD 3-Clause License (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 | +# https://opensource.org/licenses/BSD-3-Clause | ||
| 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 | +import torch | ||
| 15 | +import numpy as np | ||
| 16 | +from torch.nn import functional as F | ||
| 17 | +import torch_npu | ||
| 18 | + | ||
| 19 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 20 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 21 | + | ||
| 22 | + | ||
| 23 | +class TestBaddBmm(TestCase): | ||
| 24 | + def generate_scalar(self, dtype, min1, max1): | ||
| 25 | + if dtype == "float32": | ||
| 26 | + scalar = np.random.uniform(min1, max1) | ||
| 27 | + if dtype == "float16": | ||
| 28 | + scalar = np.random.uniform(min1, max1) | ||
| 29 | + if dtype == "int32": | ||
| 30 | + scalar = np.random.randint(min1, max1) | ||
| 31 | + return scalar | ||
| 32 | + | ||
| 33 | + def cpu_op_exec(self, input1, input2, input3, scalar1, scalar2): | ||
| 34 | + output = torch.baddbmm(input1, input2, input3, beta=scalar1, alpha=scalar2) | ||
| 35 | + output = output.numpy() | ||
| 36 | + return output | ||
| 37 | + | ||
| 38 | + def cpu_op_exec_(self, input1, input2, input3, scalar1, scalar2): | ||
| 39 | + input1.baddbmm_(input2, input3, beta=scalar1, alpha=scalar2) | ||
| 40 | + input1 = input1.numpy() | ||
| 41 | + return input1 | ||
| 42 | + | ||
| 43 | + def npu_op_exec(self, input1, input2, input3, scalar1, scalar2): | ||
| 44 | + output = torch.baddbmm(input1, input2, input3, beta=scalar1, alpha=scalar2) | ||
| 45 | + output = output.to("cpu") | ||
| 46 | + output = output.numpy() | ||
| 47 | + return output | ||
| 48 | + | ||
| 49 | + def npu_op_exec_(self, input1, input2, input3, scalar1, scalar2): | ||
| 50 | + input1.baddbmm_(input2, input3, beta=scalar1, alpha=scalar2) | ||
| 51 | + input1 = input1.to("cpu") | ||
| 52 | + input1 = input1.numpy() | ||
| 53 | + return input1 | ||
| 54 | + | ||
| 55 | + def test_baddbmm_common_shape_format(self): | ||
| 56 | + shape_format = [ | ||
| 57 | + [[np.float16, -1, (1, 3, 5)], [np.float16, -1, (1, 3, 4)], | ||
| 58 | + [np.float16, -1, (1, 4, 5)], "float32"], | ||
| 59 | + [[np.float16, -1, (6, 4, 3)], [np.float16, -1, (6, 4, 5)], | ||
| 60 | + [np.float16, -1, (6, 5, 3)], "float32"], | ||
| 61 | + [[np.float16, -1, (175, 455, 22)], [np.float16, -1, (175, 455, 116)], | ||
| 62 | + [np.float16, -1, (175, 116, 22)], "float32"], | ||
| 63 | + [[np.float16, -1, (25, 56, 12)], [np.float16, -1, (25, 56, 51)], | ||
| 64 | + [np.float16, -1, (25, 51, 12)], "float32"] | ||
| 65 | + ] | ||
| 66 | + | ||
| 67 | + for item in shape_format: | ||
| 68 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 1, 10) | ||
| 69 | + cpu_input2, npu_input2 = create_common_tensor(item[1], 1, 10) | ||
| 70 | + cpu_input3, npu_input3 = create_common_tensor(item[2], 1, 10) | ||
| 71 | + scalar1 = self.generate_scalar(item[3], 0, 10) | ||
| 72 | + scalar2 = self.generate_scalar(item[3], 0, 10) | ||
| 73 | + cpu_output = self.cpu_op_exec(cpu_input1.float(), cpu_input2.float(), cpu_input3.float(), scalar1, scalar2) | ||
| 74 | + npu_output = self.npu_op_exec(npu_input1.float(), npu_input2.float(), npu_input3.float(), scalar1, scalar2) | ||
| 75 | + self.assertRtolEqual(cpu_output, npu_output, prec=1.e-3, prec16=1.e-3) | ||
| 76 | + cpu_output_ = self.cpu_op_exec_(cpu_input1.float(), cpu_input2.float(), cpu_input3.float(), scalar1, scalar2) | ||
| 77 | + npu_output_ = self.npu_op_exec_(npu_input1.float(), npu_input2.float(), npu_input3.float(), scalar1, scalar2) | ||
| 78 | + self.assertRtolEqual(cpu_output_, npu_output_, prec=1.e-3, prec16=1.e-3) | ||
| 79 | + | ||
| 80 | + def test_baddbmm_float16_shape_format(self): | ||
| 81 | + def cpu_op_exec_fp16(input1, input2, input3, scalar1, scalar2): | ||
| 82 | + input1 = input1.to(torch.float32) | ||
| 83 | + input2 = input2.to(torch.float32) | ||
| 84 | + input3 = input3.to(torch.float32) | ||
| 85 | + output = torch.baddbmm(input1, input2, input3, beta=scalar1, alpha=scalar2) | ||
| 86 | + output = output.numpy() | ||
| 87 | + output = output.astype(np.float16) | ||
| 88 | + return output | ||
| 89 | + | ||
| 90 | + shape_format = [ | ||
| 91 | + [[np.float16, -1, (1, 3, 5)], [np.float16, -1, (1, 3, 4)], | ||
| 92 | + [np.float16, -1, (1, 4, 5)], "float16"], | ||
| 93 | + [[np.float16, -1, (500, 40, 300)], [np.float16, -1, (500, 40, 500)], | ||
| 94 | + [np.float16, -1, (500, 500, 300)], "float16"], | ||
| 95 | + [[np.float16, -1, (175, 455, 22)], [np.float16, -1, (175, 455, 116)], | ||
| 96 | + [np.float16, -1, (175, 116, 22)], "float16"], | ||
| 97 | + [[np.float16, -1, (25, 21, 11)], [np.float16, -1, (25, 21, 34)], | ||
| 98 | + [np.float16, -1, (25, 34, 11)], "float16"], | ||
| 99 | + ] | ||
| 100 | + | ||
| 101 | + for item in shape_format: | ||
| 102 | + cpu_input1, npu_input1 = create_common_tensor(item[0], 1, 1) | ||
| 103 | + cpu_input2, npu_input2 = create_common_tensor(item[1], 1, 1) | ||
| 104 | + cpu_input3, npu_input3 = create_common_tensor(item[2], 1, 1) | ||
| 105 | + scalar1 = self.generate_scalar(item[3], 0, 2) | ||
| 106 | + scalar2 = self.generate_scalar(item[3], 0, 2) | ||
| 107 | + cpu_output = cpu_op_exec_fp16(cpu_input1, cpu_input2, cpu_input3, scalar1, scalar2) | ||
| 108 | + npu_output = self.npu_op_exec(npu_input1, npu_input2, npu_input3, scalar1, scalar2) | ||
| 109 | + self.assertRtolEqual(cpu_output, npu_output, prec=1.e-3, prec16=1.e-3) | ||
| 110 | + | ||
| 111 | + | ||
| 112 | +if __name__ == "__main__": | ||
| 113 | + run_tests() | ||
| @@ -0,0 +1,50 @@ | |||
| 1 | +# Copyright (c) 2020, Huawei Technologies.All rights reserved. | ||
| 2 | +# | ||
| 3 | +# Licensed under the BSD 3-Clause License (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 | +# https://opensource.org/licenses/BSD-3-Clause | ||
| 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 | +import torch | ||
| 16 | +import numpy as np | ||
| 17 | + | ||
| 18 | +import torch_npu | ||
| 19 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 20 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 21 | + | ||
| 22 | + | ||
| 23 | +class TestBatchNormReduce(TestCase): | ||
| 24 | + def cuda_op_exec(self, input_data): | ||
| 25 | + cpu_sum = torch.sum(input_data, dim=[0, 2, 3]) | ||
| 26 | + cpu_square_sum = torch.sum(input_data * input_data, dim=[0, 2, 3]) | ||
| 27 | + return cpu_sum.numpy(), cpu_square_sum.numpy() | ||
| 28 | + | ||
| 29 | + def npu_op_exec(self, *args): | ||
| 30 | + npu_sum, npu_square_sum = torch.batch_norm_reduce(*args) | ||
| 31 | + out_sum = npu_sum.cpu().numpy() | ||
| 32 | + out_square_sum = npu_square_sum.cpu().numpy() | ||
| 33 | + return out_sum, out_square_sum | ||
| 34 | + | ||
| 35 | + def test_batch_norm_reduce(self): | ||
| 36 | + np.random.seed(1234) | ||
| 37 | + shape_format = [ | ||
| 38 | + [[np.float32, -1, [2, 3, 12, 12]], 1e-5], | ||
| 39 | + ] | ||
| 40 | + for item in shape_format: | ||
| 41 | + cpu_input1, npu_inputfp32 = create_common_tensor(item[0], 1, 10) | ||
| 42 | + cpu_output = self.cuda_op_exec(cpu_input1) | ||
| 43 | + npu_outputfp32 = self.npu_op_exec(npu_inputfp32, item[-1]) | ||
| 44 | + | ||
| 45 | + self.assertRtolEqual(cpu_output[0], npu_outputfp32[0]) | ||
| 46 | + self.assertRtolEqual(cpu_output[1], npu_outputfp32[1], 1e-2) | ||
| 47 | + | ||
| 48 | + | ||
| 49 | +if __name__ == "__main__": | ||
| 50 | + run_tests() | ||
| @@ -0,0 +1,54 @@ | |||
| 1 | +import torch | ||
| 2 | +import torch.nn as nn | ||
| 3 | +import torch.nn.functional as F | ||
| 4 | +import numpy as np | ||
| 5 | + | ||
| 6 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 7 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +class TestAdaptiveMaxPool2d(TestCase): | ||
| 11 | + def cpu_op_exec(self, input1, output_size): | ||
| 12 | + m = nn.AdaptiveMaxPool2d(output_size) | ||
| 13 | + output = m(input1) | ||
| 14 | + return output.numpy() | ||
| 15 | + | ||
| 16 | + def npu_op_exec(self, input1, output_size): | ||
| 17 | + m = nn.AdaptiveMaxPool2d(output_size).npu() | ||
| 18 | + output = m(input1) | ||
| 19 | + return output.cpu().numpy() | ||
| 20 | + | ||
| 21 | + def test_adaptiveMaxPool2d_shape_format_fp32_6(self): | ||
| 22 | + np.random.seed(1234) | ||
| 23 | + format_list = [-1] | ||
| 24 | + # (1, 8, 9) IndexError | ||
| 25 | + shape_list = [(1, 5, 9, 9)] | ||
| 26 | + shape_format = [ | ||
| 27 | + [np.float32, i, j] for i in format_list for j in shape_list | ||
| 28 | + ] | ||
| 29 | + output_list = [(3, 3)] | ||
| 30 | + for item in shape_format: | ||
| 31 | + cpu_input, npu_input = create_common_tensor(item, 0, 100) | ||
| 32 | + for output_size in output_list: | ||
| 33 | + cpu_output = self.cpu_op_exec(cpu_input, output_size) | ||
| 34 | + npu_output = self.npu_op_exec(npu_input, output_size) | ||
| 35 | + | ||
| 36 | + self.assertRtolEqual(cpu_output, npu_output, 0.0004) | ||
| 37 | + | ||
| 38 | + def test_adaptiveMaxPool2d_case_in_photo2cartoon(self): | ||
| 39 | + cpu_x = torch.rand(1, 256, 31, 31) | ||
| 40 | + npu_x = cpu_x.npu() | ||
| 41 | + cpu_out = F.adaptive_max_pool2d(cpu_x, 1) | ||
| 42 | + npu_out = F.adaptive_max_pool2d(npu_x, 1) | ||
| 43 | + self.assertRtolEqual(cpu_out, npu_out.cpu(), 0.0003) | ||
| 44 | + | ||
| 45 | + def test_adaptiveMaxPool2d_case_in_photo2cartoon_fp16(self): | ||
| 46 | + cpu_x = torch.rand(1, 256, 31, 31).half() | ||
| 47 | + npu_x = cpu_x.npu() | ||
| 48 | + cpu_out = F.adaptive_max_pool2d(cpu_x.float(), 1).half() | ||
| 49 | + npu_out = F.adaptive_max_pool2d(npu_x, 1) | ||
| 50 | + self.assertRtolEqual(cpu_out, npu_out.cpu()) | ||
| 51 | + | ||
| 52 | + | ||
| 53 | +if __name__ == "__main__": | ||
| 54 | + run_tests() | ||
| @@ -0,0 +1,65 @@ | |||
| 1 | +import torch | ||
| 2 | +import numpy as np | ||
| 3 | +import torch_npu | ||
| 4 | + | ||
| 5 | +from torch_npu.testing.testcase import TestCase, run_tests | ||
| 6 | +from torch_npu.testing.common_utils import create_common_tensor | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class TestArgSort(TestCase): | ||
| 10 | + def cpu_op_exec(self, input1, dim, descending): | ||
| 11 | + output = torch.argsort(input1, dim=dim, descending=descending) | ||
| 12 | + return output.numpy() | ||
| 13 | + | ||
| 14 | + def npu_op_exec(self, input1, dim, descending): | ||
| 15 | + output = torch.argsort(input1, dim=dim, descending=descending) | ||
| 16 | + | ||
| 17 | + return output.cpu().numpy() | ||
| 18 | + | ||
| 19 | + def cpu_default_op_exec(self, input1): | ||
| 20 | + output = torch.argsort(input1) | ||
| 21 | + return output.numpy() | ||
| 22 | + | ||
| 23 | + def npu_default_op_exec(self, input1): | ||
| 24 | + output = torch.argsort(input1) | ||
| 25 | + return output.cpu().numpy() | ||
| 26 | + | ||
| 27 | + def test_sort_shape_format_fp32(self, device="npu"): | ||
| 28 | + shape_format = [ | ||
| 29 | + [[np.float32, 0, (8, 4, 3, 9)], 2, False], | ||
| 30 | + [[np.float32, 0, (2, 3)]], | ||
| 31 | + [[np.float32, 0, (1, 7)], 0, True], | ||
| 32 | + [[np.float32, 0, (1, 5, 6)], 1, False], | ||
| 33 | + ] | ||
| 34 | + | ||
| 35 | + for item in shape_format: | ||
| 36 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -100, 100) | ||
| 37 | + if len(item) > 1: | ||
| 38 | + cpu_output = self.cpu_op_exec(cpu_input1, item[1], item[2]) | ||
| 39 | + npu_output = self.npu_op_exec(npu_input1, item[1], item[2]) | ||
| 40 | + else: | ||
| 41 | + cpu_output = self.cpu_default_op_exec(cpu_input1) | ||
| 42 | + npu_output = self.npu_default_op_exec(npu_input1) | ||
| 43 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 44 | + | ||
| 45 | + def test_sort_shape_format_fp16(self, device="npu"): | ||
| 46 | + shape_format = [ | ||
| 47 | + [[np.float16, 0, (8, 4, 3, 9)], 2, False], | ||
| 48 | + [[np.float16, 0, (2, 3)]], | ||
| 49 | + [[np.float16, 0, (1, 7)], 0, True], | ||
| 50 | + [[np.float16, 0, (1, 5, 6)], 1, False], | ||
| 51 | + ] | ||
| 52 | + | ||
| 53 | + for item in shape_format: | ||
| 54 | + cpu_input1, npu_input1 = create_common_tensor(item[0], -100, 100) | ||
| 55 | + if len(item) > 1: | ||
| 56 | + cpu_output = self.cpu_op_exec(cpu_input1.to(torch.float32), item[1], item[2]) | ||
| 57 | + npu_output = self.npu_op_exec(npu_input1, item[1], item[2]) | ||
| 58 | + else: | ||
| 59 | + cpu_output = self.cpu_default_op_exec(cpu_input1.to(torch.float32)) | ||
| 60 | + npu_output = self.npu_default_op_exec(npu_input1) | ||
| 61 | + self.assertRtolEqual(cpu_output, npu_output) | ||
| 62 | + | ||
| 63 | + | ||
| 64 | +if __name__ == "__main__": | ||
| 65 | + run_tests() | ||