Главная страница>Связанные с программированием>AI Исходный код

О структурной обрезке моделей крупных языков

? ? ? ? ? Сжатие ваших LLMS до любого размера! ? ? ? ? ?

изображение

Введение

LLM-Pruner: О структурной обрезке больших языковых моделей [arxiv]
Синьин М.А., Гонгфан Фанг, Синчао Ван
Национальный университет Сингапура

Почему LLM-Pruner

Поддерживается LLMS:

Обновления:

Список TODO:

Связаться с нами:

Присоединяйтесь к нашей группе WeChat для чата:

Оглавление

Быстрый старт

Установка

 pip install -r requirement.txt

Минимальный пример

 bash script/llama_prune.sh

Этот сценарий сжал бы модель Llama-7B с обрезанными параметрами ~ 20%. Все предварительно обученные модели и набор данных будут автоматически загружены, поэтому вам не нужно вручную загружать ресурс. При запуске этого сценария в первый раз потребуется некоторое время для загрузки модели и набора данных.

Пошаговые инструкции

Требуется три шага, чтобы обрезать LLM:

После обрезки и после тренировки мы следуем за LM-оценкой для оценки.

1. Обрезка (стадия обнаружения + этап оценки)

? Llama/Llama-2 обрезка с ~ 20% параметров обрезается:

 python hf_prune.py --pruning_ratio 0.25 
      --block_wise 
      --block_mlp_layer_start 4 --block_mlp_layer_end 30 
      --block_attention_layer_start 4 --block_attention_layer_end 30 
      --pruner_type taylor 
      --test_after_train 
      --device cpu  --eval_device cuda 
      --save_ckpt_log_name llama_prune 

Аргументы:

? Викуна обрезка

Подробности:

Если вы хотите попробовать Vicuna, укажите аргумент --base_model на путь к весу викана. Пожалуйста, следите за https://github.com/lm-sys/fastchat, чтобы получить вес-викуна.

 python hf_prune.py --pruning_ratio 0.25 
      --block_wise 
      --block_mlp_layer_start 4 --block_mlp_layer_end 30 
      --block_attention_layer_start 4 --block_attention_layer_end 30 
      --pruner_type taylor 
      --test_after_train 
      --device cpu  --eval_device cuda 
      --save_ckpt_log_name llama_prune 
      --base_model PATH_TO_VICUNA_WEIGHTS

? Байчуанс обрезка

Подробности:

Пожалуйста, обратитесь к примеру/Baichuan для получения более подробной информации

? Llama3/Llama3.1 Обрезка

Подробности:
 python llama3.py --pruning_ratio 0.25 
                 --device cuda --eval_device cuda 
                 --base_model meta-llama/Meta-Llama-3-8B-Instruct 
                 --block_wise --block_mlp_layer_start 4 --block_mlp_layer_end 30 
                 --block_attention_layer_start 4 --block_attention_layer_end 30 
                 --save_ckpt_log_name llama3_prune 
                 --pruner_type taylor --taylor param_first 
                 --max_seq_len 2048 
                 --test_after_train --test_before_train --save_model 

2. После тренировки (стадия восстановления)

 CUDA_VISIBLE_DEVICES=X python post_training.py --prune_model prune_log/PATH_TO_PRUNE_MODEL/pytorch_model.bin 
      --data_path yahma/alpaca-cleaned 
      --lora_r 8 
      --num_epochs 2  
      --learning_rate 1e-4  
      --batch_size 64 
      --output_dir tune_log/PATH_TO_SAVE_TUNE_MODEL  
      --wandb_project llama_tune

Обязательно замените PATH_TO_PRUNE_MODEL путем к модели с обрезкой на шаге 1 и замените PATH_TO_SAVE_TUNE_MODEL на желаемое местоположение, где вы хотите сохранить настроенную модель.

Совет : обучение Llama-2 в Float16 не рекомендуется и, как известно, производит NAN; Таким образом, модель должна быть обучена BFLOAT16.

 deepspeed --include=localhost:1,2,3,4 post_training.py 
      --prune_model prune_log/PATH_TO_PRUNE_MODEL/pytorch_model.bin 
      --data_path MBZUAI/LaMini-instruction  
      --lora_r 8 
      --num_epochs 3  
      --output_dir tune_log/PATH_TO_SAVE_TUNE_MODEL 
      --extra_val_dataset wikitext2,ptb 
      --wandb_project llmpruner_lamini_tune 
      --learning_rate 5e-5 
      --cache_dataset

3. Поколение

Как загрузить обрезку/предварительно обученные модели:

