- BrainTools - https://www.braintools.ru -
Добрый день, уважаемые читатели! Хакатоны уже давно стали неотъемлемой частью жизни любого топового разработчика, который хочет быть всегда в тренде и видеть самые «горячие» и актуальные задачи бизнеса. На них можно увидеть не только типовые задачи от бизнеса, которые уже имеют рабочие модели и аналитику в самом широком ключе, но требующие нестандартного и новаторского подхода в их расширении, но и задачи, открыто ставящие вызов разработчикам, и требующие самого широкого охвата знаний и упорства для их реализации.
Этой публикацией мы открываем серию статей где будут освещаться наши участия в хакатонах различного формата и профиля, а именно, команд Кафедры искуственного интеллекта [1] Финансового университета.
На сегодняшний день у нас за плечами уже несколько хакатонов. По итогам 2024 года, а начали мы участвовать с октября месяца, то есть за 3 месяца мы получили 1 серебро (HSE Assistant Hack: Python [2]), 1 бронзу (ФИЦ: Хакатон [3]), два раза заняли 6 место (BIV Hack Challenge [4]), примерно их 30 кооманд и 10 место на международном хакатоне (Цифровой прорыв [5]).
Солидно, достойно, но главное не останавливаться на достигнутом и двигаться активно вперед. На сегодняшний день у нас сформировано 4 команды, которые активно будут бороться за призы в 2025 году. Мы проводим тренировки каждую пятницу, разбираем рабочие кейсы и прошлые хакатоны. У нас постоянно действует DS клуб, где мы публикуем расписание актуальных хакатонов, конференций, митапов, а так же интересные выдержки из статей и моделей машинного обучения [6]. Сейчас мы активно включились в работу, уже две команды вышли на новые задачи и активно готовятся к ним, две ожидают новых задач. Тренирует клуб Миронов Владимир Олегович (Старший преподаватель, Кафедры искусственного интеллекта, Финансового университета при Правительстве РФ), автор этой статьи.
В данной статье мне бы хотелось сделать обзор на первый хакатон, который мы провели и получили на нем золото по всем лидербордам, 2 место по научной презентации. Кроме того, показать какими методами мы решали задачу и чего добились в результате. По традиции, всех заинтересованных лиц приглашаю под кат ;).
Участие в хакатонах это всегда отличный задел на то, чтобы посмотреть реальные бизнес-задачи и попробовать себя и свои силы на решении в несколько нестандартном, порой весьма напряженном формате работы. Также это возможность ощутить момент реализации задач под давлением, с ограниченными ресурсами и временем на сборку проекта. Более того, опыт [7] решения таких задач дает актуальные навыки проработки идей, их апробации и уверенность при общении с бизнесом, а также повышает общий навык понимания кода.
Кроме того, немаловажным фактором является умение рассматривать все ключевые аспекты деятельности заказчика. Бывает так, что необходимо, предварительно, провести анализ деятельности конторы и понять, какие задачи их интересуют, на что они нацелены и что ими движет, куда они смотрят и какую бизнес-задачу они решают в глобальном плане. Более того, оцениваются и моменты связанные с экономической ситуацией в стране и мире и какое место бизнес занимает в этой системе и его какова его роль.
Данный подход позволяет понять, как выводить задачи на уровень переговоров, порой, весьма непростых, как вести диалог и, что, немаловажно, слушать и «слышать» собеседника. Кроме всего прочего, здесь оценивается способность к презентация проектов и навыки «вытаскивать» бизнес требований, что зачастую требует, крайне «въедливого» подхода.
Хакатон, который про который мне бы хотелось рассказать проводился под эгидой НИУ ВШЭ (Факультетом компьютерных наук [8] и центром искуственного интеллекта ВШЭ [9]). В общем зачете за призовые места боролись 89 студенческих команд из 25 ведущих вузов страны. Общая задача состояла в том, чтобы с помощью LLM и и других алгоритмов создать ИИ-асистента, который бы помогал находить ошибки [10] в коде и предложить поэтапное разъяснение с возможностью человеку самому дойти до финального решения, то есть без явного представления готового кода. Упор, в этом случае, был сделан при решении больше на науку, чем на бизнес и это было особое требование организаторов. Оценка и построение лидерборда производилось по правилам подобным на codeforces.com [11].
Соревнование длилось семь дней, из которых 5 было в онлайн формате на платформе DS Works [12], которая была любезно предоставлена провайдером облачных технологий Cloud.ru [13]. Открытие и заключительная сессия проходили на Покровском бульваре, в одном из корпусов ВШЭ. В составе жюри были эксперты из Центра искусственного интеллекта ВШЭ, базовой кафедры Сбера «Финансовые технологии и анализ данных» [14], преподаватели факультета компьютерных наук и проекта Data Culture [15]. При этом, оценивалась как научная часть на презентации так и были лидерборды, публичный и приватный.
После выдачи задания, мы активно начали прорабатывать все идеи и возможные решения. Роли распределились следующим образом: Артем и Даниил занимались моделью, Денис – агенты, Илья – промпты, Максим – бизнес-идеями. Исходные данные включали в себя:
tasks.txt (id – идентификатор, level – сложность (B1, B2, C1, …), description – описание, author_solution – авторское решение);
tests.xslx (id – уникальный идентификатор, number – порядковый номер теста в системе, task_id – идентификатор задачи, к которой относится тест, input – ввод для программы, output – правильный вывод от программы);
solution (id – уникальный идентификатор, task_id – идентификатор задачи, к которой относится решение, student_solution – решение студента (с ошибкой), author_comment – комментарий от автора, в чем ошибка студента (эталонный ответ от нашего алгоритма), author_comment_embedding – векторное представление комментария, полученное с помощью модели RoBERTa).
Перво на перво, начали поднимать «вверх дном» весь GitHub и HugginFace. При этом, находили решения различного рода, выполняющие различные функции, но все же не дотягивающие до требуемого уровня. Например, были вот такие вещи:
TrustLLM [16] (инструмент на Python для комплексного исследования ответов от LLM);
Ax [17] (построение LLM-агентов на базе исследования Стэнфорда — DSP (demonstrate, search, predict))
LLama 3.2
Molmo (7В MoE (1B активных), 7В (таких две) и 72В);
Claude Sonnet 3.5;
Gemini 1.5 Pro;
Qwen2-72B
Исходя из всестороннего обзора (тут [18] и тут [19]) и бенчмарков (тут [20] и тут [21]), мы выбрали для себя несколько «рабочих лошадок», с которыми начали плотно работать. Наиболее интересными, в этой связи, нам показались модели: Qwen2.5-72B [22], gemma-2-27b [23], deepseek-coder-v2-16b [24], qwen2.5-32b [25], yi-coder-9b [26], qwen2.5-coder-7b [27], codestral-22b [28], llama3.1-8b [29], Molmo-7B-D-0924 [30]. Провели множество локальных тестов и даже составили свой личный лидерборд по полученным результатам на то как следуют модели промпту и как понимают русский язык. Тестирование моделей проводилось на RTX 4090 24gb. По контесту мы оценивали по стандартной длинне последовательности 128к токенов. При обучении мы использовали unslothai [31]. Общий пайплан собирался на langchain. Дополнительно, мы собрали синтетический датасет при помощи GPT-4o-mini [32] для тестирования. Общий набор технологий включал в себя CUDA [33], Anaconda [34], VSCode [35].
Особый упор был сделан на время выдачи ответа, у нас было 4 агента, которые, в среднем, выдавали ответ за 12 сек и еще мы думали как все ускорить, в этом нам помогла вот эта статья [36]. Таким образом, у нас получилось сделать помощника, который бы итеративно подводил студента к правильному ответу.
В ходе анализа задачи мы анализировали различные идеи, чтобы как-то «зацепить» организаторов, например, мы рассматривали случай когда идет оценка различного кода по уровню: джун, мидл и сеньор. Конечно, такая градация может быть несколько условной, ввиду того что в разных компаниях разный уровень понимания грейда, но все же имеет места быть. Также же была идея сразу генерить ссылки на либы и фреймфорки, чтобы быстро все объяснять, при этом требовалось чтобы ответ был максимально близок к преподавательскому. Кроме всего, подумывали над тем, как бы представить код, который по качеству получается лучше преподавательского, тем самым решая двойную задачу: обучение студентов и поднятие общего проффессионального навыка преподавательского состава университета. Но все же мы придерживались общей канвы, что надо наводить студента на ответ верный, а не давать готовый.
Еще был вариант проанализировать датасет, который нам дадут на хаке, и достать оттуда самые встречаемые ошибки, чтобы на их основе сделать базу RAG, по типу списка FAQ вопросов, при этом инфа из RAG будет идти в промпт и, тем самым, попытаться снизить галлюцинации. По поводу галлюцинаций руководствовались этим [37].
Дополнительно мы искали множество статей чтобы понять как более корректно и выигрышно участвовать на соревнованиях и разворачивать пайплайн, и нашли не мало хороших материлов: раз [38], два [39], три [40], четыре [41], пять [42] и шесть [43]. Еще продумывали варианты защиты нашей модели. Тут можно было брать уже известные вещи, такие как Prompt-Guard-86M [44],
В итоге мы достигли косинуского расстояния в 0,002 на сгенерированном датасете, что оказалось весьма качественным решением. В итоге нам удалось добиться метрики в 0.001897 на 1 эпохе на 9000 примеров. Промежуточные гиперпаметры выглядели, как на картинке ниже, более того мы использовали 16-битную точность для оценки.
Дополнительно, рассматривали варианты Sharded DDP: распределенные вычисления с шардингом градиентов позволяют снизить потребление памяти [45] и улучшить масштабируемость при обучении на нескольких устройствах; и ZeRO Optimization: ZeRO (Zero Redundancy Optimizer) помогает разбить градиенты на несколько узлов и тем самым значительно снизить требования к памяти. Кроме всего, прочего перебирали множество самых тонких гиперпараметров для получения наилучшего результата: bias, use_gradient_checkpointing, num_layers_to_update, update_ratio, freeze_last_n_layers, unfreeze_layers_after, peft_config_file, peft_config_dict, peft_config_name.
Как результат получили косинусное расстояние 0.000870 при loss 0.5113 и итоговая модель оказалась самой лучшей finetune-gemma-2-9b-it. Наша модель весила всего +- 7 Гб и охватывала 9 млрд параметров. Защита модели осуществлялась по метрикам, представленным организаторами, кроме всего прочего было показана оценка за питчинг проекта.
По части защиты модели от взлома, руководствовались следующими моделями и решениями: In-The-Wild Jailbreak Prompts on LLMs [46], Last Layer [47], llm-defense [48], jailbreak-tools [49], Jailbreaking Leading Safety-Aligned LLMs with Simple Adaptive Attacks [50], Benchmarking of Jailbreak Attacks on LLMs [51], Catastrophic Jailbreak of Open-source LLMs via Exploiting Generation [52], LLM-Jailbreaks [53], In-The-Wild Jailbreak Prompts on LLMs [46].
На выходе у нас была презентация, модель в UI (open-webui [54]). Код был запушен на гит, причем, гит оформили красиво по всем стандартам и старались соответствовать бизнес-модели, неплохая статья по этому поводу написана вот тут [55], тут [56], тут [57], тут [58] и уже простите тут [59] ;)).
По итогу к защите было допущено 16 комманд, которые вошли в топ рейтинга по результатам колличественной метрики, полученной их решением. Победу одержала команда «МИСИС Computer» из Университета науки и технологий МИСИС. Второе место заняли мы. Бронзу завоевала команда Selling Pandas, состоящая из студентов первого курса программы «Прикладная математика [60] и информатика» ФКН ВШЭ. Призеры получили денежные призы в размере 250 000, 200 000 и 150 000 рублей соответственно. Итоговый скор оказался таким, напоминаю, мы заняли 1 место как на привате так и на паблике, именно по скору.
Наша команда с большим удовольствием участвовала в прошедшем хакатоне. Особенно порадовало, что он был технический и исследовательский, а также, что поставленная задача была очень актуальной и востребованной. Несмотря на то, что для большинства из нас такое глубокое погружение в работу с LLM было впервые, мы успешно справились, освоили новые технологии и получили ценный опыт. Выражаем уважение организаторам хакатона за предоставленную возможность и будем рады принять участи вновь в последующих соревнованиях.
Автор: seiros
Источник [61]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/12083
URLs in this post:
[1] интеллекта: http://www.braintools.ru/article/7605
[2] HSE Assistant Hack: Python: https://www.hse.ru/ai-assistant-hack-python/
[3] ФИЦ: Хакатон: https://%D1%84%D0%B8%D1%862024.%D1%80%D1%84/hackathon
[4] BIV Hack Challenge: http://biv-challenge.ru/
[5] Цифровой прорыв: https://hacks-ai.ru/
[6] обучения: http://www.braintools.ru/article/5125
[7] опыт: http://www.braintools.ru/article/6952
[8] Факультетом компьютерных наук: https://cs.hse.ru/
[9] центром искуственного интеллекта ВШЭ: https://cs.hse.ru/aicenter/
[10] ошибки: http://www.braintools.ru/article/4192
[11] codeforces.com: https://codeforces.com/
[12] DS Works: https://dsworks.ru/
[13] Cloud.ru: https://www.braintools.ru%20Python%5C%E2%80%9D,
[14] базовой кафедры Сбера «Финансовые технологии и анализ данных»: https://cs.hse.ru/sber/
[15] Data Culture: https://www.hse.ru/dataculture/
[16] TrustLLM: https://github.com/HowieHwong/TrustLLM
[17] Ax: https://github.com/ax-llm/ax
[18] тут: https://aider.chat/docs/leaderboards/
[19] тут: https://huggingface.co/spaces/mike-ravkine/can-ai-code-results
[20] тут: https://lmarena.ai/?leaderboard
[21] тут: https://www.trustbit.tech/en/llm-leaderboard-juli-2024
[22] Qwen2.5-72B: https://huggingface.co/Qwen/Qwen2.5-72B-Instruct
[23] gemma-2-27b: https://huggingface.co/google/gemma-2-27b
[24] deepseek-coder-v2-16b: https://github.com/deepseek-ai/DeepSeek-Coder-V2
[25] qwen2.5-32b: https://huggingface.co/Qwen/Qwen2.5-32B
[26] yi-coder-9b: https://huggingface.co/01-ai/Yi-Coder-9B
[27] qwen2.5-coder-7b: https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct
[28] codestral-22b: https://huggingface.co/mistralai/Codestral-22B-v0.1
[29] llama3.1-8b: https://huggingface.co/meta-llama/Llama-3.1-8B
[30] Molmo-7B-D-0924: https://huggingface.co/allenai/Molmo-7B-D-0924
[31] unslothai: https://github.com/unslothai/unsloth
[32] GPT-4o-mini: https://minigpt-4.github.io/
[33] CUDA: https://developer.nvidia.com/cuda-toolkit
[34] Anaconda: https://www.anaconda.com/
[35] VSCode: https://code.visualstudio.com/
[36] статья: https://habr.com/ru/companies/mts_ai/articles/791594/
[37] этим: https://habr.com/ru/companies/sberbank/articles/812775/
[38] раз: https://habr.com/ru/articles/847462/
[39] два: https://habr.com/ru/companies/magnit/articles/801959/
[40] три: https://habr.com/ru/articles/738176/
[41] четыре: https://habr.com/ru/articles/346322/
[42] пять: https://habr.com/ru/articles/760044/
[43] шесть: https://habr.com/ru/articles/659045/
[44] Prompt-Guard-86M: https://huggingface.co/meta-llama/Prompt-Guard-86M
[45] памяти: http://www.braintools.ru/article/4140
[46] In-The-Wild Jailbreak Prompts on LLMs: https://github.com/verazuo/jailbreak_llms
[47] Last Layer: https://github.com/arekusandr/last_layer
[48] llm-defense: https://github.com/theshi-1128/llm-defense
[49] jailbreak-tools: https://github.com/jailbreak-tool
[50] Jailbreaking Leading Safety-Aligned LLMs with Simple Adaptive Attacks: https://github.com/tml-epfl/llm-adaptive-attacks
[51] Benchmarking of Jailbreak Attacks on LLMs: https://github.com/usail-hkust/JailTrickBench
[52] Catastrophic Jailbreak of Open-source LLMs via Exploiting Generation: https://github.com/Princeton-SysML/Jailbreak_LLM
[53] LLM-Jailbreaks: https://github.com/langgptai/LLM-Jailbreaks
[54] open-webui: https://github.com/open-webui/open-webui
[55] тут: https://habr.com/ru/articles/541258/
[56] тут: https://habr.com/ru/articles/588801/
[57] тут: https://habr.com/ru/articles/813399/
[58] тут: https://habr.com/ru/articles/820547/
[59] тут: https://habr.com/ru/articles/649363/
[60] математика: http://www.braintools.ru/article/7620
[61] Источник: https://habr.com/ru/companies/fa/articles/881108/?utm_source=habrahabr&utm_medium=rss&utm_campaign=881108
Нажмите здесь для печати.