Мы используем тесты, чтобы убедиться, что наш проект машинного обучения работает должным образом. Мы рекомендуем проводить тесты и выявлять источники ошибок как можно раньше в цикле разработки, чтобы предотвратить рост последующих расходов и потерю времени.
В этой статье я расскажу вам о реальном проекте и о том, как мы включили тесты.
Обзор проекта машинного обучения
Этот проект состоит из классификатора с несколькими метками, который принимает URL-адрес веб-сайта в качестве входных данных и возвращает список категорий для URL-адреса.
Он покажет вам, как:
- Обучите Distilbert-BERT, используя Huggingface и Pytorch для задачи с несколькими метками.
- Модульное тестирование, чтобы убедиться, что код соответствует стандартам качества перед его развертыванием.
- Разверните модель Distilbert-BERT для получения логических выводов с помощью Amazon sagemaker.
В этой записи блога основное внимание будет уделено второму пункту — тестированию.
Цели
К концу этой статьи вы сможете:
- Объясните, почему нам нужно протестировать наш проект
- Напишите конкретные модульные и функциональные тестовые функции с помощью pytest
- Запуск тестов с помощью pytest
- Создайте фикстуры для инициализации состояния для тестовых функций
- Параметризация тестов Python
Мотивы
Тестирование ваших проектов машинного обучения очень важно, поскольку оно помогает вам и вашей команде:
- Убедитесь, что код работает должным образом.
- Выявление ошибок и необычных ситуаций.
- Не стесняйтесь заменять существующий код на лучший код, не опасаясь разрушения всего процесса.
- Выясните, что делает функция, посмотрев на тест.
Начать работу с Pytest
Существует множество доступных инструментов для тестирования Python, но Pytest — самый понятный и удобный для пользователя, с подробной документацией, которую я рекомендую использовать.
Чтобы установить pytest, просто выполните команду ниже:
pip install -U pytest
В этом проекте у нас есть класс для запуска модели DistilBert с именем MultilabelClassifier.
Мы хотим протестировать этот класс, чтобы увидеть, работает ли он должным образом или нет.
Для этого просто напишите функцию, начинающуюся с test_
, за которой следует имя функции, которую мы хотим протестировать, то есть forward
.
Если мы запустим test_model.py.
Pytest пройдёт скрипт и запустит функции, начинающиеся с test
. Результат вышеприведенного теста будет выглядеть следующим образом:
pytest test_model.py ========================================= test session starts ========================================== platform darwin — Python 3.8.13, pytest-7.1.2, pluggy-1.0.0 rootdir: /Users/haythemtellili/Desktop/nlp, configfile: pytest.ini collected 1 item tests/test_model.py . [100%] ============================================================================================= 1 passed in 14.06s
Как параметризовать функцию тестирования с помощью Pytest
Встроенный декоратор @pytest.mark.parametrize позволяет вам параметризовать параметры тестовой функции, и вы можете передать список аргументов, чтобы убедиться, что определенный ввод дает желаемый результат.
В нашем случае, в качестве входных данных у нас есть идентификаторы токенов и маски (что ожидает DistilBert), и мы проверяем форму выходных данных.
Фикстуры: тестирование различных функций с одними и теми же данными
Что, если мы хотим использовать одни и те же данные для тестирования разных функций? Например, мы хотим протестировать наш Restful API с несколькими сценариями, такими как тестирование сквозной интеграции, результат API, авторизация, маршрут, доп.
Фикстуры Pytest позволяют писать код, который можно повторно использовать в нескольких тестах. Базовая фикстура просто возвращает значение, но она также может выполнять настройку, выдавать значение, а затем разрывать.
В приведенном выше примере мы создаем клиент с декоратором @pytest.fixture
над функцией client.
. Это превратит client
в экземпляр приложения.
Теперь мы можем использовать client
в качестве параметров для любых тестов!
Структура проектов
Вы можете организовать свои файлы различными способами. Вы можете хранить свои данные и тестовые файлы в одном каталоге или разделить их на две папки, одну для исходного кода, а другую для тестирования, как мы сделали для этого проекта.
├─ src │ ├─ __init__.py │ ├─ app.py │ ├─ config.py │ ├─ dataset.py │ ├─ engine.py │ ├─ inference_aws.py │ ├─ model.py │ ├─ train.py │ └─ utils.py └─ tests ├─ test_app.py ├─ test_inference_aws.py └─ test_model.py
Наконец, чтобы протестировать все функции, вы можете запустить эту команду:
python -m pytest
Если все идет так, как ожидалось, вы должны увидеть что-то вроде этого:
Заключение
Поздравляем! Вы только что открыли для себя pytest. Я надеюсь, что этот пост дал вам четкое представление о том, почему необходимо тестирование и как использовать pytest для включения тестирования в ваши проекты по науке о данных. Тестирование позволяет вам не только определить, работает ли ваша функция так, как задумано, но и помочь вам легко поддерживать и отлаживать свой код.
Исходный код этой статьи можно найти здесь:
Если вы хотите связаться со мной, свяжитесь со мной в LinkedIn.