Для модели обрезки просто используйте следующую команду для загрузки вашей модели.

  pruned_dict = torch.load(YOUR_CHECKPOINT_PATH, map_location='cpu')
  tokenizer, model = pruned_dict['tokenizer'], pruned_dict['model']

Из -за различных конфигураций между модулями в обрезенной модели, где определенные слои могут иметь большую ширину, в то время как другие подвергаются большей обрезке, становится нецелесообразно загружать модель с использованием .from_pretrained() как это предусмотрено, обнимая лицо. В настоящее время мы используем torch.save для хранения модели с обрезкой.

Поскольку в каждом слое есть различная конфигурация, как и некоторые слои могут быть шире, но некоторые слои были обрезаны больше, модель не может быть загружена .from_pretrained() В настоящее время мы просто используем torch.save , чтобы сохранить модель обрезки и torch.load для загрузки модели с обрезкой.

Поколение с интерфейсом Gradio

Мы предоставляем простой сценарий текстам Geneate, используя предварительно обученные / обрезанные модели / модели с обрезкой с пост-тренировкой.

 python generate.py --model_type pretrain
 python generate.py --model_type pruneLLM --ckpt <YOUR_MODEL_PATH_FOR_PRUNE_MODEL>
 python generate.py --model_type tune_prune_LLM --ckpt <YOUR_CKPT_PATH_FOR_PRUNE_MODEL> --lora_ckpt <YOUR_CKPT_PATH_FOR_LORA_WEIGHT>

Приведенные выше инструкции будут развернуть ваши LLM на местном уровне.

4. Оценка

Для оценки производительности модели с обрезкой мы следуем за LM-оценкой, чтобы оценить модель:

 - PATH_TO_SAVE_TUNE_MODEL
  | - checkpoint-200
      | - pytorch_model.bin
      | - optimizer.pt
      ...
  | - checkpoint-400
  | - checkpoint-600
  ...
  | - adapter_config.bin
  | - adapter-config.json

Расположить файлы по следующим командам:

 cd PATH_TO_SAVE_TUNE_MODEL
export epoch=YOUR_EVALUATE_EPOCH
cp adapter_config.json checkpoint-$epoch/
mv checkpoint-$epoch/pytorch_model.bin checkpoint-$epoch/adapter_model.bin

Если вы хотите оценить checkpoint-200 , установите эпоху, равную 200 по export epoch=200 .

 export PYTHONPATH='.'
python lm-evaluation-harness/main.py --model hf-causal-experimental 
       --model_args checkpoint=PATH_TO_PRUNE_MODEL,peft=PATH_TO_SAVE_TUNE_MODEL,config_pretrained=PATH_OR_NAME_TO_BASE_MODEL 
       --tasks openbookqa,arc_easy,winogrande,hellaswag,arc_challenge,piqa,boolq 
       --device cuda:0 --no_cache 
       --output_path PATH_TO_SAVE_EVALUATION_LOG 

Здесь замените PATH_TO_PRUNE_MODEL и PATH_TO_SAVE_TUNE_MODEL на путь, который вы сохраняете модель обрезки и настроенной модели, и PATH_OR_NAME_TO_BASE_MODEL для загрузки файла конфигурации базовой модели.

[Обновление]: Мы загружаем скрипт в процесс оценки, если вы хотите оценить обрезку модель с помощью настроенной контрольной точки. Просто используйте следующую команду:

 CUDA_VISIBLE_DEVICES=X bash scripts/evaluate.sh PATH_OR_NAME_TO_BASE_MODEL PATH_TO_SAVE_TUNE_MODEL  PATH_TO_PRUNE_MODEL EPOCHS_YOU_WANT_TO_EVALUATE

Замените необходимую информацию вашей модели в команде. Последний используется для итерации в разные эпохи, если вы хотите оценить несколько контрольных точек в одной команде. Например:

 CUDA_VISIBLE_DEVICES=1 bash scripts/evaluate.sh decapoda-research/llama-7b-hf tune_log/llama_7B_hessian prune_log/llama_prune_7B 200 1000 2000

5. Тестирование Mac, параметры и память

 python test_speedup.py --model_type pretrain
 python test_speedup.py --model_type pruneLLM --ckpt <YOUR_MODEL_PATH_FOR_PRUNE_MODEL>

Оценка с нулевым выстрелом

Краткие количественные результаты для Llama-7B:


Результаты для Vicuna-7B:


Результаты для Chatglm-6B:


Статистика для обрезанных моделей:


Результаты LLM-Pruner с образцами 2,59 м:

