ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

InsightFace Partial FC 人脸识别大规模分布式训练框架与 Glint360K 数据集完全指南

InsightFace Partial FC 人脸识别大规模分布式训练框架与 Glint360K 数据集完全指南 InsightFace Partial FC 人脸识别大规模分布式训练框架与 Glint360K 数据集完全指南【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightfacePartial FCPartial Face Classification是 InsightFace 仓库中面向大规模人脸识别分类任务例如 1000 万、1 亿身份级别的分布式深度学习训练框架。本文以其官方文档为核心结合仓库内 MXNet 实现源码train_memory.py、memory_module.py、memory_bank.py与配套配置系统讲解 Partial FC 的原理、环境搭建、单机/多机训练、Glint360K 数据集的下载解压与评测结果帮助读者掌握如何在单机 8 卡乃至 64 卡环境下训练千万级身份的人脸识别模型。一、Partial FC 是什么Partial FC 的定位是一个面向人脸识别的大规模分布式训练框架核心目标是解决大规模分类任务例如 1000 万或 1 亿个身份类别训练时的两大痛点显存瓶颈常规 Softmax 分类层需要维护一张类别数 × 特征维度的全量权重矩阵身份数量达到千万级后仅分类层权重就远超单卡显存通信开销传统 Model Parallel模型并行方案需要频繁同步全部类别中心吞吐受限。Partial FC 的解决方案是分类层类别中心按 GPU 均分存储 负类中心随机采样近似 Softmax。官方文档明确指出它比模型并行方案快得多且无精度损失no performance drop。从源码结构看Partial FC 的训练主体由以下模块协作完成模块文件职责train_memory.py训练入口基于 horovod 初始化、组装 MemoryBank 与 MarginLossmemory_module.py核心训练模块SampleDistributeModule实现特征 AllGather、Softmax 分母 AllReduce、梯度回传memory_bank.pyMemoryBank负责本 rank 局部类别中心及其动量momentum的存取与采样memory_softmax.pyMarginLossArcFace / CosFace 间隔损失的局部实现memory_samplers.py负类中心采样器default.py数据集 / 网络 / 损失等全部超参配置二、算法原理分类层模型并行与 Softmax 近似官方文档将 Partial FC 的方法归纳为两大部分仓库源码提供了对应的实现证据。1. 分类层的模型并行类别中心被均匀分布到不同的 GPU 上仅需三次通信即可完成一次无损loss-free的 Softmax 计算。以 memory_module.py 中的实现为例① 特征的同步AllGather要保证每块 GPU 上都持有全部 GPU 的特征。forward()中调用allgather()其内部通过 in-place AllReduce 实现将本 rank 的 batch 写入对应位置后做全量求和total_tensor[self.rank * self.batch_size:self.rank * self.batch_size self.batch_size] tensor hvd.allreduce_(total_tensor, averageFalse) # all-reduce in-place② Softmax 分母的同步AllReduce先在本地计算exp(logits)的局部和再通过通信得到全局和。backward()与backward_sample()中global_sum_fc7 hvd.allreduce(sum_fc7, averageFalse)即对应文档中Allreduce(sum(exp(logits_i)))这一步同时在求exp之前先同步全局最大值做数值稳定处理global_max_fc7。③ 特征梯度的同步AllReducelogits 的梯度可以独立计算特征的梯度自然也能独立得到最后将全部 GPU 上的梯度收集并回传给 backbonetotal_feature_grad hvd.allreduce(total_feature_grad, averageFalse) fc1_grad total_feature_grad[self.batch_size * self.rank:self.batch_size * self.rank self.batch_size] self.backbone_module.backward(out_grads[fc1_grad / self.size])2. Softmax 的近似只需类别中心的一个子集即可近似完整 Softmax 的计算但正类中心必须包含在被采样集合中。官方文档给出了伪代码centers_p func_positive(label) # select the positive class centers by the label of the sample centers_n func_negative(centers_p) # negative class centers are randomly sampled after excluding positive classes centers_final concat(centers_n, centers_p) # class centers that participate in softmax calculations在 memory_bank.py 中采样由WeightIndexSampler完成sample()先对全局 label 做 unique 与 sort再由weight_index_sampler(global_label)得到局部索引返回的索引经get()取出对应的类别中心与动量参与当次前向。是否采样由配置项sample_ratio控制backward_all()中if not bool(config.sample_ratio - 1):走全量backward()否则走backward_sample()。MarginLoss 与主流损失兼容memory_softmax.py 的MarginLoss默认实现 ArcFace并通过loss_m1/loss_m2/loss_m3三元组兼容 CosFacem11.0, m20.0时退化为 CosFacem3为余弦间隔对特征与权重分别做 L2 归一化后点积得到fc7最后乘缩放因子loss_s默认 64。三、配套数据集 Glint360K文档将 Partial FC 与Glint360K数据集捆绑发布该数据集经清洗、合并后共包含17,091,657 张图像、360,232 个身份是目前最大且最干净的人脸识别数据集之一。使用 Partial FC 策略在 Glint360K 上训练的基线模型即可达到当时的最优水平。1. IFRT 评测按人种细分下表为 IFRT 大型测试集上的评估结果其中r表示负类中心采样率sampling rate of negative class centers这也是 Partial FC 最重要的超参数BackboneDatasetAfricanCaucasianIndianAsianALLR50MS1M-V376.2486.2184.4437.4371.02R124MS1M-V381.0889.0687.5338.4074.76R100Glint360k(r1.0)89.5094.2393.5465.0788.67R100Glint360k(r0.1)90.4594.6093.9663.9188.23可以看到Glint360K 在 IFRT 全部人种子集上全面超越 MS1M-V3且采样率r0.1时部分指标African/Caucasian/Indian甚至优于r1.0这印证了负类采样在大规模分类任务中无损甚至更优的特性。2. IJB-C 与 MegaFace 评测评测配置为 ResNet100 backbone CosFacem0.4损失函数IJB-C 报告 TARFAR1e-4MegaFace 报告 TARFAR1e-6Test DatasetIJB-CMegaface_IdMegaface_VerMS1MV296.498.398.6Glint360k97.399.199.13. 许可证Glint360K 数据集及其上训练的模型仅限非商业研究用途non-commercial research purposes only。4. 下载与解压提供百度网盘提取码o3az与磁力链接两种渠道磁力 URI 为magnet:?xturn:btih:E5F46EE502B9E76DA8CC3A0E4F7C17E4000C7B1Ednglint360k分卷压缩包使用如下命令解压注意cat管道末尾的-不能漏掉cat glint360k_* | tar -xzvf - # Dont forget the last -!各分卷的 MD5 校验值用于核对下载完整性# cf7433cbb915ac422230ba33176f4625 glint360k_00 # 589a5ea3ab59f283d2b5dd3242bc027a glint360k_01 # 8d54fdd5b1e4cd55e1b9a714d76d1075 glint360k_02 # cd7f008579dbed9c5af4d1275915d95e glint360k_03 # 64666b324911b47334cc824f5f836d4c glint360k_04 # a318e4d32493dd5be6b94dd48f9943ac glint360k_05 # c3ae1dcbecea360d2ec2a43a7b6f1d94 glint360k_06解压得到的.rec/.idx记录文件 MD5# 5d9cd9f262ec87a5ca2eac5e703f7cdf train.idx # 8483be5af6f9906e19f85dee49132f8e train.rec如需还原为图片使用仓库中的 unpack_glint360k.py 进行解包。5. 预训练模型预训练模型提供百度网盘提取码befi与 Google Drive 下载。各模型关键指标如下IJBCe4 即 TARFAR1e-4IFRTe6 即 TARFAR1e-6Frameworkbackbonenegative class centers sample_rateIJBCe4IFRTe6mxnetR1001.097.3-mxnetR1000.197.3-pytorchR501.097.0-pytorchR1001.097.4-6. 数据集 FAQ对齐设置Glint360K 采用与 MS1MV2 相同的对齐方式为何更新 Glint360K旧版是否有 Bug旧版本在使用 Softmax 训练时无问题但在 triplet 训练中存在 Bug最新版已修复是否有 Google Drive 或 Dropbox 版本已发布 torrent磁力链接。四、Docker 环境开箱即用的训练镜像文档为 Partial FC 提供了官方 Docker 镜像避免了手工编译 horovod/mxnet 的繁琐过程。1. 拉取镜像docker pull insightface/partial_fc:v1离线 docker.tar 镜像文档标注 coming soon以 Docker Hub 拉取为准。2. 启动容器sudo docker run -it -v /train_tmp:/train_tmp --nethost --privileged --gpus 8 --shm-size1g insightface/partial_fc:v1 /bin/bash其中/train_tmp是存放训练集的目录如果机器内存足够大可先将其挂载为tmpfs内存盘。注意镜像内 CUDA 版本为10.1因此物理机显卡驱动版本必须大于 418宿主机器上无需安装 CUDA Toolkit但必须安装 NVIDIA 驱动。五、源码级安装与训练MXNet 版除 Docker 外mxnet/README.md 提供了从零搭建环境的完整流程。1. 环境要求组件版本python3.6cuda10.1cudnn765mxnet-cu1011.6.0.post0nccl推荐安装有则更快openmpi4.0.0需源码编译见 install-mpi.shhorovod0.19.2见 install-horovod.shPython 依赖安装pip install easydict mxboard opencv-python tqdm版本兼容性关键提示部分 mxnet 版本无法安装 horovod官方强烈建议mxnet1.6.0 cuda10.1。社区已知mxnet 1.5.1 无法安装 horovod建议尝试 mxnet 1.5 或 1.6 版本。2. 启动训练horovodrun 与 mpirunhorovod 底层仍调用 MPI有多少块 GPU 就启动多少个进程进程数通过-np指定。单机 8 卡horovodrun -np 8 -H localhost:8 bash config.sh两台机器共 16 卡horovodrun -np 16 -H ip1:8,ip2:8 bash config.sh或直接使用 mpirunbash run.sh多机训练前horovodrun所在主机必须能免密 SSH到所有其他主机含自身可执行ssh-copy-id userip配置。3. 训练入口与配置解析config.sh 是实际的训练命令它设置 NCCL 后端环境变量后调用 train_memory.pyexport CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 export HOROVOD_GPU_ALLREDUCENCCL export HOROVOD_GPU_ALLGATHERNCCL export HOROVOD_GPU_BROADCASTNCLL export MXNET_CPU_WORKER_NTHREADS3 PYTHON_EXEC/usr/bin/python ${PYTHON_EXEC} train_memory.py \ --dataset glint360k_8GPU \ --loss cosface \ --network r100 \ --models-root /data/anxiang/opensource/glint360k_8GPU_r100FC_1.0_fp32_cosface三个必选参数分别对应 default.py 中的配置族--dataset预置数据集配置。常用值包括glint360k_8GPUnum_classes360232、batch_size64、max_update600000、lr_steps200000,400000,500000,550000、glint360k_16GPU、emore85742 类、webface10575 类以及用于调试/压力测试的100w/1000w/2000w/3000w/10000w这些调试配置会打开config.debug 1--losscosfacem30.4或arcfacem20.5--networkr100、r122等设置net_nameresnet与num_layers。default.py 中的核心全局配置config.embedding_size 512 # 特征维度 config.image_size 112 # 输入图像尺寸 config.batch_size 64 # 每卡 batch size config.backbone_lr 0.1 # backbone 初始学习率 config.memory_bank_lr config.backbone_lr # 类别中心memory bank学习率 config.sample_ratio 1.0 # 负类中心采样率 r核心超参数 config.fp16 False # 是否混合精度 config.debug 0 # 置 1 时使用 DummyIter 屏蔽 IO4. 训练流程中的关键实现细节在 train_memory.py 中类别中心即 Softmax 线性变换矩阵按 rank等分存储num_local (num_classes size - 1) // size每卡实际参与分类的采样数num_sample int(num_local * sample_ratio)MemoryBank以 GPU 存储类别中心weight与动量weight_mom均以N(0, 0.01)初始化并提供sample / get / set / save四个核心方法训练中通过CallBackCenterSave周期性保存各 rank 的*_centers.param与*_centers_mom.parambackbone 与 memory bank 使用两个独立优化器backbone 用DistributedOptimizer(SGD(...))momentum0.9、wd5e-4且rescale_grad1.0 / (config.batch_size * size) * sizememory bank 用MemoryBankSGDOptimizerrescale_grad1.0 / config.batch_size / size文件开头设置了一批针对 MXNet horovod 的性能环境变量例如HOROVOD_FUSION_THRESHOLD67108864、HOROVOD_NUM_NCCL_STREAMS2、MXNET_EXEC_BULK_EXEC_MAX_NODE_TRAIN_FWD999等用于提升通信与执行效率。六、性能基准Benchmark1. Glint360K 的 MXNet 训练吞吐在 8 × Tesla V100-SXM2-32GB 上训练 Glint360K 的吞吐量img/secBackboneGPUFP16BatchSize/itThroughput img/secR1008 × V100-SXM2-32GBFalse641748R1008 × V100-SXM2-32GBTrue643357R1008 × V100-SXM2-32GBFalse1281847R1008 × V100-SXM2-32GBTrue1283867R508 × V100-SXM2-32GBFalse642921R508 × V100-SXM2-32GBTrue645428R508 × V100-SXM2-32GBFalse1283045R508 × V100-SXM2-32GBTrue1286112可以看出 FP16 混合精度可将吞吐提升约1.9~2 倍且不损失精度——这也是文档强调无性能下降的重要实践支撑。2. 百万级身份对比忽略 IO 影响混合精度训练backboneResNet50100 万身份 / 8 × RTX2080TiMethodGPUsBatchSizeMemory/MThroughput img/secWModel Parallel81024104082390GPUPartial FC (Ours)8102481002780GPU1000 万身份 / 64 × RTX2080TiMethodGPUsBatchSizeMemory/MThroughput img/secWModel Parallel64204896844483GPUPartial FC (Ours)644096672212600GPU在千万身份规模下Partial FC 相比模型并行将 batch size 从 2048 提升到 4096、显存占用从 9684M 降到 6722M、吞吐从 4483 提升到12600 img/sec约 2.8 倍充分体现了采样 分片策略在通信与显存上的双重优势。七、训练速度问题排查Troubleshooting官方文档给出了训练中常见的四类问题Horovod 是否安装成功执行horovodrun --check输出应显示[X] MXNet、[X] MPI、[X] Gloo、[X] NCCL等完整输出示例见 mxnet/README.mdMXNet 版本部分版本与 horovod 存在兼容 Bug建议使用 1.5 或 1.6mxnet 1.5.1 无法安装 horovodCUDA 版本一致性mxnet-cu101 要求 CUDA 10.1用/usr/local/cuda/bin/nvcc -V核对示例输出显示release 10.1, V10.1.168IO 瓶颈在config中开启debug模式config.debug 1对应--dataset 100w/1000w等调试配置训练会改用DummyIter屏蔽真实数据读取据此判断慢训练是否由 IO 引起若确为 IO 瓶颈可将数据集挂载到内存盘tmpfs例如 256G 内存的机器sudo mkdir /train_tmp mount -t tmpfs -o size140G tmpfs /train_tmp八、PyTorch 版本与生态衔接Partial FC 的 PyTorch 实现已合并进 arcface_torch见 pytorch/README.md相关训练代码、partial_fc_v2.py、损失函数与数据集加载均在 recognition/arcface_torch 中维护同时仓库还提供配套的 torch2onnx.py、onnx_helper.py 与 eval_ijbc.py 用于模型导出与大规模评测方便从训练到部署的完整衔接。九、引用Citation如果在研究中使用 Partial-FC 或 Glint360K请引用以下论文inproceedings{an_2022_pfc_cvpr, title{Killing Two Birds with One Stone: Efficient and Robust Training of Face Recognition CNNs by Partial FC}, author{An, Xiang and Deng, Jiangkang and Guo, Jia and Feng, Ziyong and Zhu, Xuhan and Jing, Yang and Tongliang, Liu}, booktitle{Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition}, year{2022} } inproceedings{an_2021_pfc_iccvw, title{Partial FC: Training 10 Million Identities on a Single Machine}, author{An, Xiang and Zhu, Xuhan and Gao, Yuan and Xiao, Yang and Zhao, Yongle and Feng, Ziyong and Wu, Lan and Qin, Bin and Zhang, Ming and Zhang, Debing and Fu, Ying}, booktitle{Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV) Workshops}, year{2021}, }总结Partial FC 通过分类层按 GPU 分片 负类中心采样两板斧将千万级身份的人脸识别训练从多机多卡的模型并行方案中解放出来单机 8 卡即可完成 1000 万身份的 Softmax 分类训练显存与通信开销双双下降、吞吐成倍提升。配合官方清洗发布的 Glint360K 数据集1709 万图 / 36 万身份在 IFRT、IJB-C、MegaFace 等评测上均取得了优于 MS1M-V2/V3 的成绩。本文所述的所有训练脚本、配置与实现均可直接在仓库 recognition/partial_fc 目录下复现与扩展。【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表