Руководство: Finetune GPT-NEO (2,7 миллиарда параметров) на одном графическом процессоре с Huggingface Transformers с использованием DeepSpeed

GPT-NEO - это серия языковых моделей от EleutherAI, которая пытается воспроизвести языковую модель OpenAI GPT-3. Текущие модели EleutherAI (1,7 миллиарда и 2,7 миллиарда параметров) еще не так велики, как самая большая модель OpenAI GPT-3 Davinci (175 миллиардов параметров). Но в отличие от моделей OpenAI, они бесплатно доступны для тестирования и настройки.

Тонкая настройка больших языковых моделей, таких как GPT-NEO, часто бывает сложной, поскольку эти модели обычно слишком велики, чтобы поместиться на одном графическом процессоре.

В этом руководстве объясняется, как точно настроить GPT-NEO (параметры 2.7B) с помощью всего одной команды библиотеки Huggingface Transformers на одном графическом процессоре.

Это стало возможным благодаря использованию библиотеки DeepSpeed ​​и контрольных точек градиента для снижения необходимого использования памяти графическим процессором модели за счет обмена с оперативной памятью и вычислениями.

Я также объясняю, как настроить сервер в Google Cloud с графическим процессором V100 (16 ГБ видеопамяти), который вы можете использовать, если у вас нет графического процессора с достаточным количеством видеопамяти (12+ ГБ) или если у вас недостаточно Оперативная память нормальная (60 ГБ +).

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

Примечание. Модель GPT-NEO работает на любом сервере с графическим процессором с объемом видеопамяти не менее 16 ГБ и 60 ГБ оперативной памяти. Если вы используете свой собственный сервер, а не описанную здесь настройку, вам необходимо установить на нем CUDA и Pytorch.

Требования

  1. Установите Google Cloud SDK: Нажмите здесь
  2. Зарегистрируйте учетную запись Google Cloud, создайте проект и настройте биллинг (только после того, как вы настроите биллинг, вы можете использовать кредит на регистрацию в размере 300 долларов для графических процессоров).
  3. Запросите увеличение лимита квоты для Все регионы GPU до 1. Вот - пошаговое руководство. Интерфейс немного изменился и теперь выглядит вот так.
  4. Войдите в систему и инициализируйте облачный SDK с помощью gcloud auth login и gcloud init и следуйте инструкциям, пока не будете настроены.

Создать ВМ

  • Замените YOURPROJECTID в приведенной ниже команде идентификатором проекта из вашего проекта GCE.
  • Вы можете добавить флаг --preemptible к команде ниже, это снизит ваши затраты примерно до 1/3, но затем Google сможет закрыть ваш экземпляр в любой момент. На момент написания эта конфигурация стоила всего около 1,28 доллара в час в GCE при использовании вытесняемого компонента.
  • Вы можете изменить зону, если нет доступных ресурсов. Здесь - список всех зон и наличие в них графических процессоров V100. В зависимости от времени суток вам может потребоваться попробовать несколько.
  • Нам нужен сервер с графическим процессором, по крайней мере, с 60 ГБ ОЗУ, иначе запуск завершится с ошибкой, когда скрипт захочет сохранить / обработать модель. Эта настройка ниже дает нам максимально возможный объем оперативной памяти с 12 ядрами ЦП в GCE (без платы за расширенную память). Вы также не можете использовать более 12 ядер ЦП с одним графическим процессором V100 в GCE.

Запустите это, чтобы создать экземпляр:

gcloud compute instances create gpuserver \
   --project YOURPROJECTID \
   --zone us-west1-b \
   --custom-cpu 12 \
   --custom-memory 78 \
   --maintenance-policy TERMINATE \
   --image-family pytorch-1-7-cu110 \
   --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 --zone=us-west1-b

Не забудьте выключить сервер, как только закончите, иначе вам будут продолжать платить за это. Сделать это можно здесь.

В следующий раз вы можете перезапустить сервер из того же веб-интерфейса здесь.

2. Скачайте скрипт и установите библиотеки.

