TimeSformer在MMAction2里跑Kinetics400,我的显卡显存不够怎么办?优化与调参实战
TimeSformer在MMAction2中训练Kinetics400的显存优化实战指南当我在实验室的RTX 3090上首次尝试用TimeSformer训练Kinetics400时显存不足的报错让我意识到——Transformer类模型对硬件的要求确实苛刻。经过两周的反复试验和参数调整我总结出一套针对中等算力设备的完整优化方案成功将显存占用从24GB降低到10GB以下同时保持模型性能不显著下降。1. 数据预处理优化从源头减少显存压力数据预处理是显存优化的第一道防线。TimeSformer默认配置中的高分辨率输入和密集帧采样是显存消耗的主要来源。1.1 输入分辨率调整策略new-short参数控制着视频帧的短边尺寸默认256对于显存有限的设备来说仍然偏高。通过实验发现将分辨率降至224甚至200时模型性能下降在可接受范围内# 修改build_rawframes.py中的参数 python build_rawframes.py ../data/train/ ../data/rawframes_train/ --new-short 200不同分辨率下的显存占用对比分辨率显存占用(GB)Top-1准确率256x25622.478.3%224x22418.777.9%200x20015.277.1%1.2 帧采样策略优化TimeSformer的默认配置使用8帧输入这对显存要求很高。通过调整clip_len和frame_interval可以显著降低显存需求train_pipeline [ dict(typeSampleFrames, clip_len4, # 减少帧数 frame_interval16, # 增大间隔 num_clips1), # 其他预处理步骤保持不变 ]注意帧数减少会损失时序信息建议配合后面的梯度累积使用2. 训练配置调参精细控制显存分配2.1 批次大小与梯度累积videos_per_gpu是显存占用的主要决定因素。对于24GB显存的显卡建议从1开始尝试data dict( videos_per_gpu1, # 关键参数 workers_per_gpu2, # 其他配置保持不变 )配合梯度累积技术可以在小批次下实现接近大批次的效果# 在配置文件中添加 optimizer_config dict( grad_clipdict(max_norm40, norm_type2), cumulative_iters4 # 累积4次梯度再更新 )2.2 优化器参数调整小批次训练需要更谨慎的学习率设置optimizer dict( typeAdamW, # 比SGD更适合小批次 lr2e-4, # 降低学习率 weight_decay0.05, paramwise_cfgdict( custom_keys{ .backbone.cls_token: dict(decay_mult0.0), .backbone.pos_embed: dict(decay_mult0.0), .backbone.time_embed: dict(decay_mult0.0) } ) )3. 模型微调技巧针对性降低计算负载3.1 部分层冻结策略TimeSformer的空间注意力层通常已经在大规模图像数据上预训练得很好可以冻结以减少计算量model dict( backbonedict( frozen_stages4, # 冻结前4层空间注意力 transformer_layers( dict(freezeTrue), # 冻结空间层 dict(freezeFalse) # 不冻结时间层 ) ) )3.2 注意力机制优化TimeSformer的divided space-time attention可以调整为更节省显存的版本model dict( backbonedict( attention_typespace_only, # 仅空间注意力 # 或者使用更节省显存的分组注意力 # attention_typedivided_group_space_time, # num_attention_groups4 ) )4. 混合精度训练与显存管理技巧4.1 FP16混合精度训练MMAction2支持自动混合精度训练可显著减少显存占用# 在配置文件中添加 fp16 dict(loss_scale512.) # 启用混合精度训练4.2 显存碎片整理定期清理显存碎片可以避免内存泄漏导致的OOM# 在训练脚本中添加 import torch def clear_memory(): torch.cuda.empty_cache() torch.cuda.ipc_collect() # 每个epoch结束后调用 clear_memory()4.3 梯度检查点技术对于特别大的模型可以启用梯度检查点技术model dict( backbonedict( use_checkpointTrue # 启用梯度检查点 ) )经过这些优化我的RTX 3090(24GB)现在可以稳定训练TimeSformerbatch size为2的情况下显存占用控制在18GB左右。如果使用RTX 2080 Ti(11GB)通过将分辨率降至200x200、batch size设为1、启用混合精度也能完成训练。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2521569.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!