Решил попробовать нейросеть, кое-что изучил и решил поделиться своим опытом.
Для начала перейдем в 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
)
И напоследок я хочу сказать "Дзен поступить в другой мире. Гуду сел возле немного денег, поэтому она проснула ему"