Repositori ini berisi implementasi resmi percobaan yang dilakukan
? Struktur repo:
efficient-attention : Basis kode mandiri kecil yang mengimplementasikan berbagai mekanisme perhatian yang efisien. Silakan lihat penggunaannya untuk lebih jelasnya.vit : CodeBase untuk Eksperimen Klasifikasi Gambar , yang diadaptasi darifairseq : Fork Modifikasi Fairseq untuk tugas bahasa, termasuk terjemahan mesin dan pemodelan bahasa autoregresif .main.sh : skrip bash untuk meluncurkan semua percobaan.-e True secara langsung diteruskan ke perintah pelatihan. Anda dapat meneruskan argumen khusus ke perintah pelatihan dengan menambahkannya setelah -e True . Untuk mengatur lingkungan, jalankan perintah berikut untuk menginstal dependensi yang diperlukan (direkomendasikan dalam lingkungan virtual):
# install packages
pip install -r requirements.txt
# install efficient-attention library
pip install -e efficient-attention
# OPTIONAL: install fairseq library for running language tasks
cd fairseq
python3 setup.py build develop
cd ..Lingkungan diuji dengan Python 3.8.10, Pytorch 1.12.0, dan CUDA 11.3 . Perhatikan juga Forks Fairseq kami memodifikasi beberapa file dalam basis kode asli; Menggunakan versi Fairseq yang lebih baru dapat menyebabkan konflik ketergantungan yang tidak terduga.
efficient-attention adalah basis kode mandiri kecil yang mengumpulkan beberapa mekanisme perhatian yang efisien.
add_attn_specific_args() dalam file python yang sesuai.argparse , ikuti cuplikan kode berikut: import argparse
from efficient_attention import AttentionFactory
# ...
parser = argparse . ArgumentParser ()
parser . add_argument ( '--attn-name' , default = 'softmax' , type = str , metavar = 'ATTN' ,
help = 'Name of attention model to use' )
# ...
temp_args , _ = parser . parse_known_args ()
# add attention-specific arguments to the parser
# struct_name: name of the inner namespace to store all attention-specific arguments
# prefix: prefix to prepend to all argument names
# for example, if prefix = encoder-attn, then for the argument --window-size
# we need to pass --encoder-attn-window-size
# this is useful to avoid argument name conflicts.
efficient_attention . AttentionFactory . add_attn_specific_args ( parser , temp_args . attn_name , struct_name = "attn_args" , prefix = "" )
# parse arguments to a namespace that supports nested attributes
args = parser . parse_args ( namespace = efficient_attention . NestedNamespace ())
# now we can access the attention-specific arguments via args.attn_args
print ( args . attn_args . window_size ) Di kelas torch.nn.Module , Anda dapat membuat modul perhatian yang efisien sebagai berikut:
# we might want to pass attention-specific arguments to the attention module
# along with other related arguments
attn_args = {
** vars ( args . attn_args ),
** {
'dim' : args . embed_dim ,
'num_heads' : args . num_heads ,
'qkv_bias' : args . qkv_bias ,
'attn_drop' : args . attn_drop_rate ,
'proj_drop' : args . drop_rate ,
}
}
self . attn = AttentionFactory . build_attention ( attn_name = attn_name , attn_args = attn_args )
# the module can then be used as a normal function as
x = self . attn ( x ) Kami mengikuti pengaturan yang mirip dengan Deit untuk pra-proses dataset Imagenet. Unduh gambar kereta imagenet dan val dan letakkan di dalam struktur direktori berikut sehingga dapat kompatibel dengan datasets.ImageFolder torchvision.imagefolder
/path/to/imagenet/
train/
class1/
img1.jpeg
class2/
img2.jpeg
val/
class1/
img3.jpeg
class2/
img4.jpeg
Perintah -perintah berikut digunakan untuk melatih dan mengevaluasi berbagai transformator penglihatan dengan LARA/EVA . Pelatihan diasumsikan dilakukan dengan 8 GPU.
Untuk menggunakan LARA/EVA dalam arsitektur Deit yang berbeda:
# LARA: DeiT-tiny-p8
bash main.sh -m evit_tiny_p8 -p < dir-of-imagenet-data > -g 8 -d imagenet -e TRUE --dist-eval --num-workers 16 --clip-grad 5.0 --warmup-epochs 10 --seed 1 --attn-name lara --mis-type mis-opt --proposal-gen pool-mixed --alpha-coeff 2.0 --num-landmarks 49
# LARA: DeiT-tiny-p16
bash main.sh -m evit_tiny_p16 -p < dir-of-imagenet-data > -g 8 -d imagenet -e TRUE --dist-eval --num-workers 16 --clip-grad 5.0 --warmup-epochs 10 --seed 1 --attn-name lara --mis-type mis-opt --proposal-gen pool-mixed --alpha-coeff 2.0 --num-landmarks 49
# LARA: DeiT-small-p16
bash main.sh -m evit_small_p16 -p < dir-of-imagenet-data > -g 8 -d imagenet -e TRUE --dist-eval --num-workers 16 --clip-grad 5.0 --warmup-epochs 10 --seed 1 --attn-name lara --mis-type mis-opt --proposal-gen pool-mixed --alpha-coeff 2.0 --num-landmarks 49
# EVA: DeiT-tiny-p8
bash main.sh -m evit_tiny_p8 -p < dir-of-imagenet-data > -g 8 -d imagenet -e TRUE --dist-eval --num-workers 16 --clip-grad 5.0 --warmup-epochs 10 --seed 1 --attn-name eva --num-landmarks 49 --adaptive-proj default --window-size 7 --attn-2d --use-rpe
# EVA: DeiT-tiny-p16
bash main.sh -m evit_tiny_p16 -p < dir-of-imagenet-data > -g 8 -d imagenet -e TRUE --dist-eval --num-workers 16 --clip-grad 5.0 --warmup-epochs 10 --seed 1 --attn-name eva --num-landmarks 49 --adaptive-proj default --window-size 7 --attn-2d --use-rpe
# EVA: DeiT-small-p16
bash main.sh -m evit_small_p16 -p < dir-of-imagenet-data > -g 8 -d imagenet -e TRUE --dist-eval --num-workers 16 --clip-grad 5.0 --warmup-epochs 10 --seed 1 --attn-name eva --num-landmarks 49 --adaptive-proj default --window-size 7 --attn-2d --use-rpe Untuk mengadaptasi LARA/EVA dalam arsitektur PVTV2:
# LARA Attention
bash main.sh -m pvt_medium2 -p < dir-of-imagenet-data > -g 8 -d imagenet -e TRUE --dist-eval --num-workers 16 --clip-grad 1.0 --drop-path-rate 0.3 --warmup-epochs 10 --seed 1 --attn-name lara --pool-module-type dense --mis-type mis-opt --proposal-gen pool-mixed --num-landmarks 49 --alpha-coeff 2.0 --repeated-aug
# EVA Attention
bash main.sh -m pvt_medium2 -p < dir-of-imagenet-data > -g 8 -d imagenet -e TRUE --dist-eval --num-workers 16 --clip-grad 5.0 --drop-path-rate 0.3 --warmup-epochs 10 --seed 1 --attn-name eva --num-landmarks 49 --adaptive-proj default --window-size 7 --attn-2d --use-rpe --repeated-augAtau, Anda mungkin ingin mencoba mekanisme perhatian lainnya:
# Softmax Attention
bash main.sh -m evit_tiny_p8 -d imagenet -e TRUE --dist-eval --num-workers 16 --clip-grad 5.0 --warmup-epochs 10 --seed 1 --attn-name softmax
# RFA/Performer
bash main.sh -m evit_tiny_p8 -d imagenet -e TRUE --dist-eval --num-workers 16 --clip-grad 5.0 --warmup-epochs 10 --seed 1 --attn-name performer --proj-method favorp --approx-attn-dim 64
# Local Attention
bash main.sh -m evit_tiny_p8 -d imagenet -e TRUE --dist-eval --num-workers 16 --clip-grad 5.0 --warmup-epochs 10 --seed 1 --attn-name local --window-size 7 --attn-2d --use-rpeKami menggunakan fairseq pra-pemrosesan standar untuk menyiapkan data untuk tugas bahasa.
WMT'14 EN-DE binarized;Wikitext-103 .-r <resume-ckpt-DIR> Menentukan direktori yang menyimpan pos pemeriksaan Anda selama pelatihan dan dapat digunakan untuk melanjutkan pelatihan.--encoder-attn- (untuk sisi-sisi) / --decoder-attn- (untuk sisi dekoder). Lihat contoh di bawah ini. # # LARA
CUDA_VISIBLE_DEVICES=0,1,2,3 bash main.sh -p < dir-of-your-bin-data > -d wmt -s lara_8 -g 4 -e TRUE --attn-name-encoder lara --encoder-attn-num-landmarks 8 --encoder-attn-proposal-gen adaptive-1d --encoder-attn-mis-type mis-opt
CUDA_VISIBLE_DEVICES=0,1,2,3 bash main.sh -p < dir-of-your-bin-data > -d wmt -s lara_16 -g 4 -e TRUE --attn-name-encoder lara --encoder-attn-num-landmarks 16 --encoder-attn-proposal-gen adaptive-1d --encoder-attn-mis-type mis-opt
CUDA_VISIBLE_DEVICES=0,1,2,3 bash main.sh -p < dir-of-your-bin-data > -d wmt -s lara_32 -g 4 -e TRUE --attn-name-encoder lara --encoder-attn-num-landmarks 32 --encoder-attn-proposal-gen adaptive-1d --encoder-attn-mis-type mis-opt
# # EVA
CUDA_VISIBLE_DEVICES=0,1,2,3 bash main.sh -p < dir-of-your-bin-data > -d wmt -s eva_8_8 -g 4 -e TRUE --attn-name-encoder eva --encoder-attn-window-size 8 --encoder-attn-num-landmarks 8 --encoder-attn-adaptive-proj no-ln --encoder-attn-use-t5-rpe --encoder-attn-overlap-window
CUDA_VISIBLE_DEVICES=0,1,2,3 bash main.sh -p < dir-of-your-bin-data > -d wmt -s eva_16_8 -g 4 -e TRUE --attn-name-encoder eva --encoder-attn-window-size 16 --encoder-attn-num-landmarks 8 --encoder-attn-adaptive-proj no-ln --encoder-attn-use-t5-rpe --encoder-attn-overlap-window
CUDA_VISIBLE_DEVICES=0,1,2,3 bash main.sh -p < dir-of-your-bin-data > -d wmt -s eva_32_8 -g 4 -e TRUE --attn-name-encoder eva --encoder-attn-window-size 32 --encoder-attn-num-landmarks 8 --encoder-attn-adaptive-proj no-ln --encoder-attn-use-t5-rpe --encoder-attn-overlap-window # Currently, LARA does not support causal masking yet.
# EVA on a 16-layer Transformer LM
CUDA_VISIBLE_DEVICES=0,1,2,3 bash main.sh -p < dir-of-your-bin-data > -m 16layers -d wikitext103 -s eva_128_8_16layers -g 4 -e TRUE --attn-name-decoder causal_eva --decoder-attn-window-size 128 --decoder-attn-causal --decoder-attn-adaptive-proj qk --decoder-attn-chunk-size 8 --decoder-attn-use-t5-rpe
# EVA on a 32-layer Transformer LM
CUDA_VISIBLE_DEVICES=0,1,2,3 bash main.sh -p < dir-of-your-bin-data > -m 32layers -d wikitext103 -s eva_128_8_32layers -g 4 -e TRUE --attn-name-decoder causal_eva --decoder-attn-window-size 128 --decoder-attn-causal --decoder-attn-adaptive-proj qk --decoder-attn-chunk-size 8 --decoder-attn-use-t5-rpe Untuk Generasi & Evaluasi, cukup lulus argumen -i true ketika memanggil main.sh untuk melakukan prosedur inferensi saja. Jalur pos pemeriksaan dapat ditentukan sebagai -c <your-ckpt-path> . Misalnya,
# Machine Translation
CUDA_VISIBLE_DEVICES=0 bash main.sh -i true -c < your-possibly-avg-checkpoint.pt > -p < dir-of-your-bin-data > -d wmt -g 1
# Autoregressive Language Modeling
CUDA_VISIBLE_DEVICES=0 bash main.sh -i true -c < your-checkpoint_last.pt > -p < dir-of-your-bin-data > -d wikitext103 -g 1 Kami juga menyediakan pos pemeriksaan model EVA terlatih di OneDrive untuk terjemahan mesin dan tugas pemodelan bahasa:
@inproceedings { zheng2023efficient ,
title = { Efficient Attention via Control Variates } ,
author = { Lin Zheng and Jianbo Yuan and Chong Wang and Lingpeng Kong } ,
booktitle = { International Conference on Learning Representations } ,
year = { 2023 } ,
url = { https://openreview.net/forum?id=G-uNfHKrj46 }
} @inproceedings { zheng2022linear ,
title = { Linear complexity randomized self-attention mechanism } ,
author = { Lin Zheng and Chong Wang and Lingpeng Kong } ,
booktitle = { International Conference on Machine Learning } ,
pages = { 27011--27041 } ,
year = { 2022 } ,
organization = { PMLR }
}