Il s'agit de la mise en œuvre officielle de notre article: élargir le réglage clairsemé pour une faible utilisation de la mémoire.
Nous proposons une méthode appelée Snell ( S Analyse du réglage avec KER NEL IZED L ORA) pour permettre un réglage clairsemé avec une faible utilisation de la mémoire. Snell décompose la matrice accordable pour la sparsification en deux matrices à faible rang apprenables, économisant le stockage coûteux de la matrice complète d'origine. Pour maintenir l'efficacité du réglage clairsemé avec des matrices de faible rang, nous étendons la décomposition de faible rang du point de vue du noyau. Plus précisément, nous appliquons des fonctions de noyau non linéaires à la fusion de la matrice complète et gagnons une augmentation du rang de la matrice fusionnée. L'utilisation de rangs plus élevés améliore la capacité de SNELL à optimiser le modèle pré-formé peu pour les tâches en aval. Pour réduire davantage l'utilisation de la mémoire dans le réglage clairsemé, nous introduisons un mécanisme de sparsification basé sur la concurrence, en évitant le stockage des indices de poids accordables. Des expériences approfondies sur plusieurs tâches en aval montrent que Snell atteint des performances de pointe avec une faible utilisation de la mémoire, étendant un PEFT efficace avec un réglage clairsemé sur des modèles à grande échelle.

Si vous trouvez ce référentiel ou notre article utile, veuillez envisager de nous citer et de nous regarder!
@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 : exécutez ce fichier pour la formation../scripts : scripts pour adapter les modèles pré-formés aux tâches en aval avec Snell../lib : fonctions d'assistance pour IO, journalisations, formation et chargement de données../model : Architectures de squelette et méthodes de réglage fin../engine.py : fonctions principales de formation et d'évaluation../data : stockage de repères FGVC et VTAB-1k.Cloner ce repo:
git clone https://github.com/ssfgunner/SNELL.git
cd SNELLCréez un environnement virtuel Conda et activez-le:
conda create -n snell python=3.8 -y
conda activate snell Installez torch==1.12.1 et torchvision==0.13.1 avec CUDA==11.3 :
conda install pytorch==1.12.1 torchvision==0.13.1 cudatoolkit=11.3 -c pytorchInstallez d'autres dépendances:
pip install -r requirements.txt
FGVC: Veuillez télécharger les ensembles de données suivants.
VTAB-1k: Étant donné que le traitement de certains ensembles de données dans Benchmark VTAB original est délicat, nous recommandons les ensembles de données VTAB-1k extraits partagés par SSF pour plus de commodité. (Notez que la licence est en référence VTAB).
La structure du fichier doit ressembler:
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.pthNous avons fourni des scripts de formation pour adapter la VIT pré-formée supervisée aux FGVC et VTAB-1k avec Snell-32, par exemple:
# 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.shPour d'autres modèles, nous fournissons des scripts pour les affiner sur FGVC par exemple:
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_stageNotre code est modifié à partir de VPT, SSF et SPT. Nous remercions les auteurs pour leur code open source.