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

Обзор проекта машинного обучения

Этот проект состоит из классификатора с несколькими метками, который принимает URL-адрес веб-сайта в качестве входных данных и возвращает список категорий для URL-адреса.

Он покажет вам, как:

  • Обучите Distilbert-BERT, используя Huggingface и Pytorch для задачи с несколькими метками.
  • Модульное тестирование, чтобы убедиться, что код соответствует стандартам качества перед его развертыванием.
  • Разверните модель Distilbert-BERT для получения логических выводов с помощью Amazon sagemaker.

В этой записи блога основное внимание будет уделено второму пункту — тестированию.

Цели

К концу этой статьи вы сможете:

  1. Объясните, почему нам нужно протестировать наш проект
  2. Напишите конкретные модульные и функциональные тестовые функции с помощью pytest
  3. Запуск тестов с помощью pytest
  4. Создайте фикстуры для инициализации состояния для тестовых функций
  5. Параметризация тестов Python

Мотивы

Тестирование ваших проектов машинного обучения очень важно, поскольку оно помогает вам и вашей команде:

  1. Убедитесь, что код работает должным образом.
  2. Выявление ошибок и необычных ситуаций.
  3. Не стесняйтесь заменять существующий код на лучший код, не опасаясь разрушения всего процесса.
  4. Выясните, что делает функция, посмотрев на тест.

Начать работу с 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.