1010import numpy
1111import paddle
1212import torch
13- import yaml
1413
1514USE_CACHED_NUMPY = os .getenv ("USE_CACHED_NUMPY" , "False" ).lower () == "true"
1615TEST_NON_CONTIGUOUS = os .getenv ("TEST_NON_CONTIGUOUS" , "0" ).lower () in ("true" , "1" )
1716USE_GPU_CACHE_MODE = os .getenv ("USE_GPU_CACHE_MODE" , "False" ).lower () == "true"
1817SKIP_GPU_CLEANUP = os .getenv ("SKIP_GPU_CLEANUP" , "False" ).lower () == "true"
1918cached_numpy = {}
2019cached_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
3722def _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