Esta es la implementación oficial de nuestro documento: expandir el ajuste disperso para el uso de baja memoria.
Proponemos un método llamado Snell (ajuste de análisis con ker nel ized l ora) para habilitar la afinación escasa con un uso de baja memoria. Snell descompone la matriz sintonizable para la escparación en dos matrices de bajo rango de bajo rango, ahorrando del costoso almacenamiento de la matriz completa original. Para mantener la efectividad del ajuste escaso con matrices de bajo rango, extendemos la descomposición de bajo rango desde una perspectiva del núcleo. Específicamente, aplicamos funciones de núcleo no lineales a la combinación de matriz completa y obtenemos un aumento en el rango de la matriz fusionada. El empleo de rangos más altos mejora la capacidad de SNELL para optimizar el modelo previamente capacitado para las tareas posteriores. Para reducir aún más el uso de la memoria en el ajuste escaso, presentamos un mecanismo de dispersión basado en la competencia, evitando el almacenamiento de índices de peso sintonizables. Extensos experimentos en múltiples tareas aguas abajo muestran que Snell alcanza el rendimiento de última generación con un bajo uso de memoria, extendiendo PEFT efectiva con un ajuste escaso a los modelos a gran escala.

Si encuentra útil este repositorio o nuestro artículo, ¡considere citarnos y mirarnos!
@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 : ejecute este archivo para el entrenamiento../scripts : scripts para adaptar modelos previamente capacitados a tareas aguas abajo con SNELL../lib : funciones auxiliares para IO, registros, capacitación y carga de datos../model : arquitecturas y métodos de columna vertebral para ajustar../engine.py : Funciones principales de entrenamiento y evaluación../data : almacenamiento de puntos de referencia FGVC y VTAB-1K.Clon este repositorio:
git clone https://github.com/ssfgunner/SNELL.git
cd SNELLCree un entorno virtual de conda y activelo:
conda create -n snell python=3.8 -y
conda activate snell Instale torch==1.12.1 y torchvision==0.13.1 con CUDA==11.3 :
conda install pytorch==1.12.1 torchvision==0.13.1 cudatoolkit=11.3 -c pytorchInstale otras dependencias:
pip install -r requirements.txt
FGVC: descargue los conjuntos de datos siguientes VPT.
VTAB-1K: Dado que el procesamiento de algunos conjuntos de datos en el punto de referencia VTAB original es complicado, recomendamos los conjuntos de datos VTAB-1K extraídos compartidos por SSF por conveniencia. (Tenga en cuenta que la licencia está en vTab Benchmark).
La estructura del archivo debe verse como:
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.pthHemos proporcionado scripts de capacitación para adaptar VIT supervisado supervisado a FGVC y VTAB-1K con SNELL-32, por ejemplo:
# 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.shPara otros modelos, proporcionamos scripts para ajustarlos en FGVC, por ejemplo:
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_stageNuestro código se modifica de VPT, SSF y SPT. Agradecemos a los autores por su código de código abierto.