[diffusion] Add is_float64_supported to Platform (#22112)

Signed-off-by: Xiaodong Ye <xiaodong.ye@mthreads.com>
This commit is contained in:
R0CKSTAR
2026-04-05 18:12:28 +08:00
committed by GitHub
parent 5a35316417
commit 10b18b8b29
10 changed files with 36 additions and 21 deletions
@@ -158,7 +158,7 @@ class UnquantizedLinearMethod(LinearMethodBase):
F.linear(x, layer.weight, bias)
if current_platform.is_amp_supported() or bias is None
else F.linear(x, layer.weight, bias.to(x.dtype))
) # NOTE: this line assumes that we are using amp when using cuda and is needed to account for the fact that amp isn't supported in mps
) # NOTE: explicit dtype cast for bias is needed on platforms where amp isn't supported
return output
@@ -644,9 +644,9 @@ class CausalWanTransformer3DModel(BaseDiT, OffloadableDiTMixin):
self.num_attention_heads,
rope_dim_list,
dtype=(
torch.float32
if current_platform.is_mps() or current_platform.is_musa()
else torch.float64
torch.float64
if current_platform.is_float64_supported()
else torch.float32
),
rope_theta=10000,
start_frame=start_frame, # Assume that start_frame is 0 when kv_cache is None
@@ -776,9 +776,9 @@ class CausalWanTransformer3DModel(BaseDiT, OffloadableDiTMixin):
self.num_attention_heads,
rope_dim_list,
dtype=(
torch.float32
if current_platform.is_mps() or current_platform.is_musa()
else torch.float64
torch.float64
if current_platform.is_float64_supported()
else torch.float32
),
rope_theta=10000,
start_frame=start_frame,
@@ -722,9 +722,9 @@ class FluxPosEmbed(nn.Module):
use_real=False,
repeat_interleave_real=False,
dtype=(
torch.float32
if current_platform.is_mps() or current_platform.is_musa()
else torch.float64
torch.float64
if current_platform.is_float64_supported()
else torch.float32
),
)
@@ -815,9 +815,9 @@ class Flux2PosEmbed(nn.Module):
use_real=False,
repeat_interleave_real=False,
dtype=(
torch.float32
if current_platform.is_mps() or current_platform.is_musa()
else torch.float64
torch.float64
if current_platform.is_float64_supported()
else torch.float32
),
)
@@ -915,9 +915,9 @@ class WanTransformer3DModel(CachableDiT, OffloadableDiTMixin):
rope_dim_list=self.rope_dim_list,
rope_theta=10000,
dtype=(
torch.float32
if current_platform.is_mps() or current_platform.is_musa()
else torch.float64
torch.float64
if current_platform.is_float64_supported()
else torch.float32
),
)
@@ -1090,7 +1090,7 @@ class WanTransformer3DModel(CachableDiT, OffloadableDiTMixin):
encoder_hidden_states.to(orig_dtype)
if not current_platform.is_amp_supported()
else encoder_hidden_states
) # cast to orig_dtype for MPS
) # cast to orig_dtype if amp is not supported
assert encoder_hidden_states.dtype == orig_dtype
@@ -149,8 +149,8 @@ class WanCausalConv3d(nn.Conv3d):
padding[4] -= cache_x.shape[2]
x = F.pad(x, padding)
x = (
x.to(self.weight.dtype) if current_platform.is_mps() else x
) # casting needed for mps since amp isn't supported
x if current_platform.is_amp_supported() else x.to(self.weight.dtype)
) # casting needed if amp isn't supported
return super().forward(x)
@@ -304,8 +304,8 @@ class WanDistCausalConv3d(nn.Conv3d):
x = F.pad(x, padding)
x = (
x.to(self.weight.dtype) if current_platform.is_mps() else x
) # casting needed for mps since amp isn't supported
x if current_platform.is_amp_supported() else x.to(self.weight.dtype)
) # casting needed if amp isn't supported
x_padded, self._halo_recv_top_buf, self._halo_recv_bottom_buf = halo_exchange(
x,
@@ -199,6 +199,11 @@ class Platform:
def is_amp_supported(cls) -> bool:
return True
@classmethod
@lru_cache(maxsize=1)
def is_float64_supported(cls) -> bool:
return True
@classmethod
def get_modelopt_fp4_quantize_op(cls) -> Callable | None:
return None
@@ -31,6 +31,11 @@ class MpsPlatform(Platform):
def is_amp_supported(cls) -> bool:
return False
@classmethod
@lru_cache(maxsize=1)
def is_float64_supported(cls) -> bool:
return False
@classmethod
def get_local_torch_device(cls) -> torch.device:
return torch.device("mps")
@@ -71,6 +71,11 @@ class MusaPlatformBase(Platform):
dispatch_key: str = "MUSA"
device_control_env_var: str = "MUSA_VISIBLE_DEVICES"
@classmethod
@lru_cache(maxsize=1)
def is_float64_supported(cls) -> bool:
return False
@classmethod
def get_local_torch_device(cls) -> torch.device:
return torch.device(f"musa:{envs.LOCAL_RANK}")