Pull to refresh

Нейронные сети, целый зоопарк друзей

Level of difficultyEasy
Reading time13 min
Views6K

Приветствие

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

Явно описывать как из России сейчас подключиться к Канаде с использованием заветных трех букв , и подтверждение аккаунта с зарубежного номера(спасибо коллегам), и тому подобные телодвижения смысла не вижу, так как вероятно следующие за прогрессом уже давно все это перепробовали, и убедились что да, ChatGPT ответит на ваши заветные вопросы ответом типа: я лишь реализация нейронной сети созданная для возможностей развития, и тому подобное, а позже и облегченно выдохнули, мол время еще есть не такой умный уж код она и пишет, за работу можно(или нет?) не переживать... Статья направлена на то чтобы сократить или перенаправить на большую продуктивность время соискателя знаний в этом направлении.

Самое начало

В первые с нейронными сетями я столкнулся еще очень давно, при чтении книги:

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

В последующие годы полученные знания о перцептроне были успешно прикручены где только можно от ай в играх, до попыток решения сложных рутинных задач, а так же написании ботов об этом более подробно в других статьях. Вообщем по перцептрону очень рекомендую эту книгу. В ней, так-же присутствует отличный пример реализации генетического алгоритма с пояснениями, который кстати участвует в WANN и много чего еще, Тиму Джонсу от меня большая благодарность. Пример из книги присутствует в моем репозитории, ссылка в конце статьи.

Следующими я изучал способы обучения(с учителем/без), кроме информации от одного из разработчиков тут скорее использовать проще google или статьи тут же на Хабре, таковых очень много приводить не буду, однако по работе сверточных сетей очень долго искал какого-то визуального представления, нашел где-то на сайтах по пути, видео этот процесс невероятно классно иллюстрирующее, могу дать ссылку на него в моих закромах в контакте. Еще можно на github посмотреть open source проекты на родном вам языке реализующие эти самые подходы обучения.

Огромные прыжки в будущее

Первой большой библиотекой нейронных сетей которую я применил стала TensorFlow, ее я прикрутил на java к проекту, в котором с другом применял ее для распознавания изображений, тут же поизучал преобразование самих изображений для улучшения результатов распознавания(ну там сделать черно белым, ну и вы знаете).

Пока я писал небольшой проектик с очередным перцептроном на Spring, для доступа по Rest к беку с бд для хранения примеров и весов, как метеорит в медиа пространство ворвалась информация сначала о StableDifusion(про запуск в docker в полезных ссылках ниже), Midjourney, а чуть позже и ChatGPT от OpenAI. Первым делом я конечно же сгенерировал локально несколько многоголовых и многопальцевых гуманойдов на фоне Cyberpunk City, и принялся погружаться в ролевые рассказы о Warhammer 40000 в ChatGPT. Но как только мои всё возрастающие интересы разбились об ограничения данных решений, я познакомился с урезанными клонами в Telegram(@gpt3_unlim_chatbot), и уже начал было мечтать о оцифровке своего сознания(ну или хотя бы его иллюзии) с целью получить таки наконец-то своего клона Д.Ж.А.Р.В.И.С. (яндекс алиса железного человека), до этого уже были подобраны инструменты с Text to speech, и убраны на полочки гитхаба.

Перед тем как Вы отправитесь себе инсталлировать всякие там Pytorch и Cuda а так-же pip, и пока еще не потонули в том что оказывается разные релизы разных библиотек нейронного обучения зависят, и или совместимы с различными комбинациями версий этих библиотек и их компонентов, сразу прошу, попридержите коней, остудите пыл и почитайте про .env в python, это позволит вам не возвращаться по десять раз к локальной переустановке, предыдущих установленных сетей. В последствии при необходимости развернуть что либо локально, я так и делал, пока не наткнулся на то что уже когда-то использовал: conda. В любом случае, мне показалось более удобным управление окружением с помощью двух команд, создание: conda create -n test python=3.10.0 и активация среды conda activate test. Еще один момент в том, как мне стало ясно дальше, что в целом безопасность пк начнет то там то тут испускать пар во все стороны, потому что вовлекшись в этот увлекательный процесс вы рискуете как и я начать тащить себе готовые библиотеки и решения(зачастую бинарники) чтобы их скорее поизучать без оглядки на безопасность... Безопасность информации и уязвимостей.

Среды и окружение