Запустите это, чтобы загрузить сценарий и установить все библиотеки:

git clone https://github.com/Xirider/finetune-gpt2xl.git
chmod -R 777 finetune-gpt2xl/
cd finetune-gpt2xl
pip install -r requirements.txt

(Необязательно) Если вы хотите использовать Wandb.ai для отслеживания экспериментов, вам необходимо авторизоваться:

wandb login

3. Finetune GPT-NEO (2,7 миллиарда параметров)

Добавьте свои собственные данные для тренировок, если вы не хотите тренироваться по приведенным примерам Шекспира:

  • Если вы хотите использовать свои собственные данные обучения, замените в папке примеры файлов train.txt и validation.txt своими собственными данными обучения с такими же именами, а затем запустите python text2csv.py. Это преобразует ваши файлы .txt в файлы csv с одним столбцом с «текстовым» заголовком и поместит весь текст в одну строку. Нам нужно использовать файлы .csv вместо файлов .txt, потому что загрузчик данных Huggingface удаляет разрывы строк при загрузке текста из файла .txt, чего не происходит с файлами .csv.
  • Если вы хотите кормить модель отдельными примерами, а не одним непрерывным блоком текста, вам нужно упаковать каждый из ваших примеров в отдельную строку в файлах поезда и проверки csv.
  • Будьте осторожны с кодировкой вашего текста. Если вы не очищаете текстовые файлы или просто копируете текст из Интернета в текстовый редактор, загрузчик данных из библиотеки наборов данных может не загрузить их.
  • Обязательно войдите в wandb.ai с wandb login или полностью удалите его. В противном случае это может вызвать ошибку памяти во время выполнения.

Затем запустите обучение, запустите эту команду:

deepspeed --num_gpus=1 run_clm.py \
--deepspeed ds_config_gptneo.json \
--model_name_or_path EleutherAI/gpt-neo-2.7B \
--train_file train.csv \
--validation_file validation.csv \
--do_train \
--do_eval \
--fp16 \
--overwrite_cache \
--evaluation_strategy="steps" \
--output_dir finetuned \
--num_train_epochs 1 \
--eval_steps 15 \
--gradient_accumulation_steps 2 \
--per_device_train_batch_size 4 \
--use_fast_tokenizer False \
--learning_rate 5e-06 \
--warmup_steps 10
  • При этом используется меньший параметр allgather_bucket_size в файле ds_config_gptneo.json и меньший размер пакета для дальнейшего уменьшения памяти графического процессора.
  • Я попробовал эти гиперпараметры, и они у меня сработали. Но если вы хотите их изменить, вы можете попробовать гиперпараметры ближе к исходной конфигурации обучения EleutherAi. Вы можете найти их здесь.

4. Создайте текст с помощью модели GPT-NEO с 2,7 миллиардами параметров.

Я предоставил скрипт, который позволяет вам интерактивно запрашивать вашу модель GPT-NEO. Если вы просто хотите взять сэмпл из предварительно обученной модели, не настраивая ее самостоятельно, замените «finetuned» на «EleutherAI / gpt-neo-2.7B». Начните с этого:

python run_generate_neo.py finetuned

Или используйте этот фрагмент для создания текста из вашей точно настроенной модели в своем коде:

# credit to Suraj Patil - https://github.com/huggingface/transformers/pull/10848 - modified
from transformers import GPTNeoForCausalLM, AutoTokenizer
model = GPTNeoForCausalLM.from_pretrained("finetuned").to("cuda")
tokenizer = AutoTokenizer.from_pretrained("finetuned")
text = "From off a hill whose concave"
ids = tokenizer(text, return_tensors="pt").input_ids.to("cuda")
max_length = 400 + ids.shape[1] # add the length of the prompt tokens to match with the mesh-tf generation
gen_tokens = model.generate(
  ids,
  do_sample=True,
  min_length=max_length,
  max_length=max_length,
  temperature=0.9,
  use_cache=True
)
gen_text = tokenizer.batch_decode(gen_tokens)[0]
print(gen_text)