Skip to content

Commit 66cd308

Browse files
authored
[data] fix: repeat FLUX mock data across training (#5534)
Signed-off-by: Yu Yao <yaoyu.094@gmail.com>
1 parent 5ca5ab7 commit 66cd308

2 files changed

Lines changed: 41 additions & 8 deletions

File tree

‎src/megatron/bridge/diffusion/data/flux/flux_mock_datamodule.py‎

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"""Mock data module for FLUX model training."""
1616

1717
from dataclasses import dataclass
18+
from itertools import chain, repeat
1819

1920
import torch
2021
from torch.utils.data import DataLoader, Dataset
@@ -219,7 +220,7 @@ class FluxMockDataModuleConfig(DatasetProvider):
219220

220221
def __post_init__(self):
221222
"""Initialize the mock dataset and dataloader."""
222-
mock_ds = _MockT2IDataset(
223+
self._mock_ds = _MockT2IDataset(
223224
image_H=self.image_H,
224225
image_W=self.image_W,
225226
length=self.num_train_samples,
@@ -232,13 +233,19 @@ def __post_init__(self):
232233
vae_channels=self.vae_channels,
233234
)
234235

236+
self._train_dl = self._build_dataloader()
237+
self._valid_dl = self._build_dataloader()
238+
self._test_dl = self._build_dataloader()
239+
self.sequence_length = self.seq_length
240+
241+
def _build_dataloader(self) -> DataLoader:
235242
kwargs = {}
236243
if self.num_workers > 0:
237244
kwargs["prefetch_factor"] = 8
238245
kwargs["persistent_workers"] = True
239246

240-
self._train_dl = DataLoader(
241-
mock_ds,
247+
return DataLoader(
248+
self._mock_ds,
242249
batch_size=self.micro_batch_size,
243250
num_workers=self.num_workers,
244251
collate_fn=_collate_fn,
@@ -247,10 +254,10 @@ def __post_init__(self):
247254
pin_memory=True,
248255
**kwargs,
249256
)
250-
self._train_dl_iter = iter(self._train_dl)
251-
self.sequence_length = self.seq_length
252257

253258
def build_datasets(self, _context: DatasetBuildContext):
254259
"""Build and return train/val/test dataloaders."""
255-
# Return iterator for external dataloader type
256-
return self._train_dl_iter, self._train_dl_iter, self._train_dl_iter
260+
# Reiterate each loader without caching generated batches in host memory.
261+
return tuple(
262+
chain.from_iterable(repeat(dataloader)) for dataloader in (self._train_dl, self._valid_dl, self._test_dl)
263+
)

‎tests/unit_tests/diffusion/data/flux/test_flux_mock_datamodule.py‎

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ def test_flux_mock_datamodule_build_and_batch_shapes():
3838
num_train_samples=100,
3939
)
4040
train_dl, val_dl, test_dl = cfg.build_datasets(_context=None)
41-
assert train_dl is val_dl and val_dl is test_dl
41+
assert train_dl is not val_dl
42+
assert val_dl is not test_dl
4243

4344
batch = next(iter(train_dl))
4445
expected_keys = {
@@ -77,6 +78,31 @@ def test_flux_mock_datamodule_build_and_batch_shapes():
7778
assert batch["loss_mask"].dtype == torch.bfloat16
7879

7980

81+
def test_flux_mock_datamodule_repeats_with_independent_splits():
82+
cfg = FluxMockDataModuleConfig(
83+
micro_batch_size=1,
84+
global_batch_size=2,
85+
num_workers=0,
86+
image_H=8,
87+
image_W=8,
88+
vae_channels=1,
89+
vae_scale_factor=8,
90+
prompt_seq_len=2,
91+
context_dim=2,
92+
pooled_prompt_dim=2,
93+
num_train_samples=2,
94+
)
95+
96+
train_dl, val_dl, test_dl = cfg.build_datasets(_context=None)
97+
98+
for _ in range(cfg.num_train_samples + 1):
99+
next(train_dl)
100+
next(val_dl)
101+
next(test_dl)
102+
assert train_dl is not val_dl
103+
assert val_dl is not test_dl
104+
105+
80106
def test_flux_mock_datamodule_without_precaching():
81107
"""Test the mock datamodule with non-precached data."""
82108
cfg = FluxMockDataModuleConfig(

0 commit comments

Comments
 (0)