Решил попробовать нейросеть, кое-что изучил и решил поделиться своим опытом.
Для начала перейдем в https://colab.research.google.com/, создадим свой блокнот для дальнейшей работы и настроим его для дальнейшего использования.
Создаем свой первый блокнот, среду выполнения выбираем GPU
Вставим код который проверит gpu, скачает минимальную модель нейросети, генерирует указанный нами текст Hello Kitty! с несколькими примерами
!nvidia-smi %tensorflow_version 1.x !pip install -q gpt-2-simple import gpt_2_simple as gpt2 from datetime import datetime from google.colab import files model_name = "117M" gpt2.download_gpt2(model_name=model_name) sess = gpt2.start_tf_sess() gpt2.load_gpt2(sess, model_name=model_name) gpt2.generate(sess, model_name=model_name, prefix="Hello Kitty!", length=150, temperature=0.7, top_p=0.9, nsamples=20, batch_size=20 )
Я думаю интуитивно понятно как она работает, жаль что язык только английский. Теперь давайте настроим нашу рабочую среду для дальнейшего использования
Нейросеть на базе gpu в colab дается корпорацией гугла на время, время аренды 12 часов, но по факту я получал максимум 7 часов. При обучении нейросети, связь с colab обрывается и приходится всё начинать с самого начала. Несколько решений по продолжению обучения, мы рассмотрим дальше.
Чтобы не прерывалась работа нейросети в colab, можно закинуть в консоль браузера небольшой скрип, который будет имитировать деятельность. Нажимаем CTRL+SHIFT+I выбираем консоль и вставляем код
function ConnectButton(){ console.log("Connect pushed"); document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click() } var colab = setInterval(ConnectButton,60000);
Жмем ENTER.
В firefox стоит ограничение на вставку в консоль браузера, решение — about:config, параметр devtools.selfxss.count выставить 100.
Этот скрипт позволит работать нейросети безпрерывно, однако через 2-3 часа гугл запросит капчу, но это лучше чем полный сброс
Когда случаются ошибки в сессии нейросети, при перезапуске кода, мне обычно помогала команда
sess= gpt2.reset_session(sess=sess)
По моим скромным подсчетам обучение в 1000 шагов занимает ~40 мин с gpu
На примере покажу как обучать нейросеть дзен буддизму, для этого я скачаю заготовленный файл 101 историю дзен в txt и закину файл себе на гугл диск. Приступим.
Проверяем наличие видеокарты
!nvidia-smi
Подгружаем модули
%tensorflow_version 1.x !pip install -q gpt-2-simple import gpt_2_simple as gpt2 import time from datetime import datetime from google.colab import files gpt2.download_gpt2(model_name="124M")
Монтируем наш гугл диск
gpt2.mount_gdrive()
Название файла на гугл диске по которому будет обучаться нейросеть, копируем его.
file_name = "101.txt" gpt2.copy_file_from_gdrive(file_name)
Старт сессии и начало тренировки, незабываем добавить скрипт для беспрерывной работы нейросети
sess = gpt2.start_tf_sess()
gpt2.finetune(sess, dataset=file_name, model_name='124M', steps=1000, restore_from='fresh', run_name='run1', print_every=10, sample_every=200, save_every=500 )
dataset — наш файл для обучения
model_name — модель, пока гугл позволяет использовать 124
print_every — печать прогресса обучения каждые 10 шагов
sample_every — результат обучения каждые 200 шагов обучения
steps — количество шагов обучения
После обучения модель лучше всего сохранить на гугл диск, т. к. после закрытия сессии будет всё удалено.
sess= gpt2.reset_session(sess=sess) gpt2.copy_checkpoint_to_gdrive(run_name='run1')
Можно посмотреть чему мы научили наше нейросеть, насколько она стала буддистом.
gpt2.generate(sess, run_name='run1')
Можно генерировать свои книжу 101 дзен история часть 2 и сохранить себе
gen_file = 'gpt2_gentext_{:%Y%m%d_%H%M%S}.txt'.format(datetime.utcnow()) gpt2.generate_to_file(sess, destination_path=gen_file, length=500, temperature=0.7, nsamples=101, batch_size=20 ) files.download(gen_file)
Время работы ограничено, а для нормального обучения требуется большего шагов обучения. Поэтому незабываем сохранять результат нашего обучения.
Продолжим обучение, скачаем с гугл диска наш результат и продолжим обучение с сохранением в n количество шагов.
Тут как обычно
!nvidia-smi %tensorflow_version 1.x !pip install -q gpt-2-simple import gpt_2_simple as gpt2 import time from datetime import datetime from google.colab import files gpt2.download_gpt2(model_name="124M") gpt2.mount_gdrive()
Качаем наш файл тренировки + чекпоинт сохраненный ранее, распаковываем его
file_name = "traine.txt" gpt2.copy_file_from_gdrive(file_name) gpt2.copy_file_from_gdrive('checkpoint_run1.tar') !tar -xvf 'checkpoint_run1.tar'
Завернём в цикл наш тренировочный скрипт с автосохранением каждые 1000 шагов
while True: sess = gpt2.start_tf_sess() sess= gpt2.reset_session(sess=sess) gpt2.finetune(sess, dataset=file_name, model_name='124M', steps=1000, restore_from='latest', overwrite=True, run_name='run1', print_every=10, sample_every=200, ) time.sleep(20) gpt2.copy_checkpoint_to_gdrive(run_name='run1') print('send to google ok!') print('send to google ok!') print('send to google ok!') time.sleep(20)
Основные параметры продолжения обучения
restore_from='latest' — восстановить последнюю сессию
overwrite=True — перезапись свежими данными, т. к. гугл диск не резиновых, а это позволит сохранять только последний результат
Когда достигли нужного уровня нейросети после обучения, можно заняться генерацией её творчества. Простой скрипт бесконечной генерации + сохранения на гугл диск
!nvidia-smi %tensorflow_version 1.x !pip install -q gpt-2-simple import gpt_2_simple as gpt2 import time from datetime import datetime from google.colab import files gpt2.download_gpt2(model_name="124M") gpt2.mount_gdrive() file_name = "traine.txt" gpt2.copy_file_from_gdrive(file_name) gpt2.copy_file_from_gdrive('checkpoint_run1.tar') !tar -xvf 'checkpoint_run1.tar' while True: sess= gpt2.reset_session(sess=sess) sess = gpt2.start_tf_sess() gpt2.finetune(sess, dataset=file_name, model_name='124M', steps=1, restore_from='latest', run_name='run1' ) gen_file = 'gpt2_gentext_{:%Y%m%d_%H%M%S}.txt'.format(datetime.utcnow()) gpt2.generate_to_file(sess, destination_path=gen_file, length=200, temperature=0.7, nsamples=2000, batch_size=20 ) gpt2.copy_file_to_gdrive(gen_file) print('file send 2 google drive')
Описывать ничего не буду, только скажу что без тренировке и сбросе сессии завернуть генерацию историй в бесконечный цикл не получилось
Пусть 774M только на английском языке, но она круто обучена, а переводчик никто не запрещает использовать.
!nvidia-smi %tensorflow_version 1.x !pip install -q gpt-2-simple import gpt_2_simple as gpt2 from datetime import datetime from google.colab import files model_name = "774M" gpt2.download_gpt2(model_name=model_name) sess = gpt2.start_tf_sess() gpt2.load_gpt2(sess, model_name=model_name) gpt2.generate(sess, model_name=model_name, prefix="I LOVE YOU!", length=150, temperature=0.7, top_p=0.9, nsamples=140, batch_size=20 )
pip3 install gpt-2-simple
Установка + обучение в домашних условиях (не рекомендуется)
import gpt_2_simple as gpt2 import os import requests model_name = "124M" if not os.path.isdir(os.path.join("models", model_name)): print(f"Downloading {model_name} model...") gpt2.download_gpt2(model_name=model_name) # model is saved into current directory under /models/124M/ file_name = "shakespeare.txt" if not os.path.isfile(file_name): url = "https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt" data = requests.get(url) with open(file_name, 'w') as f: f.write(data.text) sess = gpt2.start_tf_sess() gpt2.finetune(sess, file_name, model_name=model_name, steps=100) # steps is max number of training steps gpt2.generate(sess)
Лучше обучить нейросеть в colab, и залить её на пк через гугл диск, как описывалось ранее, файлы закинуть в checkpoint\run1\
Вот так можно генерировать текст у себя на пк
import gpt_2_simple as gpt2 from datetime import datetime sess = gpt2.start_tf_sess() gpt2.load_gpt2(sess) gen_file = ('trulala') gpt2.generate_to_file(sess, destination_path=gen_file, length=100, temperature=0.7, nsamples=1000, batch_size=20 )
И напоследок я хочу сказать "Дзен поступить в другой мире. Гуду сел возле немного денег, поэтому она проснула ему"