Документация проекта: Здесь
docs/report.md
- Описание проекта
- Серверная часть. FastAPI
- Клиентская часть. Streamlit
CIс юнит-тестами и автоматической проверкой на качество кода- Сборка проекта
- Демонстрация работы FastAPI приложения
- Демонстрация работы Streamlit приложения
Цель проекта - создать полноценное веб-приложение для обучение моделей KMeans для кластеризации новостных постов с аналитикой и отслеживанием экспериментов
Подробнее об идеи и проекте в целом: Здесь
В кратце Идея заключается в сборе новостей, их анализе методами NLP и использованием графовых нейронных сетей (GNN) для обработки, построения и прогнозирования связей между новостями.
| ФИО | telegram | github |
|---|---|---|
| Филоненко Никита Дмитриевич | @nikitafilonenko | Nikita Filonenko |
| Жданович Иван Егорович | @otpok | Eflarus |
| Малыш Алексей Александрович | @laexey | AlexeyMalish |
| Степанов Данила Михайлович | @biQvOid | biQvOid |
Основные функции включают управление датасетами, обучение моделей, предсказания и анализ данных
возможности API:
-
Работа с данными:
- Загрузка, обновление, удаление датасетов.
- Генерация отчетов EDA (Exploratory Data Analysis).
- Генерация HTML-дашбордов для анализа данных.
-
Модели машинного обучения:
- Обучение моделей.
- Дообучение существующих моделей.
- Управление загрузкой и выгрузкой моделей из памяти.
- Выполнение предсказаний (как для текстовых данных, так и для файлов).
- Получение информации о статусе моделей и их конфигурациях.
В данном проекте используется модульная структура для работы с обучением моделей машинного обучения. Подход направлен на поддержку гибкости, расширяемости и простоты добавления новых моделей и методов обучения.
-
Конфигурация модели:
- Класс ModelConfig предоставляет подробную информацию об идентификаторе модели, используемом датасете, типе модели и гиперпараметрах. Это позволяет унифицировать процесс настройки различных моделей.
- Пример конфигурации включает тип модели (kmeans) и соответствующие гиперпараметры, такие как n_clusters, random_state, max_iter.
-
Обучение:
- Процесс обучения начинается с загрузки данных на основе идентификатора датасета (dataset_id), предоставленного в конфигурации.
- Алгоритм обучения модели определяется типом модели (ml_model_type), который указывается в конфигурации.
- Результаты обучения, такие как метрики (например, silhouette, davies_bouldin) и кривые обучения (например, инерция), сохраняются для последующего анализа.
-
Сохранение и загрузка:
- После обучения модели она сохраняется в заранее определённой структуре (например, как объект в формате .pkl).
- Сохранённые модели могут быть загружены в память при необходимости для дальнейшего использования, дообучения или предсказания.
-
Отчёты и визуализация:
- Предоставляется информация о качестве обучения, метриках и дополнительных характеристиках. Пример: метрики silhouette, davies_bouldin, calinski_harabasz для оценки кластеризации.
-
Потокобезопасность:
- Для предотвращения коллизий при работе с файловой системой и данных используется
multiprocessing.Lock. - Это гарантирует, что операции записи, удаления и обновления выполняются атомарно.
- Для предотвращения коллизий при работе с файловой системой и данных используется
-
Обработка данных:
- Данные сохраняются и извлекаются из директории, указанной в конфигурации (
data_path). - Для работы с CSV-файлами используется библиотека
pandas, что обеспечивает гибкость в обработке данных.
- Данные сохраняются и извлекаются из директории, указанной в конфигурации (
-
Гибкость конфигураций:
- Использование
Pydanticдля определения моделей данных позволяет валидировать входные параметры, генерировать JSON-схемы и предоставлять примеры запросов/ответов. - Примеры конфигураций (
json_schema_extra) предоставляют понятные инструкции для интеграции.
- Использование
-
Унификация данных и моделей:
- Единые стандарты для конфигураций (модели, метрики, предсказания) упрощают взаимодействие между компонентами.
- Поддержка расширяемости через модели, такие как
FineTuneModelConfigиPredictionConfig.
-
Анализ данных и дашборды:
- Встроенная поддержка EDA (Exploratory Data Analysis) и создание дашбордов с использованием библиотеки
ydata_profiling. - Генерация HTML-отчётов для визуализации ключевых характеристик данных.
- Встроенная поддержка EDA (Exploratory Data Analysis) и создание дашбордов с использованием библиотеки
-
Управление состоянием приложения:
- Классы
StatusResponseиModelStatusResponseпозволяют легко отслеживать состояние сервиса и загруженных моделей.
- Классы
-
Обработка ошибок:
- Исключения (
FileNotFoundError, валидация черезPydantic) обрабатываются для обеспечения надёжности работы.
- Исключения (
- Масштабируемость за счёт модульного подхода.
- Простота интеграции через API и поддержку стандартов JSON.
- Поддержка многозадачности благодаря потокобезопасным операциям.
-
POST /api/v1/datasets/load
Загрузка нового датасета из CSV-файла. -
PUT /api/v1/datasets/update/{dataset_id}
Обновление существующего датасета. -
GET /api/v1/datasets/eda/{dataset_id}
Генерация аналитического отчета по данным. -
GET /api/v1/datasets/eda_dashboard/{dataset_id}
Генерация HTML-дашборда анализа данных. -
GET /api/v1/datasets/list_datasets
Получение списка всех доступных датасетов. -
DELETE /api/v1/datasets/remove/{dataset_id}
Удаление конкретного датасета. -
DELETE /api/v1/datasets/remove_all
Удаление всех датасетов.
-
POST /api/v1/models/fit
Обучение новой модели. -
POST /api/v1/models/fine_tuning
Дообучение существующей модели. -
POST /api/v1/models/load
Загрузка модели в память. -
POST /api/v1/models/unload
Выгрузка модели из памяти. -
POST /api/v1/models/predict
Выполнение предсказания для текста. -
POST /api/v1/models/predict_items
Выполнение предсказания для данных из CSV-файла. -
GET /api/v1/models/model_info/{model_id}
Получение информации о конкретной модели. -
GET /api/v1/models/models_info
Получение информации обо всех моделях. -
GET /api/v1/models/get_status
Получение статусов загруженных моделей. -
DELETE /api/v1/models/remove/{model_id}
Удаление конкретной модели. -
DELETE /api/v1/models/remove_all
Удаление всех моделей.
Проект представляет собой приложение на Streamlit для обучения моделей кластеризации текста и проведения инференса.
- Пользовательский интерфейс реализован с помощью Streamlit.
- Включает вкладки для загрузки датасетов, проведения EDA (разведочного анализа данных), обучения моделей, настройки гиперпараметров и инференса.
- Использует logging_config.py для логирования действий пользователя и работы приложения.
- utils.py содержит вспомогательные функции для взаимодействия с backend'ом (FastAPI).
- Общается с backend'ом через API запросы, определенные в config.py (BASE_URL).
- Многостраничное реактивное приложение: Клиент разделен на несколько страниц (pages директория) для лучшей организации: загрузка датасетов, EDA, обучение, инференс. Это улучшает навигацию и пользовательский опыт. Переход между страницами происходит без перезагрузки вкладки.
- Взаимодействие с backend'ом (FastAPI): Клиент общается с backend'ом через API запросы, используя библиотеку requests и LoggedSession для логирования всех запросов и ответов. BASE_URL в config.py определяет адрес backend'a, также его можно задать через переменные окружения
- Обработка и отображение данных: Клиент использует Streamlit для отображения данных, графиков (с помощью plotly) и других визуализаций, получаемых от backend'a, например, кривых обучения.
- Логирование: logging_config.py настраивает логирование, записывая информацию о запросах, ответах и других событиях в файл logs/app.log с ротацией логов. Это помогает в отладке и мониторинге работы приложения.
- Утилиты: utils.py содержит вспомогательные функции для взаимодействия с backend'ом: загрузка/выгрузка/удаление моделей, получение списка датасетов и информации о моделях, отображение статуса моделей. Это инкапсулирует логику взаимодействия с API и упрощает код основной части приложения.
- Пример данных: Предоставляется пример файла с данными (news_sample.csv), который, используется для демонстрации функциональности или для начального тестирования приложения.
- Клиент развернут на сервере, его можно протестировать по адресу https://hse-client.partoneclo.ru/
В данном репозитории настроен CI процесс (автоматический механизм проверки качества кода и запуска юнит-тестов), что способствует поддержанию высокого уровня стабильности и стандартизации проекта.
Основные аспекты:
-
Линтеры для проверки качества кода:
- Используются Flake8 и Pylint для статического анализа кода.
- Проверяются потенциальные ошибки, форматирование, соответствие стандартам PEP8.
- Настроены допустимые параметры, такие как максимальная длина строки и минимальный рейтинг кода.
-
Юнит-тестирование:
- Юнит-тесты выполняются с использованием фреймворка pytest.
- Тесты запускаются в рамках установленного тайм-аута, чтобы гарантировать завершение проверки в разумные сроки.
- Проект покрыт тестами, что позволяет выявлять ошибки на ранних этапах разработки.
-
Мультиплатформенная проверка:
- CI/CD выполнен для двух популярных операционных систем: Ubuntu и Windows.
- Убедившись, что код работает стабильно в разных средах, повышается его переносимость и устойчивость.
-
Управление зависимостями:
- Использование Poetry для управления зависимостями упрощает настройку окружения и гарантирует, что все зависимости установлены корректно.
- Локальные виртуальные окружения создаются и кэшируются для ускорения сборки.
-
Анализ Dockerfile:
- Применение линтера Hadolint к файлам Docker гарантирует, что контейнеры собираются с соблюдением лучших практик.
- Сборка проекта и его деплой осуществляется при помощи Docker
- Алгоритм сборки образа бекенда и фронтенда описан в файлах Dockerfile
- Деплой и связка самих сервисов осуществляется по конфигурации из
docker-compose.yml - Чтобы собрать проект самостоятельно, достаточно выполнить команду из корня проекта
docker compose up -d- обучение модели
/fit
Пример запроса:
Результат выполнения:
- fine tuning модели
/fine_tuning
Пример запроса:
Результат выполнения:
- загрузка модели
/load
Пример запроса:
Результат выполнения:
- предсказание модели
/predict
Пример запроса:
Результат выполнения:
- предсказание модели для нескольких объектов
/predict_items
Пример запроса:
Результат выполнения:
- вывод информации о модели по id
/model_info/{model_id}
Пример запроса:
Результат выполнения:
{
"id": "kmeans_BoW_1",
"type": "kmeans",
"metrics": {
"silhouette": -0.1940026642864812,
"davies_bouldin": 2.114552593586959,
"calinski_harabasz": 18.69414302282505
},
"training_curves": {
"inertia": [
357189.8310640746,
356979.31565604336,
356754.0672893798,
356537.0162913634,
356320.9691806494,
356069.62696588004,
355794.083666806,
355447.66496736807,
355109.70212574577,
354777.35552658944,
354377.05035275436,
353952.4647551086,
353506.16712571203,
353017.0402453156,
352530.17506688717,
352048.284182104,
351561.1804935722,
351041.9285548266,
350529.1208158211,
350019.28289021004,
349523.8855833017,
349034.94950361294,
348547.9622522913,
348062.3406087103,
347598.2699409341,
347154.4193074891,
346729.5642678646,
346322.5758485365,
345932.41102261393,
345558.10442750965,
345198.76110873424,
344853.55012422975,
344521.698877727,
344201.0725743793,
343887.5771285611,
343583.41896326153,
343291.22296874766,
343010.3328467996,
342740.1373586305,
342480.06660545646,
342229.0017141595,
341984.42476121226,
341747.29910995334,
341519.1501401755,
341299.49838560045,
341087.8963428938,
340883.92593085335,
340687.19618430035,
340497.3411578985,
340314.0180180408,
340136.90530360676,
339965.7013384972,
339800.12278088246,
339634.6414736319,
339468.90693510906,
339308.2386924257,
339152.41344714357,
339001.2202447031,
338854.4596607322,
338711.94304956263,
338573.49184951314,
338438.9369400723,
338308.11804654554,
338180.88318825734,
338057.08816658036,
337936.5960896083,
337819.27693047404,
337705.0071165675,
337593.6691472558,
337485.15123782854,
337379.3469876031,
337276.15507040254,
337175.4789455917,
337077.22658822493,
336981.31023678405,
336887.64615726855,
336796.15442238067,
336706.75870477513,
336619.38608326827,
336533.966861184,
336450.4343958931,
336368.7249388051,
336288.7774850716,
336210.53363233083,
336133.93744789826,
336058.93534378905,
335985.4759590782,
335913.510049111,
335842.9903810969,
335773.8716356667,
335706.1103140314,
335639.2251398898,
335571.95737245446,
335505.9318621242,
335441.11272929254,
335377.46542792465,
335314.9566860794,
335253.55444949714,
335193.22782808787,
335133.94704517233,
335075.68338924943,
335075.68338924943
]
},
"dataset_id": "news"
}- вывод информации о всех обученных моделях
/models_info
Пример запроса:
Результат выполнения:
- список активных для инференса моделей
/get_status
Пример запроса:
Результат выполнения:
- выгрузка модели
/unload
Пример запроса:
Результат выполнения:
- удаление модели по id
/remove/{model_id}
Пример запроса:
Результат выполнения:
- удаление всех обученных моделей
/remove_all
Пример запроса:
Результат выполнения:
- загрузка датасета
/load
Пример запроса:
Результат выполнения:
- список всех загруженных датасетов
/list_datasets
- выполнение анализа данных (EDA)
/eda
Пример запроса:
Результат выполнения:
- построение дашборда с использованием ydata_profiling
/eda_dashboard
Пример запроса:
Результат выполнения:
- удаление датасета по id
/remove/{dataset_id}
Пример запроса:
Результат выполнения:
- удаление всех датасетов
/remove_all
Пример запроса:
Результат выполнения:


































