Мне нужно было настроить модель параметров GPT2 1,5 миллиарда для проекта, но модель не подходила для моего графического процессора. Итак, я понял, как запустить его с высокой скоростью и градиентными контрольными точками, что уменьшает требуемую память графического процессора.
Я надеюсь, что это руководство поможет некоторым людям, которые также хотят настроить GPT2, но не хотят настраивать распределенное обучение.
Вы можете найти репозиторий с самой последней версией руководства здесь.
1. (Необязательно) Настройте виртуальную машину с V100 в Google Compute Engine.
Примечание. Модель работает на любом сервере с графическим процессором, не менее 16 ГБ видеопамяти и 70 ГБ ОЗУ.
Требования
- Установите Google Cloud SDK: Нажмите здесь
- Зарегистрируйте учетную запись Google Cloud, создайте проект и настройте биллинг.
- Запросите увеличение квоты для «GPU All Regions» до 1.
- Войдите в систему и инициализируйте облачный SDK с помощью
gcloud auth login
иgcloud init
.
Создать виртуальную машину
- Замените PROJECTID в приведенной ниже команде идентификатором проекта из вашего проекта GCE.
- Вы можете добавить флаг
--preemptible
к приведенной ниже команде, это снизит ваши затраты примерно до 1/3, но тогда Google сможет закрыть ваш экземпляр в любой момент. - Вы можете изменить зону, если нет доступных ресурсов. Здесь — список всех зон и наличие в них графических процессоров V100.
- Нам нужен GPU-сервер с оперативной памятью не менее 70 ГБ, в противном случае прогон сорвется всякий раз, когда скрипт захочет замариновать модель. Эта конфигурация ниже дает нам максимально возможное количество оперативной памяти с 12 процессорами в GCE. Вы также не можете использовать более 12 ЦП с одним графическим процессором V100 в GCE.
Запустите это, чтобы создать экземпляр:
gcloud compute instances create gpuserver \ --project PROJECTID \ --zone us-central1-a \ --custom-cpu 12 \ --custom-memory 78 \ --maintenance-policy TERMINATE \ --image-family pytorch-latest-gpu \ --image-project deeplearning-platform-release \ --boot-disk-size 200GB \ --metadata "install-nvidia-driver=True" \ --accelerator="type=nvidia-tesla-v100,count=1" \
Примерно через 5 минут (сначала серверу необходимо установить драйверы nvidia) вы можете подключиться к своему экземпляру.
- замените YOURSDKACCOUNT на имя вашей учетной записи sdk
gcloud compute ssh YOURSDKACCOUNT@gpuserver
Не забудьте выключить сервер, как только закончите, иначе вам будут платить за него.
В следующий раз вы можете перезапустить сервер из веб-интерфейса здесь.
2. Скачайте скрипт и установите библиотеки
Запустите это, чтобы загрузить скрипт и установить все библиотеки:
git clone https://github.com/Xirider/finetune-gpt2xl.git chmod -R 777 finetune-gpt2xl/ cd finetune-gpt2xl pip install -r requirements.txt
- Это устанавливает трансформаторы из исходников, так как текущая версия плохо работает с глубокой скоростью. Это также загружает модифицированный сценарий обучения и файл конфигурации DeepSpeed.
(Необязательно) Если вы хотите использовать Wandb.ai для отслеживания экспериментов, вам необходимо войти в систему:
wandb login
3. Тонкая настройка GPT2-xl
Теперь добавьте свои тренировочные данные:
- замените файлы примеров train.txt и validation.txt в папке собственными данными обучения, а затем запустите
python text2csv.py
. Это преобразует ваши файлы .txt в файлы csv с одним столбцом с заголовком «текст» и помещает весь текст в одну строку. Нам нужно использовать файлы .csv вместо файлов .txt, потому что загрузчик данных Huggingface удаляет разрывы строк при загрузке текста из файла .txt, чего не происходит с файлами .csv. - Если вы хотите передать модели отдельные примеры вместо одного непрерывного блока текста, вам необходимо упаковать каждый из ваших примеров в отдельную строку в файлах поезда и проверки csv.
- Будьте осторожны с кодировкой вашего текста. Если вы не очистите свои текстовые файлы или просто скопируете текст из Интернета в текстовый редактор, загрузчик данных из библиотеки наборов данных может их не загрузить.
Наконец, запустите эту команду, чтобы начать тонкую настройку:
deepspeed --num_gpus=1 run_clm.py \ --deepspeed ds_config.json \ --model_name_or_path gpt2-xl \ --train_file train.csv \ --validation_file validation.csv \ --do_train \ --do_eval \ --fp16 \ --overwrite_cache \ --evaluation_strategy="steps" \ --output_dir finetuned \ --eval_steps 200 \ --num_train_epochs 1 \ --gradient_accumulation_steps 2 \ --per_device_train_batch_size 8
- Эта команда запускает стандартный файл run_clm.py из примеров Huggingface с глубокой скоростью, всего с двумя добавленными строками, чтобы включить контрольную точку градиента для использования меньшего количества памяти.
- Обучение на примере Шекспира должно занять около 17 минут. При накоплении градиента 2 и размере партии 8 один шаг градиента занимает около 9 секунд. Это означает, что скорость обучения модели должна составлять почти 2 примера в секунду. Вы можете увеличить размер партии до 12 до исчерпания памяти, но это не дает никакого ускорения.
- Обратите внимание, что гиперпараметры оптимизатора Huggingface по умолчанию и гиперпараметры, заданные как флаг, перезаписывают гиперпараметры в файле ds_config.json. Поэтому, если вы хотите настроить скорость обучения, разминку и многое другое, вам нужно установить их как флаги для команды обучения. В качестве примера ниже вы можете найти обучающую команду GPT-NEO, которая изменяет скорость обучения.
4. Сгенерируйте текст с помощью доработанной модели
Вы можете протестировать свою доработанную модель GPT2-xl с помощью этого скрипта от Huggingface Transfomers (включен в папку):
python run_generation.py --model_type=gpt2 --model_name_or_path=finetuned --length 200
Или вы можете использовать его сейчас в своем собственном коде, чтобы генерировать текст в пакетах:
# credit to Niels Rogge - https://github.com/huggingface/transformers/issues/10704 from transformers import GPT2Tokenizer, GPT2LMHeadModel import torch device = 'cuda' if torch.cuda.is_available() else 'cpu' tokenizer = GPT2Tokenizer.from_pretrained('finetuned') tokenizer.padding_side = "left" tokenizer.pad_token = tokenizer.eos_token model = GPT2LMHeadModel.from_pretrained('finetuned').to(device) print("model loaded") # this is a single input batch with size 3 texts = ["From off a hill whose concave womb", "Another try", "A third test"] encoding = tokenizer(texts, padding=True, return_tensors='pt').to(device) with torch.no_grad(): generated_ids = model.generate(**encoding, max_length=100) generated_texts = tokenizer.batch_decode( generated_ids, skip_special_tokens=True) print(generated_texts)
- вывод модели работает даже на небольшом графическом процессоре или на процессоре без каких-либо дополнительных изменений
(Необязательно) Конфигурация
Вы можете изменить скорость обучения, снижение веса и разминку в качестве флагов тренировочной команды. Конфигурация DeepSpeed использует настройки по умолчанию, за исключением уменьшенного allgather_bucket_size и уменьшенного reduce_bucket_size, чтобы сэкономить еще больше памяти GPU. Прогрев и скорость обучения, указанные в конфигурации, игнорируются, так как скрипт всегда использует значения по умолчанию оптимизатора Huggingface. Если вы хотите перезаписать их, вам нужно использовать флаги. Вы можете проверить все объяснения здесь:
https://huggingface.co/transformers/master/main_classes/trainer.html#deepspeed
Остальные обучающие аргументы могут быть предоставлены как флаги, и все они перечислены здесь:
https://huggingface.co/transformers/master/main_classes/trainer.html#trainingarguments