Я долго шел к этому, в той же llama.cpp я не сразу заметил пункты про docker да и не мудрено, почитав про llama.cpp я увидел упоминания переноса вычислений на GPU от чего сразу решил что вероятно это тогда точно сугубо локальное решение, и ни о какой alpaca конфетке под RaspberryPi (например) речи не может идти. Каким же было мое удивление, когда я наткнулся на это и тут все стало ясно, docker - наше все, никакие .env не нужны, image можно хранить и делать с ним все аля cd/dvd-R диск из прошлого, далее было вникание как развернуть то или иное решение в docker.

Alpaca, llama, cobold и прочие звери

Скорость мирового прогресса все ускоряется несмотря на окончание прогресса развития уменьшения транзисторов для чипов процессоров, и уже думаю где-то на пол пути ко скорости света, ровно с таким ощущением, воспринимаются появляющиеся кучи продуктов с крутыми фичами.

Наверно у всех java developer-ов, одним из первых поисковых запросов при знакомстве с СhatGPT стал поиск java решений для работы с OpenApi, что не проблема Baeldung(пример) из java, еще пример.

Появился интерес к автономным решениям в этих областях, тут конечно же всплыли alpaca, llama.cpp (coboldcpp и другие обложки) ,обязательно не забудьте про vicuna и другие нецензурированные модели - полномасштабно с описанием сражений без них Warhammer 40000 вам не ощутить.

