Diffusers
Safetensors
File size: 2,004 Bytes
f0fc238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import os
import torch
import torch.distributed as dist
import argparse
from utils.autodataloader_v3 import get_mesh_dataloader

def count_dataset(args):
    # 1. 初始化分布式环境
    # 使用环境变量自动获取 local_rank
    local_rank = int(os.environ.get("LOCAL_RANK", 0))
    torch.cuda.set_device(local_rank)
    dist.init_process_group(backend="nccl")
    rank = dist.get_rank()
    world_size = dist.get_world_size()

    # 2. 初始化数据加载器
    # 确保 get_mesh_dataloader 在分布式环境下已配置好对应的采样分片 (DistributedSampler)
    dataloader = get_mesh_dataloader(batch_size=args.batch_size, num_workers=8)

    local_batch_count = 0
    local_sample_count = 0

    # 3. 遍历统计
    print(f"[Rank {rank}] 开始统计数据...")
    for batch in dataloader:
        # 统计当前 batch 的样本数
        batch_size = len(batch['vertices'])
        local_batch_count += 1
        local_sample_count += batch_size

    # 4. 汇总各进程统计信息
    # 将统计结果转换为 tensor 用于通信
    batch_tensor = torch.tensor([local_batch_count], device=f"cuda:{local_rank}")
    sample_tensor = torch.tensor([local_sample_count], device=f"cuda:{local_rank}")
    
    # 使用 all_reduce 将所有卡的统计数据求和至所有卡
    dist.all_reduce(batch_tensor, op=dist.ReduceOp.SUM)
    dist.all_reduce(sample_tensor, op=dist.ReduceOp.SUM)

    # 5. 输出汇总结果 (仅在 rank 0 执行)
    if rank == 0:
        print("\n" + "="*40)
        print("数据集并行加载统计结果:")
        print(f"总参与卡数 (World Size): {world_size}")
        print(f"全局总 Batch 数: {batch_tensor.item()}")
        print(f"全局总数据样本数: {sample_tensor.item()}")
        print("="*40 + "\n")

    dist.destroy_process_group()

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--batch_size", type=int, default=4)
    args = parser.parse_args()
    count_dataset(args)