Pavel Zloi
1.36K subscribers
474 photos
42 videos
2 files
732 links
Моя миссия — сделать нейросети доступными каждому

AI/ML, MCP, MLOps, LLM, GPT, GNN, NLP, GCN, Python, AWS, Linux, DevOps

Ссылки:
https://rpa.icu/
https://pay.cloudtips.ru/p/937f48ac
https://github.com/EvilFreelancer
https://dzen.ru/a/ZGI0ytgNQUkpkIME
Download Telegram
Pavel Zloi
Сегодня впервые в жизни я стал обладателем профессиональной серверной двухпроцессорной материнской платы. Раньше я сталкивался с подобным железом только по работе, но вот спустя столько лет смог завести столь прелестного питомца дома :) Модель: Supermicro…
Ну в общем удалось собрать сервер в одну коробочку, в качестве корпуса нашёл на Авито вариант для сбора майнинговой фермы (судя по всему это корпус Cryptone на 4x видеокарты, и судя по "качеству" производитель этого корпуса до майнинговой лихорадки выпускал жестяные мангалы), данный корпус мне понравился прежде всего тем, что я купил его за 2тр и что автор в довесок к нему отдал мне несколько райзеров (к сожалению с x16 на x1, так что для нейросетей не самый лучший вариант).

Сам по себе корпус имеет "два уровня", на первом должна по идее располагаться материнская плата, но к сожалению оказалось, что у моей материнки панель ввода-вывода для подключения периферии слегка сдвинута ближе к центру, но я бы закрыл на это глаза, выкрутил бы заднюю крышку да и дело с концом. Однако, оказалось, что технологические отверстия (куда вкручиваются болтики дабы закрепить материнку внутри) опять же рассчитаны на десктопные материнки, поэтому мать надо было двигать вглубь и заодно просверливать новые отверстия (чего прямо сейчас мне делать не хотелось, но этим я как-нибудь в другой раз займусь). Ну и самое главное, мне хотелось использовать мою малютку RTX 3050 через шину PCI-E x16, а при монтаже материнки на "первом этаже" крепления для видеокарт отсутствуют, так как в майнинговой ферме предполагается, что всё на райзерах, но как я упомянул выше разеры у меня только на x1.

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

#server
Pavel Zloi
Ну в общем удалось собрать сервер в одну коробочку, в качестве корпуса нашёл на Авито вариант для сбора майнинговой фермы (судя по всему это корпус Cryptone на 4x видеокарты, и судя по "качеству" производитель этого корпуса до майнинговой лихорадки выпускал…
С радиаторами и вентиляторами заморачиваться не стал, корпус который я взял является классическим горизонтальным корпусом поэтому 120мм вертушку можно просто положить сверху на материнку и она никуда не убежит, ну а 140мм вертушку я вкрутил в соответствующий паз таким образом чтобы поток воздуха был направлен на радиатор. Из-за нестандартного расположения материнки пришлось заранее обжать и подключить пару патчкордов (один в IPMI, другой в eno0), так как после "монтажа" на антрисоль мне до эзернет портов будет не добраться. Ах, да. ещё докупил себе кнопку включения на длинном проводе, в DNS продается комплект.

Дисковые накопители следущие: 1x SSD на 100гб - на нём живёт операционка, 1х ноутбучный HDD на 320Гб - на нём логи, контейнеры и веса моделей буду хранить.

Такой вот жмот эдишни ГПУ сервер у меня получился :) в дальнейшем я его буду тестировать под нагрузкой и смотреть на что он способен, но в ближайшее время вносить изменения в него скорее всего не буду.

#server
Ещё одна хорошая новость!

Мои изменения были наконец приняты в TorchTune после нескольких итераций код-ревью.

Так что если вы будете использовать этот проект для обучения своих моделей на нескольких датасетах, помните, что эта фича была добавлена моей скромной персоной :)

Всем хороших выходных!
Здравствуйте, товарищи! Поздравляю всех с Днём Победы!
Всем привет! Рад поделиться с вами своей новой публикацией на Дзен под названием "Что я знал о чанках? Как нарезать текст с помощью LangChain для LLM и векторного поиска".

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

