Мне нужно было настроить модель параметров GPT2 1,5 миллиарда для проекта, но модель не подходила для моего графического процессора. Итак, я понял, как запустить его с высокой скоростью и градиентными контрольными точками, что уменьшает требуемую память графического процессора.

Я надеюсь, что это руководство поможет некоторым людям, которые также хотят настроить GPT2, но не хотят настраивать распределенное обучение.

Вы можете найти репозиторий с самой последней версией руководства здесь.

1. (Необязательно) Настройте виртуальную машину с V100 в Google Compute Engine.

Примечание. Модель работает на любом сервере с графическим процессором, не менее 16 ГБ видеопамяти и 70 ГБ ОЗУ.

Требования

  1. Установите Google Cloud SDK: Нажмите здесь
  2. Зарегистрируйте учетную запись Google Cloud, создайте проект и настройте биллинг.
  3. Запросите увеличение квоты для «GPU All Regions» до 1.
  4. Войдите в систему и инициализируйте облачный 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