Diffusers
Safetensors
AR / check_data.py
xfcghj's picture
Upload folder using huggingface_hub
f0fc238 verified
Raw
History Blame Contribute Delete
2 kB
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)