text-splitting это репозиторий на GitHub с юпитер-блокнотами демонстрирующими каждый из методов упомянутых в публикации.

Приятного прочтения и успешных экспериментов!

#langchain #chunking #spliting #llm #vectorsearch
Сегодня в чатике мы обсуждали тему преобразования текстовой информации в граф знаний.

Используя свой опыт в текстовом чанкинге, я решил провести эксперимент, взял большой текстовый документ, нарезал его на семантически связанные чанки, которые в моём случае выступают в роли узлов графа.

Для вычисления рёбер между узлами из чанков были извлечены эмбеддинги (векторные представления), после чего определяется косинусное расстояние между всеми узлами и фильтруются только те у которых сходство >= 0.9

Полученный граф на картинке.

Ссылка на юпитер-блокнот тут.
Всю прошлую неделю занимался вопросом сбора Parallel Corpora датасета специализированной технической тематики.

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

Иными словами, чтобы можно было сказать "how create a helm chart?" или "как создать хельм чарт?", а векторный поиск вернул одни и те же чанки.

На данный момет мои эксперименты привели меня к следующей схеме:
1) берём базовую sentence transformer модель, в моём случае это Snowflake/snowflake-arctic-embed-xs так как я хочу потому использовать её в ollama
2) дообучаем её на домене технической литературы, на данный момент я собрал датасет только про PHP (2 тысячи пар текста), но хочу ещё сделать датасет по Python, Docker, Kubernets и GoLang
3) полученную модель обучить на Parallel Corpora из пар English<>Russian (сравнение выполняю через MSELoss)

Промежуточный результат на картинках, пока что всё очень плохо :)
Pavel Zloi
Всю прошлую неделю занимался вопросом сбора Parallel Corpora датасета специализированной технической тематики. Моя идея крайне проста, хочу обучить модель-эмбеддер которая бы могла: a) участвовать в пайплайне индексации чанков из текстов для векторного поиска…
В общем надоело возиться с моделями семейства snowflake-arctic-embed так как все мои эксперименты с этими моноязыковыми моделями (всех доступных размерностей) не давали каких-то заметных результатов, поэтому решил отойти от концепции совместимости с ollama и попробовал обучить мультиязыковую google-bert/bert-base-multilingual-uncased.

Для этого взял датасет большой (Helsinki-NLP/opus_books, выборка en-ru, сплит train) на 17к пар, подмешал в него мой вычищенный датасет про PHP на 2к пар и запустил обучение в 20 эпох (на всё про всё ушло примерно 40 минут).

После первых 5 эпох мультиязывая bert показала результаты лучше, чем любая snowflake-arctic-embed, nomic-embed-text или mxbai-embed-large.

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

Прикладываю скрин с результатами тестов, по центру эмбеддинги похожих фраз на разных языках начали "кружиться в вальсе", чего не наблюдается у модели без дообучения (правый график). Результаты ручного теста первым постом под этим сообщением.

PS. Датасет evilfreelancer/opus-php-en-ru-cleaned содержит в себе сплит train (на 1.6k строк) и eval на 100 строк.

PPS. Бай зе вей, между делом научился через matplotlib рисовать несколько графиков на одной картинке.
Forwarded from LightAutoML framework (Alex Ryzhkov)
Коллеги, всем доброго дня!

Если вы еще не успели ткнуть ⭐️ на гитхабе на https://github.com/sb-ai-lab/LightAutoML, то самое время это сделать.

Наша глобальная текущая цель - собрать 1000 звезд и попасть в окружение Kaggle на постоянной основе!

Будем рады, если вы нас в этом поддержите ❤️
Утро доброе!

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

Ну и так вот, читаю эту пометку и пришла новая мысля, а что если сжимать не внутри модели, а скажем на входе? (присылать в модель уже сжатые данные)

Скажем берём текста 1мб, сжимаем его через tar.gz дальше преобразуем и отправляем на вход модели.

