Руководство: 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.
Требования
- Установите Google Cloud SDK: Нажмите здесь
- Зарегистрируйте учетную запись Google Cloud, создайте проект и настройте биллинг (только после того, как вы настроите биллинг, вы можете использовать кредит на регистрацию в размере 300 долларов для графических процессоров).
- Запросите увеличение лимита квоты для Все регионы GPU до 1. Вот - пошаговое руководство. Интерфейс немного изменился и теперь выглядит вот так.
- Войдите в систему и инициализируйте облачный 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)