Коэффициент обрезки #Param Память Задержка Ускорение Бульк Пика Hellaswag Winogrande Арк-э Дуговой Obqa Средний
Лама-7B 6,74b 12884,5mib 69,32 с 1x 73,18 78.35 72,99 67.01 67.45 41.38 42,40 63,25
Llama-5,4b с альпакой (50K) 5.47b 10488.4mib 58,55 с 1.18x 64,62 77.20 68,80 63.14 64,31 36.77 39,80 59,23
Llama-5,4b с ламини (2,59 м) 5.47b 10488.4mib 58,55 с 1.18x 76.57 77.37 66.60 65,82 70.62 40,70 38,80 62,36

Больше результатов можно найти в статье.

Больше примеров

Оригинальная модель Выход Обрезка модель Выход
Лама-7B Вселенная - это все пространство, время, материя и энергия, которая существует. Он включает в себя все материи и энергию, видимым или нет, и на самом деле вся вселенная невидима. Есть много теорий, касающихся его происхождения и конечной судьбы ... Лама-5,4b Вселенная - это все пространство, время, материя и энергия, которая существует. Законы, которые составляют физику - электроны, вращающиеся вращающимися атомами, магниты, привлекающие другие предметы, планеты, вращающиеся на солнце, были последовательны ...
Vicuna-7b 10 шагов по созданию приложения для iOS: 1. Исследование и разработка идеи. 2. Определите платформу, которую вы хотите использовать (iOS, Android или оба). 3. Создайте план и бюджет. 4. Наймите команду разработчиков. 5. Создайте пользовательский интерфейс (пользовательский интерфейс). 6. Разработать пользовательский интерфейс (пользовательский интерфейс). 7. Проверьте и итерацию в приложении. 8. Отправьте приложение в App Store. 9. Оптимизируйте приложение для производительности и пользовательского опыта (UX). 10. Рынок и продвигать приложение. Vicuna-5,4b 10 шагов для создания приложения для iOS: 1. Спланируйте приложение: решайте, что оно должно делать, как оно будет выглядеть, и сколько это будет стоить для его создания. 2. Наймите разработчика: хороший разработчик iOS поможет вам разработать пользовательский интерфейс, создать приложение и убедиться, что оно не является ошибочным. 3. Создайте пользовательский интерфейс: вот где происходит магия. Пользовательский интерфейс вашего приложения будет спроектировано и издевается на этом этапе ...
Чатглм-6B Напишите поэзию о любви и мире. В разгар жизни и суеты жизни я нахожу вашу любовь успокаивающим миром. Это чувство, которое нельзя передать, связь, которую нельзя дистанцировать. С твоей улыбкой, твоими глазами, твоими объятиями я чувствую принадлежность, которое только ты можешь дать. Это любовь, которая длится вечно, любовь, которая не может быть поражена ... Чатглм-5,6B Напишите поэзию о любви и мире. Любовь и мир, две такие замечательные вещи Чистое и бесконечное желание в моем сердце И оба они должны искать долгое, долгое время, я знаю ... Я знаю, что я чувствую себя идеальным партнером, во всех смыслах и мира, мне так нужно, однажды долгий, долгий путь, мое сердце пойдет ...

Информация о версии

Из -за изменений в версиях моделей и репо, использованных в этом проекте, мы перечислили некоторые известные проблемы версий и конкретные версии, необходимые для воспроизведения нашего метода:

  1. LM-Eval-Harness: мы используем этот коммит LM-оценки-Harness, и код также включен в это репо. Пожалуйста, проверьте выпуск № 25 для получения подробной информации.
  2. LLAMA1-7B: В наших экспериментах мы используем контрольную точку Decapoda-Research/Llama-7B-HF, чего сейчас недоступно. Пожалуйста, рассмотрите возможность использования скопированной версии, например, Baffo32/decapoda-research-llama-7b-hf.

Ограничения

Подтверждение

Цитирование

Если вы найдете этот проект полезным, пожалуйста, процитируйте

 @inproceedings{ma2023llmpruner,
  title={LLM-Pruner: On the Structural Pruning of Large Language Models},
  author={Xinyin Ma and Gongfan Fang and Xinchao Wang},
  booktitle={Advances in Neural Information Processing Systems},
  year={2023},
}
 @article{fang2023depgraph,
  title={DepGraph: Towards Any Structural Pruning},
  author={Fang, Gongfan and Ma, Xinyin and Song, Mingli and Mi, Michael Bi and Wang, Xinchao},
  journal={The IEEE/CVF Conference on Computer Vision and Pattern Recognition},
  year={2023}
}
Расширять
Дополнительная информация