Правда не понятно как разжимать, если про LLM модели говорить. Но для моделей типа эмбеддеров подобный подход вероятно позволит в 512 токенов укладывать в разы больше данных, однако, тут нужен будет кастомный токенизатор, чтобы бинарные последовательности в токены преобразовывать.

В общем мне любопытно попадались ли кому публикации на тему сжатия данных передаваемых в нейросети? Прежде всего любопытно это в контексте сетей работающих с естественным языком.
Сегодня состоялся релиз ManticoreSearch версии 6.3, одной из ключевых особенностей новой версии является официальное добавление векторного поиска.

Помимо этого сегодня ещё был выдан аппрув моему PR в проект LangChain который добавляет поддержку Мантикоры в качестве движка векторного поиска.

PS. Думаю после работы ещё поправлю тесты в PR, чтобы всё точно было красиво.
Pavel Zloi
Сегодня состоялся релиз ManticoreSearch версии 6.3, одной из ключевых особенностей новой версии является официальное добавление векторного поиска. Помимо этого сегодня ещё был выдан аппрув моему PR в проект LangChain который добавляет поддержку Мантикоры…
Кстати PR смерджили, вот пример как использовать ManticoreSearch Engine в качестве VectorStrore через LangChain:

from langchain.text_splitter import CharacterTextSplitter
from langchain_community.embeddings import GPT4AllEmbeddings
from langchain_community.vectorstores import ManticoreSearch, ManticoreSearchSettings
from langchain_community.document_loaders import TextLoader

# Подгружаем какие-нибудь документы
loader = TextLoader("../../modules/paul_graham_essay.txt")
documents = loader.load()

# При помощи сплиттера режем на чанки (кусочки)
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# (опционально) Добавляем в чанки метаинформацию которую необходимо хранить в базе
for d in docs:
d.metadata = {"some": "metadata"}

# Инициализируем эмбеддинговую модель
embeddings = GPT4AllEmbeddings()

# Инициализируем клиент мантикоры и настройки векторного поиска, после чего заливаем чанки в базу
settings = ManticoreSearchSettings(table="manticoresearch_vector_search_example")
docsearch = ManticoreSearch.from_documents(docs, embeddings, config=settings)

# Выполняем поисковый запрос
query = "Robert Morris is"
docs = docsearch.similarity_search(query)


Детали реализации классов ManticoreSearch и ManticoreSearchSettings тут.
Всем привет! Отправил сегодня мой первый PR в проект llama.cpp, в нём я добавил возможность конвертировать BERT-модели расположенные на локальной файловой системе, так как текущая стабильная версия умеет работать лишь с моделями выгруженными на HuggingFace.
Всем привет!

В моём блоге на Дзен появилась свежая публикация под названием "Как конвертировать модель семейста BERT в формат GGUF?", если вы хотите узнать, как запускать модели-эмбеддеры на слабом железе или эффективно использовать ресурсы сервера, то эта публикация для вас.

Юпитерианский блокнот в котором я сравнил PyTorch к GGUF версии модели ai-forever/sbert_large_nlu_ru

Желаю приятного прочтения!

#zen #gguf #bert #nlp #embedding
Прочёл с утреца пост который вчера опубликовал Илья Гусев, у меня в целом схожие мысли, кто давно на меня подписан знает, что мой путь в OpenSource начался примерно 8 лет назад одновременно с этим начал вести стримы на Твиче и делал видеоролики на Ютубе, написал множество публикаций в своих блогах, на Хабре и на Дзене, но всё это создавалось беззаветно, из-за люблю к искусству, просто делал и всё.

По моим более чем 100 проектам на GitHub можно проследить, как рос мой скил, как менялись мои вкусы и интересы, как всё глубже я изучал PHP, а после достижения пхпшного дао и множество других языков программирования, видно что начинал я со своих собственных велосипедов, а в последнее время всё чаще участвую в чужих проектах.

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

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

Короче, не стоит бояться делиться своими наработками, не стоит стесняться своих наработок, не стоит думать что вам удастся на них хоть что-то заработать, денег вам смогут принести, дай Торвальдс, только десятая часть из всех проектов да и то косвенно, а не напрямую :)