Когда напридумывал себе себя:
Другие наши проекты: https://t.me/+1s1ZEg7EeQ5mNDVi
Другие наши проекты: https://t.me/+1s1ZEg7EeQ5mNDVi
Всем привет! Ищу человека, кто только начинает изучать программирование, для совместного изучения и работы над какими-то небольшими проектами и обменом идей. Сам изучаю питон.
Привет всем бывалым айтишникам и джунам :)
В общем, я очередной "вкатун", "вайтишник", "свитчер" или как там нас ещё называют.
Изучаю Java, параллельно работая на своей работе (я работаю в нефтегазовой отрасли и она мне ужасно надоела, собсна из-за чего и собираюсь вкатываться). Учу java-core уже 4 месяца. Да, согласен, это медленно, но на работе выходных у меня практически нет.
И слава богу, что до Spring и прочего непотребства я ещё не успел дойти, потому что у меня назрел резонный вопрос: почему не андройд разработка?
Изучение рынка труда java backend оставила неизгладимое впечатление безнадеги, а один знакомый HR, который хайрит как раз джава бэкендеров сказал, что в этой отрасли людей без опыта НЕ РАССМАТРИВАЮТ ОТ СЛОВА СОВСЕМ. Но это если верить ему. Как дела обстоят на самом деле я не знаю
Собсна поэтому и обращаюсь к всезнающей аудитории Пикабу. Пока не начал изучать стек для бэкендера может перейти на андройд, доучив джаву и затем приправить все это дело котлином и остальными технологиями, нужными в андройд разработке? Как вообще с новичками дела обстоят в этой сфере? Легче ли вкатывание чем в джава бэкенд? Сопоставимы ли зарплатные вилки?
Заранее всем большое спасибо за ответы. Я надеюсь, что этот вопрос дойдет до нужной аудитории
- У вас программисты - некомпетентные дураки! Ничего не умеют! Всё через жопу сделано!
- Программа работает?
- Работает...
- Ошибки есть?
- Ошибок нет...
- Программа работает именно так, как написано в техническом задании?
- Да, но когда мы писали ТЗ, то имели ввиду совершенно другое!
Ребят, помогите, плиз! Третий день мучаюсь.
Ребят, привет. Подскажите, плиз, как такое решать?
Есть таблица такого вида:
CREATE TABLE kg.data (
year INT,
month INT,
value INT
);INSERT INTO kg.data (year, month, value) VALUES
(2022, 3, 12),
(2022, 7, 18),
(2023, 2, 22);
Нужно написать такой запрос, который дополнит её недостающими датами и значениями в такой логике, что до достижения новой даты повторяется значение предыдущей.
Исходная таблица:
2022 3 12
2022 7 18
2023 2 22
Таблица будет иметь вид:
2022 3 12
2022 4 12
2022 5 12
2022 6 12
2022 7 18
2022 8 18
2022 9 18
2022 10 18
2022 11 18
2022 12 18
2023 1 18
2023 2 22
Помогите, плиз! Научите! Мучаюсь уже несколько дней!
Всем привет, в последние годы я исследую Искусственный Интеллект, мой контент об этом можно найти на канале Ruslan Dev на YouTube. В этой статье я расскажу о том, как я сделал файнтюнинг Llama 3 70B - лучшей базовой модели на сегодняшний день. Я обучал модель на мультиязычном датасете Tagengo, в котором есть русскоязычная выборка.
Очевидно, обучение такой модели требует серьезных вычислительных мощностей, поэтому полного цикла на 3-4 эпохи я делать не стал. Я рассчитывал потратить пять-десять GPU-часов, чтобы проверить мой код для файнтюнинга на работоспособность, посмотреть метрики обучения, запустить инференс модели и оценить первые результаты.
Кстати, для файнтюнинга моделей я использую свой фреймворк gptchain, который построен на основе библиотек unsloth и trl (Transformer Reinforcement Learning).
Моей второй целью была квантизация обученной модели и сохранение в формате GGUF. Этот формат позволяет запустить Большую Языковую Модель (LLM) на любом компьютере с достаточно мощным процессором.
Базовая модель, которую я файнтюнил - unsloth/llama-3-70b-bnb-4bit. Cначала я проверил, как эта модель справляется с русскоязычным промптом, задав ей вопрос - "Из чего состоит нейронная сеть?"
Очевидно, что базовая модель не обучена следовать инструкциям. Она просто повторяла мой вопрос, итерация за итерацией, пока генерация не достигла максимальной заданной длины. Я рассчитывал на то, что после файнтюнинга модель будет следовать инструкциям на русском языке.
Я обратился к облачному GPU сервису immers.cloud. чтобы обучить модель.
Сначала я собирался обучать на нескольких видеокартах параллельно и выбрал два GPU A100 c NvLink.
Однако, я не учел тот факт, что библиотека unsloth, которую я использую в моем фреймворке, еще не поддерживает model parallelism, а это серьезное ограничение. В их дискорде нашел пост, что в ближайшее время обучение на нескольких GPU станет возможным. Если этого не случится, мне придется искать альтернативные пути.
Поскольку файнтюнинг базовой модели Llama 70B c квантизацией в 4 bit на 3 эпохи на одном A100 требует порядка 5 дней, мне пришлось сократить количество шагов обучения.
Также я решил перейти на другую видеокарту - H100, самую мощную из того что есть.
Настройка рабочего окружения у меня довольно простая. Мне нужен только python >= 3.9, а затем клонирую свой фреймворк gptchain с github:
И устанавливаю его зависимости:
pip install -r requirements-train.txt
Весь код, который понадобится мне для файнтюнинга, запускается через консольный интерфейс фреймворка.
После обучения веса модели мержатся с параметрами LoRA, полученными в процессе файнтюнинга, их можно загрузить на Huggingface.
Я использовал датасет lightblue/tagengo-gpt4.
На странице датасета заявлено, что "Tagengo - самый большой в мире мультиязычный датасет высокого качества". 78 тысяч примеров диалога на разных языках, включая русский. Здесь есть серьезная выборка на русском - 8 тысяч строк.
Я обучил модель на 2,400 шагов, на это ушло 7 часов на H100.
python gptchain.py train -m unsloth/llama-3-70b-bnb-4bit \
--dataset-name tagengo_gpt4 \
--save-path checkpoints/llama-3-70b-tagengo \
--huggingface-repo llama-3-70b-tagengo \
--max-steps 2400
Если использовать A100, по моим расчетам, потребовалось бы примерно 10 часов.
Я запустил файнтюнинг на Виртуальной Машине в бэкграунд-процессе. Для этого я воспользовался systemd, стандартным способом создания фоновых процессов (демонов) в Linux.
Я создал файл gptchain.service в /etc/systemd/system. В него вставил вот такую конфигурацию:
[Unit]
Description=Llama-3-70b finetune
[Service]
WorkingDirectory=/home/ubuntu/gptchain
ExecStart=/home/ubuntu/venv/bin/python gptchain.py train --model_id unsloth/llama-3-70b-bnb-4bit --dataset-name tagengo_gpt4 --save-path checkpoints/llama-3-70b-tagengo --huggingface-repo llama-3-70b-tagengo --max-steps 2400
Type=simple
Restart=no
Здесь главное - команда gptchain.py train, которая запускает файнтюнинг модели.
А теперь нужно выполнить:
sudo systemctl daemon-reload
sudo systemctl start gptchain
И все, остается ждать завершения файнтюнинга, но метрики вроде Train Loss хотелось бы как-то отслеживать. Самое простое - посмотреть логи процесса:
journalctl -u gptchain.service
Чтобы иметь возможность нормально наблюдать метрики, лучше, конечно, использовать wandb или tensorboard.
В этот раз я использовал wandb - просто указал ключ доступа в переменной WANDB_API_KEY в файле .env. Мой процесс подключается к wandb автоматически и экспортирует метрики в реальном времени.
К базовой модели применяется LoRA (Low Rank Adaptation), метод, позволяющий файнтюнить параметры более эффективно - исходная матрица параметров оставляется неизменной ( "замораживается"). В процессе обучения изменяется представление параметров модели в виде двух матриц более низкой размерности. Реализация LoRA, с которой мы обычно имеем дело, работая на стеке Huggingface Transformers (как и в данном случае) - через библиотеку peft.
Дальше происходит загрузка датасета и приведение к нужной структуре. Данные в Tagengo представлены в виде массивов json, какие принимает и возвращает OpenAI API. Чтобы использовать эти данные для файнтюнинга, я сконвертировал их в формат ChatML. У библиотеки Unsloth есть хорошая поддержка СhatML, что мне очень помогло конвертировать данные из вот этого:
[
{
"from": "human",
"value": "The user’s message goes here"
},
{
"from": "gpt",
"value": ""
}
]
Вот в это:
<|im_start|>user
The user’s message goes here
<|im_end|>
<|im_start|>assistant
Следующее, что происходит в моем коде - конфигурируется экземпляр Supervised Fine-tuning Trainer (SFTTrainer) - класса, предоставленного библиотекой trl. В нем задаются параметры файнтюнинга.
Основные из них:
learning_rate: 2e-4
seed: 3407
gradient_accumulation_steps: 4
per_device_train_batch_size: 2
optimizer: adamw_8bit
lr_scheduler_type: linear
warmup_steps: 5
max_steps: 2400
weight_decay: 0.01
Через семь часов файнтюнинг завершился. Я убедился, что Train Loss медленно, но верно сходится. Хотелось бы обучить на несколько полных эпох, но, как я уже говорил, надо значительно больше GPU часов. Обучать нужно минимум на 2, а лучше на 4 видеокартах параллельно.
Затем я проверил, начала ли Llama следовать инструкциям на русском языке:
python gptchain.py chat -m checkpoints/llama-3-70b-tagengo \
-q '[{"from": "human", "value": "Из чего состоит нейронная сеть?"}]' \
--chatml true
Да, начала - вместо бессмысленных повторений я получил правильный, очень подробный ответ на вопрос "Из чего состоит нейронная сеть?" Рекомендую посмотреть видео, чтобы оценить качество ответа и скорость инференса Llama 3 70B на H100.
Стиль ответа напоминает GPT-4, это длинный детализированный текст. Неудивительно, так как датасет tagengo включает именно ответы GPT-4.
Затем я выполнил квантизацию модели и сконвертировал ее в формат GGUF, чтобы ее можно было запускать без GPU, на обычном процессоре.
Для этого в моем фреймворке есть консольная команда quant. Среди прочих аргументов она принимает метод квантизации. В интерфейсе llama.cpp, который используется под капотом, есть также полезная команда quantize --help, которая покажет много полезной информации по методам квантизации, в том числе какие из них рекомендуются в плане баланса качества модели, скорости инференса и размера файла. Я воспользовался методом q4_k_m:
python gptchain.py quant -m checkpoints/llama-3-70b-tagengo \
--method q4_k_m \
--save-path quants/llama-3-70b-tagengo \
--huggingface-repo llama-3-70b-tagengo-GGUF
Для Llama 3 70B непосредственно квантизация занимает примерно полчаса, перед этим еще произойдет сборка llama.cpp из C++ исходников, что необходимо для конвертации весов модели в GGUF формат.
В итоге вы получите файл gguf в папке quants, его можно запустить с помощью llama.cpp.
Я задал модели тот же вопрос "Из чего состоит нейронная сеть?", и модель начинала генерировать просто completion - завершила фразу, выдала в конце токен end-of-text и остановилась.
Это потому, что я не задал формат промпта. Здесь ведь нет автоматической конвертации инпута в формат СhatML, которую мне обеспечивал Unsloth при инференсе несжатой модели.
Я задал формат ChatML вручную и запустил еще раз:
llama.cpp/main -m quants/llama-3-70b-tagengo-unsloth.Q4_K_M.gguf \
-p "<|im_start|>user \nИз чего состоит нейронная сеть?<|im_end|>"
Модель на этот раз поняла, что от нее хотят. Она сгенерировала ответ в нужном формате.
Это такой же развернутый ответ в том же стиле, что у несжатой модели. Но инференс GGUF значительно медленнее, чем на GPU. Зато вы можете запустить этот файл на любом компьютере, лишь бы хватило мощности CPU, иначе инференс будет длиться вечность.
Однако ближе к концу ответа модель стала генерировать странную последовательность обратных слэшей и других символов. У несжатой модели такого дефекта не было. Возможно, если бы файнтюнинг был проведен полностью, эта проблема бы не возникла.
Тем не менее, в целом мне понравилось качество ответов обеих моделей - с квантизацией и без. Я бы хотел протестировать свою модель на разных бенчмарках, например MT-Bench, в особенности меня интересуют результаты для русского языка. Это, вероятно, тема для новой статьи. А пока я рекомендую посмотреть видео о том, как происходил файнтюнинг, описанный в этой статье.
Веса моей модели можно скачать с Huggingface:
Если у вас есть еще на эту тему — присылайте в комменты
Вот краткий отчет о моих выходных на хакатоне в Кельне, где мы стремились создать AI-стартап всего за два дня. Мы прошли путь от подачи идей в пятницу вечером до демонстрации работающего приложения к воскресенью. Кодили до поздней ночи, решали технические проблемы в последнюю минуту и даже подготовили презентацию за несколько минут до демонстрации. В качестве бонуса я привел список основных пунктов, которые необходимо выполнить для создания стартапа.
Несколько недель назад я оказался в Кельне на захватывающем хакатоне AI Startup Hackathon, организованном Startplatz, расположенном в самом сердце MediaPark.
День 1: Идеи и формирование команд (пятница, с 18:00 до 22:00)
Мероприятие началось с того, что около 40 участников анонимно представили свои идеи. После демократического голосования восемь лучших концепций были отобраны для разработки. Эти идеи варьировались от медицинской диагностики (наше детище, прозванное «Доктор Хаус») до ИИ, оценивающего очки в Warhammer!
Шаг 1. Начните с идеи
Определите уникальную концепцию, которая решает нерешенную проблему или улучшает существующие решения.
Вот снимок разнообразия и креативности, продемонстрированных в питчах:
ИИ для диагностики (наш): Быстрая медицинская диагностика
LLM без галлюцинаций: Цель - создать более надежную языковую модель.
Управление базой знаний с помощью ИИ
Распознавание жестов для бесконтактного управления воспроизведением: Инновационные пользовательские интерфейсы с помощью компьютерного зрения.
SchoolGPT: Применение новой технологии в образовательных учреждениях.
Оценка очков в Warhammer с помощью ИИ
И еще несколько проектов, каждый из которых обладает большим потенциалом.
2. Определите, какую проблему вы решаете.
Определите, с какими проблемами сталкиваются ваши потенциальные клиенты и как ваш продукт может эффективно решить эти проблемы.
Затем каждая команда доработала свои идеи, взвесив все «за» и «против», потенциальное влияние и бизнес-модели. День завершился общением за пиццей, задав непринужденный, но амбициозный тон выходным.
Ночь 1: Знакомство с Кельном
В то время как другие уединялись отдыхать, я исследовал ночную жизнь Кельна - от шумных деловых районов до спокойных жилых кварталов. Мой маршрут включал в себя кулинарные остановки и размышления на берегу реки. Однако драйв основателя стартапа никогда не ослабевает; я набросал в Xcode ранний вариант нашего приложения-диагноста. Позже меня позвал долг из моего основного предприятия MajorDom, потребовав несколько часов работы в Jira, чтобы поддерживать наши другие проекты в рабочем состоянии.
День 2: интенсивное развитие и неожиданные повороты (суббота, с 8:00 до 22:00)
Благодарен за гостеприимство коворкинга: я успел позавтракать и провести час в «медитации» с закрытыми глазами, прежде чем в 9:15 погрузиться в работу.
Заряженные энергией, мы начали с оживленной разминки, за которой последовала проницательная лекция о разработке клиентов (customer development) и позиционировании продукта. Мы сразу проверили полученные знания на практике, проведя несколько интервью, чтобы лучше изучить общественное мнение и уточнить направление нашего проекта.
3. CustDev: Определите целевую аудиторию.
Поймите, кто ваши клиенты, каковы их потребности и как они себя ведут. Проведите интервью с ними на ранних этапах разработки, чтобы уточнить направленность вашего продукта.
Также важно задавать вопросы о прошлом и настоящем, например «Как часто вы посещаете врача?», но не вопросы о будущем, например «Стали бы вы использовать приложение вместо этого?». Первые вопросы дают реальную картину, а вторые — ненадежные галлюцинации. Также не стоит начинать интервью с фразы «Мы разрабатываем приложение, которое заменит врача», потому что тогда разговор станет эмоциональным, и люди будут подстраивать ответы под вас, вместо того чтобы говорить правду, которая может вам не понравиться. Вместо этого задавайте максимально нейтральные вопросы, не предполагающие определенный ответ.
Некоторые из наших интервью с клиентами можно найти здесь.
Кроме того, интервью с потенциальными клиентами могут дать вам первый список FAQ, который поможет улучшить ваш питч. Наш FAQ можно найти здесь.
4. Анализ альтернатив и конкурентов.
Проведите тщательное исследование как прямых конкурентов, так и смежных игроков рынка. Поймите их сильные и слабые стороны, а также то, как они удовлетворяют потребности клиентов.
Хотя мы не нашли прямых конкурентов, мы все же отметили другие проекты в этой области, которые могли бы быть нам полезны. Список находится здесь.
5. Разработка УТП и питча
Составьте уникальное торговое предложение, в котором четко сформулируйте, чем ваш продукт отличается от других и чем он лучше. Подготовьте убедительную презентацию для различных заинтересованных сторон (инвесторов, клиентов, партнеров).
Поскольку мы не нашли прямых конкурентов, создать уникальное предложение было несложно, поэтому мы просто описали наше обновленное видение.
6. Определите модель монетизации и бизнес-модель.
Определите, как ваш бизнес будет зарабатывать деньги - через подписку, рекламу, прямые продажи и т. д. Решите, будете ли вы работать по схеме B2B (business-to-business), B2C (business-to-consumer) или по другой схеме, например SaaS (Software as a Service). Подумайте о масштабируемости и возможности получения регулярного дохода.
Наш проект оказался довольно гибким в плане монетизации, поэтому мы можем экспериментировать с разными вариантами: от SaaS подписки для пользователей до B2B-партнерства с больницами. Наш список можно посмотреть здесь.
В середине дня нас ждал приятный сюрприз - к нам заглянули два инженера из Microsoft, чтобы поделиться своими знаниями о data science, GPT и ИИ, а также дать ценные советы и подсказки. Признаться, я, возможно, задремал во время 20-минутного сегмента, посвященного промпт инженерии, но уверяю вас, остальное было интересным.
7. Создайте концепцию для проверки идеи
Разработайте Proof of Concept, чтобы продемонстрировать осуществимость вашей идеи в решении поставленной задачи. Используйте ее для сбора отзывов и внесения необходимых корректировок.
Большая часть дня была посвящена разработке. Пока конкурирующие команды боролись с GPT и их API, наша команда решала этические дилеммы, разбиралась с нюансами европейских регуляций и тонкостями промтов, в результате чего мы перешли от приложения, ориентированного исключительно на медицину, к более общему лайфстайл приложению. Тем временем я боролся с желанием заснуть под столом, но продолжал писать код.
К позднему вечеру наш пробный вариант концепции был почти готов: минималистичный интерфейс приложения на SwiftUI с бэкендом FastAPI, использующим (не очень) быстрый API ChatGPT. На нашем пути стояла только ошибка валидации 422, вызванная небольшим несоответствием моделей данных между фронтендом и бэкендом, но было решено заняться этой проблемой после ночного отдыха.
Мы завершили день пиццей и общением. К счастью, на этот раз мне удалось снять номер в отеле всего в пяти минутах ходьбы от места проведения хакатона — наконец-то заслуженный сон был в пределах досягаемости.
День 3: финальные разработки и двойные демонстрации (воскресенье, с 9:00 до 14:00)
Последний день разработки часто включает в себя доработку и масштабирование идей, но в этот раз задача была сложнее. Мы находились на грани между категориями медицины и лайфстайла, и каждая доработка подталкивала нас в сторону одной из них. Я верю в создание продуктов без ограничений и компромиссов — моя философия проста: если вам это не нравится, не используйте это.
Хороший сон принес ясность и новое смелое видение. Утром я первым делом поделился этим прорывом с командой, набросав на флипчарте новую стратегию. Мы решили разделить наши усилия на два разных приложения: одно - сугубо медицинское, оставаясь верным нашей первоначальной концепции, а другое - чисто для образа жизни, как запасной вариант.
Мы разделились на две подкоманды по два человека для работы над проектами. Медицинское приложение и его бэкэнд были быстро доведены до ума и стабилизированы. Благодаря Ngrok мы получили публичный URL-адрес для нашего бэкенда, что позволило оживить «Доктора Хауса» как раз к началу демонстрации. Тем временем команда, ориентированная на лайфстайл, использовала более простой подход с конструктором partyrock из aws, чтобы завершить работу над приложением «Лучший друг» (демонстрация находится здесь).
За 20 минут до конца выступления мы поняли, что не подготовили официальную презентацию — по иронии судьбы, именно это было основной утренней задачей! Время поджимало, но накидать несколько слайдов не является чем-то сложным, если знаешь, что делаешь.
Задача усложнялась тем, что каждой команде было выделено всего пять минут на презентацию и еще пять на ответы вопросы - едва ли достаточно, чтобы рассказать об одном продукте, не говоря уже о двух. Время на презентацию вышло прямо перед началом демонстрации, но нам повезло (или мы это спланировали, никто точно не знает): первым вопросом из зала была просьба показать демо. Такой "случайный" выбор позволил нам выкроить несколько дополнительных минут демонстрации под видом ответов на вопросы. С помощью airplay мы транслировали скринкаст с iphone на экран сцены через мой macbook, превратив нашу презентацию в интерактивное шоу "У кого что болит?", что было довольно забавным.
8. Разработка и запуск MVP по принципу Парето (80-20)
Сосредоточьтесь на 20% функций, которые обеспечивают 80% ценности. Быстро разработайте и запустите минимально жизнеспособный продукт, чтобы начать цикл обучения, стремясь обеспечить максимальную ценность при минимальных затратах времени и ресурсов.Помните, что красота технологии заключается в итерациях. Начните с простого, создайте прототип и постоянно совершенствуйте его. Каждый шаг вперед приближает вас к овладению искусством разработки программного обеспечения и, возможно, к следующему большому прорыву в технологиях.
К сожалению, у нашей команды нет возможности работать над этим стартапом фулл-тайм, поэтому мы опубликовали все результаты нашей работы в открытый доступ. Слайды вы можете найти здесь (написан по памяти неделю спустя). Полную информацию о проекте, включая все заметки и исходный код, можно найти на GitHub.
О других интересных проектах периодически пишу в телеграм.