Skip to content

Commit 5c62587

Browse files
Revert "APITest 测试修复:🐛 修复 forward-only 用例的 autograd 冗余建图" (#662)
1 parent d0e32f4 commit 5c62587

1 file changed

Lines changed: 41 additions & 58 deletions

File tree

tester/api_config/config_analyzer.py

Lines changed: 41 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,13 @@
1010
import numpy
1111
import paddle
1212
import torch
13-
import yaml
1413

1514
USE_CACHED_NUMPY = os.getenv("USE_CACHED_NUMPY", "False").lower() == "true"
1615
TEST_NON_CONTIGUOUS = os.getenv("TEST_NON_CONTIGUOUS", "0").lower() in ("true", "1")
1716
USE_GPU_CACHE_MODE = os.getenv("USE_GPU_CACHE_MODE", "False").lower() == "true"
1817
SKIP_GPU_CLEANUP = os.getenv("SKIP_GPU_CLEANUP", "False").lower() == "true"
1918
cached_numpy = {}
2019
cached_gpu_inputs = {}
21-
AUTOGRAD_DTYPES = frozenset(
22-
["float32", "float64", "float16", "complex64", "complex128", "bfloat16"]
23-
)
24-
FLOAT8_DTYPES = frozenset(["float8_e5m2", "float8_e4m3fn"])
25-
CAST_THROUGH_INTERMEDIATE_DTYPES = frozenset(["bfloat16"]) | FLOAT8_DTYPES
26-
27-
28-
def _load_forward_only_apis():
29-
config_path = os.path.join(os.path.dirname(__file__), "..", "base_config.yaml")
30-
with open(config_path, encoding="utf-8") as f:
31-
return frozenset(yaml.safe_load(f).get("forward_only_apis", []))
32-
33-
34-
FORWARD_ONLY_APIS = _load_forward_only_apis()
3520

3621

3722
def _env_bool(name, default=False):
@@ -255,35 +240,16 @@ def _use_gpu_cache(self, dtype=None):
255240
return False
256241
return True
257242

258-
def _supports_autograd(self, dtype=None):
259-
dtype = dtype or self.dtype
260-
return dtype in AUTOGRAD_DTYPES
261-
262-
def _requires_autograd(self, api_config, dtype=None):
263-
if not self._supports_autograd(dtype):
264-
return False
265-
api_name = getattr(api_config, "api_name", "")
266-
api = api_name[api_name.rindex(".") + 1 :] if "." in api_name else api_name
267-
if api in FORWARD_ONLY_APIS:
268-
return False
269-
return getattr(api_config, "test_backward", True)
270-
271243
def _gpu_cache_key(self, api_config, dtype=None):
272244
dtype = dtype or self.dtype
273245
location = (
274246
getattr(self, "index", None),
275247
getattr(self, "key", None),
276248
tuple(getattr(self, "list_index", [])),
277249
)
278-
return (
279-
api_config.config,
280-
location,
281-
dtype,
282-
_shape_tuple(self.shape),
283-
self._requires_autograd(api_config, dtype),
284-
)
250+
return (api_config.config, location, dtype, _shape_tuple(self.shape))
285251

286-
def _make_gpu_cache_tensors(self, api_config, dtype=None):
252+
def _make_gpu_cache_tensors(self, dtype=None):
287253
dtype = dtype or self.dtype
288254
torch_dtype = self.convert_dtype_to_torch_type(dtype)
289255
shape = tuple(self.shape)
@@ -305,22 +271,21 @@ def _make_gpu_cache_tensors(self, api_config, dtype=None):
305271
base = (torch.rand(shape, device=device, dtype=torch.float32) - 0.5) * 1.2
306272
torch_tensor = base.to(dtype=torch_dtype)
307273

308-
requires_autograd = self._requires_autograd(api_config, dtype)
309274
torch_source = torch_tensor.detach()
310275
paddle_tensor = paddle.utils.dlpack.from_dlpack(
311276
torch.utils.dlpack.to_dlpack(torch_source.clone())
312277
)
313-
paddle_tensor.stop_gradient = not requires_autograd
278+
paddle_tensor.stop_gradient = False
314279
torch_tensor = torch_source.clone()
315-
if requires_autograd:
316-
torch_tensor = torch_tensor.detach().requires_grad_(True)
280+
if dtype in ["float32", "float64", "float16", "complex64", "complex128", "bfloat16"]:
281+
torch_tensor = torch_tensor.requires_grad_(True)
317282
return paddle_tensor, torch_tensor
318283

319284
def _get_gpu_cache_entry(self, api_config, dtype=None):
320285
dtype = dtype or self.dtype
321286
key = self._gpu_cache_key(api_config, dtype)
322287
if key not in cached_gpu_inputs:
323-
paddle_tensor, torch_tensor = self._make_gpu_cache_tensors(api_config, dtype)
288+
paddle_tensor, torch_tensor = self._make_gpu_cache_tensors(dtype)
324289
cached_gpu_inputs[key] = {
325290
"paddle": paddle_tensor,
326291
"torch": torch_tensor,
@@ -3054,23 +3019,24 @@ def get_paddle_tensor(self, api_config):
30543019
f"is_contiguous: {self.paddle_tensor.is_contiguous()}"
30553020
)
30563021
else:
3057-
requires_autograd = self._requires_autograd(api_config)
30583022
intermediate_dtype = (
30593023
"float32"
30603024
if self.dtype == "bfloat16"
3061-
else ("float16" if self.dtype in FLOAT8_DTYPES else self.dtype)
3025+
else (
3026+
"float16" if self.dtype in ["float8_e5m2", "float8_e4m3fn"] else self.dtype
3027+
)
30623028
)
30633029
self.paddle_tensor = paddle.to_tensor(
30643030
self.get_numpy_tensor(api_config),
30653031
dtype=intermediate_dtype,
30663032
place=self.place,
30673033
)
30683034

3035+
self.paddle_tensor.stop_gradient = False
30693036
if self.dtype == "bfloat16":
30703037
self.paddle_tensor = paddle.cast(self.paddle_tensor, dtype="bfloat16")
3071-
elif self.dtype in FLOAT8_DTYPES:
3038+
elif self.dtype in ["float8_e5m2", "float8_e4m3fn"]:
30723039
self.paddle_tensor = paddle.cast(self.paddle_tensor, dtype=self.dtype)
3073-
self.paddle_tensor.stop_gradient = not requires_autograd
30743040
if TEST_NON_CONTIGUOUS:
30753041
if not self.shuffle_dims:
30763042
ndim = self.paddle_tensor.dim()
@@ -3093,7 +3059,9 @@ def _create_strided_paddle_tensor(self, api_config):
30933059
original_flag = paddle.get_flags([flag_name])
30943060
paddle.set_flags({flag_name: False})
30953061
try:
3096-
intermediate_dtype = "float16" if self.dtype in FLOAT8_DTYPES else self.dtype
3062+
intermediate_dtype = (
3063+
"float16" if self.dtype in ["float8_e5m2", "float8_e4m3fn"] else self.dtype
3064+
)
30973065
storage_size = self._strided_storage_size()
30983066
flat_tensor = paddle.zeros(
30993067
[storage_size],
@@ -3108,11 +3076,11 @@ def _create_strided_paddle_tensor(self, api_config):
31083076
dtype=intermediate_dtype,
31093077
place=self.place,
31103078
)
3111-
if self.dtype in FLOAT8_DTYPES:
3079+
if self.dtype in ["float8_e5m2", "float8_e4m3fn"]:
31123080
flat_tensor = paddle.cast(flat_tensor, dtype=self.dtype)
31133081
tensor = paddle.as_strided(flat_tensor, self.shape, self.strides)
31143082

3115-
tensor.stop_gradient = not self._requires_autograd(api_config)
3083+
tensor.stop_gradient = False
31163084
return tensor
31173085
finally:
31183086
paddle.set_flags(original_flag)
@@ -3126,25 +3094,32 @@ def get_torch_tensor(self, api_config):
31263094
if not self.is_contiguous and self.strides is not None:
31273095
self.torch_tensor = self._create_strided_torch_tensor(api_config)
31283096
else:
3129-
needs_cast = self.dtype in CAST_THROUGH_INTERMEDIATE_DTYPES
3130-
if needs_cast:
3097+
needs_intermediate = self.dtype in ["bfloat16", "float8_e5m2", "float8_e4m3fn"]
3098+
if needs_intermediate:
31313099
intermediate_torch_dtype = (
31323100
torch.float32 if self.dtype == "bfloat16" else torch.float16
31333101
)
31343102
else:
31353103
intermediate_torch_dtype = self.convert_dtype_to_torch_type(self.dtype)
3136-
requires_grad = self._requires_autograd(api_config)
31373104
self.torch_tensor = torch.tensor(
31383105
self.get_numpy_tensor(api_config),
31393106
dtype=intermediate_torch_dtype,
3140-
requires_grad=requires_grad and not needs_cast,
3107+
requires_grad=self.dtype
3108+
in [
3109+
"float32",
3110+
"float64",
3111+
"float16",
3112+
"complex64",
3113+
"complex128",
3114+
"bfloat16",
3115+
],
31413116
)
3142-
if needs_cast:
3117+
if self.dtype == "bfloat16":
3118+
self.torch_tensor = self.torch_tensor.to(dtype=torch.bfloat16)
3119+
elif self.dtype in ["float8_e5m2", "float8_e4m3fn"]:
31433120
self.torch_tensor = self.torch_tensor.to(
31443121
dtype=self.convert_dtype_to_torch_type(self.dtype)
31453122
)
3146-
if requires_grad:
3147-
self.torch_tensor = self.torch_tensor.detach().requires_grad_(True)
31483123
if TEST_NON_CONTIGUOUS:
31493124
if not self.shuffle_dims:
31503125
ndim = self.torch_tensor.dim()
@@ -3157,7 +3132,7 @@ def get_torch_tensor(self, api_config):
31573132
def _create_strided_torch_tensor(self, api_config):
31583133
"""Create a non-contiguous torch tensor from the shared logical numpy input."""
31593134
device = torch.device("cuda:0") if torch.cuda.is_available() else torch.device("cpu")
3160-
needs_intermediate = self.dtype in FLOAT8_DTYPES
3135+
needs_intermediate = self.dtype in ["float8_e5m2", "float8_e4m3fn"]
31613136
if needs_intermediate:
31623137
intermediate_torch_dtype = torch.float16
31633138
else:
@@ -3178,11 +3153,19 @@ def _create_strided_torch_tensor(self, api_config):
31783153
device=device,
31793154
)
31803155
)
3181-
if self.dtype in FLOAT8_DTYPES:
3156+
if self.dtype in ["float8_e5m2", "float8_e4m3fn"]:
31823157
flat_tensor = flat_tensor.to(dtype=self.convert_dtype_to_torch_type(self.dtype))
31833158
tensor = torch.as_strided(flat_tensor, self.shape, self.strides)
31843159

3185-
if self._requires_autograd(api_config):
3160+
requires_grad = self.dtype in [
3161+
"float32",
3162+
"float64",
3163+
"float16",
3164+
"complex64",
3165+
"complex128",
3166+
"bfloat16",
3167+
]
3168+
if requires_grad:
31863169
tensor = tensor.detach().requires_grad_(True)
31873170
return tensor
31883171

0 commit comments

Comments
 (0)