From 90619c5533b8d98511a8ae563db33132e8984e6a Mon Sep 17 00:00:00 2001 From: Elisa Tsai Date: Mon, 15 Dec 2025 19:23:05 +0000 Subject: [PATCH 1/4] Reapply "Attention bug fixes, tokamax splash defaulting logic (#282)" (#287) This reverts commit 503e9d65d540e41bfaa983a7bb6f291c6a1eabd9. --- docs/attention_blocks_flowchart.md | 30 +++ docs/attention_blocks_flowchart.png | Bin 0 -> 234417 bytes src/maxdiffusion/max_utils.py | 29 ++- src/maxdiffusion/models/attention_flax.py | 7 +- .../tests/wan_transformer_test.py | 183 ++++++++++-------- 5 files changed, 152 insertions(+), 97 deletions(-) create mode 100644 docs/attention_blocks_flowchart.md create mode 100644 docs/attention_blocks_flowchart.png diff --git a/docs/attention_blocks_flowchart.md b/docs/attention_blocks_flowchart.md new file mode 100644 index 00000000..69816ac7 --- /dev/null +++ b/docs/attention_blocks_flowchart.md @@ -0,0 +1,30 @@ +# Attention block sizes + +## Description +- "block_q": Block sizes (HBM TO VMEM and VREG) to tile along Q sequence in forward pass +- "block_kv_compute" : Sub Block size (VMEM to VREG) of "block_kv" where compute is performed in forward pass. It must be factor or same as "block_kv" +- "block_kv" : Block sizes (HBM TO VMEM) to tile along KV sequence in forward pass +- "block_q_dkv" : Block sizes along Q sequence in backward pass with fused kernel to compute gradient of q, k , v. It must be factor or same as block_q +- "block_kv_dkv" : Block sizes along KV sequence in backward pass. It must be factor or same as block_kv +- "block_kv_dkv_compute" : Sub Block Sizes of block_kv_dkv, must be factor or same as "block_kv_dkv" +- "block_q_dq" : Block sizes along Q sequence in backward pass with unfused kernel to compute gradient of just q. it must be factor or same as "block_q" +- "block_kv_dq" : Block sizes along KV to tiline on KV sequence in backward pass with unfused kernel to compute gradient of just q. it must be factor or same as "block_kv" +- "use_fused_bwd_kernel" : This means fused bwd kernel is used where DQ, DK, DV are computed in single kernel. It usually more perfomant but comes with slight HBM memory overhead. + +## Flowchart + +Maxdiffusion automatically adheres to this flowchart to ensure working, and there is a log that will inform you on the modifications that maxdiffusion makes to the specified block sizes. + +![alt text](attention_blocks_flowchart.png) + +> "tokamax_flash" uses the splash attention implementation in [tokamax-repo](https://github.com/openxla/tokamax/blob/main/tokamax/_src/ops/experimental/tpu/splash_attention/splash_attention_kernel.py) This kernel only supports fused backward pass where gradients for q,k,v are computed in a single kernel so "block_q_dq" and "block_kv_dq" are not used + +## How block sizes matter for perfomance and accuracy + +Block sizes key to saturating HBM bandwidth and ensuring maximum possible overlap of computation on cores with HBM use and VMEM to VREG. It is highly recommended to tune them. + +Block sizes also have an effect on the sequence length. Sequence length is multiple of resolution and number of frames (video), along with VAE scale down factors and patchifying ratios. This sequence length or shard of this sequence length needs to be multiple of the block sizes specified. Therefore maxdiffusion pads the sequence lengths to the nearest multiple of the block sizes. It is advisable to choose block sizes which are factor of sequence length, atleast for the Q block sizes. + +> In cross attention Image or Video tokens are attending to text tokens sequence length of text tokens is really small and potentially smaller than specified block size so KV block sizes are overwritten to safe values. + +> KV block sizes must be multiple of 128 since the size of register is 8x128 and in attention KV sequence dim lies on 128 for the multiplications as K is transposed. \ No newline at end of file diff --git a/docs/attention_blocks_flowchart.png b/docs/attention_blocks_flowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..bed28e63700a7f3da290801c1d318fbbe3dc632e GIT binary patch literal 234417 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ⅇyR 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

p@` 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 0: - use_fused_bwd_kernel = config.flash_block_sizes.get("use_fused_bwd_kernel", False) + attention_is_tokamax = "tokamax" in config.attention + user_block_sizes:Dict[str, int] = config.flash_block_sizes + if attention_is_tokamax: + max_logging.log("Tokamax kernel specified, Note: Tokamax only supports fused backward kernel." + "Hence following flash block properties specified will be ignored:" + f"block_q: {user_block_sizes['block_q']}," + f"block_q_dq: {user_block_sizes.get('block_q_dq')}," + f"block_kv_dq: {user_block_sizes.get('block_kv_dq')}," + f"use_fused_bwd_kernel: {user_block_sizes.get('use_fused_bwd_kernel')}" + ) flash_block_sizes = splash_attention_kernel.BlockSizes( - block_q=config.flash_block_sizes["block_q"], - block_kv_compute=config.flash_block_sizes["block_kv_compute"], - block_kv=config.flash_block_sizes["block_kv"], - block_q_dkv=config.flash_block_sizes["block_q_dkv"], - block_kv_dkv=config.flash_block_sizes["block_kv_dkv"], - block_kv_dkv_compute=config.flash_block_sizes["block_kv_dkv_compute"], - block_q_dq=value_or_none(config.flash_block_sizes, "block_q_dq"), - block_kv_dq=value_or_none(config.flash_block_sizes, "block_kv_dq"), - use_fused_bwd_kernel=value_or_none(config.flash_block_sizes, "use_fused_bwd_kernel"), + block_q=user_block_sizes.get("block_q_dkv", user_block_sizes["block_kv"]) if attention_is_tokamax else user_block_sizes["block_q"], + block_kv_compute=user_block_sizes["block_kv_compute"], + block_kv=user_block_sizes["block_kv"], + block_q_dkv=user_block_sizes["block_q_dkv"], + block_kv_dkv=user_block_sizes["block_kv_dkv"], + block_kv_dkv_compute=user_block_sizes["block_kv_dkv_compute"], + block_q_dq=None if attention_is_tokamax else value_or_none(user_block_sizes, "block_q_dq"), + block_kv_dq=None if attention_is_tokamax else value_or_none(user_block_sizes, "block_kv_dq"), + use_fused_bwd_kernel=True if attention_is_tokamax else value_or_none(user_block_sizes, "use_fused_bwd_kernel"), ) return flash_block_sizes diff --git a/src/maxdiffusion/models/attention_flax.py b/src/maxdiffusion/models/attention_flax.py index e95a8b25..22ee47d9 100644 --- a/src/maxdiffusion/models/attention_flax.py +++ b/src/maxdiffusion/models/attention_flax.py @@ -189,14 +189,15 @@ def _tpu_flash_attention( if flash_block_sizes: block_sizes = flash_block_sizes else: + block_size_q = flash_block_sizes.block_q if flash_block_sizes else q_max_block_size block_sizes = splash_attention_kernel.BlockSizes( - block_q=min(q_max_block_size, query.shape[2]), + block_q=block_size_q, block_kv_compute=min(kv_max_block_size, key.shape[2]), block_kv=min(kv_max_block_size, key.shape[2]), - block_q_dkv=min(q_max_block_size, query.shape[2]), + block_q_dkv=block_size_q, block_kv_dkv=min(kv_max_block_size, key.shape[2]), block_kv_dkv_compute=min(kv_max_block_size, query.shape[2]), - block_q_dq=None if attention_kernel == "tokamax_flash" else block_sizes.block_q_dq, + block_q_dq=None if attention_kernel == "tokamax_flash" else block_size_q, block_kv_dq=None if attention_kernel == "tokamax_flash" else min(kv_max_block_size, query.shape[2]), use_fused_bwd_kernel=True if attention_kernel == "tokamax_flash" else False, ) diff --git a/src/maxdiffusion/tests/wan_transformer_test.py b/src/maxdiffusion/tests/wan_transformer_test.py index 34f0ef64..47a41234 100644 --- a/src/maxdiffusion/tests/wan_transformer_test.py +++ b/src/maxdiffusion/tests/wan_transformer_test.py @@ -23,7 +23,7 @@ from absl.testing import absltest from flax import nnx from jax.sharding import Mesh - +from flax.linen import partitioning as nn_partitioning from .. import pyconfig from ..max_utils import (create_device_mesh, get_flash_block_sizes) from ..models.wan.transformers.transformer_wan import ( @@ -53,6 +53,18 @@ class WanTransformerTest(unittest.TestCase): def setUp(self): WanTransformerTest.dummy_data = {} + pyconfig.initialize( + [ + None, + os.path.join(THIS_DIR, "..", "configs", "base_wan_14b.yml"), + ], + unittest=True, + ) + config = pyconfig.config + self.config = config + devices_array = create_device_mesh(config) + self.mesh = Mesh(devices_array, config.mesh_axes) + def test_rotary_pos_embed(self): batch_size = 1 @@ -70,18 +82,20 @@ def test_nnx_pixart_alpha_text_projection(self): key = jax.random.key(0) rngs = nnx.Rngs(key) dummy_caption = jnp.ones((1, 512, 4096)) - layer = NNXPixArtAlphaTextProjection(rngs=rngs, in_features=4096, hidden_size=5120) - dummy_output = layer(dummy_caption) - dummy_output.shape == (1, 512, 5120) + with self.mesh, nn_partitioning.axis_rules(self.config.logical_axis_rules): + layer = NNXPixArtAlphaTextProjection(rngs=rngs, in_features=4096, hidden_size=5120) + dummy_output = layer(dummy_caption) + dummy_output.shape == (1, 512, 5120) def test_nnx_timestep_embedding(self): key = jax.random.key(0) rngs = nnx.Rngs(key) dummy_sample = jnp.ones((1, 256)) - layer = NNXTimestepEmbedding(rngs=rngs, in_channels=256, time_embed_dim=5120) - dummy_output = layer(dummy_sample) - assert dummy_output.shape == (1, 5120) + with self.mesh, nn_partitioning.axis_rules(self.config.logical_axis_rules): + layer = NNXTimestepEmbedding(rngs=rngs, in_channels=256, time_embed_dim=5120) + dummy_output = layer(dummy_sample) + assert dummy_output.shape == (1, 5120) def test_fp32_layer_norm(self): key = jax.random.key(0) @@ -89,9 +103,10 @@ def test_fp32_layer_norm(self): batch_size = 1 dummy_hidden_states = jnp.ones((batch_size, 75600, 5120)) # expected same output shape with same dtype - layer = FP32LayerNorm(rngs=rngs, dim=5120, eps=1e-6, elementwise_affine=False) - dummy_output = layer(dummy_hidden_states) - assert dummy_output.shape == dummy_hidden_states.shape + with self.mesh, nn_partitioning.axis_rules(self.config.logical_axis_rules): + layer = FP32LayerNorm(rngs=rngs, dim=5120, eps=1e-6, elementwise_affine=False) + dummy_output = layer(dummy_hidden_states) + assert dummy_output.shape == dummy_hidden_states.shape @pytest.mark.skipif(IN_GITHUB_ACTIONS, reason="Don't run smoke tests on Github Actions") def test_wan_time_text_embedding(self): @@ -102,20 +117,21 @@ def test_wan_time_text_embedding(self): time_freq_dim = 256 time_proj_dim = 30720 text_embed_dim = 4096 - layer = WanTimeTextImageEmbedding( - rngs=rngs, dim=dim, time_freq_dim=time_freq_dim, time_proj_dim=time_proj_dim, text_embed_dim=text_embed_dim - ) + with self.mesh, nn_partitioning.axis_rules(self.config.logical_axis_rules): + layer = WanTimeTextImageEmbedding( + rngs=rngs, dim=dim, time_freq_dim=time_freq_dim, time_proj_dim=time_proj_dim, text_embed_dim=text_embed_dim + ) - dummy_timestep = jnp.ones(batch_size) + dummy_timestep = jnp.ones(batch_size) - encoder_hidden_states_shape = (batch_size, time_freq_dim * 2, text_embed_dim) - dummy_encoder_hidden_states = jnp.ones(encoder_hidden_states_shape) - temb, timestep_proj, encoder_hidden_states, encoder_hidden_states_image = layer( - dummy_timestep, dummy_encoder_hidden_states - ) - assert temb.shape == (batch_size, dim) - assert timestep_proj.shape == (batch_size, time_proj_dim) - assert encoder_hidden_states.shape == (batch_size, time_freq_dim * 2, dim) + encoder_hidden_states_shape = (batch_size, time_freq_dim * 2, text_embed_dim) + dummy_encoder_hidden_states = jnp.ones(encoder_hidden_states_shape) + temb, timestep_proj, encoder_hidden_states, encoder_hidden_states_image = layer( + dummy_timestep, dummy_encoder_hidden_states + ) + assert temb.shape == (batch_size, dim) + assert timestep_proj.shape == (batch_size, time_proj_dim) + assert encoder_hidden_states.shape == (batch_size, time_freq_dim * 2, dim) def test_wan_block(self): key = jax.random.key(0) @@ -181,68 +197,66 @@ def test_wan_block(self): assert dummy_output.shape == dummy_hidden_states.shape def test_wan_attention(self): - pyconfig.initialize( - [ - None, - os.path.join(THIS_DIR, "..", "configs", "base_wan_14b.yml"), - ], - unittest=True, - ) - config = pyconfig.config - - batch_size = 1 - channels = 16 - frames = 21 - height = 90 - width = 160 - hidden_states_shape = (batch_size, frames, height, width, channels) - dummy_hidden_states = jnp.ones(hidden_states_shape) - wan_rot_embed = WanRotaryPosEmbed(attention_head_dim=128, patch_size=[1, 2, 2], max_seq_len=1024) - dummy_rotary_emb = wan_rot_embed(dummy_hidden_states) - - key = jax.random.key(0) - rngs = nnx.Rngs(key) - devices_array = create_device_mesh(config) - - flash_block_sizes = get_flash_block_sizes(config) - - mesh = Mesh(devices_array, config.mesh_axes) - batch_size = 1 - query_dim = 5120 - attention = FlaxWanAttention( - rngs=rngs, - query_dim=query_dim, - heads=40, - dim_head=128, - attention_kernel="flash", - mesh=mesh, - flash_block_sizes=flash_block_sizes, - ) - - dummy_hidden_states_shape = (batch_size, 75600, query_dim) - - dummy_hidden_states = jnp.ones(dummy_hidden_states_shape) - dummy_encoder_hidden_states = jnp.ones(dummy_hidden_states_shape) - with mesh: - dummy_output = attention( - hidden_states=dummy_hidden_states, encoder_hidden_states=dummy_encoder_hidden_states, rotary_emb=dummy_rotary_emb - ) - assert dummy_output.shape == dummy_hidden_states_shape - - # dot product - try: - attention = FlaxWanAttention( - rngs=rngs, - query_dim=query_dim, - heads=40, - dim_head=128, - attention_kernel="dot_product", - split_head_dim=True, - mesh=mesh, - flash_block_sizes=flash_block_sizes, + for attention_kernel in ["flash", "tokamax_flash"]: + pyconfig.initialize( + [ + None, + os.path.join(THIS_DIR, "..", "configs", "base_wan_14b.yml"), + f"attention={attention_kernel}" + ], + unittest=True ) - except NotImplementedError: - pass + config = pyconfig.config + batch_size = 1 + channels = 16 + frames = 21 + height = 90 + width = 160 + hidden_states_shape = (batch_size, frames, height, width, channels) + dummy_hidden_states = jnp.ones(hidden_states_shape) + wan_rot_embed = WanRotaryPosEmbed(attention_head_dim=128, patch_size=[1, 2, 2], max_seq_len=1024) + dummy_rotary_emb = wan_rot_embed(dummy_hidden_states) + + key = jax.random.key(0) + rngs = nnx.Rngs(key) + devices_array = create_device_mesh(config) + mesh = Mesh(devices_array, config.mesh_axes) + batch_size = 1 + query_dim = 5120 + with mesh, nn_partitioning.axis_rules(config.logical_axis_rules): + flash_block_sizes = get_flash_block_sizes(config) + attention = FlaxWanAttention( + rngs=rngs, + query_dim=query_dim, + heads=40, + dim_head=128, + attention_kernel=attention_kernel, + mesh=mesh, + flash_block_sizes=flash_block_sizes, + ) + dummy_hidden_states_shape = (batch_size, 75600, query_dim) + + dummy_hidden_states = jnp.ones(dummy_hidden_states_shape) + dummy_encoder_hidden_states = jnp.ones(dummy_hidden_states_shape) + dummy_output = attention( + hidden_states=dummy_hidden_states, encoder_hidden_states=dummy_encoder_hidden_states, rotary_emb=dummy_rotary_emb + ) + assert dummy_output.shape == dummy_hidden_states_shape + + # dot product + try: + attention = FlaxWanAttention( + rngs=rngs, + query_dim=query_dim, + heads=40, + dim_head=128, + attention_kernel="dot_product", + split_head_dim=True, + mesh=mesh, + flash_block_sizes=flash_block_sizes, + ) + except NotImplementedError: + pass @pytest.mark.skipif(IN_GITHUB_ACTIONS, reason="Don't run smoke tests on Github Actions") def test_wan_model(self): @@ -272,7 +286,8 @@ def test_wan_model(self): mesh = Mesh(devices_array, config.mesh_axes) batch_size = 1 num_layers = 1 - wan_model = WanModel(rngs=rngs, attention="flash", mesh=mesh, flash_block_sizes=flash_block_sizes, num_layers=num_layers) + with nn_partitioning.axis_rules(config.logical_axis_rules): + wan_model = WanModel(rngs=rngs, attention="flash", mesh=mesh, flash_block_sizes=flash_block_sizes, num_layers=num_layers) dummy_timestep = jnp.ones((batch_size)) dummy_encoder_hidden_states = jnp.ones((batch_size, 512, 4096)) From d848983f4c8575e2bf6bf204754a5413e9fb2945 Mon Sep 17 00:00:00 2001 From: Elisa Tsai Date: Mon, 15 Dec 2025 19:29:47 +0000 Subject: [PATCH 2/4] Reapply "Cross self attention switch (#251)" (#288) This reverts commit f1ff3ccc4614722ab9ca90c2954954c12bfe0857. --- .gitignore | 2 +- preview-xpk.sh | 93 -------- requirements.txt | 1 + src/maxdiffusion/common_types.py | 36 ++- src/maxdiffusion/configs/base14.yml | 9 + src/maxdiffusion/configs/base21.yml | 10 + src/maxdiffusion/configs/base_2_base.yml | 10 + src/maxdiffusion/configs/base_flux_dev.yml | 9 + .../configs/base_flux_dev_multi_res.yml | 9 + .../configs/base_flux_schnell.yml | 9 + src/maxdiffusion/configs/base_wan_14b.yml | 32 ++- src/maxdiffusion/configs/base_wan_27b.yml | 9 + src/maxdiffusion/configs/base_xl.yml | 9 + .../configs/base_xl_lightning.yml | 9 + src/maxdiffusion/generate_wan.py | 9 + src/maxdiffusion/max_utils.py | 2 +- src/maxdiffusion/models/attention_flax.py | 105 +++++++-- .../models/wan/autoencoder_kl_wan.py | 3 +- .../wan/transformers/transformer_wan.py | 106 +++++---- .../pipelines/wan/wan_pipeline.py | 16 +- src/maxdiffusion/pyconfig.py | 21 +- .../tests/wan_transformer_test.py | 27 ++- src/maxdiffusion/tests/wan_vae_test.py | 221 ++++++++++-------- src/maxdiffusion/trainers/wan_trainer.py | 2 +- tests/schedulers/test_scheduler_flax.py | 4 +- 25 files changed, 472 insertions(+), 291 deletions(-) delete mode 100755 preview-xpk.sh diff --git a/.gitignore b/.gitignore index 8e4e723f..bd4a64b8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ __pycache__/ *.py[cod] *$py.class - # C extensions *.so @@ -98,6 +97,7 @@ celerybeat-schedule # Environments .env +.history .venv env/ venv/ diff --git a/preview-xpk.sh b/preview-xpk.sh deleted file mode 100755 index 25a76aa0..00000000 --- a/preview-xpk.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash -bash docker_build_dependency_image.sh -docker tag maxdiffusion_base_image:latest gcr.io/cloud-tpu-multipod-dev/sanbao/maxdiffusion_base_image:latest -docker push gcr.io/cloud-tpu-multipod-dev/sanbao/maxdiffusion_base_image:latest -CLUSTER_NAME=bodaborg-tpu7x-128 -DEVICE_TYPE=tpu7x-128 # can change to any size <= tpu7x-256 -PROJECT=cloud-tpu-multipod-dev -ZONE=us-central1 - -# Please change the RUN_NAME and OUTPUT_DIR to your own GCS bucket path. -export RUN_NAME=sanbao-wan-v7x-20k-${RANDOM} -OUTPUT_DIR=gs://sanbao-bucket/wan/${RUN_NAME} -# OUTPUT_DIR=gs://sanbao-bucket/wan/sanbao-wan-train-test -DATASET_DIR=gs://sanbao-bucket/wan_tfr_dataset_pusa_v1/train/ -EVAL_DATA_DIR=gs://sanbao-bucket/wan_tfr_dataset_pusa_v1/eval_timesteps/ -SAVE_DATASET_DIR=gs://sanbao-bucket/wan_tfr_dataset_pusa_v1/save/ -RANDOM=123456789 -IMAGE_DIR=gcr.io/cloud-tpu-multipod-dev/sanbao/maxdiffusion_base_image:latest -# IMAGE_DIR=gcr.io/tpu-prod-env-multipod/maxdiffusion_jax_stable_stack_nightly@sha256:fd27d49a3be7f743f08e3b6b03e5ae00196794944310e3fee2a7795b99d81195 -LIBTPU_VERSION=libtpu-0.0.25.dev20251013+tpu7x-cp312-cp312-manylinux_2_31_x86_64.whl - -xpk workload create \ ---cluster=$CLUSTER_NAME \ ---project=$PROJECT \ ---zone=$ZONE \ ---device-type=$DEVICE_TYPE \ ---num-slices=1 \ ---command=" \ -pip install . && \ -gsutil cp gs://libtpu-tpu7x-releases/wheels/libtpu/${LIBTPU_VERSION} . && \ -python -m pip install ${LIBTPU_VERSION} && \ -export LIBTPU_INIT_ARGS='--xla_enable_async_all_gather=true \ ---xla_tpu_enable_async_collective_fusion=true \ ---xla_tpu_enable_async_collective_fusion_fuse_all_gather=true \ ---xla_enable_async_all_reduce=true \ ---xla_tpu_enable_sparse_core_collective_offload_all_reduce=true \ ---xla_max_concurrent_async_all_gathers=4 \ ---xla_tpu_enable_async_all_to_all=true \ ---xla_latency_hiding_scheduler_rerun=5 \ ---xla_tpu_rwb_fusion=false \ ---xla_tpu_enable_sublane_major_scaling_bitcast_fusion=false \ ---xla_tpu_impure_enable_packed_bf16_math_ops=false \ ---xla_tpu_enable_sparse_core_reduce_scatter_v2=true \ ---xla_tpu_enable_sparse_core_collective_offload_all_gather=true \ ---xla_tpu_enable_sparse_core_collective_offload_2d_all_gather=true \ ---xla_tpu_enable_all_gather_offload_tracing=true \ ---xla_tpu_use_tc_device_shape_on_sc=true \ ---xla_tpu_prefer_async_allgather_to_allreduce=true \ ---xla_tpu_enable_sparse_core_collective_offload_reduce_scatter=true \ ---xla_tpu_scoped_vmem_limit_kib=65536 \ ---xla_tpu_enable_tpu_custom_call_scoped_vmem_adjustments=true \ ---xla_enable_transpose_trace=false' && \ -echo 'Starting WAN training ...' && \ -HF_HUB_CACHE=/dev/shm python src/maxdiffusion/train_wan.py \ - src/maxdiffusion/configs/base_wan_14b.yml \ - attention='flash' \ - weights_dtype=bfloat16 \ - activations_dtype=bfloat16 \ - guidance_scale=5.0 \ - flow_shift=5.0 \ - fps=16 \ - skip_jax_distributed_system=False \ - run_name='test-wan-training-new' \ - output_dir=${OUTPUT_DIR} \ - train_data_dir=${DATASET_DIR} \ - load_tfrecord_cached=True \ - height=1280 \ - width=720 \ - num_frames=81 \ - num_inference_steps=50 \ - prompt='a japanese pop star young woman with black hair is singing with a smile. She is inside a studio with dim lighting and musical instruments.' \ - jax_cache_dir=${OUTPUT_DIR}/jax_cache/ \ - enable_profiler=True \ - dataset_save_location=${SAVE_DATASET_DIR} \ - remat_policy='HIDDEN_STATE_WITH_OFFLOAD' \ - flash_min_seq_length=0 \ - seed=$RANDOM \ - skip_first_n_steps_for_profiler=3 \ - profiler_steps=3 \ - per_device_batch_size=0.5 \ - ici_data_parallelism=64 \ - ici_fsdp_parallelism=2 \ - ici_tensor_parallelism=1 \ - allow_split_physical_axes=True \ - max_train_steps=150 \ - scan_layers=true \ - flash_block_sizes='{\"block_q\":2048,\"block_kv_compute\":512,\"block_kv\":2048,\"block_q_dkv\":2048,\"block_kv_dkv\":2048,\"block_kv_dkv_compute\":512,\"use_fused_bwd_kernel\":true}' \ - " \ ---base-docker-image=${IMAGE_DIR} \ ---enable-debug-logs \ ---workload=${RUN_NAME} \ ---priority=medium \ ---max-restarts=0 diff --git a/requirements.txt b/requirements.txt index 478359fe..0516b9f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,6 +13,7 @@ ftfy tensorboard>=2.17.0 tensorboardx>=2.6.2.2 tensorboard-plugin-profile>=2.15.2 +tokamax Jinja2 scikit-image parameterized diff --git a/src/maxdiffusion/common_types.py b/src/maxdiffusion/common_types.py index 51fe2b8d..71b3735d 100644 --- a/src/maxdiffusion/common_types.py +++ b/src/maxdiffusion/common_types.py @@ -33,7 +33,11 @@ BlockSizes = splash_attention_kernel.BlockSizes AxisNames = tuple[str, ...] - +# Physical axis names for device meshes. +DATA = "data" +FSDP = "fsdp" +TENSOR = "tensor" +# Logical axis names for model parameters and activations. BATCH = "activation_batch" LENGTH = "activation_length" KV_LENGTH = "activation_kv_length" @@ -48,3 +52,33 @@ WAN2_2 = "wan2.2" WAN_MODEL = WAN2_1 + +# For setting self/cross attention independently in splash kernel +SELF_ATTN_HEAD = "activation_self_attn_heads" +SELF_ATTN_Q_LENGTH = "activation_self_attn_q_length" +SELF_ATTN_KV_LENGTH = "activation_self_attn_kv_length" +CROSS_ATTN_HEAD = "activation_cross_attn_heads" +CROSS_ATTN_Q_LENGTH = "activation_cross_attn_q_length" +CROSS_ATTN_KV_LENGTH = "activation_cross_attn_kv_length" + + +WAN_MODEL = "Wan2.1" + +### Common axis rules for ring attention ### +RING_ATTENTION_AXIS_RULES = [ + [SELF_ATTN_HEAD, None], + [SELF_ATTN_Q_LENGTH, FSDP], + [SELF_ATTN_KV_LENGTH, FSDP], + [CROSS_ATTN_HEAD, None], + [CROSS_ATTN_Q_LENGTH, FSDP], + [CROSS_ATTN_KV_LENGTH, FSDP], +] + +SEQUENCE_PARALLEL_AXIS_RULES = [ + [SELF_ATTN_HEAD, None], + [SELF_ATTN_Q_LENGTH, FSDP], + [SELF_ATTN_KV_LENGTH, None], + [CROSS_ATTN_HEAD, None], + [CROSS_ATTN_Q_LENGTH, FSDP], + [CROSS_ATTN_KV_LENGTH, None], +] \ No newline at end of file diff --git a/src/maxdiffusion/configs/base14.yml b/src/maxdiffusion/configs/base14.yml index 80daf9ea..7bd8ae70 100644 --- a/src/maxdiffusion/configs/base14.yml +++ b/src/maxdiffusion/configs/base14.yml @@ -50,6 +50,15 @@ jit_initializers: True from_pt: False split_head_dim: True attention: 'dot_product' # Supported attention: dot_product, flash +# If mask_padding_tokens is True, we pass in segment ids to splash attention to avoid attending to padding tokens. +# Else we do not pass in segment ids and on vpu bound hardware like trillium this is faster. +# However, when padding tokens are significant, this will lead to worse quality and should be set to True. +mask_padding_tokens: True +# Maxdiffusion has 2 types of attention sharding strategies: +# 1. attention_sharding_uniform = True : same sequence sharding rules applied for q in both (self and cross attention) +# 2. attention_sharding_uniform = False : Heads are sharded uniformly across devices for self attention while sequence is sharded +# in cross attention q. +attention_sharding_uniform: True flash_block_sizes: {} # GroupNorm groups norm_num_groups: 32 diff --git a/src/maxdiffusion/configs/base21.yml b/src/maxdiffusion/configs/base21.yml index d02af595..24dffe40 100644 --- a/src/maxdiffusion/configs/base21.yml +++ b/src/maxdiffusion/configs/base21.yml @@ -49,6 +49,16 @@ jit_initializers: True from_pt: False split_head_dim: True attention: 'dot_product' # Supported attention: dot_product, flash +# If mask_padding_tokens is True, we pass in segment ids to splash attention to avoid attending to padding tokens. +# Else we do not pass in segment ids and on vpu bound hardware like trillium this is faster. +# However, when padding tokens are significant, this will lead to worse quality and should be set to True. +mask_padding_tokens: True +# Maxdiffusion has 2 types of attention sharding strategies: +# 1. attention_sharding_uniform = True : same sequence sharding rules applied for q in both (self and cross attention) +# 2. attention_sharding_uniform = False : Heads are sharded uniformly across devices for self attention while sequence is sharded +# in cross attention q. +attention_sharding_uniform: True + flash_block_sizes: {} # GroupNorm groups norm_num_groups: 32 diff --git a/src/maxdiffusion/configs/base_2_base.yml b/src/maxdiffusion/configs/base_2_base.yml index b535762e..7b224058 100644 --- a/src/maxdiffusion/configs/base_2_base.yml +++ b/src/maxdiffusion/configs/base_2_base.yml @@ -50,6 +50,16 @@ jit_initializers: True from_pt: True split_head_dim: True attention: 'flash' # Supported attention: dot_product, flash +# If mask_padding_tokens is True, we pass in segment ids to splash attention to avoid attending to padding tokens. +# Else we do not pass in segment ids and on vpu bound hardware like trillium this is faster. +# However, when padding tokens are significant, this will lead to worse quality and should be set to True. +mask_padding_tokens: True +# Maxdiffusion has 2 types of attention sharding strategies: +# 1. attention_sharding_uniform = True : same sequence sharding rules applied for q in both (self and cross attention) +# 2. attention_sharding_uniform = False : Heads are sharded uniformly across devices for self attention while sequence is sharded +# in cross attention q. +attention_sharding_uniform: True + flash_block_sizes: {} # to override default block sizes for flash attention # flash_block_sizes: diff --git a/src/maxdiffusion/configs/base_flux_dev.yml b/src/maxdiffusion/configs/base_flux_dev.yml index a7ca1350..0036b363 100644 --- a/src/maxdiffusion/configs/base_flux_dev.yml +++ b/src/maxdiffusion/configs/base_flux_dev.yml @@ -63,6 +63,15 @@ jit_initializers: True from_pt: True split_head_dim: True attention: 'flash' # Supported attention: dot_product, flash, cudnn_flash_te +# If mask_padding_tokens is True, we pass in segment ids to splash attention to avoid attending to padding tokens. +# Else we do not pass in segment ids and on vpu bound hardware like trillium this is faster. +# However, when padding tokens are significant, this will lead to worse quality and should be set to True. +mask_padding_tokens: True +# Maxdiffusion has 2 types of attention sharding strategies: +# 1. attention_sharding_uniform = True : same sequence sharding rules applied for q in both (self and cross attention) +# 2. attention_sharding_uniform = False : Heads are sharded uniformly across devices for self attention while sequence is sharded +# in cross attention q. +attention_sharding_uniform: True flash_block_sizes: {} # Use the following flash_block_sizes on v6e (Trillium) due to larger vmem. diff --git a/src/maxdiffusion/configs/base_flux_dev_multi_res.yml b/src/maxdiffusion/configs/base_flux_dev_multi_res.yml index 0da843fd..ac0a0f8c 100644 --- a/src/maxdiffusion/configs/base_flux_dev_multi_res.yml +++ b/src/maxdiffusion/configs/base_flux_dev_multi_res.yml @@ -63,6 +63,15 @@ jit_initializers: True from_pt: True split_head_dim: True attention: 'flash' # Supported attention: dot_product, flash, cudnn_flash_te +# If mask_padding_tokens is True, we pass in segment ids to splash attention to avoid attending to padding tokens. +# Else we do not pass in segment ids and on vpu bound hardware like trillium this is faster. +# However, when padding tokens are significant, this will lead to worse quality and should be set to True. +mask_padding_tokens: True +# Maxdiffusion has 2 types of attention sharding strategies: +# 1. attention_sharding_uniform = True : same sequence sharding rules applied for q in both (self and cross attention) +# 2. attention_sharding_uniform = False : Heads are sharded uniformly across devices for self attention while sequence is sharded +# in cross attention q. +attention_sharding_uniform: True #flash_block_sizes: {} # Use the following flash_block_sizes on v6e (Trillium) due to larger vmem. diff --git a/src/maxdiffusion/configs/base_flux_schnell.yml b/src/maxdiffusion/configs/base_flux_schnell.yml index 300ec039..c60dd79e 100644 --- a/src/maxdiffusion/configs/base_flux_schnell.yml +++ b/src/maxdiffusion/configs/base_flux_schnell.yml @@ -62,6 +62,15 @@ jit_initializers: True from_pt: True split_head_dim: True attention: 'flash' # Supported attention: dot_product, flash, cudnn_flash_te +# If mask_padding_tokens is True, we pass in segment ids to splash attention to avoid attending to padding tokens. +# Else we do not pass in segment ids and on vpu bound hardware like trillium this is faster. +# However, when padding tokens are significant, this will lead to worse quality and should be set to True. +mask_padding_tokens: True +# Maxdiffusion has 2 types of attention sharding strategies: +# 1. attention_sharding_uniform = True : same sequence sharding rules applied for q in both (self and cross attention) +# 2. attention_sharding_uniform = False : Heads are sharded uniformly across devices for self attention while sequence is sharded +# in cross attention q. +attention_sharding_uniform: True flash_block_sizes: { "block_q" : 256, "block_kv_compute" : 256, diff --git a/src/maxdiffusion/configs/base_wan_14b.yml b/src/maxdiffusion/configs/base_wan_14b.yml index 8cd7e70f..e8146a70 100644 --- a/src/maxdiffusion/configs/base_wan_14b.yml +++ b/src/maxdiffusion/configs/base_wan_14b.yml @@ -60,7 +60,17 @@ jit_initializers: True from_pt: True split_head_dim: True attention: 'flash' # Supported attention: dot_product, flash, cudnn_flash_te, ring -flash_min_seq_length: 4096 +flash_min_seq_length: 0 + +# If mask_padding_tokens is True, we pass in segment ids to splash attention to avoid attending to padding tokens. +# Else we do not pass in segment ids and on vpu bound hardware like trillium this is faster. +# However, when padding tokens are significant, this will lead to worse quality and should be set to True. +mask_padding_tokens: True +# Maxdiffusion has 2 types of attention sharding strategies: +# 1. attention_sharding_uniform = True : same sequence sharding rules applied for q in both (self and cross attention) +# 2. attention_sharding_uniform = False : Heads are sharded uniformly across devices for self attention while sequence is sharded +# in cross attention q. +attention_sharding_uniform: True dropout: 0.1 flash_block_sizes: { @@ -70,7 +80,7 @@ flash_block_sizes: { "block_q_dkv" : 2048, "block_kv_dkv" : 2048, "block_kv_dkv_compute" : 512, - "use_fused_bwd_kernel" : True + "use_fused_bwd_kernel": True } # Use on v6e # flash_block_sizes: { @@ -79,11 +89,22 @@ flash_block_sizes: { # "block_kv" : 2048, # "block_q_dkv" : 3024, # "block_kv_dkv" : 2048, -# "block_kv_dkv_compute" : 2048, +# "block_kv_dkv_compute" : 1024, # "block_q_dq" : 3024, # "block_kv_dq" : 2048, # "use_fused_bwd_kernel": False, # } +# Use on v5p +# flash_block_sizes: { +# "block_q" : 3024, +# "block_kv_compute" : 1024, +# "block_kv" : 2048, +# "block_q_dkv" : 1024, +# "block_kv_dkv" : 3072, +# "block_kv_dkv_compute" : 256, +# "block_q_dq" : 1024, +# "block_kv_dq" : 3072 +# } # GroupNorm groups norm_num_groups: 32 @@ -144,8 +165,9 @@ mesh_axes: ['data', 'fsdp', 'tensor'] logical_axis_rules: [ ['batch', 'data'], ['activation_batch', 'data'], + ['activation_self_attn_heads', ['fsdp', 'tensor']], + ['activation_cross_attn_q_length', ['fsdp', 'tensor']], ['activation_length', 'fsdp'], - ['activation_heads', 'tensor'], ['mlp','tensor'], ['embed','fsdp'], @@ -279,7 +301,7 @@ flow_shift: 3.0 # Based on 3.4. in https://arxiv.org/pdf/2305.08891.pdf guidance_rescale: 0.0 num_inference_steps: 30 -fps: 24 +fps: 16 save_final_checkpoint: False # SDXL Lightning parameters diff --git a/src/maxdiffusion/configs/base_wan_27b.yml b/src/maxdiffusion/configs/base_wan_27b.yml index ffdf02eb..1b93a32a 100644 --- a/src/maxdiffusion/configs/base_wan_27b.yml +++ b/src/maxdiffusion/configs/base_wan_27b.yml @@ -61,6 +61,15 @@ from_pt: True split_head_dim: True attention: 'flash' # Supported attention: dot_product, flash, cudnn_flash_te, ring flash_min_seq_length: 4096 +# If mask_padding_tokens is True, we pass in segment ids to splash attention to avoid attending to padding tokens. +# Else we do not pass in segment ids and on vpu bound hardware like trillium this is faster. +# However, when padding tokens are significant, this will lead to worse quality and should be set to True. +mask_padding_tokens: True +# Maxdiffusion has 2 types of attention sharding strategies: +# 1. attention_sharding_uniform = True : same sequence sharding rules applied for q in both (self and cross attention) +# 2. attention_sharding_uniform = False : Heads are sharded uniformly across devices for self attention while sequence is sharded +# in cross attention q. +attention_sharding_uniform: True dropout: 0.1 flash_block_sizes: { diff --git a/src/maxdiffusion/configs/base_xl.yml b/src/maxdiffusion/configs/base_xl.yml index aa07940e..49e53ae5 100644 --- a/src/maxdiffusion/configs/base_xl.yml +++ b/src/maxdiffusion/configs/base_xl.yml @@ -50,6 +50,15 @@ jit_initializers: True from_pt: False split_head_dim: True attention: 'dot_product' # Supported attention: dot_product, flash +# If mask_padding_tokens is True, we pass in segment ids to splash attention to avoid attending to padding tokens. +# Else we do not pass in segment ids and on vpu bound hardware like trillium this is faster. +# However, when padding tokens are significant, this will lead to worse quality and should be set to True. +mask_padding_tokens: True +# Maxdiffusion has 2 types of attention sharding strategies: +# 1. attention_sharding_uniform = True : same sequence sharding rules applied for q in both (self and cross attention) +# 2. attention_sharding_uniform = False : Heads are sharded uniformly across devices for self attention while sequence is sharded +# in cross attention q. +attention_sharding_uniform: True flash_block_sizes: {} # GroupNorm groups norm_num_groups: 32 diff --git a/src/maxdiffusion/configs/base_xl_lightning.yml b/src/maxdiffusion/configs/base_xl_lightning.yml index ee2e59d5..6f6662b0 100644 --- a/src/maxdiffusion/configs/base_xl_lightning.yml +++ b/src/maxdiffusion/configs/base_xl_lightning.yml @@ -48,6 +48,15 @@ jit_initializers: True from_pt: False split_head_dim: True attention: 'flash' # Supported attention: dot_product, flash +# If mask_padding_tokens is True, we pass in segment ids to splash attention to avoid attending to padding tokens. +# Else we do not pass in segment ids and on vpu bound hardware like trillium this is faster. +# However, when padding tokens are significant, this will lead to worse quality and should be set to True. +mask_padding_tokens: True +# Maxdiffusion has 2 types of attention sharding strategies: +# 1. attention_sharding_uniform = True : same sequence sharding rules applied for q in both (self and cross attention) +# 2. attention_sharding_uniform = False : Heads are sharded uniformly across devices for self attention while sequence is sharded +# in cross attention q. +attention_sharding_uniform: True flash_block_sizes: {} # GroupNorm groups norm_num_groups: 32 diff --git a/src/maxdiffusion/generate_wan.py b/src/maxdiffusion/generate_wan.py index e3365e96..d67fd2e8 100644 --- a/src/maxdiffusion/generate_wan.py +++ b/src/maxdiffusion/generate_wan.py @@ -76,6 +76,15 @@ def get_git_commit_hash(): return None jax.config.update("jax_use_shardy_partitioner", True) +jax.config.update("jax_default_prng_impl", "unsafe_rbg") + # TF allocates extraneous GPU memory when using TFDS data + # this leads to CUDA OOMs. WAR for now is to hide GPUs from TF + # tf.config.set_visible_devices([], "GPU") +if "xla_tpu_spmd_rng_bit_generator_unsafe" not in os.environ.get("LIBTPU_INIT_ARGS", ""): + max_logging.log("Enabling unsafe RNG bit generator for TPU SPMD.") + os.environ["LIBTPU_INIT_ARGS"] = ( + os.environ.get("LIBTPU_INIT_ARGS", "") + " --xla_tpu_spmd_rng_bit_generator_unsafe=true" + ) def call_pipeline(config, pipeline, prompt, negative_prompt): model_key = config.model_name diff --git a/src/maxdiffusion/max_utils.py b/src/maxdiffusion/max_utils.py index e687396e..48c6ca44 100644 --- a/src/maxdiffusion/max_utils.py +++ b/src/maxdiffusion/max_utils.py @@ -650,4 +650,4 @@ def maybe_initialize_jax_distributed_system(raw_keys): initialize_jax_for_gpu() max_logging.log("Jax distributed system initialized on GPU!") else: - jax.distributed.initialize() \ No newline at end of file + jax.distributed.initialize() diff --git a/src/maxdiffusion/models/attention_flax.py b/src/maxdiffusion/models/attention_flax.py index 22ee47d9..cfe3c1fc 100644 --- a/src/maxdiffusion/models/attention_flax.py +++ b/src/maxdiffusion/models/attention_flax.py @@ -25,6 +25,8 @@ from jax.experimental import shard_map from jax.experimental.pallas.ops.tpu.splash_attention import splash_attention_mask from jax.experimental.pallas.ops.tpu.splash_attention import splash_attention_kernel +from tokamax._src.ops.experimental.tpu.splash_attention import splash_attention_mask as tokamax_splash_attention_mask +from tokamax._src.ops.experimental.tpu.splash_attention import splash_attention_kernel as tokamax_splash_attention_kernel from einops import rearrange from .. import common_types, max_logging @@ -46,6 +48,13 @@ EMBED = common_types.EMBED Quant = quantizations.AqtQuantization +SELF_ATTN_HEAD = common_types.SELF_ATTN_HEAD +SELF_ATTN_Q_LENGTH = common_types.SELF_ATTN_Q_LENGTH +SELF_ATTN_KV_LENGTH = common_types.SELF_ATTN_KV_LENGTH +CROSS_ATTN_HEAD = common_types.CROSS_ATTN_HEAD +CROSS_ATTN_Q_LENGTH = common_types.CROSS_ATTN_Q_LENGTH +CROSS_ATTN_KV_LENGTH = common_types.CROSS_ATTN_KV_LENGTH + def _maybe_aqt_einsum(quant: Quant): return jnp.einsum if quant is None else quant.einsum() @@ -163,6 +172,40 @@ def _pad_data_for_flash(tensor, heads, flash_block_size, num_shards: int = 1): return tensor, kv_size, seq_len +def convert_to_tokamax_splash_config( block_sizes: BlockSizes, + q_layout: tokamax_splash_attention_kernel.QKVLayout = tokamax_splash_attention_kernel.QKVLayout.HEAD_DIM_MINOR, + k_layout: tokamax_splash_attention_kernel.QKVLayout = tokamax_splash_attention_kernel.QKVLayout.HEAD_DIM_MINOR, + v_layout: tokamax_splash_attention_kernel.QKVLayout = tokamax_splash_attention_kernel.QKVLayout.HEAD_DIM_MINOR, + residual_checkpoint_name: str | None = None, + attn_logits_soft_cap: float | None = None, + fuse_reciprocal: bool = True, + use_base2_exp: bool = False, + max_logit_const: float | None = None, + interpret: bool = False, + dq_reduction_steps: int | None = None) -> tokamax_splash_attention_kernel.SplashConfig: + assert block_sizes.use_fused_bwd_kernel, "Tokamax Splash attention only supports fused bwd kernel." + return tokamax_splash_attention_kernel.SplashConfig( + block_q=block_sizes.block_q, + block_kv=block_sizes.block_kv, + block_kv_compute=block_sizes.block_kv_compute, + block_q_dkv=block_sizes.block_q_dkv, + block_kv_dkv=block_sizes.block_kv_dkv, + block_kv_dkv_compute=block_sizes.block_kv_dkv_compute, + block_q_dq= None if block_sizes.use_fused_bwd_kernel else block_sizes.block_q_dq, + block_kv_dq=None if block_sizes.use_fused_bwd_kernel else block_sizes.block_kv_dq, + use_fused_bwd_kernel=block_sizes.use_fused_bwd_kernel, + q_layout=q_layout, + k_layout=k_layout, + v_layout=v_layout, + residual_checkpoint_name=residual_checkpoint_name, + attn_logits_soft_cap=attn_logits_soft_cap, + fuse_reciprocal=fuse_reciprocal, + use_base2_exp=use_base2_exp, + max_logit_const=max_logit_const, + interpret=interpret, + dq_reduction_steps=dq_reduction_steps, + ) + def _tpu_flash_attention( query: jax.Array, @@ -175,6 +218,7 @@ def _tpu_flash_attention( flash_block_sizes: BlockSizes, dtype: jnp.dtype = jnp.float32, attention_kernel: str = "flash", + mask_padding_tokens: bool = True, residual_checkpoint_name: str | None = None, ) -> jax.Array: """TPU Flash Attention""" @@ -186,7 +230,8 @@ def _tpu_flash_attention( kv_max_block_size = key.shape[1] else: kv_max_block_size = q_max_block_size - if flash_block_sizes: + # ensure that for cross attention we override the block sizes. + if flash_block_sizes and key.shape[1] == query.shape[1]: block_sizes = flash_block_sizes else: block_size_q = flash_block_sizes.block_q if flash_block_sizes else q_max_block_size @@ -254,17 +299,28 @@ def wrap_flash_attention(query, key, value): # make_splash_mha is wrapped around shardmap and seq and head is already # sharded based on in_specs, therefore setting head_shards=1 and q_seq_shards=1. - splash_kernel = splash_attention_kernel.make_splash_mha( - mask=multi_head_mask, - head_shards=1, # the sizes of the axis is sharding over heads - q_seq_shards=1, # the sizes of the axis is sharding over seq_len - block_sizes=block_sizes, - save_residuals=True if attention_kernel == "ring" else False, - residual_checkpoint_name=residual_checkpoint_name, - ) + if attention_kernel == "tokamax_flash": + mask = tokamax_splash_attention_mask.FullMask(_shape=(query.shape[2], key.shape[2]),) + splash_kernel = tokamax_splash_attention_kernel.make_splash_mha( + mask=mask, + q_seq_shards=1, # the sizes of the axis is sharding over seq_len + config=convert_to_tokamax_splash_config(block_sizes, residual_checkpoint_name=residual_checkpoint_name), + save_residuals=True if attention_kernel == "ring" else False, + ) + else: + splash_kernel = splash_attention_kernel.make_splash_mha( + mask=multi_head_mask, + head_shards=1, # the sizes of the axis is sharding over heads + q_seq_shards=1, # the sizes of the axis is sharding over seq_len + block_sizes=block_sizes, + save_residuals=True if attention_kernel == "ring" else False, + residual_checkpoint_name=residual_checkpoint_name + ) vmapped_splash = jax.vmap(splash_kernel, in_axes=(0, 0, 0, None)) - if attention_kernel == "flash": + if not mask_padding_tokens: + segment_ids = None + if attention_kernel in ["flash", "tokamax_flash"]: attention_output = vmapped_splash(query, key, value, segment_ids) else: if num_fsdp_shards > 1: @@ -303,6 +359,8 @@ def ring_scan_body(carry, _): (m_final, l_final, o_final, _, _), _ = jax.lax.scan(ring_scan_body, initial_carry, None, length=num_fsdp_shards - 1) attention_output = o_final / l_final[..., None] + else: + raise ValueError("ring attention requires fsdp > 1") return attention_output[:, :, :query_seq_len, :kv_size].astype(query.dtype) @@ -443,6 +501,7 @@ def _apply_attention( axis_names_kv: AxisNames, flash_block_sizes: BlockSizes, dpa_layer: Callable, + mask_padding_tokens: bool = True, residual_checkpoint_name: str | None = None, ): """Routes to different attention kernels.""" @@ -450,7 +509,7 @@ def _apply_attention( seq_len_idx = 1 if query.ndim == 4: seq_len_idx = 2 - if attention_kernel == "flash": + if attention_kernel in ["flash", "tokamax_flash"]: can_use_flash_attention = ( query.shape[seq_len_idx] >= flash_min_seq_length and key.shape[seq_len_idx] >= flash_min_seq_length @@ -462,7 +521,7 @@ def _apply_attention( return _apply_attention_dot( query, key, value, dtype, heads, dim_head, scale, split_head_dim, float32_qk_product, use_memory_efficient_attention ) - elif attention_kernel == "flash": + elif attention_kernel in ["flash", "tokamax_flash"]: return _tpu_flash_attention( query, key * scale, @@ -473,11 +532,14 @@ def _apply_attention( axis_names_kv, flash_block_sizes, dtype, + attention_kernel, + mask_padding_tokens=mask_padding_tokens, residual_checkpoint_name=residual_checkpoint_name, ) elif attention_kernel == "ring": return _tpu_flash_attention( - query, key * scale, value, heads, mesh, axis_names_q, axis_names_kv, flash_block_sizes, dtype, attention_kernel + query, key * scale, value, heads, mesh, axis_names_q, axis_names_kv, flash_block_sizes, dtype, attention_kernel, + mask_padding_tokens=mask_padding_tokens, ) elif attention_kernel == "cudnn_flash_te": return _cudnn_flash_attention(query, key, value, heads, mesh, dpa_layer) @@ -608,6 +670,7 @@ def __init__( flash_block_sizes: BlockSizes = None, dtype: DType = jnp.float32, quant: Quant = None, + mask_padding_tokens: bool = True, residual_checkpoint_name: str | None = None, ): self.dpa_layer = None @@ -628,6 +691,7 @@ def __init__( self.flash_block_sizes = flash_block_sizes self.dtype = dtype self.quant = quant + self.mask_padding_tokens = mask_padding_tokens self.residual_checkpoint_name = residual_checkpoint_name def apply_attention(self, query: Array, key: Array, value: Array): @@ -649,6 +713,7 @@ def apply_attention(self, query: Array, key: Array, value: Array): axis_names_kv=self.axis_names_kv, flash_block_sizes=self.flash_block_sizes, dpa_layer=self.dpa_layer, + mask_padding_tokens=self.mask_padding_tokens, residual_checkpoint_name=self.residual_checkpoint_name, ) @@ -738,6 +803,8 @@ def __init__( precision: jax.lax.Precision = None, qkv_bias: bool = False, quant: Quant = None, + is_self_attention: bool = True, + mask_padding_tokens: bool = True, residual_checkpoint_name: str | None = None, enable_jax_named_scopes: bool = False, ): @@ -751,11 +818,18 @@ def __init__( self.inner_dim = dim_head * heads scale = dim_head**-0.5 self.qk_norm = qk_norm - self.enable_jax_named_scopes = enable_jax_named_scopes self.query_axis_names = query_axis_names self.key_axis_names = key_axis_names self.value_axis_names = value_axis_names self.out_axis_names = out_axis_names + self.enable_jax_named_scopes = enable_jax_named_scopes + + if is_self_attention: + axis_names_q = (BATCH, SELF_ATTN_HEAD, SELF_ATTN_Q_LENGTH, D_KV) + axis_names_kv = (BATCH, SELF_ATTN_HEAD, SELF_ATTN_KV_LENGTH, D_KV) + else: + axis_names_q = (BATCH, CROSS_ATTN_HEAD, CROSS_ATTN_Q_LENGTH, D_KV) + axis_names_kv = (BATCH, CROSS_ATTN_HEAD, CROSS_ATTN_KV_LENGTH, D_KV) self.attention_op = NNXAttentionOp( mesh=mesh, @@ -766,10 +840,13 @@ def __init__( use_memory_efficient_attention=use_memory_efficient_attention, split_head_dim=split_head_dim, float32_qk_product=False, + axis_names_q=axis_names_q, + axis_names_kv=axis_names_kv, flash_min_seq_length=flash_min_seq_length, flash_block_sizes=flash_block_sizes, dtype=dtype, quant=quant, + mask_padding_tokens=mask_padding_tokens, residual_checkpoint_name=residual_checkpoint_name, ) # None axes corresponds to the stacked weights across all blocks diff --git a/src/maxdiffusion/models/wan/autoencoder_kl_wan.py b/src/maxdiffusion/models/wan/autoencoder_kl_wan.py index 0226a859..77f35073 100644 --- a/src/maxdiffusion/models/wan/autoencoder_kl_wan.py +++ b/src/maxdiffusion/models/wan/autoencoder_kl_wan.py @@ -16,6 +16,7 @@ from typing import Tuple, List, Sequence, Union, Optional +import flax import jax import jax.numpy as jnp from flax import nnx @@ -27,7 +28,7 @@ BlockSizes = common_types.BlockSizes CACHE_T = 2 - +flax.config.update('flax_always_shard_variable', False) # Helper to ensure kernel_size, stride, padding are tuples of 3 integers def _canonicalize_tuple(x: Union[int, Sequence[int]], rank: int, name: str) -> Tuple[int, ...]: diff --git a/src/maxdiffusion/models/wan/transformers/transformer_wan.py b/src/maxdiffusion/models/wan/transformers/transformer_wan.py index 128c2203..5d7aec10 100644 --- a/src/maxdiffusion/models/wan/transformers/transformer_wan.py +++ b/src/maxdiffusion/models/wan/transformers/transformer_wan.py @@ -273,6 +273,7 @@ def __init__( precision: jax.lax.Precision = None, attention: str = "dot_product", dropout: float = 0.0, + mask_padding_tokens: bool = True, enable_jax_named_scopes: bool = False, ): @@ -295,6 +296,8 @@ def __init__( precision=precision, attention_kernel=attention, dropout=dropout, + is_self_attention=True, + mask_padding_tokens=mask_padding_tokens, residual_checkpoint_name="self_attn", enable_jax_named_scopes=enable_jax_named_scopes, ) @@ -315,6 +318,8 @@ def __init__( precision=precision, attention_kernel=attention, dropout=dropout, + is_self_attention=False, + mask_padding_tokens=mask_padding_tokens, residual_checkpoint_name="cross_attn", enable_jax_named_scopes=enable_jax_named_scopes, ) @@ -362,43 +367,50 @@ def __call__( hidden_states = checkpoint_name(hidden_states, "hidden_states") encoder_hidden_states = jax.lax.with_sharding_constraint(encoder_hidden_states, PartitionSpec("data", "fsdp", None)) - # 1. Self-attention - with self.conditional_named_scope("self_attn"): - with self.conditional_named_scope("self_attn_norm"): - norm_hidden_states = (self.norm1(hidden_states.astype(jnp.float32)) * (1 + scale_msa) + shift_msa).astype( - hidden_states.dtype - ) - with self.conditional_named_scope("self_attn_attn"): - attn_output = self.attn1( - hidden_states=norm_hidden_states, - encoder_hidden_states=norm_hidden_states, - rotary_emb=rotary_emb, - deterministic=deterministic, - rngs=rngs, - ) - with self.conditional_named_scope("self_attn_residual"): - hidden_states = (hidden_states.astype(jnp.float32) + attn_output * gate_msa).astype(hidden_states.dtype) - - # 2. Cross-attention - norm_hidden_states = self.norm2(hidden_states.astype(jnp.float32)).astype(hidden_states.dtype) - attn_output = self.attn2( - hidden_states=norm_hidden_states, encoder_hidden_states=encoder_hidden_states, deterministic=deterministic, rngs=rngs - ) - hidden_states = hidden_states + attn_output - - # 3. Feed-forward - with self.conditional_named_scope("mlp"): - with self.conditional_named_scope("mlp_norm"): - norm_hidden_states = (self.norm3(hidden_states.astype(jnp.float32)) * (1 + c_scale_msa) + c_shift_msa).astype( - hidden_states.dtype - ) - with self.conditional_named_scope("mlp_ffn"): - ff_output = self.ffn(norm_hidden_states, deterministic=deterministic, rngs=rngs) - with self.conditional_named_scope("mlp_residual"): - hidden_states = (hidden_states.astype(jnp.float32) + ff_output.astype(jnp.float32) * c_gate_msa).astype( - hidden_states.dtype - ) - return hidden_states + # 1. Self-attention + with self.conditional_named_scope("self_attn"): + with self.conditional_named_scope("self_attn_norm"): + norm_hidden_states = (self.norm1(hidden_states.astype(jnp.float32)) * (1 + scale_msa) + shift_msa).astype( + hidden_states.dtype + ) + with self.conditional_named_scope("self_attn_attn"): + attn_output = self.attn1( + hidden_states=norm_hidden_states, + encoder_hidden_states=norm_hidden_states, + rotary_emb=rotary_emb, + deterministic=deterministic, + rngs=rngs, + ) + with self.conditional_named_scope("self_attn_residual"): + hidden_states = (hidden_states.astype(jnp.float32) + attn_output * gate_msa).astype(hidden_states.dtype) + + # 2. Cross-attention + with self.conditional_named_scope("cross_attn"): + with self.conditional_named_scope("cross_attn_norm"): + norm_hidden_states = self.norm2(hidden_states.astype(jnp.float32)).astype(hidden_states.dtype) + with self.conditional_named_scope("cross_attn_attn"): + attn_output = self.attn2( + hidden_states=norm_hidden_states, + encoder_hidden_states=encoder_hidden_states, + deterministic=deterministic, + rngs=rngs, + ) + with self.conditional_named_scope("cross_attn_residual"): + hidden_states = hidden_states + attn_output + + # 3. Feed-forward + with self.conditional_named_scope("mlp"): + with self.conditional_named_scope("mlp_norm"): + norm_hidden_states = (self.norm3(hidden_states.astype(jnp.float32)) * (1 + c_scale_msa) + c_shift_msa).astype( + hidden_states.dtype + ) + with self.conditional_named_scope("mlp_ffn"): + ff_output = self.ffn(norm_hidden_states, deterministic=deterministic, rngs=rngs) + with self.conditional_named_scope("mlp_residual"): + hidden_states = (hidden_states.astype(jnp.float32) + ff_output.astype(jnp.float32) * c_gate_msa).astype( + hidden_states.dtype + ) + return hidden_states class WanModel(nnx.Module, FlaxModelMixin, ConfigMixin): @@ -435,6 +447,7 @@ def __init__( remat_policy: str = "None", names_which_can_be_saved: list = [], names_which_can_be_offloaded: list = [], + mask_padding_tokens: bool = True, scan_layers: bool = True, enable_jax_named_scopes: bool = False, ): @@ -493,6 +506,8 @@ def init_block(rngs): precision=precision, attention=attention, dropout=dropout, + mask_padding_tokens=mask_padding_tokens, + enable_jax_named_scopes=enable_jax_named_scopes, ) self.gradient_checkpoint = GradientCheckpointType.from_str(remat_policy) @@ -562,14 +577,15 @@ def __call__( post_patch_width = width // p_w hidden_states = jnp.transpose(hidden_states, (0, 2, 3, 4, 1)) - rotary_emb = self.rope(hidden_states) - - hidden_states = self.patch_embedding(hidden_states) - hidden_states = jax.lax.collapse(hidden_states, 1, -1) - - temb, timestep_proj, encoder_hidden_states, encoder_hidden_states_image = self.condition_embedder( - timestep, encoder_hidden_states, encoder_hidden_states_image - ) + with self.conditional_named_scope("rotary_embedding"): + rotary_emb = self.rope(hidden_states) + with self.conditional_named_scope("patch_embedding"): + hidden_states = self.patch_embedding(hidden_states) + hidden_states = jax.lax.collapse(hidden_states, 1, -1) + with self.conditional_named_scope("condition_embedder"): + temb, timestep_proj, encoder_hidden_states, encoder_hidden_states_image = self.condition_embedder( + timestep, encoder_hidden_states, encoder_hidden_states_image + ) timestep_proj = timestep_proj.reshape(timestep_proj.shape[0], 6, -1) if encoder_hidden_states_image is not None: diff --git a/src/maxdiffusion/pipelines/wan/wan_pipeline.py b/src/maxdiffusion/pipelines/wan/wan_pipeline.py index 153c225d..f2c4a41e 100644 --- a/src/maxdiffusion/pipelines/wan/wan_pipeline.py +++ b/src/maxdiffusion/pipelines/wan/wan_pipeline.py @@ -113,6 +113,7 @@ def create_model(rngs: nnx.Rngs, wan_config: dict): wan_config["names_which_can_be_offloaded"] = config.names_which_can_be_offloaded wan_config["flash_min_seq_length"] = config.flash_min_seq_length wan_config["dropout"] = config.dropout + wan_config["mask_padding_tokens"] = config.mask_padding_tokens wan_config["scan_layers"] = config.scan_layers wan_config["enable_jax_named_scopes"] = config.enable_jax_named_scopes @@ -533,13 +534,14 @@ def _prepare_model_inputs( batch_size = len(prompt) - prompt_embeds, negative_prompt_embeds = self.encode_prompt( - prompt=prompt, - negative_prompt=negative_prompt, - max_sequence_length=max_sequence_length, - prompt_embeds=prompt_embeds, - negative_prompt_embeds=negative_prompt_embeds, - ) + with jax.named_scope("Encode-Prompt"): + prompt_embeds, negative_prompt_embeds = self.encode_prompt( + prompt=prompt, + negative_prompt=negative_prompt, + max_sequence_length=max_sequence_length, + prompt_embeds=prompt_embeds, + negative_prompt_embeds=negative_prompt_embeds, + ) num_channel_latents = self._get_num_channel_latents() if latents is None: diff --git a/src/maxdiffusion/pyconfig.py b/src/maxdiffusion/pyconfig.py index 9488f106..27c9f645 100644 --- a/src/maxdiffusion/pyconfig.py +++ b/src/maxdiffusion/pyconfig.py @@ -27,7 +27,7 @@ from . import max_logging from . import max_utils from .models.wan.wan_utils import CAUSVID_TRANSFORMER_MODEL_NAME_OR_PATH, WAN_21_FUSION_X_MODEL_NAME_OR_PATH -from maxdiffusion.common_types import LENGTH, KV_LENGTH, WAN2_1, WAN2_2 +from maxdiffusion.common_types import LENGTH, KV_LENGTH, WAN2_1, WAN2_2, RING_ATTENTION_AXIS_RULES, SEQUENCE_PARALLEL_AXIS_RULES _ALLOWED_MODEL_NAMES = {WAN2_1, WAN2_2} _ALLOWED_TRAINING_MODEL_NAMES = {WAN2_1} @@ -46,7 +46,6 @@ def _validate_training_model_name(model_name: str | None): if model_name not in _ALLOWED_TRAINING_MODEL_NAMES: raise ValueError(f"Invalid config.model_name '{model_name}' for training. Allowed values: {sorted(_ALLOWED_TRAINING_MODEL_NAMES)}") - def string_to_bool(s: str) -> bool: if s.lower() == "true": return True @@ -196,15 +195,29 @@ def user_init(raw_keys): raw_keys["logical_axis_rules"] = _lists_to_tuples(raw_keys["logical_axis_rules"]) # Verify qkv is sharded across sequence. - if raw_keys["attention"] == "ring": + if raw_keys["attention"] == "ring" or raw_keys["attention_sharding_uniform"]: + max_logging.log(f"Adding sequence sharding to q and kv if not already present because {raw_keys['attention']}=='ring' or {raw_keys['attention_sharding_uniform']} is set.") logical_axis_rules = list(raw_keys["logical_axis_rules"]) + max_logging.log(f"Initial logical axis rules: {logical_axis_rules}") + new_rules = [] q_seq_sharding = (LENGTH, "fsdp") kv_seq_sharding = (KV_LENGTH, "fsdp") if q_seq_sharding not in logical_axis_rules: logical_axis_rules.append(q_seq_sharding) if kv_seq_sharding not in logical_axis_rules: logical_axis_rules.append(kv_seq_sharding) - raw_keys["logical_axis_rules"] = tuple(logical_axis_rules) + if raw_keys["attention"] == "ring": + for ring_attention_axis_rule in RING_ATTENTION_AXIS_RULES: + if ring_attention_axis_rule not in logical_axis_rules: + max_logging.log(f"Adding ring attention axis rule {ring_attention_axis_rule}") + new_rules.append(ring_attention_axis_rule) + else: # attention =flash but sequence parallel sharding requested for both self and cross attention + for seq_parallel_axis_rule in SEQUENCE_PARALLEL_AXIS_RULES: + if seq_parallel_axis_rule not in logical_axis_rules: + max_logging.log(f"Adding sequence parallel attention axis rule {seq_parallel_axis_rule}") + new_rules.append(seq_parallel_axis_rule) + raw_keys["logical_axis_rules"] = tuple(new_rules) + tuple(logical_axis_rules) + max_logging.log(f"Final logical axis rules: {raw_keys['logical_axis_rules']}") raw_keys["data_sharding"] = _lists_to_tuples(raw_keys["data_sharding"]) diff --git a/src/maxdiffusion/tests/wan_transformer_test.py b/src/maxdiffusion/tests/wan_transformer_test.py index 47a41234..5c22c3c8 100644 --- a/src/maxdiffusion/tests/wan_transformer_test.py +++ b/src/maxdiffusion/tests/wan_transformer_test.py @@ -179,20 +179,19 @@ def test_wan_block(self): dummy_encoder_hidden_states = jnp.ones((batch_size, 512, dim)) dummy_temb = jnp.ones((batch_size, 6, dim)) - - wan_block = WanTransformerBlock( - rngs=rngs, - dim=dim, - ffn_dim=ffn_dim, - num_heads=num_heads, - qk_norm=qk_norm, - cross_attn_norm=cross_attn_norm, - eps=eps, - attention="flash", - mesh=mesh, - flash_block_sizes=flash_block_sizes, - ) - with mesh: + with mesh, nn_partitioning.axis_rules(self.config.logical_axis_rules): + wan_block = WanTransformerBlock( + rngs=rngs, + dim=dim, + ffn_dim=ffn_dim, + num_heads=num_heads, + qk_norm=qk_norm, + cross_attn_norm=cross_attn_norm, + eps=eps, + attention="flash", + mesh=mesh, + flash_block_sizes=flash_block_sizes, + ) dummy_output = wan_block(dummy_hidden_states, dummy_encoder_hidden_states, dummy_temb, dummy_rotary_emb) assert dummy_output.shape == dummy_hidden_states.shape diff --git a/src/maxdiffusion/tests/wan_vae_test.py b/src/maxdiffusion/tests/wan_vae_test.py index 2268411c..b2ffbc3b 100644 --- a/src/maxdiffusion/tests/wan_vae_test.py +++ b/src/maxdiffusion/tests/wan_vae_test.py @@ -22,6 +22,7 @@ import jax import jax.numpy as jnp from flax import nnx +from flax.linen import partitioning as nn_partitioning from jax.sharding import Mesh from .. import pyconfig from ..max_utils import ( @@ -163,6 +164,17 @@ class WanVaeTest(unittest.TestCase): def setUp(self): WanVaeTest.dummy_data = {} + pyconfig.initialize( + [ + None, + os.path.join(THIS_DIR, "..", "configs", "base_wan_14b.yml"), + ], + unittest=True, + ) + config = pyconfig.config + self.config = config + devices_array = create_device_mesh(config) + self.mesh = Mesh(devices_array, config.mesh_axes) def test_wanrms_norm(self): """Test against the Pytorch implementation""" @@ -212,12 +224,13 @@ def test_zero_padded_conv(self): output_torch = resample(input) assert output_torch.shape == (1, 96, 240, 360) - model = ZeroPaddedConv2D(dim=dim, rngs=rngs, kernel_size=(1, 3, 3), stride=(1, 2, 2)) - dummy_input = jnp.ones(input_shape) - dummy_input = jnp.transpose(dummy_input, (0, 2, 3, 1)) - output = model(dummy_input) - output = jnp.transpose(output, (0, 3, 1, 2)) - assert output.shape == (1, 96, 240, 360) + with self.mesh, nn_partitioning.axis_rules(self.config.logical_axis_rules): + model = ZeroPaddedConv2D(dim=dim, rngs=rngs, kernel_size=(1, 3, 3), stride=(1, 2, 2)) + dummy_input = jnp.ones(input_shape) + dummy_input = jnp.transpose(dummy_input, (0, 2, 3, 1)) + output = model(dummy_input) + output = jnp.transpose(output, (0, 3, 1, 2)) + assert output.shape == (1, 96, 240, 360) def test_wan_upsample(self): batch_size = 1 @@ -249,13 +262,13 @@ def test_wan_resample(self): torch_wan_resample = TorchWanResample(dim=dim, mode=mode) torch_output = torch_wan_resample(dummy_input) assert torch_output.shape == (batch, dim, t, h // 2, w // 2) - - wan_resample = WanResample(dim, mode=mode, rngs=rngs) - # channels is always last here - input_shape = (batch, t, h, w, dim) - dummy_input = jnp.ones(input_shape) - output = wan_resample(dummy_input) - assert output.shape == (batch, t, h // 2, w // 2, dim) + with self.mesh, nn_partitioning.axis_rules(self.config.logical_axis_rules): + wan_resample = WanResample(dim, mode=mode, rngs=rngs) + # channels is always last here + input_shape = (batch, t, h, w, dim) + dummy_input = jnp.ones(input_shape) + output = wan_resample(dummy_input) + assert output.shape == (batch, t, h // 2, w // 2, dim) def test_3d_conv(self): key = jax.random.key(0) @@ -286,28 +299,29 @@ def test_3d_conv(self): dummy_cache = jnp.zeros((batch_size, cache_depth, in_height, in_width, in_channels)) # Instantiate the module - causal_conv_layer = WanCausalConv3d( - in_channels=in_channels, - out_channels=out_channels, - kernel_size=(kernel_d, kernel_h, kernel_w), - padding=(padding_d, padding_h, padding_w), - rngs=rngs, # Pass rngs for initialization, - mesh=mesh, - ) + with self.mesh, nn_partitioning.axis_rules(config.logical_axis_rules): + causal_conv_layer = WanCausalConv3d( + in_channels=in_channels, + out_channels=out_channels, + kernel_size=(kernel_d, kernel_h, kernel_w), + padding=(padding_d, padding_h, padding_w), + rngs=rngs, # Pass rngs for initialization, + mesh=mesh, + ) - # --- Test Case 1: No Cache --- - output_no_cache = causal_conv_layer(dummy_input) - assert output_no_cache.shape == (1, 10, 32, 32, 16) + # --- Test Case 1: No Cache --- + output_no_cache = causal_conv_layer(dummy_input) + assert output_no_cache.shape == (1, 10, 32, 32, 16) - # --- Test Case 2: With Cache --- - output_with_cache = causal_conv_layer(dummy_input, cache_x=dummy_cache) - assert output_with_cache.shape == (1, 10, 32, 32, 16) + # --- Test Case 2: With Cache --- + output_with_cache = causal_conv_layer(dummy_input, cache_x=dummy_cache) + assert output_with_cache.shape == (1, 10, 32, 32, 16) - # --- Test Case 3: With Cache larger than padding --- - larger_cache_depth = 4 # Larger than needed padding (2*padding_d = 2) - dummy_larger_cache = jnp.zeros((batch_size, larger_cache_depth, in_height, in_width, in_channels)) - output_with_larger_cache = causal_conv_layer(dummy_input, cache_x=dummy_larger_cache) - assert output_with_larger_cache.shape == (1, 10, 32, 32, 16) + # --- Test Case 3: With Cache larger than padding --- + larger_cache_depth = 4 # Larger than needed padding (2*padding_d = 2) + dummy_larger_cache = jnp.zeros((batch_size, larger_cache_depth, in_height, in_width, in_channels)) + output_with_larger_cache = causal_conv_layer(dummy_input, cache_x=dummy_larger_cache) + assert output_with_larger_cache.shape == (1, 10, 32, 32, 16) def test_wan_residual(self): key = jax.random.key(0) @@ -331,21 +345,20 @@ def test_wan_residual(self): dim = 96 input_shape = (batch, t, height, width, dim) expected_output_shape = (batch, t, height, width, dim) - - wan_residual_block = WanResidualBlock(in_dim=in_dim, out_dim=out_dim, rngs=rngs, mesh=mesh) - dummy_input = jnp.ones(input_shape) - dummy_output = wan_residual_block(dummy_input) - assert dummy_output.shape == expected_output_shape - - # --- Test Case 1: different in/out dim --- - in_dim = 96 - out_dim = 196 - expected_output_shape = (batch, t, height, width, out_dim) - - wan_residual_block = WanResidualBlock(in_dim=in_dim, out_dim=out_dim, rngs=rngs, mesh=mesh) - dummy_input = jnp.ones(input_shape) - dummy_output = wan_residual_block(dummy_input) - assert dummy_output.shape == expected_output_shape + with mesh, nn_partitioning.axis_rules(config.logical_axis_rules): + wan_residual_block = WanResidualBlock(in_dim=in_dim, out_dim=out_dim, rngs=rngs, mesh=mesh) + dummy_input = jnp.ones(input_shape) + dummy_output = wan_residual_block(dummy_input) + assert dummy_output.shape == expected_output_shape + # --- Test Case 1: different in/out dim --- + in_dim = 96 + out_dim = 196 + expected_output_shape = (batch, t, height, width, out_dim) + + wan_residual_block = WanResidualBlock(in_dim=in_dim, out_dim=out_dim, rngs=rngs, mesh=mesh) + dummy_input = jnp.ones(input_shape) + dummy_output = wan_residual_block(dummy_input) + assert dummy_output.shape == expected_output_shape def test_wan_attention(self): key = jax.random.key(0) @@ -356,10 +369,11 @@ def test_wan_attention(self): height = 60 width = 90 input_shape = (batch, t, height, width, dim) - wan_attention = WanAttentionBlock(dim=dim, rngs=rngs) - dummy_input = jnp.ones(input_shape) - output = wan_attention(dummy_input) - assert output.shape == input_shape + with self.mesh, nn_partitioning.axis_rules(self.config.logical_axis_rules): + wan_attention = WanAttentionBlock(dim=dim, rngs=rngs) + dummy_input = jnp.ones(input_shape) + output = wan_attention(dummy_input) + assert output.shape == input_shape def test_wan_midblock(self): key = jax.random.key(0) @@ -380,10 +394,11 @@ def test_wan_midblock(self): height = 60 width = 90 input_shape = (batch, t, height, width, dim) - wan_midblock = WanMidBlock(dim=dim, rngs=rngs, mesh=mesh) - dummy_input = jnp.ones(input_shape) - output = wan_midblock(dummy_input) - assert output.shape == input_shape + with mesh, nn_partitioning.axis_rules(config.logical_axis_rules): + wan_midblock = WanMidBlock(dim=dim, rngs=rngs, mesh=mesh) + dummy_input = jnp.ones(input_shape) + output = wan_midblock(dummy_input) + assert output.shape == input_shape def test_wan_decode(self): key = jax.random.key(0) @@ -404,30 +419,31 @@ def test_wan_decode(self): num_res_blocks = 2 attn_scales = [] temperal_downsample = [False, True, True] - wan_vae = AutoencoderKLWan( - rngs=rngs, - base_dim=dim, - z_dim=z_dim, - dim_mult=dim_mult, - num_res_blocks=num_res_blocks, - attn_scales=attn_scales, - temperal_downsample=temperal_downsample, - mesh=mesh, - ) - vae_cache = AutoencoderKLWanCache(wan_vae) - batch = 1 - t = 13 - channels = 16 - height = 60 - width = 90 - input_shape = (batch, t, height, width, channels) - input = jnp.ones(input_shape) - - latents_mean = jnp.array(wan_vae.latents_mean).reshape(1, 1, 1, 1, wan_vae.z_dim) - latents_std = 1.0 / jnp.array(wan_vae.latents_std).reshape(1, 1, 1, 1, wan_vae.z_dim) - input = input / latents_std + latents_mean - dummy_output = wan_vae.decode(input, feat_cache=vae_cache) - assert dummy_output.sample.shape == (batch, 49, 480, 720, 3) + with mesh, nn_partitioning.axis_rules(config.logical_axis_rules): + wan_vae = AutoencoderKLWan( + rngs=rngs, + base_dim=dim, + z_dim=z_dim, + dim_mult=dim_mult, + num_res_blocks=num_res_blocks, + attn_scales=attn_scales, + temperal_downsample=temperal_downsample, + mesh=mesh, + ) + vae_cache = AutoencoderKLWanCache(wan_vae) + batch = 1 + t = 13 + channels = 16 + height = 60 + width = 90 + input_shape = (batch, t, height, width, channels) + input = jnp.ones(input_shape) + + latents_mean = jnp.array(wan_vae.latents_mean).reshape(1, 1, 1, 1, wan_vae.z_dim) + latents_std = 1.0 / jnp.array(wan_vae.latents_std).reshape(1, 1, 1, 1, wan_vae.z_dim) + input = input / latents_std + latents_mean + dummy_output = wan_vae.decode(input, feat_cache=vae_cache) + assert dummy_output.sample.shape == (batch, 49, 480, 720, 3) def test_wan_encode(self): key = jax.random.key(0) @@ -448,26 +464,27 @@ def test_wan_encode(self): num_res_blocks = 2 attn_scales = [] temperal_downsample = [False, True, True] - wan_vae = AutoencoderKLWan( - rngs=rngs, - base_dim=dim, - z_dim=z_dim, - dim_mult=dim_mult, - num_res_blocks=num_res_blocks, - attn_scales=attn_scales, - temperal_downsample=temperal_downsample, - mesh=mesh, - ) - vae_cache = AutoencoderKLWanCache(wan_vae) - batch = 1 - channels = 3 - t = 49 - height = 480 - width = 720 - input_shape = (batch, channels, t, height, width) - input = jnp.ones(input_shape) - output = wan_vae.encode(input, feat_cache=vae_cache) - assert output.latent_dist.sample(key).shape == (1, 13, 60, 90, 16) + with mesh, nn_partitioning.axis_rules(config.logical_axis_rules): + wan_vae = AutoencoderKLWan( + rngs=rngs, + base_dim=dim, + z_dim=z_dim, + dim_mult=dim_mult, + num_res_blocks=num_res_blocks, + attn_scales=attn_scales, + temperal_downsample=temperal_downsample, + mesh=mesh, + ) + vae_cache = AutoencoderKLWanCache(wan_vae) + batch = 1 + channels = 3 + t = 49 + height = 480 + width = 720 + input_shape = (batch, channels, t, height, width) + input = jnp.ones(input_shape) + output = wan_vae.encode(input, feat_cache=vae_cache) + assert output.latent_dist.sample(key).shape == (1, 13, 60, 90, 16) def test_load_checkpoint(self): def vae_encode(video, wan_vae, vae_cache, key): @@ -487,9 +504,9 @@ def vae_encode(video, wan_vae, vae_cache, key): config = pyconfig.config devices_array = create_device_mesh(config) mesh = Mesh(devices_array, config.mesh_axes) - - wan_vae = AutoencoderKLWan.from_config(config.pretrained_model_name_or_path, subfolder="vae", rngs=rngs, mesh=mesh) - vae_cache = AutoencoderKLWanCache(wan_vae) + with self.mesh, nn_partitioning.axis_rules(self.config.logical_axis_rules): + wan_vae = AutoencoderKLWan.from_config(config.pretrained_model_name_or_path, subfolder="vae", rngs=rngs, mesh=mesh) + vae_cache = AutoencoderKLWanCache(wan_vae) video_path = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/hiker.mp4" video = load_video(video_path) diff --git a/src/maxdiffusion/trainers/wan_trainer.py b/src/maxdiffusion/trainers/wan_trainer.py index 4369d6d0..f23836a5 100644 --- a/src/maxdiffusion/trainers/wan_trainer.py +++ b/src/maxdiffusion/trainers/wan_trainer.py @@ -17,7 +17,7 @@ import os import datetime import functools -from pprint import pprint +import pprint import numpy as np import threading from concurrent.futures import ThreadPoolExecutor diff --git a/tests/schedulers/test_scheduler_flax.py b/tests/schedulers/test_scheduler_flax.py index d7457e56..81818d79 100644 --- a/tests/schedulers/test_scheduler_flax.py +++ b/tests/schedulers/test_scheduler_flax.py @@ -335,8 +335,8 @@ def test_full_loop_no_noise(self): result_mean = jnp.mean(jnp.abs(sample)) if jax_device == "tpu": - assert abs(result_sum - 257.29) < 1.5e-2 - assert abs(result_mean - 0.3349905) < 2e-5 + assert abs(result_sum - 263.11) < 1.5e-2 + assert abs(result_mean - 0.34259) < 2e-5 else: assert abs(result_sum - 255.1113) < 1e-2 assert abs(result_mean - 0.332176) < 1e-3 From c29fdc4108dbf16f11a7926a17a11b5f216f12a9 Mon Sep 17 00:00:00 2001 From: Elisa Tsai Date: Mon, 15 Dec 2025 19:35:45 +0000 Subject: [PATCH 3/4] Disable unsafe rng --- src/maxdiffusion/generate_wan.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/maxdiffusion/generate_wan.py b/src/maxdiffusion/generate_wan.py index d67fd2e8..e3365e96 100644 --- a/src/maxdiffusion/generate_wan.py +++ b/src/maxdiffusion/generate_wan.py @@ -76,15 +76,6 @@ def get_git_commit_hash(): return None jax.config.update("jax_use_shardy_partitioner", True) -jax.config.update("jax_default_prng_impl", "unsafe_rbg") - # TF allocates extraneous GPU memory when using TFDS data - # this leads to CUDA OOMs. WAR for now is to hide GPUs from TF - # tf.config.set_visible_devices([], "GPU") -if "xla_tpu_spmd_rng_bit_generator_unsafe" not in os.environ.get("LIBTPU_INIT_ARGS", ""): - max_logging.log("Enabling unsafe RNG bit generator for TPU SPMD.") - os.environ["LIBTPU_INIT_ARGS"] = ( - os.environ.get("LIBTPU_INIT_ARGS", "") + " --xla_tpu_spmd_rng_bit_generator_unsafe=true" - ) def call_pipeline(config, pipeline, prompt, negative_prompt): model_key = config.model_name From f68c7b0c6e4b8030685d43b22b2a22b8f0b9da40 Mon Sep 17 00:00:00 2001 From: Elisa Tsai Date: Wed, 17 Dec 2025 19:13:53 +0000 Subject: [PATCH 4/4] Integrate tokamax ring attention as optional attention kernel for WAN 2.1 --- src/maxdiffusion/models/attention_flax.py | 104 ++++++++++++++-------- src/maxdiffusion/pyconfig.py | 8 +- 2 files changed, 72 insertions(+), 40 deletions(-) diff --git a/src/maxdiffusion/models/attention_flax.py b/src/maxdiffusion/models/attention_flax.py index cfe3c1fc..520c4071 100644 --- a/src/maxdiffusion/models/attention_flax.py +++ b/src/maxdiffusion/models/attention_flax.py @@ -27,6 +27,7 @@ from jax.experimental.pallas.ops.tpu.splash_attention import splash_attention_kernel from tokamax._src.ops.experimental.tpu.splash_attention import splash_attention_mask as tokamax_splash_attention_mask from tokamax._src.ops.experimental.tpu.splash_attention import splash_attention_kernel as tokamax_splash_attention_kernel +from tokamax._src.ops.experimental.tpu.splash_attention import ring_attention_kernel as tokamax_ring_attention_kernel from einops import rearrange from .. import common_types, max_logging @@ -305,7 +306,16 @@ def wrap_flash_attention(query, key, value): mask=mask, q_seq_shards=1, # the sizes of the axis is sharding over seq_len config=convert_to_tokamax_splash_config(block_sizes, residual_checkpoint_name=residual_checkpoint_name), - save_residuals=True if attention_kernel == "ring" else False, + save_residuals=True if "ring" in attention_kernel else False, + ) + elif attention_kernel == "tokamax_ring": + mask = tokamax_splash_attention_mask.FullMask(_shape=(query.shape[2], key.shape[2]),) + splash_kernel = tokamax_ring_attention_kernel.make_ring_attention( + mask=mask, + is_mqa=False, + config=convert_to_tokamax_splash_config(block_sizes, residual_checkpoint_name=residual_checkpoint_name), + save_residuals=True, + ring_axis="fsdp", ) else: splash_kernel = splash_attention_kernel.make_splash_mha( @@ -313,54 +323,75 @@ def wrap_flash_attention(query, key, value): head_shards=1, # the sizes of the axis is sharding over heads q_seq_shards=1, # the sizes of the axis is sharding over seq_len block_sizes=block_sizes, - save_residuals=True if attention_kernel == "ring" else False, + save_residuals=True if "ring" in attention_kernel else False, residual_checkpoint_name=residual_checkpoint_name ) - vmapped_splash = jax.vmap(splash_kernel, in_axes=(0, 0, 0, None)) - if not mask_padding_tokens: - segment_ids = None - if attention_kernel in ["flash", "tokamax_flash"]: - attention_output = vmapped_splash(query, key, value, segment_ids) + if attention_kernel == "tokamax_ring": + # For tokamax_ring, use the kernel directly without vmap + # The ring attention kernel handles the ring topology internally + if not mask_padding_tokens: + segment_ids = None + attention_output = splash_kernel( + fwd_mask_info=None, + dkv_mask_info=None, + q=query, + k=key, + v=value, + segment_ids=segment_ids, + is_mqa=False, + config=convert_to_tokamax_splash_config(block_sizes, residual_checkpoint_name=residual_checkpoint_name), + mask_value=-jnp.inf, + mask_function=None, + fwd_mask_sparsity=1.0, + save_residuals=True, + ) else: - if num_fsdp_shards > 1: - out, (lse,) = vmapped_splash(query, key, value, segment_ids) - m = lse.astype(jnp.float32) - l = jnp.exp(lse - m) - o = out.astype(jnp.float32) * l[..., None] + vmapped_splash = jax.vmap(splash_kernel, in_axes=(0, 0, 0, None)) - perm = [(j, (j + 1) % num_fsdp_shards) for j in range(num_fsdp_shards)] + if not mask_padding_tokens: + segment_ids = None + if attention_kernel in ["flash", "tokamax_flash"]: + attention_output = vmapped_splash(query, key, value, segment_ids) + else: + if num_fsdp_shards > 1: + out, (lse,) = vmapped_splash(query, key, value, segment_ids) + m = lse.astype(jnp.float32) + l = jnp.exp(lse - m) + o = out.astype(jnp.float32) * l[..., None] - k1 = jax.lax.ppermute(key, axis_name="fsdp", perm=perm) - v1 = jax.lax.ppermute(value, axis_name="fsdp", perm=perm) + perm = [(j, (j + 1) % num_fsdp_shards) for j in range(num_fsdp_shards)] - def ring_scan_body(carry, _): - m, l, o, k_current, v_current = carry - k_next = jax.lax.ppermute(k_current, axis_name="fsdp", perm=perm) - v_next = jax.lax.ppermute(v_current, axis_name="fsdp", perm=perm) + k1 = jax.lax.ppermute(key, axis_name="fsdp", perm=perm) + v1 = jax.lax.ppermute(value, axis_name="fsdp", perm=perm) - out_chunk, (lse_chunk,) = vmapped_splash(query, k_current, v_current, segment_ids) + def ring_scan_body(carry, _): + m, l, o, k_current, v_current = carry + k_next = jax.lax.ppermute(k_current, axis_name="fsdp", perm=perm) + v_next = jax.lax.ppermute(v_current, axis_name="fsdp", perm=perm) - m_chunk = lse_chunk.astype(jnp.float32) - m_old = m - m = jnp.maximum(m_old, m_chunk) + out_chunk, (lse_chunk,) = vmapped_splash(query, k_current, v_current, segment_ids) - exp_m_diff = jnp.exp(m_old - m) - exp_m_chunk_diff = jnp.exp(m_chunk - m) + m_chunk = lse_chunk.astype(jnp.float32) + m_old = m + m = jnp.maximum(m_old, m_chunk) - l = l * exp_m_diff + jnp.exp(lse_chunk - m) - o = o * exp_m_diff[..., None] - o += exp_m_chunk_diff[..., None] * out_chunk.astype(jnp.float32) + exp_m_diff = jnp.exp(m_old - m) + exp_m_chunk_diff = jnp.exp(m_chunk - m) - # Return the updated state for the next iteration - return (m, l, o, k_next, v_next), None + l = l * exp_m_diff + jnp.exp(lse_chunk - m) + o = o * exp_m_diff[..., None] + o += exp_m_chunk_diff[..., None] * out_chunk.astype(jnp.float32) - initial_carry = (m, l, o, k1, v1) - (m_final, l_final, o_final, _, _), _ = jax.lax.scan(ring_scan_body, initial_carry, None, length=num_fsdp_shards - 1) + # Return the updated state for the next iteration + return (m, l, o, k_next, v_next), None - attention_output = o_final / l_final[..., None] - else: - raise ValueError("ring attention requires fsdp > 1") + initial_carry = (m, l, o, k1, v1) + (m_final, l_final, o_final, _, _), _ = jax.lax.scan(ring_scan_body, initial_carry, None, length=num_fsdp_shards - 1) + + attention_output = o_final / l_final[..., None] + else: + raise ValueError("ring attention requires fsdp > 1") return attention_output[:, :, :query_seq_len, :kv_size].astype(query.dtype) @@ -536,7 +567,7 @@ def _apply_attention( mask_padding_tokens=mask_padding_tokens, residual_checkpoint_name=residual_checkpoint_name, ) - elif attention_kernel == "ring": + elif "ring" in attention_kernel: return _tpu_flash_attention( query, key * scale, value, heads, mesh, axis_names_q, axis_names_kv, flash_block_sizes, dtype, attention_kernel, mask_padding_tokens=mask_padding_tokens, @@ -547,6 +578,7 @@ def _apply_attention( raise ValueError(f"Unexpected attention kernel {attention_kernel=}.") + def _query_chunk_attention(query, key, value, precision, key_chunk_size: int = 4096): """Multi-head dot product attention with a limited number of queries.""" num_kv, num_heads, k_features = key.shape[-3:] diff --git a/src/maxdiffusion/pyconfig.py b/src/maxdiffusion/pyconfig.py index 27c9f645..060cc1bf 100644 --- a/src/maxdiffusion/pyconfig.py +++ b/src/maxdiffusion/pyconfig.py @@ -195,8 +195,8 @@ def user_init(raw_keys): raw_keys["logical_axis_rules"] = _lists_to_tuples(raw_keys["logical_axis_rules"]) # Verify qkv is sharded across sequence. - if raw_keys["attention"] == "ring" or raw_keys["attention_sharding_uniform"]: - max_logging.log(f"Adding sequence sharding to q and kv if not already present because {raw_keys['attention']}=='ring' or {raw_keys['attention_sharding_uniform']} is set.") + if "ring" in raw_keys["attention"] or raw_keys["attention_sharding_uniform"]: + max_logging.log(f"Adding sequence sharding to q and kv if not already present because '{raw_keys['attention']}' contains 'ring' or {raw_keys['attention_sharding_uniform']} is set.") logical_axis_rules = list(raw_keys["logical_axis_rules"]) max_logging.log(f"Initial logical axis rules: {logical_axis_rules}") new_rules = [] @@ -206,12 +206,12 @@ def user_init(raw_keys): logical_axis_rules.append(q_seq_sharding) if kv_seq_sharding not in logical_axis_rules: logical_axis_rules.append(kv_seq_sharding) - if raw_keys["attention"] == "ring": + if "ring" in raw_keys["attention"]: for ring_attention_axis_rule in RING_ATTENTION_AXIS_RULES: if ring_attention_axis_rule not in logical_axis_rules: max_logging.log(f"Adding ring attention axis rule {ring_attention_axis_rule}") new_rules.append(ring_attention_axis_rule) - else: # attention =flash but sequence parallel sharding requested for both self and cross attention + else: # attention contains 'flash' but sequence parallel sharding requested for both self and cross attention for seq_parallel_axis_rule in SEQUENCE_PARALLEL_AXIS_RULES: if seq_parallel_axis_rule not in logical_axis_rules: max_logging.log(f"Adding sequence parallel attention axis rule {seq_parallel_axis_rule}")