@@ -2833,6 +2833,39 @@ def test_resume_dataloader(dataset: IterableDataset):
28332833 assert remaining == list (dl )
28342834
28352835
2836+ @require_torchdata_stateful_dataloader
2837+ @pytest .mark .parametrize ("num_workers" , [0 , 1 , 2 ])
2838+ def test_resume_dataloader_twice (num_workers ):
2839+ from torchdata .stateful_dataloader import StatefulDataLoader
2840+
2841+ ex_iterable = ExamplesIterable (generate_examples_fn , {"filepaths" : [f"file{ i } .txt" for i in range (4 )]})
2842+ dataset = IterableDataset (ex_iterable )
2843+
2844+ def make_dataloader ():
2845+ return StatefulDataLoader (dataset , batch_size = None , num_workers = num_workers )
2846+
2847+ all_examples = list (make_dataloader ())
2848+
2849+ # consume 2 examples, then checkpoint #1
2850+ dl = make_dataloader ()
2851+ it = iter (dl )
2852+ consumed = [next (it ) for _ in range (2 )]
2853+ state_1 = dl .state_dict ()
2854+
2855+ # resume from #1, consume 2 more, then checkpoint #2 (taken from a resumed loader)
2856+ dl = make_dataloader ()
2857+ dl .load_state_dict (state_1 )
2858+ it = iter (dl )
2859+ consumed += [next (it ) for _ in range (2 )]
2860+ state_2 = dl .state_dict ()
2861+
2862+ # resuming from #2 must continue from where it left off, not restart from the beginning
2863+ dl = make_dataloader ()
2864+ dl .load_state_dict (state_2 )
2865+ remainder = list (dl )
2866+ assert consumed + remainder == all_examples
2867+
2868+
28362869@pytest .mark .parametrize ("num_shards" , [1 , 2 , 3 , 7 ])
28372870def test_iterable_dataset_batch (num_shards : int ):
28382871 # Create a simple IterableDataset
0 commit comments