Это официальная реализация нашей статьи: расширение разреженной настройки для низкого использования памяти.
Мы предлагаем метод под названием Snell ( S Parse Tuging с Ker Nel Ized L Ora), чтобы обеспечить редкую настройку с низким использованием памяти. Снелл разлагает настраиваемую матрицу для редактирования на две обучаемые матрицы с низким уровнем ранга, сохраняя от дорогостоящего хранения исходной полной матрицы. Чтобы поддерживать эффективность разреженной настройки с низкими матрицами, мы расширяем разложение с низким уровнем ранга с точки зрения ядра. В частности, мы применяем нелинейные функции ядра к слиянию полной матрицы и увеличиваем ранг объединенную матрицу. Использование более высоких рангов повышает способность Снелла оптимизировать предварительно обученную модель редко для нижестоящих задач. Чтобы дополнительно уменьшить использование памяти в разреженной настройке, мы вводим механизм спарфикации на основе конкуренции, избегая хранения настраиваемых индексов веса. Обширные эксперименты по нескольким нисходящим задачам показывают, что Снелл достигает современной производительности с низким использованием памяти, расширяя эффективную 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 : Сценарии для адаптации предварительно обученных моделей к нисходящим задачам с Снелл../lib : вспомогательные функции для ввода -вывода, логгинга, обучения и загрузки данных../model : Архитектуры и методы магистралей для тонкой настройки../engine.py : основные тренировки и функции Eval../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 с 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 является сложной, мы рекомендуем извлеченные наборы данных VTAB-1K, разделяемые SSF для удобства. (Обратите внимание, что лицензия находится в тесте 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Мы предоставили учебные сценарии для адаптации контролируемого предварительно обученного Vit к FGVC и VTAB-1K с Snell-32, например:
# 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. Мы благодарим авторов за их код с открытым исходным кодом.