SNELL
1.0.0
这是我们论文的官方实施:扩大稀疏调整以减少内存使用情况。
我们提出了一种称为Snell(用Ker nel ized l ora进行调整)的方法,以使稀疏调谐使用低记忆使用。 Snell将稀疏性的可调矩阵分解为两个可学习的低级矩阵,从原始完整矩阵的昂贵存储中节省下来。为了保持低级矩阵稀疏调整的有效性,我们从内核角度扩展了低级别的分解。具体而言,我们将非线性内核函数应用于全矩阵合并并增加合并矩阵的等级。采用较高的等级可以增强SNELL对下游任务优化稀疏训练模型的能力。为了进一步减少稀疏调整中的内存使用量,我们引入了一种基于竞争的稀疏机制,避免了可调重量索引的存储。在多个下游任务上进行了广泛的实验表明,Snell以低内存使用的方式实现了最先进的性能,从而扩展了有效的PEFT,并稀疏地调整到大型模型。

如果您发现此存储库或我们的论文有用,请考虑引用和凝视我们!
@InProceedings{Shen_2024_SNELL,
title={Expanding Sparse Tuning for Low Memory Usage},
author={Shen, Shufan and Sun, Junshu and Ji, Xiangyang and Huang, Qingming and Wang, Shuhui},
booktitle={Advances in Neural Information Processing Systems (NeurIPS)},
year={2024}
}
./train.py :运行此文件进行培训。./scripts :用于使用Snell调整预训练的模型到下游任务的脚本。./lib :用于IO,登录,培训和数据加载的辅助功能。./model :用于微调的骨干架构和方法。./engine.py :主要培训和评估功能。./data :存储FGVC和VTAB-1K基准。克隆这个仓库:
git clone https://github.com/ssfgunner/SNELL.git
cd SNELL创建一个conda虚拟环境并激活它:
conda create -n snell python=3.8 -y
conda activate snell安装torch==1.12.1和torchvision==0.13.1 with CUDA==11.3 :
conda install pytorch==1.12.1 torchvision==0.13.1 cudatoolkit=11.3 -c pytorch安装其他依赖项:
pip install -r requirements.txt
FGVC:请在VPT之后下载数据集。
VTAB-1K:由于原始VTAB基准测试中某些数据集的处理非常棘手,因此我们建议SSF共享的提取的VTAB-1K数据集为方便起见。 (请注意,许可证是在VTAB基准中)。
文件结构应该看起来像:
data
├── fgvc
│ ├── cub
│ ├── nabirds
│ └── ...
└── vtab-1k
├── caltech101
├── cifar
└── ...mkdir checkpoints
cd checkpoints
# Supervisedly pre-trained ViT-B/16
wget https://console.cloud.google.com/storage/browser/_details/vit_models/imagenet21k/ViT-B_16.npz
# MAE pre-trained ViT-B/16
wget https://dl.fbaipublicfiles.com/mae/pretrain/mae_pretrain_vit_base.pth
# MoCo V3 pre-trained ViT-B/16
wget https://dl.fbaipublicfiles.com/moco-v3/vit-b-300ep/linear-vit-b-300ep.pth.tar
# Supervisedly pre-trained Swin-Transformer
wget https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224_22k.pth
# Supervisedly pre-trained ConvNeXt
wget https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_224.pth我们提供了培训脚本,以通过SNELL-32调整受监督的预训练的VIT对FGVC和VTAB-1K。
# Fine-tuning supervised pre-trained ViT-B/16 with SNELL-32 for CUB dataset of FGVC
bash scripts/fgvc/snell32/vit_cub_snell.sh
# Fine-tuning supervised pre-trained ViT-B/16 with SNELL-32 for CIFAR dataset of VTAB-1k
bash scripts/vtab/snell32/vit_cifar_snell.sh对于其他模型,我们提供脚本以在FGVC上微调它们:例如:
python train.py --data-path=./data/fgvc/ ${DATASET} --init_thres= ${init_thres}
--data-set= ${DATASET} --model_name=vit_base_patch16_224_in21k_snell --resume=checkpoints/mae_pretrain_vit_base.pth
--output_dir= ${save_dir}
--batch-size= ${batch_size} --lr=0.001 --epochs=100 --weight-decay= ${WEIGHT_DECAY} --mixup=0 --cutmix=0
--smoothing=0 --launcher= " none " --seed=0 --val_interval=10 --opt=adamw --low_rank_dim=32
--exp_name= " ViT_MAE_ ${DATASET} " --seed=0
--test --block=BlockSNELLParallel --tuning_model=snell --freeze_stagepython train.py --data-path=./data/fgvc/ ${DATASET} --init_thres= ${init_thres}
--data-set= ${DATASET} --model_name=vit_base_patch16_224_in21k_snell --resume=checkpoints/linear-vit-b-300ep.pth.tar
--output_dir= ${save_dir}
--batch-size= ${batch_size} --lr=0.001 --epochs=100 --weight-decay= ${WEIGHT_DECAY} --mixup=0 --cutmix=0
--smoothing=0 --launcher= " none " --seed=0 --val_interval=10 --opt=adamw --low_rank_dim=32
--exp_name= " ViT_MoCo_ ${DATASET} " --seed=0
--test --block=BlockSNELLParallel --tuning_model=snell --freeze_stagepython train.py --data-path=./data/fgvc/ ${DATASET} --init_thres= ${init_thres}
--data-set= ${DATASET} --model_name=swin_base_patch4_window7_224_in22k --resume=./checkpoints/swin_base_patch4_window7_224_22k.pth
--output_dir= ${save_dir}
--batch-size= ${batch_size} --lr=0.001 --epochs=100 --weight-decay= ${WEIGHT_DECAY} --mixup=0 --cutmix=0
--smoothing=0 --launcher= " none " --seed=0 --val_interval=10 --opt=adamw --low_rank_dim=32
--exp_name= " Swin_ ${DATASET} " --seed=0
--test --block=BlockSNELLParallel --tuning_model=snell --freeze_stagepython train.py --data-path=./data/fgvc/ ${DATASET} --init_thres= ${init_thres}
--data-set= ${DATASET} --model_name=convnext_base_in22k --resume=./checkpoints/convnext_base_22k_224.pth
--output_dir= ${save_dir}
--batch-size= ${batch_size} --lr=0.001 --epochs=100 --weight-decay= ${WEIGHT_DECAY} --mixup=0 --cutmix=0
--smoothing=0 --launcher= " none " --seed=0 --val_interval=10 --opt=adamw --low_rank_dim=32
--exp_name= " ConvNeXt_ ${DATASET} " --seed=0
--test --block=BlockSNELLParallel --tuning_model=snell --freeze_stage我们的代码根据VPT,SSF和SPT进行了修改。我们感谢作者的开源代码。