fusion-bench 0.2.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fusion_bench/__init__.py +20 -0
- fusion_bench/__main__.py +4 -0
- fusion_bench/compat/__init__.py +0 -0
- fusion_bench/compat/method/__init__.py +109 -0
- fusion_bench/compat/method/base_algorithm.py +58 -0
- fusion_bench/compat/modelpool/AutoModelForSeq2SeqLM.py +34 -0
- fusion_bench/compat/modelpool/__init__.py +116 -0
- fusion_bench/compat/modelpool/base_pool.py +328 -0
- fusion_bench/compat/modelpool/huggingface_clip_vision.py +178 -0
- fusion_bench/compat/taskpool/__init__.py +95 -0
- fusion_bench/compat/taskpool/base_pool.py +111 -0
- fusion_bench/compat/taskpool/clip_image_classification.py +210 -0
- fusion_bench/compat/taskpool/flan_t5_glue_text_generation.py +175 -0
- fusion_bench/constants/__init__.py +2 -0
- fusion_bench/constants/paths.py +18 -0
- fusion_bench/dataset/__init__.py +29 -0
- fusion_bench/dataset/arc_agi/__init__.py +6 -0
- fusion_bench/dataset/arc_agi/arc.py +308 -0
- fusion_bench/dataset/arc_agi/arc_agi.py +365 -0
- fusion_bench/dataset/arc_agi/augmenters.py +1036 -0
- fusion_bench/dataset/arc_agi/messagers.py +1355 -0
- fusion_bench/dataset/arc_agi/np_cache.py +168 -0
- fusion_bench/dataset/arc_agi/preprocess.py +298 -0
- fusion_bench/dataset/arc_agi/representers.py +1019 -0
- fusion_bench/dataset/clip_dataset.py +71 -0
- fusion_bench/dataset/fer2013.py +12 -0
- fusion_bench/dataset/gpt2_glue.py +300 -0
- fusion_bench/dataset/gsm8k.py +60 -0
- fusion_bench/dataset/image_dataset.py +55 -0
- fusion_bench/dataset/imdb.py +11 -0
- fusion_bench/dataset/llama/__init__.py +1 -0
- fusion_bench/dataset/llama/alpaca.py +232 -0
- fusion_bench/dataset/llama/collate.py +120 -0
- fusion_bench/dataset/llama/metamathqa.py +50 -0
- fusion_bench/dataset/llama/openai.py +160 -0
- fusion_bench/dataset/llama/preference_700k.py +70 -0
- fusion_bench/dataset/llama/sharegpt.py +141 -0
- fusion_bench/dataset/llama/squad.py +125 -0
- fusion_bench/dataset/llama/stanford_shp.py +90 -0
- fusion_bench/dataset/llama/ultrachat.py +58 -0
- fusion_bench/dataset/llama/utils/__init__.py +0 -0
- fusion_bench/dataset/llama/wikitext.py +89 -0
- fusion_bench/dataset/nyuv2.py +119 -0
- fusion_bench/method/__init__.py +177 -0
- fusion_bench/method/ada_svd/__init__.py +2 -0
- fusion_bench/method/ada_svd/clip_vision.py +319 -0
- fusion_bench/method/adamerging/__init__.py +6 -0
- fusion_bench/method/adamerging/clip_layer_wise_adamerging.py +46 -0
- fusion_bench/method/adamerging/clip_task_wise_adamerging.py +187 -0
- fusion_bench/method/adamerging/entropy_loss.py +25 -0
- fusion_bench/method/adamerging/flan_t5_layer_wise_adamerging.py +332 -0
- fusion_bench/method/adamerging/gpt2_layer_wise_adamerging.py +351 -0
- fusion_bench/method/adamerging/layer_wise_adamerging.py +252 -0
- fusion_bench/method/adamerging/llama_adamerging.py +335 -0
- fusion_bench/method/adamerging/min_norm_solvers.py +227 -0
- fusion_bench/method/adamerging/task_wise_adamerging.py +174 -0
- fusion_bench/method/adamerging/utils.py +15 -0
- fusion_bench/method/analysis/__init__.py +2 -0
- fusion_bench/method/analysis/task_vector_cos_similarity.py +172 -0
- fusion_bench/method/analysis/task_vector_violin_plot.py +205 -0
- fusion_bench/method/base_algorithm.py +44 -0
- fusion_bench/method/classification/__init__.py +3 -0
- fusion_bench/method/classification/clip_finetune.py +444 -0
- fusion_bench/method/classification/continual_clip_finetune.py +297 -0
- fusion_bench/method/concrete_subspace/__init__.py +6 -0
- fusion_bench/method/concrete_subspace/clip_concrete_adamerging.py +595 -0
- fusion_bench/method/concrete_subspace/clip_concrete_task_arithmetic.py +263 -0
- fusion_bench/method/dare/__init__.py +4 -0
- fusion_bench/method/dare/simple_average.py +31 -0
- fusion_bench/method/dare/task_arithmetic.py +82 -0
- fusion_bench/method/dare/ties_merging.py +100 -0
- fusion_bench/method/dare/utils.py +87 -0
- fusion_bench/method/dawe/__init__.py +2 -0
- fusion_bench/method/dawe/dawe_for_clip.py +274 -0
- fusion_bench/method/dawe/warppers/__init__.py +13 -0
- fusion_bench/method/dawe/warppers/dawe_model.py +256 -0
- fusion_bench/method/depth_upscaling/__init__.py +3 -0
- fusion_bench/method/depth_upscaling/depth_upscaling.py +89 -0
- fusion_bench/method/depth_upscaling/depth_upscaling_for_llama.py +57 -0
- fusion_bench/method/dummy.py +35 -0
- fusion_bench/method/ensemble.py +98 -0
- fusion_bench/method/fisher_merging/__init__.py +4 -0
- fusion_bench/method/fisher_merging/clip_fisher_merging.py +191 -0
- fusion_bench/method/fisher_merging/fisher_merging.py +484 -0
- fusion_bench/method/fisher_merging/gpt2_fisher_merging.py +193 -0
- fusion_bench/method/linear/__init__.py +6 -0
- fusion_bench/method/linear/expo.py +118 -0
- fusion_bench/method/linear/linear_interpolation.py +60 -0
- fusion_bench/method/linear/llama_expo.py +229 -0
- fusion_bench/method/linear/simple_average_for_llama.py +54 -0
- fusion_bench/method/linear/task_arithmetic_for_llama.py +57 -0
- fusion_bench/method/lm_finetune/__init__.py +3 -0
- fusion_bench/method/lm_finetune/bradley_terry_rm.py +432 -0
- fusion_bench/method/lm_finetune/causal_lm_pretrain.py +7 -0
- fusion_bench/method/lm_finetune/fullfinetune_sft.py +375 -0
- fusion_bench/method/lm_finetune/peftfinetune_sft.py +370 -0
- fusion_bench/method/mixture_of_experts/__init__.py +7 -0
- fusion_bench/method/mixture_of_experts/mixtral_merging.py +112 -0
- fusion_bench/method/mixture_of_experts/mixtral_upcycling.py +329 -0
- fusion_bench/method/model_recombination.py +121 -0
- fusion_bench/method/opcm/__init__.py +4 -0
- fusion_bench/method/opcm/opcm.py +277 -0
- fusion_bench/method/opcm/task_arithmetic.py +115 -0
- fusion_bench/method/opcm/ties_merging.py +156 -0
- fusion_bench/method/opcm/utils.py +73 -0
- fusion_bench/method/opcm/weight_average.py +120 -0
- fusion_bench/method/pruning/__init__.py +5 -0
- fusion_bench/method/pruning/llama_magnitude_prune.py +202 -0
- fusion_bench/method/pruning/llama_random_prune.py +143 -0
- fusion_bench/method/pruning/llama_wanda_prune.py +359 -0
- fusion_bench/method/pruning/magnitude_diff_pruning.py +180 -0
- fusion_bench/method/pruning/prune_utils.py +165 -0
- fusion_bench/method/pruning/wanda_utils/__init__.py +7 -0
- fusion_bench/method/pruning/wanda_utils/ablate.py +188 -0
- fusion_bench/method/pruning/wanda_utils/data.py +135 -0
- fusion_bench/method/pruning/wanda_utils/eval.py +245 -0
- fusion_bench/method/pruning/wanda_utils/layerwrapper.py +61 -0
- fusion_bench/method/pruning/wanda_utils/prune.py +581 -0
- fusion_bench/method/pruning/wanda_utils/prune_opt.py +539 -0
- fusion_bench/method/pruning/wanda_utils/sparsegpt.py +165 -0
- fusion_bench/method/pwe_moe/__init__.py +5 -0
- fusion_bench/method/pwe_moe/clip_pwe_moe.py +315 -0
- fusion_bench/method/pwe_moe/module.py +316 -0
- fusion_bench/method/pwe_moe/phn/__init__.py +2 -0
- fusion_bench/method/pwe_moe/phn/solvers.py +195 -0
- fusion_bench/method/pwe_moe/utils.py +43 -0
- fusion_bench/method/rankone_moe/__init__.py +3 -0
- fusion_bench/method/rankone_moe/clip_rankone_moe.py +160 -0
- fusion_bench/method/rankone_moe/rankone_moe.py +249 -0
- fusion_bench/method/regmean/__init__.py +4 -0
- fusion_bench/method/regmean/clip_regmean.py +131 -0
- fusion_bench/method/regmean/gpt2_regmean.py +147 -0
- fusion_bench/method/regmean/regmean.py +375 -0
- fusion_bench/method/simple_average.py +112 -0
- fusion_bench/method/slerp/__init__.py +2 -0
- fusion_bench/method/slerp/slerp.py +101 -0
- fusion_bench/method/slerp/slerp_utils.py +107 -0
- fusion_bench/method/smile_upscaling/__init__.py +3 -0
- fusion_bench/method/smile_upscaling/singular_projection_merging.py +198 -0
- fusion_bench/method/smile_upscaling/smile_mistral_upscaling.py +331 -0
- fusion_bench/method/smile_upscaling/smile_upscaling.py +573 -0
- fusion_bench/method/sparse_we_moe/__init__.py +2 -0
- fusion_bench/method/sparse_we_moe/sparse_clip_we_moe.py +248 -0
- fusion_bench/method/sparse_we_moe/sparse_we_moe.py +301 -0
- fusion_bench/method/sparselo/__init__.py +2 -0
- fusion_bench/method/sparselo/sparselo.py +955 -0
- fusion_bench/method/surgery/__init__.py +1 -0
- fusion_bench/method/surgery/clip_layer_wise_adamerging_surgery.py +157 -0
- fusion_bench/method/tall_mask/__init__.py +0 -0
- fusion_bench/method/tall_mask/utils.py +234 -0
- fusion_bench/method/task_arithmetic/__init__.py +2 -0
- fusion_bench/method/task_arithmetic/task_arithmetic.py +151 -0
- fusion_bench/method/task_singular_vector/TSVC.py +16 -0
- fusion_bench/method/task_singular_vector/TSVM.py +63 -0
- fusion_bench/method/task_singular_vector/__init__.py +9 -0
- fusion_bench/method/task_singular_vector/utils/TSVC_utils.py +50 -0
- fusion_bench/method/task_singular_vector/utils/TSVM_utils.py +640 -0
- fusion_bench/method/task_singular_vector/utils/__init__.py +7 -0
- fusion_bench/method/ties_merging/__init__.py +2 -0
- fusion_bench/method/ties_merging/ties_merging.py +117 -0
- fusion_bench/method/ties_merging/ties_merging_utils.py +331 -0
- fusion_bench/method/trust_region/__init__.py +2 -0
- fusion_bench/method/trust_region/clip_task_arithmetic.py +205 -0
- fusion_bench/method/trust_region/utils.py +58 -0
- fusion_bench/method/we_moe/__init__.py +2 -0
- fusion_bench/method/we_moe/clip_we_moe.py +161 -0
- fusion_bench/method/we_moe/we_moe.py +247 -0
- fusion_bench/method/weighted_average/__init__.py +3 -0
- fusion_bench/method/weighted_average/llama.py +113 -0
- fusion_bench/method/weighted_average/weighted_average.py +102 -0
- fusion_bench/metrics/__init__.py +0 -0
- fusion_bench/metrics/continual_learning/backward_transfer.py +22 -0
- fusion_bench/metrics/nyuv2/__init__.py +11 -0
- fusion_bench/metrics/nyuv2/depth.py +45 -0
- fusion_bench/metrics/nyuv2/loss.py +31 -0
- fusion_bench/metrics/nyuv2/noise.py +16 -0
- fusion_bench/metrics/nyuv2/normal.py +48 -0
- fusion_bench/metrics/nyuv2/segmentation.py +43 -0
- fusion_bench/metrics/text_to_image_generation/__init__.py +9 -0
- fusion_bench/metrics/text_to_image_generation/aesthetic_scorer.py +123 -0
- fusion_bench/metrics/text_to_image_generation/compressibility.py +49 -0
- fusion_bench/metrics/text_to_image_generation/pickscore_scorer.py +95 -0
- fusion_bench/mixins/__init__.py +28 -0
- fusion_bench/mixins/clip_classification.py +252 -0
- fusion_bench/mixins/fabric_training.py +320 -0
- fusion_bench/mixins/lightning_fabric.py +174 -0
- fusion_bench/mixins/optim/__init__.py +0 -0
- fusion_bench/mixins/optim/adamw_with_warmup.py +42 -0
- fusion_bench/mixins/rich_live.py +21 -0
- fusion_bench/mixins/serialization.py +132 -0
- fusion_bench/mixins/simple_profiler.py +79 -0
- fusion_bench/modelpool/PeftModelForSeq2SeqLM.py +49 -0
- fusion_bench/modelpool/__init__.py +42 -0
- fusion_bench/modelpool/base_pool.py +268 -0
- fusion_bench/modelpool/causal_lm/__init__.py +2 -0
- fusion_bench/modelpool/causal_lm/causal_lm.py +139 -0
- fusion_bench/modelpool/clip_vision/__init__.py +1 -0
- fusion_bench/modelpool/clip_vision/modelpool.py +145 -0
- fusion_bench/modelpool/huggingface_automodel.py +20 -0
- fusion_bench/modelpool/huggingface_gpt2_classification.py +63 -0
- fusion_bench/modelpool/nyuv2_modelpool.py +40 -0
- fusion_bench/modelpool/seq2seq_lm/__init__.py +2 -0
- fusion_bench/modelpool/seq2seq_lm/modelpool.py +65 -0
- fusion_bench/modelpool/seq_classification_lm/__init__.py +2 -0
- fusion_bench/modelpool/seq_classification_lm/reward_model.py +15 -0
- fusion_bench/modelpool/seq_classification_lm/seq_classification_lm.py +98 -0
- fusion_bench/models/__init__.py +3 -0
- fusion_bench/models/chat_templates/__init__.py +1 -0
- fusion_bench/models/chat_templates/llama_3_Instruct.py +1 -0
- fusion_bench/models/chat_templates/load_tokenizer.py +43 -0
- fusion_bench/models/hf_clip.py +199 -0
- fusion_bench/models/linearized/__init__.py +0 -0
- fusion_bench/models/linearized/linearized_model_utils.py +91 -0
- fusion_bench/models/linearized/vision_model.py +122 -0
- fusion_bench/models/llama/__init__.py +16 -0
- fusion_bench/models/llama/model_utils/__init__.py +0 -0
- fusion_bench/models/llama/model_utils/embedding.py +87 -0
- fusion_bench/models/llama/model_utils/liger_kernel.py +86 -0
- fusion_bench/models/llama/model_utils/misc.py +112 -0
- fusion_bench/models/llama/model_utils/mod.py +52 -0
- fusion_bench/models/llama/model_utils/visual.py +241 -0
- fusion_bench/models/llama/patcher.py +78 -0
- fusion_bench/models/llama/tokenizer_loader.py +153 -0
- fusion_bench/models/masks/__init__.py +2 -0
- fusion_bench/models/masks/mask_model.py +160 -0
- fusion_bench/models/modeling_losparse_llama/__init__.py +4 -0
- fusion_bench/models/modeling_losparse_llama/configuration_losparse_llama.py +205 -0
- fusion_bench/models/modeling_losparse_llama/losparse_linear.py +67 -0
- fusion_bench/models/modeling_losparse_llama/modeling_losparse_llama.py +1825 -0
- fusion_bench/models/modeling_losparse_llama/register.py +8 -0
- fusion_bench/models/modeling_losparse_llama/utils.py +60 -0
- fusion_bench/models/modeling_smile_mistral/__init__.py +48 -0
- fusion_bench/models/modeling_smile_mistral/configuration_smile_mistral.py +21 -0
- fusion_bench/models/modeling_smile_mistral/modeling_smile_mistral.py +1034 -0
- fusion_bench/models/modeling_smile_mistral/register.py +8 -0
- fusion_bench/models/nyuv2/__init__.py +0 -0
- fusion_bench/models/nyuv2/aspp.py +82 -0
- fusion_bench/models/nyuv2/lightning_module.py +176 -0
- fusion_bench/models/nyuv2/resnet.py +405 -0
- fusion_bench/models/nyuv2/resnet_dilated.py +99 -0
- fusion_bench/models/parameter_dict.py +75 -0
- fusion_bench/models/rankone_moe.py +410 -0
- fusion_bench/models/separate_io.py +105 -0
- fusion_bench/models/smile_moe/__init__.py +0 -0
- fusion_bench/models/smile_moe/linear.py +256 -0
- fusion_bench/models/sparse_we_moe.py +459 -0
- fusion_bench/models/surgery/__init__.py +1 -0
- fusion_bench/models/surgery/surgerymodelwrapper.py +158 -0
- fusion_bench/models/utils.py +80 -0
- fusion_bench/models/we_moe.py +247 -0
- fusion_bench/models/wrappers/__init__.py +0 -0
- fusion_bench/models/wrappers/ensemble.py +183 -0
- fusion_bench/models/wrappers/layer_wise_fusion.py +336 -0
- fusion_bench/models/wrappers/task_wise_fusion.py +249 -0
- fusion_bench/optim/__init__.py +2 -0
- fusion_bench/optim/exception.py +47 -0
- fusion_bench/optim/lr_scheduler/__init__.py +1 -0
- fusion_bench/optim/lr_scheduler/linear_warmup.py +222 -0
- fusion_bench/optim/lr_scheduler/utils/__init__.py +1 -0
- fusion_bench/optim/lr_scheduler/utils/visualization.py +119 -0
- fusion_bench/optim/mezo.py +118 -0
- fusion_bench/programs/__init__.py +20 -0
- fusion_bench/programs/base_program.py +9 -0
- fusion_bench/programs/fabric_fusion_program.py +299 -0
- fusion_bench/scripts/__init__.py +0 -0
- fusion_bench/scripts/cli.py +43 -0
- fusion_bench/scripts/clip/__init__.py +0 -0
- fusion_bench/scripts/clip/convert_checkpoint.py +39 -0
- fusion_bench/scripts/imgui.py +218 -0
- fusion_bench/scripts/nyuv2_mtl_train.py +137 -0
- fusion_bench/scripts/webui.py +405 -0
- fusion_bench/taskpool/__init__.py +39 -0
- fusion_bench/taskpool/base_pool.py +35 -0
- fusion_bench/taskpool/clip_vision/__init__.py +4 -0
- fusion_bench/taskpool/clip_vision/clip_rankone_moe_taskpool.py +112 -0
- fusion_bench/taskpool/clip_vision/clip_sparse_wemoe_taskpool.py +120 -0
- fusion_bench/taskpool/clip_vision/taskpool.py +392 -0
- fusion_bench/taskpool/dummy.py +58 -0
- fusion_bench/taskpool/gpt2_text_classification.py +149 -0
- fusion_bench/taskpool/llama/__init__.py +1 -0
- fusion_bench/taskpool/llama/reward_model.py +157 -0
- fusion_bench/taskpool/llama/test_generation.py +185 -0
- fusion_bench/taskpool/nyuv2_taskpool.py +65 -0
- fusion_bench/tasks/__init__.py +2 -0
- fusion_bench/tasks/base_task.py +18 -0
- fusion_bench/tasks/classification.py +75 -0
- fusion_bench/tasks/clip_classification/__init__.py +183 -0
- fusion_bench/tasks/clip_classification/cifar10.py +33 -0
- fusion_bench/tasks/clip_classification/cifar100.py +146 -0
- fusion_bench/tasks/clip_classification/clip_dataset.py +1 -0
- fusion_bench/tasks/clip_classification/cub_200_2011.py +208 -0
- fusion_bench/tasks/clip_classification/dtd.py +60 -0
- fusion_bench/tasks/clip_classification/emnist_letters.py +31 -0
- fusion_bench/tasks/clip_classification/emnist_mnist.py +5 -0
- fusion_bench/tasks/clip_classification/eurosat.py +18 -0
- fusion_bench/tasks/clip_classification/fashion_mnist.py +18 -0
- fusion_bench/tasks/clip_classification/fer2013.py +18 -0
- fusion_bench/tasks/clip_classification/flower102.py +106 -0
- fusion_bench/tasks/clip_classification/food101.py +105 -0
- fusion_bench/tasks/clip_classification/gtsrb.py +51 -0
- fusion_bench/tasks/clip_classification/imagenet.py +2103 -0
- fusion_bench/tasks/clip_classification/kmnist.py +17 -0
- fusion_bench/tasks/clip_classification/mnist.py +5 -0
- fusion_bench/tasks/clip_classification/mongo_leaf_disease.py +19 -0
- fusion_bench/tasks/clip_classification/oxford_iiit_pet.py +41 -0
- fusion_bench/tasks/clip_classification/pcam.py +5 -0
- fusion_bench/tasks/clip_classification/rendered_sst2.py +3 -0
- fusion_bench/tasks/clip_classification/resisc45.py +68 -0
- fusion_bench/tasks/clip_classification/stanford_cars.py +209 -0
- fusion_bench/tasks/clip_classification/stl10.py +17 -0
- fusion_bench/tasks/clip_classification/sun397.py +404 -0
- fusion_bench/tasks/clip_classification/svhn.py +5 -0
- fusion_bench/tasks/clip_classification/tiny_imagenet.py +208 -0
- fusion_bench/tasks/flan_t5_text_generation/__init__.py +0 -0
- fusion_bench/tasks/flan_t5_text_generation/datasets_preprocess.py +71 -0
- fusion_bench/tasks/flan_t5_text_generation/glue_evaluation.py +132 -0
- fusion_bench/tasks/flan_t5_text_generation/glue_load_dataset.py +64 -0
- fusion_bench/tasks/flan_t5_text_generation/glue_preprocessors.py +379 -0
- fusion_bench/tasks/flan_t5_text_generation/glue_prompt_templates.py +52 -0
- fusion_bench/utils/__init__.py +14 -0
- fusion_bench/utils/auto.py +31 -0
- fusion_bench/utils/cache_utils.py +58 -0
- fusion_bench/utils/data.py +165 -0
- fusion_bench/utils/devices.py +231 -0
- fusion_bench/utils/dict.py +43 -0
- fusion_bench/utils/dtype.py +146 -0
- fusion_bench/utils/expr.py +90 -0
- fusion_bench/utils/fabric.py +17 -0
- fusion_bench/utils/functools.py +37 -0
- fusion_bench/utils/hydra_utils.py +28 -0
- fusion_bench/utils/instantiate.py +450 -0
- fusion_bench/utils/json.py +93 -0
- fusion_bench/utils/lazy_imports.py +74 -0
- fusion_bench/utils/misc.py +18 -0
- fusion_bench/utils/packages.py +84 -0
- fusion_bench/utils/parameters.py +323 -0
- fusion_bench/utils/path.py +22 -0
- fusion_bench/utils/plot/__init__.py +0 -0
- fusion_bench/utils/plot/color_data.py +1726 -0
- fusion_bench/utils/plot/token.py +52 -0
- fusion_bench/utils/plot/token_notebook.py +127 -0
- fusion_bench/utils/pylogger.py +55 -0
- fusion_bench/utils/rich_utils.py +201 -0
- fusion_bench/utils/set.py +8 -0
- fusion_bench/utils/state_dict_arithmetic.py +297 -0
- fusion_bench/utils/strenum/__init__.py +326 -0
- fusion_bench/utils/strenum/_name_mangler.py +127 -0
- fusion_bench/utils/strenum/_version.py +556 -0
- fusion_bench/utils/tensorboard.py +51 -0
- fusion_bench/utils/timer.py +49 -0
- fusion_bench/utils/type.py +34 -0
- fusion_bench-0.2.9.dist-info/LICENSE +21 -0
- fusion_bench-0.2.9.dist-info/METADATA +258 -0
- fusion_bench-0.2.9.dist-info/RECORD +727 -0
- fusion_bench-0.2.9.dist-info/WHEEL +5 -0
- fusion_bench-0.2.9.dist-info/entry_points.txt +3 -0
- fusion_bench-0.2.9.dist-info/top_level.txt +1 -0
- fusion_bench_config/README.md +12 -0
- fusion_bench_config/clip-vit-base-patch32_robustness_corrupted.yaml +23 -0
- fusion_bench_config/dataset/image_classification/README.md +6 -0
- fusion_bench_config/dataset/image_classification/test/TALL14.yaml +20 -0
- fusion_bench_config/dataset/image_classification/test/TALL20.yaml +28 -0
- fusion_bench_config/dataset/image_classification/test/cifar10.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/cifar100.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/cub-200-2011.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/dtd.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/emnist_letters.yaml +5 -0
- fusion_bench_config/dataset/image_classification/test/emnist_mnist.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/eurosat.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/fashion_mnist.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/fer2013.yaml +3 -0
- fusion_bench_config/dataset/image_classification/test/food101.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/gtsrb.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/kmnist.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/mango-leaf-disease.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/mnist.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/oxford-iiit-pet.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/oxford_flowers102.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/pcam.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/rendered-sst2.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/resisc45.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/stanford-cars.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/stl10.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/sun397.yaml +4 -0
- fusion_bench_config/dataset/image_classification/test/svhn.yaml +6 -0
- fusion_bench_config/dataset/image_classification/test/the_eight_tasks.yaml +9 -0
- fusion_bench_config/dataset/image_classification/test/tiny-imagenet.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/TALL14.yaml +20 -0
- fusion_bench_config/dataset/image_classification/train/TALL20.yaml +28 -0
- fusion_bench_config/dataset/image_classification/train/cifar10.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/cifar100.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/cub-200-2011.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/dtd.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/emnist_letters.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/emnist_mnist.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/eurosat.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/fashion_mnist.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/fer2013.yaml +3 -0
- fusion_bench_config/dataset/image_classification/train/food101.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/gtsrb.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/kmnist.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/mango-leaf-disease.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/mnist.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/oxford-iiit-pet.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/oxford_flowers102.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/pcam.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/rendered-sst2.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/resisc45.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/stanford-cars.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/stl10.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/sun397.yaml +4 -0
- fusion_bench_config/dataset/image_classification/train/svhn.yaml +6 -0
- fusion_bench_config/dataset/image_classification/train/the_eight_tasks.yaml +9 -0
- fusion_bench_config/dataset/image_classification/train/tiny-imagenet.yaml +4 -0
- fusion_bench_config/dataset/image_classification/val/dtd.yaml +10 -0
- fusion_bench_config/dataset/image_classification/val/eurosat.yaml +10 -0
- fusion_bench_config/dataset/image_classification/val/gtsrb.yaml +10 -0
- fusion_bench_config/dataset/image_classification/val/mnist.yaml +10 -0
- fusion_bench_config/dataset/image_classification/val/resisc45.yaml +10 -0
- fusion_bench_config/dataset/image_classification/val/stanford-cars.yaml +10 -0
- fusion_bench_config/dataset/image_classification/val/sun397.yaml +10 -0
- fusion_bench_config/dataset/image_classification/val/svhn.yaml +12 -0
- fusion_bench_config/dataset/image_classification/val/the_eight_tasks.yaml +9 -0
- fusion_bench_config/dataset/llm_sft/alpaca_cleaned.yaml +6 -0
- fusion_bench_config/dataset/llm_sft/ultrachat_200k.yaml +3 -0
- fusion_bench_config/dataset/question_answering/search_qa.yaml +6 -0
- fusion_bench_config/dataset/question_answering/test/search_qa.yaml +7 -0
- fusion_bench_config/dataset/question_answering/train/MetaMathQA.yaml +4 -0
- fusion_bench_config/dataset/question_answering/train/search_qa.yaml +7 -0
- fusion_bench_config/dataset/question_answering/val/search_qa.yaml +7 -0
- fusion_bench_config/dataset/summarization/test/xsum.yaml +4 -0
- fusion_bench_config/dataset/summarization/train/xsum.yaml +4 -0
- fusion_bench_config/dataset/summarization/val/xsum.yaml +4 -0
- fusion_bench_config/dataset/summarization/xsum.yaml +3 -0
- fusion_bench_config/dataset/text_generation/test/gsm-hard.yaml +4 -0
- fusion_bench_config/dataset/text_generation/test/gsm8k.yaml +5 -0
- fusion_bench_config/dataset/text_generation/test/gsm8k_question_label.yaml +3 -0
- fusion_bench_config/dataset/text_generation/train/CodeAlpaca-20k.yaml +4 -0
- fusion_bench_config/dataset/text_generation/train/gsm8k.yaml +5 -0
- fusion_bench_config/dataset/text_generation/train/gsm8k_question_label.yaml +3 -0
- fusion_bench_config/fabric/auto.yaml +16 -0
- fusion_bench_config/fabric/llama_ddp.yaml +18 -0
- fusion_bench_config/fabric/llama_fsdp.yaml +16 -0
- fusion_bench_config/fabric/llama_peft_fsdp.yaml +16 -0
- fusion_bench_config/fabric/loggers/csv_logger.yaml +11 -0
- fusion_bench_config/fabric/loggers/tensorboard_logger.yaml +11 -0
- fusion_bench_config/fabric/loggers/wandb_logger.yaml +2 -0
- fusion_bench_config/fabric/strategy/deepspeed.yaml +10 -0
- fusion_bench_config/fabric/strategy/llama_fsdp.yaml +8 -0
- fusion_bench_config/fabric/strategy/llama_peft_fsdp.yaml +9 -0
- fusion_bench_config/fabric_model_fusion.yaml +20 -0
- fusion_bench_config/hydra/default.yaml +8 -0
- fusion_bench_config/hydra/help/fusion_bench_help.yaml +47 -0
- fusion_bench_config/hydra/job_logging/rich_logging.yaml +20 -0
- fusion_bench_config/llama_full_finetune.yaml +19 -0
- fusion_bench_config/llama_magnitude_pruning.yaml +16 -0
- fusion_bench_config/llama_model_fusion.yaml +17 -0
- fusion_bench_config/method/ada_svd/clip_vision.yaml +9 -0
- fusion_bench_config/method/adamerging/clip.yaml +23 -0
- fusion_bench_config/method/adamerging/layer_wise_flan_t5.yaml +23 -0
- fusion_bench_config/method/adamerging/layer_wise_gpt2.yaml +23 -0
- fusion_bench_config/method/adamerging/llama_sft.yaml +33 -0
- fusion_bench_config/method/adamerging.yaml +23 -0
- fusion_bench_config/method/analysis/task_vector_cos_similarity.yaml +6 -0
- fusion_bench_config/method/analysis/task_vector_violin_plot.yaml +6 -0
- fusion_bench_config/method/classification/clip_continual_finetune.yaml +28 -0
- fusion_bench_config/method/classification/clip_finetune.yaml +26 -0
- fusion_bench_config/method/clip_finetune.yaml +26 -0
- fusion_bench_config/method/concrete_subspace/clip_concrete_layer_wise_adamerging.yaml +27 -0
- fusion_bench_config/method/concrete_subspace/clip_concrete_task_arithmetic.yaml +25 -0
- fusion_bench_config/method/concrete_subspace/clip_concrete_task_wise_adamerging.yaml +27 -0
- fusion_bench_config/method/dare/simple_average.yaml +5 -0
- fusion_bench_config/method/dare/task_arithmetic.yaml +6 -0
- fusion_bench_config/method/dare/ties_merging.yaml +15 -0
- fusion_bench_config/method/dawe/dawe_for_clip.yaml +32 -0
- fusion_bench_config/method/depth_upscaling.yaml +5 -0
- fusion_bench_config/method/dummy.yaml +1 -0
- fusion_bench_config/method/ensemble/max_model_predictor.yaml +1 -0
- fusion_bench_config/method/ensemble/simple_ensemble.yaml +2 -0
- fusion_bench_config/method/ensemble/weighted_ensemble.yaml +6 -0
- fusion_bench_config/method/fisher_merging/clip_fisher_merging.yaml +13 -0
- fusion_bench_config/method/fisher_merging/fisher_merging.yaml +9 -0
- fusion_bench_config/method/fisher_merging/gpt2_fisher_merging.yaml +12 -0
- fusion_bench_config/method/linear/expo.yaml +8 -0
- fusion_bench_config/method/linear/linear_interpolation.yaml +3 -0
- fusion_bench_config/method/linear/llama_expo.yaml +19 -0
- fusion_bench_config/method/linear/llama_expo_with_dare.yaml +19 -0
- fusion_bench_config/method/linear/simple_average_for_llama.yaml +5 -0
- fusion_bench_config/method/linear/task_arithmetic_for_llama.yaml +4 -0
- fusion_bench_config/method/linear/weighted_average.yaml +6 -0
- fusion_bench_config/method/linear/weighted_average_for_llama.yaml +12 -0
- fusion_bench_config/method/lm_finetune/bradley_terry_rm.yaml +47 -0
- fusion_bench_config/method/lm_finetune/fullfinetune_sft.yaml +47 -0
- fusion_bench_config/method/lm_finetune/peftfinetune_sft.yaml +63 -0
- fusion_bench_config/method/mixtral_moe_merging.yaml +4 -0
- fusion_bench_config/method/mixtral_moe_upscaling.yaml +7 -0
- fusion_bench_config/method/model_recombination.yaml +4 -0
- fusion_bench_config/method/opcm/opcm.yaml +12 -0
- fusion_bench_config/method/opcm/task_arithmetic.yaml +12 -0
- fusion_bench_config/method/opcm/ties_merging.yaml +18 -0
- fusion_bench_config/method/opcm/weight_average.yaml +10 -0
- fusion_bench_config/method/pruning/llama_magnitude_pruning.yaml +14 -0
- fusion_bench_config/method/pruning/llama_random_pruning.yaml +9 -0
- fusion_bench_config/method/pruning/llama_wanda_pruning.yaml +16 -0
- fusion_bench_config/method/pruning/magnitude_diff_pruning.yaml +5 -0
- fusion_bench_config/method/pwe_moe_ls_for_clip.yaml +22 -0
- fusion_bench_config/method/rankone_moe/rankone_moe.yaml +26 -0
- fusion_bench_config/method/regmean/clip_regmean.yaml +11 -0
- fusion_bench_config/method/regmean/gpt2_regmean.yaml +12 -0
- fusion_bench_config/method/regmean/regmean.yaml +4 -0
- fusion_bench_config/method/simple_average.yaml +1 -0
- fusion_bench_config/method/slerp/slerp.yaml +6 -0
- fusion_bench_config/method/smile_upscaling/singular_projection_merging.yaml +8 -0
- fusion_bench_config/method/smile_upscaling/smile_mistral_upscaling.yaml +10 -0
- fusion_bench_config/method/smile_upscaling/smile_upscaling.yaml +14 -0
- fusion_bench_config/method/sparselo_pruning/llama_iterative_sparselo.yaml +20 -0
- fusion_bench_config/method/sparselo_pruning/llama_pcp_sparselo.yaml +20 -0
- fusion_bench_config/method/sparselo_pruning/llama_sparselo.yaml +19 -0
- fusion_bench_config/method/surgery/adamerging_surgery.yaml +27 -0
- fusion_bench_config/method/task_arithmetic.yaml +2 -0
- fusion_bench_config/method/task_singular_vector/TaskSingularVectorMerging.yaml +2 -0
- fusion_bench_config/method/ties_merging.yaml +8 -0
- fusion_bench_config/method/trust_region/clip_task_arithmetic.yaml +7 -0
- fusion_bench_config/method/wemoe/sparse_weight_ensembling_moe.yaml +39 -0
- fusion_bench_config/method/wemoe/weight_ensembling_moe.yaml +20 -0
- fusion_bench_config/model/clip-vit/README.md +38 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_TALL14.yaml +22 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_TALL20.yaml +29 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_cifar10.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_cifar100.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_dtd.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_eight_tasks.yaml +10 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_emnist_letters.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_eurosat.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_fashion_mnist.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_fer2013.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_food101.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_gtsrb.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_kmnist.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_mnist.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_oxford-iiit-pet.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_oxford_flowers102.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_pcam.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_rendered-sst2.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_resisc45.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_stanford-cars.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_stl10.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_sun397.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch16_svhn.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_TALL14.yaml +22 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_TALL20.yaml +29 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_cifar10.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_cifar100.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_dtd.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_eight_tasks.yaml +11 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_emnist_letters.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_eurosat.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_fashion_mnist.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_fer2013.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_food101.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_gtsrb.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_kmnist.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_mnist.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_oxford-iiit-pet.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_oxford_flowers102.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_pcam.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_rendered-sst2.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_resisc45.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_stanford-cars.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_stl10.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_sun397.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-base-patch32_svhn.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_TALL14.yaml +22 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_TALL20.yaml +29 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_cifar10.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_cifar100.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_dtd.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_eight_tasks.yaml +10 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_emnist_letters.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_eurosat.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_fashion_mnist.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_fer2013.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_food101.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_gtsrb.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_kmnist.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_mnist.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_oxford-iiit-pet.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_oxford_flowers102.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_pcam.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_rendered-sst2.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_resisc45.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_stanford-cars.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_stl10.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_sun397.yaml +1 -0
- fusion_bench_config/model/clip-vit/clip-vit-large-patch14_svhn.yaml +1 -0
- fusion_bench_config/model/clip-vit/download_TALL20_models.sh +6 -0
- fusion_bench_config/model/clip-vit/generate_vit_model_config.sh +23 -0
- fusion_bench_config/model/flan-t5/flan-t5-base.yaml +3 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-cola.yaml +3 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-cola_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-mnli.yaml +3 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-mnli_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-mrpc.yaml +3 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-mrpc_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-qnli.yaml +3 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-qnli_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-qqp.yaml +3 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-qqp_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-rte.yaml +3 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-rte_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-sst2.yaml +3 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-sst2_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-stsb.yaml +3 -0
- fusion_bench_config/model/flan-t5/flan-t5-base_glue-stsb_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-large.yaml +3 -0
- fusion_bench_config/model/flan-t5/flan-t5-large_glue-cola_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-large_glue-mnli_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-large_glue-mrpc_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-large_glue-qnli_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-large_glue-qqp_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-large_glue-rte_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-large_glue-sst2_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/flan-t5-large_glue-stsb_lora-16.yaml +4 -0
- fusion_bench_config/model/flan-t5/generate_flan-t5.sh +38 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/_template.yaml +12 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch16_TA8.yaml +8 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch16_TA8_lora.yaml +53 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch16_TA8_model_only.yaml +6 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch16_TALL14.yaml +11 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch16_TALL14_model_only.yaml +9 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch16_TALL20.yaml +11 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch16_TALL20_model_only.yaml +9 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch16_individual.yaml +19 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch16_individual_lora.yaml +14 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_TA8.yaml +5 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_TA8_control_task.yaml +24 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_TA8_model_only.yaml +3 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_TALL14.yaml +8 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_TALL14_model_only.yaml +6 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_TALL20.yaml +8 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_TALL20_model_only.yaml +6 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_generalization_exp1.yaml +24 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_generalization_exp2.yaml +24 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_individual.yaml +13 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_mtl.yaml +5 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_robustness_clean.yaml +18 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_robustness_corrupted.yaml +29 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_single_finetuned.yaml +5 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_single_task_projection.yaml +15 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_svhn_and_mnist.yaml +6 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-base-patch32_two_tasks_control_task.yaml +18 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-large-patch14_TA8.yaml +8 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-large-patch14_TA8_model_only.yaml +6 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-large-patch14_TALL14.yaml +11 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-large-patch14_TALL14_model_only.yaml +9 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-large-patch14_TALL20.yaml +11 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-large-patch14_TALL20_model_only.yaml +9 -0
- fusion_bench_config/modelpool/CLIPVisionModelPool/clip-vit-large-patch14_individual.yaml +19 -0
- fusion_bench_config/modelpool/CausalLMPool/llama_alpaca_cleaned.yaml +21 -0
- fusion_bench_config/modelpool/CausalLMPool/llama_codealpaca.yaml +21 -0
- fusion_bench_config/modelpool/CausalLMPool/llama_for_causallm.yaml +20 -0
- fusion_bench_config/modelpool/CausalLMPool/llama_metamathqa.yaml +19 -0
- fusion_bench_config/modelpool/CausalLMPool/llama_ultrachat.yaml +18 -0
- fusion_bench_config/modelpool/CausalLMPool/simle_mixtral_exp_v4.yaml +21 -0
- fusion_bench_config/modelpool/CausalLMPool/single_llama_model.yaml +17 -0
- fusion_bench_config/modelpool/Seq2SeqLMPool/_template.yaml +8 -0
- fusion_bench_config/modelpool/Seq2SeqLMPool/flan-t5-base_glue.yaml +13 -0
- fusion_bench_config/modelpool/Seq2SeqLMPool/flan-t5-base_glue_lora16.yaml +41 -0
- fusion_bench_config/modelpool/Seq2SeqLMPool/flan-t5-base_glue_lora16_tta.yaml +68 -0
- fusion_bench_config/modelpool/Seq2SeqLMPool/flan-t5-base_individual.yaml +7 -0
- fusion_bench_config/modelpool/Seq2SeqLMPool/flan-t5-large_glue_lora16.yaml +45 -0
- fusion_bench_config/modelpool/SeqenceClassificationModelPool/llama_preference700k.yaml +23 -0
- fusion_bench_config/modelpool/SeqenceClassificationModelPool/single_reward_model.yaml +14 -0
- fusion_bench_config/modelpool/automodelpool.yaml +12 -0
- fusion_bench_config/modelpool/gpt-2_glue.yaml +64 -0
- fusion_bench_config/modelpool/mixtral_moe_merging.yaml +14 -0
- fusion_bench_config/modelpool/mixtral_moe_upscaling.yaml +6 -0
- fusion_bench_config/modelpool/nyuv2_modelpool.yaml +26 -0
- fusion_bench_config/modelpool/smile_mistral_exp_v1.yaml +9 -0
- fusion_bench_config/modelpool/smile_mistral_exp_v2.yaml +9 -0
- fusion_bench_config/modelpool/smile_mistral_exp_v3.yaml +9 -0
- fusion_bench_config/modelpool/smile_mistral_exp_v4.yaml +13 -0
- fusion_bench_config/nyuv2_config.yaml +17 -0
- fusion_bench_config/nyuv2_mtl_train.yaml +32 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/_template.yaml +31 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-base-patch32_robustness_corrupted.yaml +27 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-classification_TA8.yaml +11 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-classification_TA8_B16.yaml +31 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-classification_TA8_L14.yaml +12 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-classification_TA8_val.yaml +12 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-classification_TA8_with_control_task.yaml +12 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-classification_TALL14.yaml +19 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-classification_TALL20.yaml +26 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_cifar10.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_cifar100.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_dtd.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_emnist_letters.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_eurosat.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_fashion_mnist.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_fer2013.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_food101.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_gtsrb.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_kmnist.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_mnist.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_oxford-iiit-pet.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_oxford_flowers102.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_oxford_flowers102_val.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_pcam.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_rendered-sst2.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_resisc45.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_stanford-cars.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_stl10.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_sun397.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip-vit-single-task_svhn.yaml +3 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip_rankone_wemoe_clip-vit-classification_TA8.yaml +18 -0
- fusion_bench_config/taskpool/CLIPVisionModelTaskPool/clip_sparse_wemoe_clip-vit-classification_TA8.yaml +18 -0
- fusion_bench_config/taskpool/clip-vit-base-patch32_robustness_clean.yaml +24 -0
- fusion_bench_config/taskpool/clip-vit-base-patch32_robustness_corrupted.yaml +27 -0
- fusion_bench_config/taskpool/clip-vit-base-patch32_svhn_and_mnist.yaml +22 -0
- fusion_bench_config/taskpool/dummy.yaml +2 -0
- fusion_bench_config/taskpool/flan-t5_glue_text_generation.yaml +44 -0
- fusion_bench_config/taskpool/gpt-2_glue.yaml +39 -0
- fusion_bench_config/taskpool/nyuv2_taskpool.yaml +9 -0
- fusion_bench_config/taskpool/reward_model_evaluation.yaml +18 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This is an experimental implementation of the Layer-Wise AdaMerging Algorithm for GPT-2 models.
|
|
3
|
+
The efficiency of the algorithm is not guaranteed, and it may not work as expected.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import functools
|
|
7
|
+
import logging
|
|
8
|
+
import os
|
|
9
|
+
from abc import abstractmethod
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any, Dict, List, Mapping, Optional, Union, cast # noqa: F401
|
|
12
|
+
|
|
13
|
+
import torch
|
|
14
|
+
from lightning.fabric.utilities.rank_zero import rank_zero_only
|
|
15
|
+
from omegaconf import DictConfig
|
|
16
|
+
from torch import Tensor, nn
|
|
17
|
+
from torch.utils.data import DataLoader
|
|
18
|
+
from tqdm.autonotebook import tqdm
|
|
19
|
+
from transformers import GPT2ForSequenceClassification, GPT2Model
|
|
20
|
+
from transformers.data import default_data_collator
|
|
21
|
+
|
|
22
|
+
from fusion_bench.method import BaseAlgorithm
|
|
23
|
+
from fusion_bench.method.simple_average import simple_average
|
|
24
|
+
from fusion_bench.mixins.lightning_fabric import LightningFabricMixin
|
|
25
|
+
from fusion_bench.mixins.simple_profiler import SimpleProfilerMixin
|
|
26
|
+
from fusion_bench.modelpool import GPT2ForSequenceClassificationPool
|
|
27
|
+
from fusion_bench.models.wrappers.layer_wise_fusion import (
|
|
28
|
+
LayerWiseMergedModel,
|
|
29
|
+
get_layer_wise_weights,
|
|
30
|
+
)
|
|
31
|
+
from fusion_bench.utils.data import InfiniteDataLoader, load_tensor_from_file
|
|
32
|
+
from fusion_bench.utils.instantiate import instantiate
|
|
33
|
+
|
|
34
|
+
from .entropy_loss import entropy_loss
|
|
35
|
+
from .min_norm_solvers import MinNormSolver
|
|
36
|
+
from .utils import get_memory_usage
|
|
37
|
+
|
|
38
|
+
log = logging.getLogger(__name__)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class GPT2LayerWiseAdaMergingAlgorithm(
|
|
42
|
+
BaseAlgorithm,
|
|
43
|
+
LightningFabricMixin,
|
|
44
|
+
SimpleProfilerMixin,
|
|
45
|
+
):
|
|
46
|
+
scores: Dict[str, nn.Linear] = None
|
|
47
|
+
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
optimizer: DictConfig,
|
|
51
|
+
dataloader_kwargs: DictConfig,
|
|
52
|
+
init_values: float,
|
|
53
|
+
max_steps: int,
|
|
54
|
+
merging_weights_load_path: Optional[Union[str, Path]] = None,
|
|
55
|
+
merging_weights_save_path: Optional[Union[str, Path]] = None,
|
|
56
|
+
clamp_weights: bool = False,
|
|
57
|
+
tie_weights: bool = True,
|
|
58
|
+
strict: bool = False,
|
|
59
|
+
cache_dir: str = "outputs/cache",
|
|
60
|
+
variant: Optional[str] = None,
|
|
61
|
+
**kwargs,
|
|
62
|
+
):
|
|
63
|
+
self._optimizer = optimizer
|
|
64
|
+
self.dataloader_kwargs = dataloader_kwargs
|
|
65
|
+
self.init_values = init_values
|
|
66
|
+
self.merging_weights_load_path = merging_weights_load_path
|
|
67
|
+
self.merging_weights_save_path = merging_weights_save_path
|
|
68
|
+
self.clamp_weights = clamp_weights
|
|
69
|
+
self.tie_weights = tie_weights
|
|
70
|
+
self.strict = strict
|
|
71
|
+
self.max_steps = max_steps
|
|
72
|
+
self.cache_dir = cache_dir
|
|
73
|
+
self.variant = variant
|
|
74
|
+
super().__init__(**kwargs)
|
|
75
|
+
|
|
76
|
+
@torch.no_grad()
|
|
77
|
+
def construct_layer_wise_merged_model(
|
|
78
|
+
self, modelpool: GPT2ForSequenceClassificationPool
|
|
79
|
+
):
|
|
80
|
+
"""
|
|
81
|
+
Constructs a wrapped layer-wise merged model from model pool.
|
|
82
|
+
|
|
83
|
+
This method creates a new wrapped model by merging the layers of a pretrained model with those of several fine-tuned models.
|
|
84
|
+
The merging is controlled by layer-wise weights, which is a `torch.Tensor` of the shape `(num_models, num_layers)`.
|
|
85
|
+
The merging weights can be initialized based on a provided configuration or loaded from a file.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
modelpool (ModelPool): An object containing the pretrained model and fine-tuned models to be merged.
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
LayerWiseMergedModel: An instance of the merged model with layer-wise weights applied.
|
|
92
|
+
"""
|
|
93
|
+
pretrained_model: GPT2Model = modelpool.load_model("_pretrained_")
|
|
94
|
+
finetuned_models: List[GPT2Model] = [
|
|
95
|
+
modelpool.load_model(name) for name in modelpool.model_names
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
# initialize layer-wise weights using the provided configuration `init_values` or load from file if `weights` is provided
|
|
99
|
+
if self.merging_weights_load_path is None:
|
|
100
|
+
layer_wise_weight = get_layer_wise_weights(
|
|
101
|
+
num_models=len(modelpool.model_names),
|
|
102
|
+
num_layers=len(
|
|
103
|
+
tuple(
|
|
104
|
+
filter(lambda p: p.requires_grad, pretrained_model.parameters())
|
|
105
|
+
)
|
|
106
|
+
),
|
|
107
|
+
init_values=self.init_values,
|
|
108
|
+
)
|
|
109
|
+
else:
|
|
110
|
+
if isinstance(self.merging_weights_load_path, str):
|
|
111
|
+
# load the merging weights from a file
|
|
112
|
+
layer_wise_weight = load_tensor_from_file(
|
|
113
|
+
self.merging_weights_load_path
|
|
114
|
+
)
|
|
115
|
+
else:
|
|
116
|
+
raise ValueError(
|
|
117
|
+
f"Unsupported weights format: {self.merging_weights_load_path}"
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
module = LayerWiseMergedModel(
|
|
121
|
+
layer_wise_weight=layer_wise_weight,
|
|
122
|
+
pretrained_model=pretrained_model,
|
|
123
|
+
finetuned_models=finetuned_models,
|
|
124
|
+
clamp_weights=self.clamp_weights,
|
|
125
|
+
tie_weights=self.tie_weights,
|
|
126
|
+
strict=self.strict,
|
|
127
|
+
)
|
|
128
|
+
print(f"{layer_wise_weight.size()=}, {layer_wise_weight.numel()=}")
|
|
129
|
+
return module
|
|
130
|
+
|
|
131
|
+
@rank_zero_only
|
|
132
|
+
def save_merging_weights(self, file_path: str, merging_weights: torch.Tensor):
|
|
133
|
+
"""
|
|
134
|
+
Save the merging weights to a file.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
file_path (str): The path to save the merging weights.
|
|
138
|
+
merging_weights (torch.Tensor): The merging weights to save.
|
|
139
|
+
"""
|
|
140
|
+
if self.fabric.is_global_zero and self.merging_weights_save_path is not None:
|
|
141
|
+
if isinstance(file_path, str) and not file_path.startswith(("/", ".")):
|
|
142
|
+
# if the file path is not absolute or relative to current working directory, save it in the log directory
|
|
143
|
+
save_path = os.path.join(self.log_dir, file_path)
|
|
144
|
+
else:
|
|
145
|
+
save_path = file_path
|
|
146
|
+
log.info(f"saving merging weights to {save_path}.")
|
|
147
|
+
if os.path.dirname(save_path):
|
|
148
|
+
os.makedirs(os.path.dirname(save_path), exist_ok=True)
|
|
149
|
+
torch.save(merging_weights.detach().cpu(), save_path)
|
|
150
|
+
|
|
151
|
+
def run(self, modelpool: GPT2ForSequenceClassificationPool, **kwargs):
|
|
152
|
+
"""
|
|
153
|
+
Run the Layer-Wise AdaMerging Algorithm.
|
|
154
|
+
|
|
155
|
+
This method constructs the wrapped model and performs test-time adaptation if necessary.
|
|
156
|
+
|
|
157
|
+
Args:
|
|
158
|
+
modelpool (ModelPool): The model pool containing the pretrained and fine-tuned models.
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
LayerWiseMergedModel: The merged model after test-time adaptation.
|
|
162
|
+
"""
|
|
163
|
+
log.info("Fusing models using layer-wise adaptive merging.")
|
|
164
|
+
self.modelpool = modelpool
|
|
165
|
+
|
|
166
|
+
with self.profile("construct the wrapped model"):
|
|
167
|
+
module = self.construct_layer_wise_merged_model(modelpool)
|
|
168
|
+
|
|
169
|
+
if self.merging_weights_load_path is not None:
|
|
170
|
+
# skip the test-time adaptation
|
|
171
|
+
return module.merge_and_unload()
|
|
172
|
+
else:
|
|
173
|
+
with self.profile("test-time adaptation"):
|
|
174
|
+
module = self.test_time_adaptation(module)
|
|
175
|
+
if self.merging_weights_save_path is not None:
|
|
176
|
+
self.save_merging_weights(
|
|
177
|
+
self.merging_weights_save_path, module.merge_weight
|
|
178
|
+
)
|
|
179
|
+
return module.merge_and_unload()
|
|
180
|
+
|
|
181
|
+
def on_test_time_adaptation_start(self):
|
|
182
|
+
"""
|
|
183
|
+
Something to do before the test-time adaptation starts. Such as setting up the task-specific heads.
|
|
184
|
+
"""
|
|
185
|
+
self.scores = {}
|
|
186
|
+
for model_name in self.modelpool.model_names:
|
|
187
|
+
score = cast(
|
|
188
|
+
GPT2ForSequenceClassification,
|
|
189
|
+
self.modelpool.load_classifier(model_name),
|
|
190
|
+
).score.requires_grad_(False)
|
|
191
|
+
score = score.to(self.fabric.device)
|
|
192
|
+
self.scores[model_name] = score
|
|
193
|
+
|
|
194
|
+
@functools.cache
|
|
195
|
+
def get_shuffled_test_loader_iter(self, task: str) -> DataLoader:
|
|
196
|
+
"""
|
|
197
|
+
Loader of test dataset for test-time adaptation. labels are not needed.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
task (str): The name of the task.
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
DataLoader: The data loader for the test dataset.
|
|
204
|
+
"""
|
|
205
|
+
dataloader_kwargs = dict(self.dataloader_kwargs)
|
|
206
|
+
dataloader_kwargs.update(dict(shuffle=True, collate_fn=default_data_collator))
|
|
207
|
+
|
|
208
|
+
dataset = self.modelpool.load_test_dataset(task)
|
|
209
|
+
loader = DataLoader(dataset, **dataloader_kwargs)
|
|
210
|
+
|
|
211
|
+
if self.fabric is not None:
|
|
212
|
+
loader = self.fabric.setup_dataloaders(loader)
|
|
213
|
+
return iter(InfiniteDataLoader(loader))
|
|
214
|
+
|
|
215
|
+
def compute_logits(self, module: GPT2Model, batch, task: str) -> Tensor:
|
|
216
|
+
"""
|
|
217
|
+
Compute the logits for the given images and task.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
module: The model module.
|
|
221
|
+
images (Tensor): The input images.
|
|
222
|
+
task (str): The name of the task.
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
Tensor: The computed logits.
|
|
226
|
+
"""
|
|
227
|
+
input_ids = batch["input_ids"]
|
|
228
|
+
attention_mask = batch["attention_mask"]
|
|
229
|
+
batch_size, _ = input_ids.shape[:2]
|
|
230
|
+
pad_token_id = 50256
|
|
231
|
+
|
|
232
|
+
transformer_outputs = module(
|
|
233
|
+
input_ids,
|
|
234
|
+
past_key_values=None,
|
|
235
|
+
attention_mask=attention_mask,
|
|
236
|
+
token_type_ids=None,
|
|
237
|
+
position_ids=None,
|
|
238
|
+
head_mask=None,
|
|
239
|
+
inputs_embeds=None,
|
|
240
|
+
use_cache=None,
|
|
241
|
+
output_attentions=None,
|
|
242
|
+
output_hidden_states=None,
|
|
243
|
+
return_dict=True,
|
|
244
|
+
)
|
|
245
|
+
hidden_states = transformer_outputs[0]
|
|
246
|
+
logits = self.scores[task](hidden_states)
|
|
247
|
+
|
|
248
|
+
sequence_lengths = torch.eq(input_ids, pad_token_id).int().argmax(-1) - 1
|
|
249
|
+
sequence_lengths = sequence_lengths % input_ids.shape[-1]
|
|
250
|
+
sequence_lengths = sequence_lengths.to(logits.device)
|
|
251
|
+
|
|
252
|
+
pooled_logits = logits[
|
|
253
|
+
torch.arange(batch_size, device=logits.device), sequence_lengths
|
|
254
|
+
]
|
|
255
|
+
|
|
256
|
+
assert pooled_logits.dim() == 2
|
|
257
|
+
return pooled_logits
|
|
258
|
+
|
|
259
|
+
def test_time_adaptation(self, module: LayerWiseMergedModel):
|
|
260
|
+
"""
|
|
261
|
+
Perform test-time adaptation on the merged model.
|
|
262
|
+
|
|
263
|
+
This method adapts the merging weights during test-time to improve performance.
|
|
264
|
+
|
|
265
|
+
Args:
|
|
266
|
+
module (LayerWiseMergedModel): The merged model.
|
|
267
|
+
|
|
268
|
+
Returns:
|
|
269
|
+
LayerWiseMergedModel: The adapted merged model.
|
|
270
|
+
"""
|
|
271
|
+
self.on_test_time_adaptation_start()
|
|
272
|
+
|
|
273
|
+
# configure optimizer
|
|
274
|
+
optimizer = instantiate(self._optimizer, [module.merge_weight])
|
|
275
|
+
module, optimizer = self.fabric.setup(module, optimizer)
|
|
276
|
+
|
|
277
|
+
module.train()
|
|
278
|
+
module.merge_weights()
|
|
279
|
+
for step_idx in (
|
|
280
|
+
pbar := tqdm(
|
|
281
|
+
range(self.max_steps if not self.is_debug_mode else 1),
|
|
282
|
+
("[DEBUG MODE] " if self.is_debug_mode else "")
|
|
283
|
+
+ "AdaMerging Test-time adaptation",
|
|
284
|
+
dynamic_ncols=True,
|
|
285
|
+
)
|
|
286
|
+
):
|
|
287
|
+
if self.variant == "mgda":
|
|
288
|
+
total_loss = self._compute_gradients_using_mgda(module)
|
|
289
|
+
else:
|
|
290
|
+
total_loss = 0
|
|
291
|
+
for task in self.modelpool.model_names:
|
|
292
|
+
with self.profile("data loading"):
|
|
293
|
+
batch = next(self.get_shuffled_test_loader_iter(task))
|
|
294
|
+
with self.profile("forward pass"):
|
|
295
|
+
logits = self.compute_logits(module, batch, task)
|
|
296
|
+
logits = logits.mean(dim=0, keepdim=True)
|
|
297
|
+
loss = entropy_loss(logits)
|
|
298
|
+
total_loss += loss
|
|
299
|
+
with self.profile("backward pass"):
|
|
300
|
+
self.fabric.backward(loss, retain_graph=True)
|
|
301
|
+
|
|
302
|
+
with self.profile("optimizer step"):
|
|
303
|
+
optimizer.step()
|
|
304
|
+
optimizer.zero_grad()
|
|
305
|
+
with self.profile("merging weights"):
|
|
306
|
+
module.merge_weights()
|
|
307
|
+
|
|
308
|
+
metrics = {
|
|
309
|
+
"train/loss": total_loss.item(),
|
|
310
|
+
"train/weight_max": module.merge_weight.max().item(),
|
|
311
|
+
"train/weight_min": module.merge_weight.min().item(),
|
|
312
|
+
"train/weight_mean": module.merge_weight.mean().item(),
|
|
313
|
+
}
|
|
314
|
+
self.fabric.log_dict(metrics, step=step_idx)
|
|
315
|
+
pbar.set_postfix(metrics)
|
|
316
|
+
|
|
317
|
+
log.info(get_memory_usage(f"after adamerging, the memory usage of GPU is:"))
|
|
318
|
+
self.print_profile_summary()
|
|
319
|
+
return module
|
|
320
|
+
|
|
321
|
+
def _compute_gradients_using_mgda(self, module: LayerWiseMergedModel):
|
|
322
|
+
all_grads = []
|
|
323
|
+
total_loss = 0
|
|
324
|
+
# default behavior for first-order optimizers
|
|
325
|
+
for task in self.modelpool.model_names:
|
|
326
|
+
with self.profile("data loading"):
|
|
327
|
+
batch = next(self.get_shuffled_test_loader_iter(task))
|
|
328
|
+
with self.profile("forward pass"):
|
|
329
|
+
logits = self.compute_logits(module, batch, task)
|
|
330
|
+
logits = logits.mean(dim=0, keepdim=True)
|
|
331
|
+
loss = entropy_loss(logits)
|
|
332
|
+
total_loss += loss
|
|
333
|
+
with self.profile("backward pass"):
|
|
334
|
+
# self.fabric.backward(loss, retain_graph=True)
|
|
335
|
+
_grads = torch.autograd.grad(
|
|
336
|
+
loss,
|
|
337
|
+
[module.merge_weight],
|
|
338
|
+
create_graph=False,
|
|
339
|
+
retain_graph=True,
|
|
340
|
+
)
|
|
341
|
+
all_grads.append(_grads[0].flatten().detach())
|
|
342
|
+
sol, min_norm = MinNormSolver.find_min_norm_element(all_grads)
|
|
343
|
+
if not isinstance(sol, torch.Tensor):
|
|
344
|
+
sol = torch.from_numpy(sol)
|
|
345
|
+
sol = sol.to(
|
|
346
|
+
device=module.merge_weight.device,
|
|
347
|
+
dtype=module.merge_weight.dtype,
|
|
348
|
+
)
|
|
349
|
+
grad = torch.stack(all_grads) * sol.view(-1, 1)
|
|
350
|
+
module.merge_weight.grad = grad.sum(dim=0).view_as(module.merge_weight)
|
|
351
|
+
return total_loss
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
from abc import abstractmethod
|
|
4
|
+
from typing import TYPE_CHECKING, Any, List, Mapping, TypeVar, Union, cast # noqa: F401
|
|
5
|
+
|
|
6
|
+
import torch
|
|
7
|
+
from lightning.fabric.utilities.rank_zero import rank_zero_only
|
|
8
|
+
from omegaconf import DictConfig
|
|
9
|
+
from torch import Tensor, nn
|
|
10
|
+
from torch.utils.data import DataLoader
|
|
11
|
+
from tqdm.autonotebook import tqdm
|
|
12
|
+
|
|
13
|
+
from fusion_bench.compat.method import ModelFusionAlgorithm
|
|
14
|
+
from fusion_bench.compat.modelpool import ModelPool
|
|
15
|
+
from fusion_bench.mixins.lightning_fabric import LightningFabricMixin
|
|
16
|
+
from fusion_bench.mixins.simple_profiler import SimpleProfilerMixin
|
|
17
|
+
from fusion_bench.models.wrappers.layer_wise_fusion import (
|
|
18
|
+
LayerWiseMergedModel,
|
|
19
|
+
get_layer_wise_weights,
|
|
20
|
+
)
|
|
21
|
+
from fusion_bench.utils.data import load_tensor_from_file
|
|
22
|
+
from fusion_bench.utils.type import TorchModelType
|
|
23
|
+
|
|
24
|
+
from .entropy_loss import entropy_loss
|
|
25
|
+
from .utils import get_memory_usage
|
|
26
|
+
|
|
27
|
+
if TYPE_CHECKING:
|
|
28
|
+
from fusion_bench.programs.fabric_fusion_program import FabricModelFusionProgram
|
|
29
|
+
|
|
30
|
+
log = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class LayerWiseAdaMergingAlgorithm(
|
|
34
|
+
ModelFusionAlgorithm,
|
|
35
|
+
LightningFabricMixin,
|
|
36
|
+
SimpleProfilerMixin,
|
|
37
|
+
):
|
|
38
|
+
_program: "FabricModelFusionProgram"
|
|
39
|
+
"""The program that this algorithm is running on."""
|
|
40
|
+
|
|
41
|
+
"""
|
|
42
|
+
Implements the Layer-Wise AdaMerging Algorithm.
|
|
43
|
+
|
|
44
|
+
This class merges the layers of a pretrained model with those of several fine-tuned models.
|
|
45
|
+
The merging is controlled by layer-wise weights, which can be initialized based on a provided configuration or loaded from a file.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(self, algorithm_config: DictConfig):
|
|
49
|
+
"""
|
|
50
|
+
Initialize the LayerWiseAdaMergingAlgorithm with the given configuration.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
algorithm_config (DictConfig): The configuration for the algorithm.
|
|
54
|
+
"""
|
|
55
|
+
super().__init__(algorithm_config)
|
|
56
|
+
|
|
57
|
+
@torch.no_grad()
|
|
58
|
+
def construct_layer_wise_merged_model(self, modelpool: "ModelPool"):
|
|
59
|
+
"""
|
|
60
|
+
Constructs a wrapped layer-wise merged model from model pool.
|
|
61
|
+
|
|
62
|
+
This method creates a new wrapped model by merging the layers of a pretrained model with those of several fine-tuned models.
|
|
63
|
+
The merging is controlled by layer-wise weights, which is a `torch.Tensor` of the shape `(num_models, num_layers)`.
|
|
64
|
+
The merging weights can be initialized based on a provided configuration or loaded from a file.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
modelpool (ModelPool): An object containing the pretrained model and fine-tuned models to be merged.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
LayerWiseMergedModel: An instance of the merged model with layer-wise weights applied.
|
|
71
|
+
"""
|
|
72
|
+
pretrained_model = modelpool.load_model("_pretrained_")
|
|
73
|
+
finetuned_models = [
|
|
74
|
+
modelpool.load_model(name) for name in modelpool.model_names
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
# initialize layer-wise weights using the provided configuration `init_values` or load from file if `weights` is provided
|
|
78
|
+
if self.config.weights is None:
|
|
79
|
+
layer_wise_weight = get_layer_wise_weights(
|
|
80
|
+
num_models=len(modelpool.model_names),
|
|
81
|
+
num_layers=len(
|
|
82
|
+
tuple(
|
|
83
|
+
filter(lambda p: p.requires_grad, pretrained_model.parameters())
|
|
84
|
+
)
|
|
85
|
+
),
|
|
86
|
+
init_values=self.config.init_values,
|
|
87
|
+
)
|
|
88
|
+
else:
|
|
89
|
+
if isinstance(self.config.weights, str):
|
|
90
|
+
# self.config.weights is a path to a saved tensor
|
|
91
|
+
layer_wise_weight = load_tensor_from_file(self.config.weights)
|
|
92
|
+
else:
|
|
93
|
+
raise ValueError(f"Unsupported weights format: {self.config.weights}")
|
|
94
|
+
|
|
95
|
+
module = LayerWiseMergedModel(
|
|
96
|
+
layer_wise_weight=layer_wise_weight,
|
|
97
|
+
pretrained_model=pretrained_model,
|
|
98
|
+
finetuned_models=finetuned_models,
|
|
99
|
+
clamp_weights=self.config.clamp_weights,
|
|
100
|
+
tie_weights=self.config.tie_weights,
|
|
101
|
+
strict=self.config.strict,
|
|
102
|
+
)
|
|
103
|
+
print(f"{layer_wise_weight.size()=}, {layer_wise_weight.numel()=}")
|
|
104
|
+
return module
|
|
105
|
+
|
|
106
|
+
@rank_zero_only
|
|
107
|
+
def save_merging_weights(self, file_path: str, merging_weights: torch.Tensor):
|
|
108
|
+
"""
|
|
109
|
+
Save the merging weights to a file.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
file_path (str): The path to save the merging weights.
|
|
113
|
+
merging_weights (torch.Tensor): The merging weights to save.
|
|
114
|
+
"""
|
|
115
|
+
if self.fabric.is_global_zero and self.config.get(
|
|
116
|
+
"save_merging_weights", False
|
|
117
|
+
):
|
|
118
|
+
if isinstance(file_path, str) and not file_path.startswith(("/", ".")):
|
|
119
|
+
# if the file path is not absolute or relative to current working directory, save it in the log directory
|
|
120
|
+
save_path = os.path.join(self.log_dir, file_path)
|
|
121
|
+
else:
|
|
122
|
+
save_path = file_path
|
|
123
|
+
log.info(f"saving merging weights to {save_path}.")
|
|
124
|
+
if os.path.dirname(save_path):
|
|
125
|
+
os.makedirs(os.path.dirname(save_path), exist_ok=True)
|
|
126
|
+
torch.save(merging_weights.detach().cpu(), save_path)
|
|
127
|
+
|
|
128
|
+
def run(self, modelpool: ModelPool, **kwargs):
|
|
129
|
+
"""
|
|
130
|
+
Run the Layer-Wise AdaMerging Algorithm.
|
|
131
|
+
|
|
132
|
+
This method constructs the wrapped model and performs test-time adaptation if necessary.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
modelpool (ModelPool): The model pool containing the pretrained and fine-tuned models.
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
LayerWiseMergedModel: The merged model after test-time adaptation.
|
|
139
|
+
"""
|
|
140
|
+
log.info("Fusing models using layer-wise adaptive merging.")
|
|
141
|
+
self.modelpool = modelpool
|
|
142
|
+
self.log_hyperparams(self.config)
|
|
143
|
+
|
|
144
|
+
with self.profile("construct the wrapped model"):
|
|
145
|
+
module = self.construct_layer_wise_merged_model(modelpool)
|
|
146
|
+
|
|
147
|
+
if self.config.weights is not None:
|
|
148
|
+
# skip the test-time adaptation
|
|
149
|
+
return module.merge_and_unload()
|
|
150
|
+
else:
|
|
151
|
+
with self.profile("test-time adaptation"):
|
|
152
|
+
module = self.test_time_adaptation(module)
|
|
153
|
+
if self.config.get("save_merging_weights", False):
|
|
154
|
+
self.save_merging_weights(
|
|
155
|
+
self.config.save_merging_weights, module.merge_weight
|
|
156
|
+
)
|
|
157
|
+
return module.merge_and_unload()
|
|
158
|
+
|
|
159
|
+
def on_test_time_adaptation_start(self):
|
|
160
|
+
"""
|
|
161
|
+
Something to do before the test-time adaptation starts. Such as setting up the task-specific heads.
|
|
162
|
+
"""
|
|
163
|
+
pass
|
|
164
|
+
|
|
165
|
+
@abstractmethod
|
|
166
|
+
def get_shuffled_test_loader_iter(self, task: str) -> DataLoader:
|
|
167
|
+
"""
|
|
168
|
+
Loader of test dataset for test-time adaptation. labels are not needed.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
task (str): The name of the task.
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
DataLoader: The data loader for the test dataset.
|
|
175
|
+
"""
|
|
176
|
+
pass
|
|
177
|
+
|
|
178
|
+
@abstractmethod
|
|
179
|
+
def compute_logits(self, module, images: Tensor, task: str) -> Tensor:
|
|
180
|
+
"""
|
|
181
|
+
Compute the logits for the given images and task.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
module: The model module.
|
|
185
|
+
images (Tensor): The input images.
|
|
186
|
+
task (str): The name of the task.
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
Tensor: The computed logits.
|
|
190
|
+
"""
|
|
191
|
+
pass
|
|
192
|
+
|
|
193
|
+
def test_time_adaptation(self, module: "LayerWiseMergedModel[TorchModelType]"):
|
|
194
|
+
"""
|
|
195
|
+
Perform test-time adaptation on the merged model.
|
|
196
|
+
|
|
197
|
+
This method adapts the merging weights during test-time to improve performance.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
module (LayerWiseMergedModel): The merged model.
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
LayerWiseMergedModel: The adapted merged model.
|
|
204
|
+
"""
|
|
205
|
+
self.on_test_time_adaptation_start()
|
|
206
|
+
|
|
207
|
+
# configure optimizer
|
|
208
|
+
if self.config.optimizer == "adam":
|
|
209
|
+
optimizer = torch.optim.Adam([module.merge_weight], lr=self.config.lr)
|
|
210
|
+
print(f"{optimizer=}")
|
|
211
|
+
module, optimizer = self.fabric.setup(module, optimizer)
|
|
212
|
+
else:
|
|
213
|
+
raise ValueError(f"Unsupported optimizer: {self.config.optimizer}")
|
|
214
|
+
|
|
215
|
+
module.train()
|
|
216
|
+
module.merge_weights()
|
|
217
|
+
for step_idx in (
|
|
218
|
+
pbar := tqdm(
|
|
219
|
+
range(self.config.max_steps if not self.is_debug_mode else 1),
|
|
220
|
+
("[DEBUG MODE] " if self.is_debug_mode else "")
|
|
221
|
+
+ "AdaMerging Test-time adaptation",
|
|
222
|
+
dynamic_ncols=True,
|
|
223
|
+
)
|
|
224
|
+
):
|
|
225
|
+
# default behavior for first-order optimizers
|
|
226
|
+
for task in self.modelpool.model_names:
|
|
227
|
+
with self.profile("data loading"):
|
|
228
|
+
batch = next(self.get_shuffled_test_loader_iter(task))
|
|
229
|
+
with self.profile("forward pass"):
|
|
230
|
+
logits = self.compute_logits(module, batch[0], task)
|
|
231
|
+
loss = entropy_loss(logits)
|
|
232
|
+
with self.profile("backward pass"):
|
|
233
|
+
self.fabric.backward(loss, retain_graph=True)
|
|
234
|
+
|
|
235
|
+
with self.profile("optimizer step"):
|
|
236
|
+
optimizer.step()
|
|
237
|
+
optimizer.zero_grad()
|
|
238
|
+
with self.profile("merging weights"):
|
|
239
|
+
module.merge_weights()
|
|
240
|
+
|
|
241
|
+
metrics = {
|
|
242
|
+
"train/loss": loss.item(),
|
|
243
|
+
"train/weight_max": module.merge_weight.max().item(),
|
|
244
|
+
"train/weight_min": module.merge_weight.min().item(),
|
|
245
|
+
"train/weight_mean": module.merge_weight.mean().item(),
|
|
246
|
+
}
|
|
247
|
+
self.fabric.log_dict(metrics, step=step_idx)
|
|
248
|
+
pbar.set_postfix(metrics)
|
|
249
|
+
|
|
250
|
+
log.info(get_memory_usage(f"after adamerging, the memory usage of GPU is:"))
|
|
251
|
+
self.print_profile_summary()
|
|
252
|
+
return module
|