Обучение нейросети или стресс тест для домашнего ноутбука.
ПОСТ БЕЗ КАРТИНОК. Только текст.
Посмотрев на всю эту движуху вокруг нейросетей, я подумал обучить свою комнатную нейросеть. Сразу скажу, что я понимаю, что мое железо технически не сможет потянуть обучение модели на биллиона параметров, НО такой задачи в принципе и не ставится - это скорее технологический интерес. Так вот, собственно сам алгоритм нейронки было принято решение писать на Rust, потому что.
Во-первых, так быстрее, чем на C++ и более полная возможность следить за памятью, чем если бы все писалось на питоне, да и по времени ушло намног меньше, чем на том же питон с numpy.
Во-вторых, производительность питона пока оставляет желать лучшего, несмотря на то что его все время ускоряют, минимизируют и портируют бингдинги к другим языкам.
В-третьих, для эксперимента, Почему нет?
Ладно. Первый шаг уже выполнен, потребовалось полдня, чтобы это провернуть, остается подбор датасетов и обучение алгоритма. Но это только токенизатор, надо помнить, что прежде чем писать сам алгоритм нейронки, нужно хотя бы мизерно обучить токенизатор. Передо мной в этом случае стояла цель приблизить понимание токенизатором 2 языков так, чтобы один русский символ читался как один английский символ, то есть а(русская) -> 1 токен на выходе.
Согласен, что задача странная, но в полне выполнимая. 4.5 часа на обучение и токенизатор начал считать российские символы как это надо мне, а не как принято в стандартах других нейросетей.
Токенизатор немного обучили. Пишем нейронку. Ну, тут в целом ничего сложного, достаточно скопировать готовый код и адаптировать под себя, и можно обучать алгоритм.
Скажу сразу. Если токенизатору достаточно только скормить датасет, например wiki text на 2 языка и он в целом все вкурит, то с самим поносом нейронки дела уже обстоят сложнее. Что нам нужно? Описанный корпус, стартово у меня он на 39мб(в последствии его нам не хватит и придётся написать корпус на 309мб). Скармливаем нашему алгоритму готовые пары слов и предложений(уникальные). В моем случае получилось ~12000+ уникальных пар и смотрим промежуточные результаты.
Первая генерация, после 39 заходов обучения(эпоха) “Привет, как при при” Как видим, нейронка уже начинает выдавать что-то осмысленное, но при этом проглатывает желаемые слова и падает в повтор. Учим дальше 69 эпоха: “Привет, как дела” Как мы видим, уже что-то вырисовывается, но мне этого недостаточно. Так как изначальное название статьи было “GPT учит GPT быть GPT”, я продолжаю колдовать с данными и через еще не колько генераций, нейросеть начинает выдавать осмысленный текст из Википедии, почти без ошибок. ~80 эпоха: “1990 год …”, за точной фразой тут я не следил, поэтому не запомнил.
Ладно. Пока нейронка обучается, я решил на базе того что уже имеется, сделать более прикладные штуки, например заставить нейронку настраивать мою гитару. Это, конечно, утрировано но тем не менее, я решаю вокруг нейронки наколдовать простой тюнер, для чего беру дата ет со всеми нотами и строями с Hugging Face и скармливаю нейротюнеру весь этот датасет, в котором на минуту почти 30000 звуков и описаний нот разной высоты, для разных инструментов и в целом мне это удается, несмотря на то, что вся конструкция падала несколько раз на фазе мерджа обработанных данных и приходилось попутно фиксить баги в коде.
Итог. Основная нейронка второй день обучается, но уже на её базе готов продукт, чем-то похожий на продукты от компаний Polychrome и Neural, правда урезанный, который остается только качественно протестировать - чем я займусь когда основной алгоритм нейросети закончит обучение.
Кому интересно, вот моё железо Intel Core I5-10300H Nvidia GeForce GTX 1650 4GB vRAM 32 GB RAM
Всем спасибо.
Как все будет готово, следующим постом ссылку на гит выложу и на задеплоенный сервис.
Пока в планах только обкатать всю нейронку в целом и проверить че она уже умеет.
P.S. Как я и писал, потребовалось расширять корпус, но при этом и на 309мб корпусе тоже не все весело и радостно. Проблемы с индексацией и медленная обработка и OOM