В процессе изучения стало понятно что ChatGPT хранит историю запросов ответов, не очень заботясь о том знает ли об этом пользователь, чтобы так - же работать с большинством других моделей(alpaca, vicuna) нужна интерфейс оболочка реализующая такую память, но опять-же как я понял данная память ограничена глубиной = количеству токенов, и опять же эту глубину можно победить(освободить) переобучением модели, если не ошибаюсь. В продуктиве я больше работаю на java (но и к c# с с++ и python норм отношусь, но то в какую лепешку наступаешь при вхождении в IT первой прилипает как-то по особенному) так что стали интересны решения в интернете для реализации своей системы запоминания, истории сообщений от пользователя к чату и его ответов пользователю, именно на этих или около с минималкой языках, нашел некоторые примеры, зачастую правда там доступ ведется в консоль, но мне удобнее будет взаимодействовать с сетью по Rest как у OpenAI. При использовании автономных моделей появляется желание реализовать данную функциональность - восстановление истории чата с каждым новым обращением, например через хранение в БД, про это если интерес у читателя не пропадет и будут положительные комментарии напишу в следующих статьях.

И конечно же возникает желание визуализации своей личности в модели (как это провернули авторы определенных моделей, спросив у таких моделей кто ты, вы получите ответ что это например молодой ученый из гарворда...), с такими желаниями возникает необходимость разобраться в том что же такое эта ggml, и чем отличается от других форматов моделей процесс обучения такой на наборе данных в json, сам еще в процессе погружения но выше привел пару ссылок. С перебором моделей привлекают внимание, и порождают вопросы к примеру такие q_5 формулировки (квантование) в их названиях, объяснения в видео по ссылкам далее. Всплывает догадка о настройках весов и том что в этом может крыться суть разницы форматов и подходов к обучению, из которых вытекают разница по времени обучения, а так-же разное количество узлов связей при разных подходах. Большее число узлов связей решающее одну и ту же проблему, вероятно требует больший ресурс железа а так-же затрат по времени как при использовании так и при обучении.

В итоге только за невозможностью оплатить доступ к официальным инструментам от бесплатной(по изначальной задумке создателей) OpenAI, и отсюда вытекающей блокировке доступа к официальным инструментам для модификации моделей: простые и классные инструкции вроде этой - переносим свою картину мира в чат бота, зачастую становятся неприменимыми, однако без необходимости внесения денег это все еще возможно и доступно например в H2O и других решениях, но в основном для автономных решений, дообучение с переходом на другой язык(один из примеров).

Интересные ссылки:

Видео демонстрация процесса запуска некоторых из ниже приведенных проектов:

LLAMA.CPP in docker (vicuna):

MPT-30B on CPU in docker:

RCV-Project in docker:

LocalGPT in docker:

Audiocraft in docker:

H2O on docker:

  1. Для ознакомления с alpaca, рекомендую: тут отличная статья про настройку, тут статься про установку на свой сервер, но все же мне зашло только после просмотра нескольких роликов на youtube, впервые запустил способом ниже.

  2. Alpaca-electron cpu версия ChatGPT(запуск, через простой .exe инсталлятор), при затруднении много обучений на youtobe.

  3. Alpaca.http, тут интересно и ближе всего к цели, но я все таки использовал подход по ссылке со страницы самой alpaca.

  4. Aider для генерации кода, мне к сожалению не подошел пока!?, из-за необходимости сидеть под VPN. Нужно ли... но docker ).

  5. Quivr(колчан!?) еще одно приложение для обработки своих файлов с подключением к OpenAI, но так-же с возможностью offline обработки, за счет ваших моделей. Инструкция в видео. Хранение данных происходит в free Supabase.

  6. KoboldAI, качаем релиз, запускаем exe-шник, и указываем ранее загруженную модель, он так же заботливо сообщит если та устарела. Как запустится, после сообщения (так было у меня) жмем Enter и переходим: browser: http://localhost:5001/# , swagger: http://localhost:5001/api/latest/docs/ ,ну а с rest вы знаете что делать) официальный образ docker.

  7. OOBABOOGA интересное решение, схожее с описанным выше, у решения имеется web_ui, и так-же его можно развернуть в docker

  8. H2O.ai так-же включает инструментарий по переобучению и с возможностью дозагрузки индивидуальных документов для корректировки ответов сети. Вот свзяка статья инструкция, + пример dockerfile. Docker есть еще и в репозитории в придачу вроде есть реализация rest. Я запускал в docker. В этом решении java доступна из коробки, как и разные инструменты (transformers).

  9. LocalGPT расширяющий privateGPT предоставляет локальный доступ к моделям как от hf(GPU) так и ggml, включает в себя рабочий код для автоматической выгрузки моделей с сайта hf, позволяет загружать свои документы. Видео с инструкцией локального запуска от автора. Может работать как на GPU так и на CPU, по умолчанию GPU, переключение на CPU потребует закомментировать код. Я думал автоматизировать это в forked но отказался так как автоматом тяну последнюю версию при сборке в docker.

  10. TelegramChatGPT3 telegram бот, с персонализацией, и возможностью исполнения кода на ChatGPT.

  11. RVC-project инструмент для обработки голоса, видео, так-же есть у меня в docker.

  12. Ссылка на docker файл как пример для основы, контейнера с бесплатным генератором музыки Audiocraft. Не в docker, я запускал так: стянул себе, открыл корневую папку в visual studio, далее вот по этому видео. FFMPEG. Пока возился с зависимостями заметил что другой автор опубликовал docker-compose правда из коробки стоит непробиваемый порт, да и у меня к сожалению видеокарты не видит. Есть еще такой. Запустил, зависимости явно лишние есть, но мне было не критично + с новыми обновлениями их явно надо будет докручивать, docker.

  13. Для speech-to-text(! и наоборот) есть Whisper и вот тут про оптимизацию для русского языка, его так-же лучше развернуть в docker. Docker в моем репозитории. Мои старые заранее заготовленные варианты тут же отвалились сами собой).

  14. Запуск StableDifusion в docker за 2 команды (http://localhost:7860/).

  15. Увидел интересное видео с инструкцией запуска модели 30B локально только на CPU, в репозитории автора, есть упоминание рекомендации запускать в докер, но самого dockerfile(запускал на видео) нет, первоначально я запускал по его инструкции, и столкнулся с невидимым текстом ответов.

  16. llama.cpp или go (внимание, после обработки модели для go даже в 7 у меня занимали 25 ГБ на носителе(так-же вроде пока не поддерживается квантование)), тут можно скачать готовый release и по инструкциям из этой классной статьи запускать. Но так как я рассматривал ее в связке с доступом из java, и в конечном счете предлагал использовать docker, то давайте пробовать запустить ее в контейнере, попутно настроим систему и под другие сети в будущих контейнерах.

  17. На текущий момент самой на мой взгляд удобной локальной автономной оболочкой с API для доступа к своему ChatGPT является Jan. Репозиторий.

  18. Десктопный лучший и уже долго существующий вариант(только меняйте модели) Gpt4All.

Запуск llama.cpp в docker, в Windows 10:

Книга, от авторов. Примечательно что до того как мы будем выполнять какие либо действия с dockerfile, понадобится проделать множество всяких настроек окружения, проект который возьмем за основу с гитхаба, в частности пока выполнял настройки у себя, все описывал в README.md, если что то вдруг пропустил в статье.

Еще немного от себя, после запуска docker, рекомендую изменить в настройках место хранения образов, так как я часто пересобираю их, чтобы не убивать ssd использую для них папку на hdd. Идеальным вариантом для меня в итоге стало размещение папки model на диске ssd, и комментирование строчки затягивания модели в образ docker, с последующим запуском с учетом volume, пример запроса для той же llama(просто пример):

docker run -dit --name llama-cpp-container -p 221:22 -v D:/Develop/NeuronNetwork/llama_cpp/llama_cpp_java/model/wizardLM-7B.ggmlv3.q4_0.bin:/home/llama-cpp-user/model/wizardLM-7B.ggmlv3.q4_0.bin --gpus all --shm-size="12gb" --restart unless-stopped llama-cpp-container:l atest

Первым делом устанавливаем Docker.

  1. В проекте открываем readme:

    видим что порядок команд там под линукс заточен, и размещен по bash скриптам, спасибо создателю, но нам это не нужно, выковыриваем команды из bash скриптов:

    docker build -t llama-cpp-container .

    docker run -dit --name llama-cpp-container -p 221:22 --gpus all --shm-size="12gb" --restart unless-stopped llama-cpp-container:l
    atest

    внимательно читайте логи какие либо удаленные репозитории могут отказаться грузиться без vpn, но на момент написания статьи все доступно.

    далее контейнер запущен.

  2. Но в нем нет модели ggml так как строки подгрузки ее с сайта закомментированы в dockerfile. я добавил в корневую папку рядом с dockerfile папку model и скопировал туда ранее скачанную модель ссылки на модели с которыми экспериментировал: vicuna, alpaca качаем .bin, с другими по аналогии. Так как процесс развития моделей скорости звука подобен, рекомендую под свежими youtube роликами, одноименных тематик, подсмотреть более свежие ссылки.

    Не забываем что есть конвертер моделей из одной в другую.

  3. Далее в dockerfile я добавил в строку 64 инструкцию для копирования в образ модели COPY ./model/ggml-gpt4-x-vicuna-13b-q5_1.bin /llama

  4. Снова выполняем build и run, потом по инструкции от автора когда видим в Docker UI что контейнер запущен, выполняем подключение:

    docker container attach llama-cpp-container

  5. Далее запускаем командой:

    ./main -i --interactive-first -r "### Human:" --temp 0 -c 2048 -n -1 --ignore-eos --repeat_penalty 1.2 --instruct -m /ggml-gpt4-x-vicuna-13b-q5_1.bin

  6. Пример dockerfile.

Вот так выглядело первое общение, контейнер запущен в docker. llama может переработать не все модели, обновил ссылки выше на vicuna рабочей версии.
Вот так выглядело первое общение, контейнер запущен в docker. llama может переработать не все модели, обновил ссылки выше на vicuna рабочей версии.

В моем случае был нужен апгрейд памяти ноутбука, вся оперативка помимо смысловой нагрузки альпаки съедалась еще и докером (однако до апгрейда все еще мог запустить alpaca-electron).

Другие сети запускаются схожим образом.

Мысли и идеи бонусом от меня
  1. Наборы вопросов и ответов для персонализации или конкретизации модели в процессе переобучения, можно получить опять же от с превеликим удовольствием предоставившего ChatGPT.

  1. На вопрос, к ChatGPT а ты можешь выступить в роли функции для оценки эффективности результатов принятого решения другой нейронной сети(возможно моих любимых перцептронов) для коррекции ее подборки правильных ответов(обучение без учителя), чат ответил: да я могу выступить в этой роли однако следует понимать что я не являюсь экспертом в этой области. Мои мысли тут: оператор(как в матрице), загрузить программу обучения для оценки эффективности.

  1. Последним backend решением будет то которое предоставит чатам на подобие alpaca доступ к файловой системе машины, и которой станет возможно управлять посредством текстового общения(ну или speech to text), поприветствуйте новую операционную систему.

  2. Чувство, с которым все практически всегда соглашаются, что в детстве время шло медленнее, и изучение нейронных сетей, привело меня к мысли(не факт что она правильная), если сказать по простому: со временем/возрастом база данных примеров человека несказанно расширяется за счет его опыта и воспоминаний, а так-же ассоциаций и связей между событиями/мыслями и их взаимозависимостей (ведь мозг перегруппирует свою структуру относительно частоты использования той или иной информации), но вот скорость обработки этой информации (кстати я тут так-же считаю что многое зависит от способа получения и комбинации входящей информации/происходящих событий), остается или неизменной или изменяется незначительно, а с возрастом может даже понижается. Это приводит нас к так можно сказать состоянию "подвисания" в котором мы думая о чем-то просто забываем/теряем чувство течения времени, а выполнив умственную задачу оказываемся возвращаясь в состоянии готового восприятия "пропустив некий временной участок". Иными словами подаренный при рождении новейший компьютер, со временем упирается в тактовую частоту нашего (однопоточного) процессора и скоростные характеристики, а так-же пропускную способность ввода вывода остального оборудования. Очень жду нового от WANN наверняка тут мы получим информацию о том как улучшить нашу систему образования(дефрагментация?). А быть может, и в области психологии и лечения появится возможность путем переобучения человека восстанавливать/блокировать утерянные клочки памяти, за счет их перестроения еще более изощренными способами.

Интересные инструменты для реализации UI для текстового чата:

Так или иначе что-то подобное повсеместно изобретается, но мне интересны java и c# а так-же автономность решения.

В настоящее время остановился на изучении WANN, как всегда все доступно с набросков.

Конец статьи

Большая часть из описанных мной решений или какая либо информация скорее всего присутствует в моем репозитории, ссылка на сайте портфолио.

Статью на текущий момент решил не продолжать обновлять, таким будет мой первый выход на хабре. Инструменты будут дальше развиваться и она вероятно скоро устареет, но то что я предлагаю вынести нам из пройденного пути, все что так или иначе связано с нейронными сетями сейчас и я думаю дальше будет всегда выражено весами. Просто то в каком удобном варианте для их скорейшей и эффективной обработки они будут храниться вероятно будет меняться. Далее предлагаю с вашего любимого языка поизучать процесс подготовки информации для обучения, я еще раз поделюсь ссылкой на видео которое было для меня ближе всего к тому чтобы начать работать на близких мне языках с автономными моделями нейронных сетей и перейти к дальнейшим экспериментам с promt. Ну а от меня готовое к приведенной в ролике инструкции решение в виде docker и обвязки, достаточной чтобы побаловаться. Ну а для java ближе H2O выше в подробностях есть ссылки. На здоровье, если нужно, красоту наведете сами под себя(конечно придется еще почитать про python и FastApi, но я чтобы достичь цели еще и go, js поприменял, так что несложно). Ну и еще один ролик:

В целом после погружения, в какие либо мне интересные тонкости, желание оцифровать себя сменилось множеством других идей, не так то уж оно и сложно оказывается, спасибо конечно исследователям в этих областях кто нас двигают. Во всем этом, я по прежнему вижу знакомое и понятное слово vector, в котором нынче вместо: 0 - число врагов, 3 - состояние здоровья и т.п, есть куча иных значений {0.039586, -095867, 7667548}, обозначающих "истинное" смысловое значение - определяемое сложными математическими подходами(с использованием transformers), которые поизучал при встраивании своей информации, затронув инструменты "обнимающего лица" ) и другие, все это свойственно всем сферам нейронных сетей(текст, звук изображение...). Новым, и довольно логичным было то что близкие значения определяют схожесть "зашитого значения", вспомнил что когда читал книги про цифровое зрение, такая информация мне попадалась. Очень интересно что ПОИСК(ну естественно много тонкостей в этом слове если копать глубже) в сети с легкостью маскируется под практически неотличимую от человека OpenAI, ну пока не начнешь копать в глубину при общении конечно же. Например число акцентированных к запоминанию мельчайших условий ломает ответы чата, однако при общении я нашел способы его научить это обходить. Думаю дальше конечно будет интереснее. SQL против человеческой речи... Слова. Создатели толковых словарей. Это все так увлекательно и интересно. Очень рад что застал именно это столетие. Оно у нас особенно разнообразно на события.

Процитировать не смогу, но своими словами, где-то услышал выражение(или что-то похожее):

Если у меня есть яблоко и я дам его тебе, то яблоко будет у тебя, а у меня нет. Но если у меня есть идея и я дам тебе эту идею, то у нас у обоих будет по идее. Так что рад поделиться, и еще больше рад если вы свою полученную идею не выбросите в урну.

Спасибо, и всем хорошего дня.

Tags:
Hubs:
Total votes 3: ↑2 and ↓1+1
Comments4

Articles