Skip to content
This repository was archived by the owner on May 20, 2026. It is now read-only.

Commit dee1153

Browse files
committed
fix dit inference bug. Add wanbd to inference code.
Signed-off-by: sajadn <snorouzi@nvidia.com>
1 parent fa1b884 commit dee1153

2 files changed

Lines changed: 48 additions & 29 deletions

File tree

dfm/src/megatron/model/dit/edm/edm_pipeline.py

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -179,21 +179,17 @@ def training_step(
179179
# import pdb; pdb.set_trace()
180180
# Get the input data to noise and denoise~(image, video) and the corresponding conditioner.
181181
self.net = model
182-
x0_from_data_batch, x0, condition = self.get_data_and_condition(data_batch)
182+
x0, condition = self.get_data_and_condition(data_batch)
183183

184184
# Sample pertubation noise levels and N(0, 1) noises
185185
sigma, epsilon = self.draw_training_sigma_and_epsilon(x0.size(), condition)
186186

187187
if parallel_state.is_pipeline_last_stage():
188-
output_batch, pred_mse, edm_loss = self.compute_loss_with_epsilon_and_sigma(
189-
data_batch, x0_from_data_batch, x0, condition, epsilon, sigma
190-
)
188+
output_batch, pred_mse, edm_loss = self.compute_loss_with_epsilon_and_sigma(x0, condition, epsilon, sigma)
191189

192190
return output_batch, edm_loss
193191
else:
194-
net_output = self.compute_loss_with_epsilon_and_sigma(
195-
data_batch, x0_from_data_batch, x0, condition, epsilon, sigma
196-
)
192+
net_output = self.compute_loss_with_epsilon_and_sigma(x0, condition, epsilon, sigma)
197193
return net_output
198194

199195
def denoise(self, xt: torch.Tensor, sigma: torch.Tensor, condition: dict[str, torch.Tensor]):
@@ -232,8 +228,6 @@ def denoise(self, xt: torch.Tensor, sigma: torch.Tensor, condition: dict[str, to
232228

233229
def compute_loss_with_epsilon_and_sigma(
234230
self,
235-
data_batch: dict[str, torch.Tensor],
236-
x0_from_data_batch: torch.Tensor,
237231
x0: torch.Tensor,
238232
condition: dict[str, torch.Tensor],
239233
epsilon: torch.Tensor,
@@ -294,14 +288,14 @@ def get_per_sigma_loss_weights(self, sigma: torch.Tensor):
294288

295289
def get_condition_uncondition(self, data_batch: Dict):
296290
"""Returns conditioning and unconditioning for classifier-free guidance."""
297-
_, _, condition = self.get_data_and_condition(data_batch, dropout_rate=0.0)
291+
_, condition = self.get_data_and_condition(data_batch, dropout_rate=0.0)
298292

299293
if "neg_context_embeddings" in data_batch:
300294
data_batch["context_embeddings"] = data_batch["neg_context_embeddings"]
301295
data_batch["context_mask"] = data_batch["context_mask"]
302-
_, _, uncondition = self.get_data_and_condition(data_batch, dropout_rate=1.0)
296+
_, uncondition = self.get_data_and_condition(data_batch, dropout_rate=1.0)
303297
else:
304-
_, _, uncondition = self.get_data_and_condition(data_batch, dropout_rate=1.0)
298+
_, uncondition = self.get_data_and_condition(data_batch, dropout_rate=1.0)
305299

306300
return condition, uncondition
307301

@@ -419,13 +413,14 @@ def get_data_and_condition(self, data_batch: dict[str, Tensor], dropout_rate=0.2
419413
Raw data, latent data, and conditioning information.
420414
"""
421415
# Latent state
422-
raw_state = data_batch["video"] * self.sigma_data
423-
# assume data is already encoded
424-
latent_state = raw_state
425-
426-
# Condition
427-
data_batch["crossattn_emb"] = self.random_dropout_input(
416+
latent_state = data_batch["video"] * self.sigma_data
417+
condition = {} # Create a new dictionary for condition
418+
# Copy all keys from data_batch except 'video'
419+
for key, value in data_batch.items():
420+
if key not in ["video", "context_embeddings"]:
421+
condition[key] = value
422+
423+
condition["crossattn_emb"] = self.random_dropout_input(
428424
data_batch["context_embeddings"], dropout_rate=dropout_rate
429425
)
430-
431-
return raw_state, latent_state, data_batch
426+
return latent_state, condition

examples/megatron/recipes/dit/inference_dit_model.py

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from megatron.core.tensor_parallel.random import model_parallel_cuda_manual_seed
2525
from transformers import T5EncoderModel, T5TokenizerFast
2626

27+
import wandb
2728
from dfm.src.common.tokenizers.cosmos.cosmos1.causal_video_tokenizer import CausalVideoTokenizer
2829
from dfm.src.common.utils.save_video import save_video
2930
from dfm.src.megatron.model.dit.edm.edm_pipeline import EDMPipeline
@@ -143,12 +144,7 @@ def get_pos_id_3d(self, *, t, h, w):
143144
return self.grid[:t, :h, :w]
144145

145146

146-
def prepare_data_batch(args, t5_embeding_max_length=512):
147-
tokenizer = T5TokenizerFast.from_pretrained("google-t5/t5-11b", cache_dir=args.t5_cache_dir)
148-
text_encoder = T5EncoderModel.from_pretrained("google-t5/t5-11b", cache_dir=args.t5_cache_dir)
149-
text_encoder.to("cuda")
150-
text_encoder.eval()
151-
147+
def prepare_data_batch(args, tokenizer, text_encoder, t5_embeding_max_length=512):
152148
print("[args.prompt]: ", args.prompt)
153149
# Encode text to T5 embedding
154150
out = encode_for_batch(tokenizer, text_encoder, [args.prompt])
@@ -254,8 +250,7 @@ def load_model_from_checkpoint(args):
254250
if isinstance(model, list):
255251
model = model[0]
256252

257-
model = model.cuda().to(torch.bfloat16)
258-
model.eval()
253+
model = model.cuda().to(torch.bfloat16).eval()
259254

260255
print_rank_0(f"✅ Model loaded successfully from {checkpoint_path}")
261256

@@ -311,12 +306,25 @@ def set_seed(seed):
311306

312307
set_seed(42)
313308

309+
rank = torch.distributed.get_rank()
310+
if rank == 0:
311+
gather_list = [None for _ in range(ps.get_data_parallel_world_size())]
312+
wandb.init(project="dit-inference-video", name="inference_generation")
313+
else:
314+
gather_list = None
315+
314316
# Load model from checkpoint or initialize from scratch
315317
print_rank_0("Loading model from checkpoint...")
316318
model, diffusion_pipeline, model_config = load_model_from_checkpoint(args)
317319

320+
tokenizer = T5TokenizerFast.from_pretrained("google-t5/t5-11b", cache_dir=args.t5_cache_dir, dtype=torch.bfloat16)
321+
text_encoder = T5EncoderModel.from_pretrained(
322+
"google-t5/t5-11b", cache_dir=args.t5_cache_dir, dtype=torch.bfloat16
323+
)
324+
text_encoder.to("cuda").eval()
325+
318326
print_rank_0("preparing data batch...")
319-
data_batch, state_shape = prepare_data_batch(args)
327+
data_batch, state_shape = prepare_data_batch(args, tokenizer, text_encoder)
320328
vae = CausalVideoTokenizer.from_pretrained(args.tokenizer_model, cache_dir=args.tokenizer_cache_dir)
321329
vae.to("cuda").eval()
322330

@@ -356,6 +364,22 @@ def set_seed(seed):
356364
)
357365
print_rank_0(f"saved video to rank={rank}_{args.video_save_path}")
358366

367+
torch.distributed.gather_object(
368+
obj=(decoded_video[0], args.prompt),
369+
object_gather_list=gather_list,
370+
dst=0,
371+
group=ps.get_data_parallel_group(),
372+
)
373+
374+
if rank == 0 and wandb.run is not None:
375+
videos = []
376+
for video, caption in gather_list:
377+
video_data_transposed = video.transpose(0, 3, 1, 2)
378+
videos.append(wandb.Video(video_data_transposed, fps=args.fps, format="mp4", caption=caption))
379+
wandb.log({"generated_videos": videos})
380+
wandb.finish()
381+
print_rank_0("✅ All videos gathered and logged to wandb with captions")
382+
359383

360384
if __name__ == "__main__":
361385
args = parse_args()

0 commit comments

Comments
 (0)