Как создавать тесты для ноутбуков
Для тестирования ноутбуков этого репозитория мы разработали исполнитель ноутбуков Recommenders, который позволяет параметризировать и выполнять ноутбуки для тестирования.
Исполнитель ноутбука находится в recommenders/utils/notebook_utils.py. Основные функции:
Разработка тестов PR-гейта с исполнителем ноутбука
Выполнить ноутбук с исполнителем ноутбуков Recommenders легко, это то, что мы в основном делаем в модульных тестах. Далее мы покажем только один из тестов, которые у нас есть в tests/unit/examples/test_notebooks_python.py.
import pytest
from recommenders.utils.notebook_utils import execute_notebook
@pytest.mark.notebooks
def test_sar_single_node_runs(notebooks, output_notebook, kernel_name):
notebook_path = notebooks["sar_single_node"]
execute_notebook(notebook_path, output_notebook, kernel_name=kernel_name)
Обратите внимание, что входные данные функции являются приспособлением, определённым в conftest.py. Дополнительную информацию см. в определении приспособлений в PyTest.
Чтобы выполнить этот тест, сначала убедитесь, что вы находитесь в правильной среде, как описано в SETUP.md:
Обратите внимание, что следующая инструкция выполняет тесты из корневой папки.
pytest tests/unit/examples/test_notebooks_python.py::test_sar_single_node_runs
Разработка ночных тестов с исполнителем ноутбука
Более продвинутый вариант используется в ночных тестах, где мы не только выполняем ноутбук, но и внедряем параметры и восстанавливаем вычисленные метрики.
Первый шаг — пометить параметры, которые мы собираемся внедрить. Для этого нам нужно изменить ноутбук. Мы добавим тег с именем parameters. Чтобы добавить тег, перейдите в меню ноутбука, «Вид», «Панель инструментов ячеек» и «Теги». Поле тега появится в каждой ячейке. Переменные в ячейке с тегами parameters могут быть введены. Типичными переменными, которые мы вводим, являются MOVIELENS_DATA_SIZE, EPOCHS и другие переменные конфигурации для наших алгоритмов.
Способ работы исполнителя ноутбука для внедрения параметров очень прост, он генерирует копию ноутбука (в нашем коде мы называем его OUTPUT_NOTEBOOK) и заменяет ячейку с тегом parameters внедрёнными переменными.
Второе изменение, которое нам нужно сделать в ноутбуке, — записать метрики, которые мы хотим протестировать, используя store_metadata("output_variable", python_variable_name). Обычно мы используем последнюю ячейку ноутбука для записи всех показателей. Это показатели, которыми мы будем управлять в дымовых и функциональных тестах.
Это пример того, как мы проводим дымовой тест. Полный код можно найти в... ``` import pytest
from recommenders.utils.notebook_utils import execute_notebook, read_notebook
TOL = 0.05 ABS_TOL = 0.05
def test_sar_single_node_smoke(notebooks, output_notebook, kernel_name): notebook_path = notebooks["sar_single_node"] execute_notebook( notebook_path, output_notebook, kernel_name=kernel_name, parameters=dict(TOP_K=10, MOVIELENS_DATA_SIZE="100k"), ) results = read_notebook(output_notebook)
assert results["precision"] == pytest.approx(0.330753, rel=TOL, abs=ABS_TOL)
assert results["recall"] == pytest.approx(0.176385, rel=TOL, abs=ABS_TOL)
Как видно из кода, мы вводим размер набора данных и топ k, и получаем точность и отзыв при k.
Для выполнения этого теста сначала убедитесь, что вы находитесь в правильной среде, как описано в файле SETUP.md:
*Обратите внимание, что следующие инструкции выполняют тесты из корневой папки.*
```pytest tests/smoke/examples/test_notebooks_python.py::test_sar_single_node_smoke```
### Как добавить тесты в конвейер AzureML
Чтобы добавить новый тест в конвейер AzureML, добавьте путь к тесту в соответствующую тестовую группу, указанную в файле test_groups.py (./ci/azureml_tests/test_groups.py).
Тесты в группах group_cpu_xxx выполняются на вычислительном узле кластера AzureML только с ЦП. Тесты в группах group_gpu_xxx выполняются на узле вычислительного кластера AzureML с поддержкой GPU с зависимостями, связанными с GPU, добавленными в среду выполнения AzureML. Тесты в группах group_pyspark_xxx выполняются на вычислительном узле кластера AzureML только с процессором, с зависимостями PySpark, добавленными в среду выполнения AzureML.
При добавлении нового теста важно помнить, что время выполнения тестовой группы не должно превышать указанный порог в файле test_groups.py.
Пример добавления нового теста:
1. В среде, в которой вы запускаете свой код, сначала посмотрите, есть ли группа, общее время работы которой меньше порога.
```python
"group_spark_001": [ # Общее время группы: 271,13 с
"tests/data_validation/recommenders/datasets/test_movielens.py::test_load_spark_df", # 4,33 с + 25,58 с + 101,99 с + 139,23 с
],
"group_spark_001": [ # Общее время группы: 571,13 с
"tests/data_validation/recommenders/datasets/test_movielens.py::test_load_spark_df", # 4,33 с+ 25,58 с + 101,99 с + 139,23 с
#
"tests/path/to/test_new.py::test_new_function", # 300 с
],
В этом разделе объясняется, как создать инфраструктуру AzureML для запуска тестов в GitHub Actions.
Чтобы выполнить тесты в Recommenders, нам нужны два типа виртуальных машин: без GPU для выполнения тестов CPU и Spark и с GPU для выполнения тестов GPU. Поэтому первым шагом является запрос достаточного квоты для вашей подписки.
Затем выполните следующие шаги, чтобы создать инфраструктуру AzureML:
Создайте новое рабочее пространство AzureML.
Создайте два новых кластера: cpu-cluster и gpu-cluster. Перейдите в раздел «вычислить», затем «кластер вычислений», затем «новый».
Добавьте идентификатор подписки в секреты действий GitHub здесь. Создайте новый секрет репозитория под названием AZUREML_TEST_SUBID и добавьте идентификатор подписки в качестве значения.
Убедитесь, что вы установили Azure CLI, и... ## Вы вошли в систему: az login
.
Выберите подписку: az account set -s $AZURE_SUBSCRIPTION_ID
.
Создайте субъект-службу: az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --role contributor --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID --json-auth
. Это создаст JSON-объект с учётными данными субъекта-службы:
{
"clientId": "XXXXXXXXXXXXXXXXXXXXX",
"clientSecret": "XXXXXXXXXXXXXXXXXXXXX",
"subscriptionId": "XXXXXXXXXXXXXXXXXXXXX",
"tenantId": "XXXXXXXXXXXXXXXXXXXXX",
"activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
"resourceManagerEndpointUrl": "https://management.azure.com/",
"activeDirectoryGraphResourceId": "https://graph.windows.net/",
"sqlManagementEndpointUrl": "https://management.core.windows.net:8443/",
"galleryEndpointUrl": "https://gallery.azure.com/",
"managementEndpointUrl": "https://management.core.windows.net/"
}
Добавьте вывод в качестве секрета действий GitHub AZUREML_TEST_CREDENTIALS
в разделе Настройки > Безопасность > Секреты и переменные > Действия репозитория.
Чтобы вручную выполнить тесты на CPU, GPU или Spark, сначала убедитесь, что вы находитесь в правильной среде, как описано в SETUP.md.
Обратите внимание, что следующие инструкции выполняют тесты из корневой папки.
Для выполнения тестов на CPU для утилит:
pytest tests -m "not notebooks and not spark and not gpu" --durations 0 --disable-warnings
Для выполнения тестов на CPU для ноутбуков:
pytest tests -m "notebooks and not spark and not gpu" --durations 0 --disable-warnings
Если вы хотите выполнить конкретный тест, вы можете использовать следующую команду:
pytest tests/data_validation/recommenders/datasets/test_mind.py::test_mind_url --durations 0 --disable-warnings
Если вы хотите выполнить любой из типов тестов (data_validation, unit, smoke, functional и т. д.), вы можете использовать следующую команду:
pytest tests/data_validation -m "not notebooks and not spark and not gpu" --durations 0 --disable-warnings
Для выполнения тестов на GPU для утилит:
pytest tests -m "not notebooks and not spark and gpu" --durations 0 --disable-warnings
Для выполнения тестов на GPU для ноутбуков:
pytest tests -m "notebooks and not spark and gpu" --durations 0 --disable-warnings
Для выполнения PySpark-тестов для утилит:
pytest tests -m "not notebooks and spark and not gpu" --durations 0 --disable-warnings
Для выполнения PySpark-тестов для ноутбуков:
pytest tests -m "notebooks and spark and not gpu" --durations 0 --disable-warnings
Примечание: добавление --durations 0
показывает время вычислений всех тестов.
Примечание: добавление --disable-warnings
отключит предупреждающие сообщения.
Чтобы пропустить тест из-за проблемы с ОС или вышестоящей системой, которую невозможно решить, можно использовать аннотации pytest annotations.
Пример:
@pytest.mark.skip(reason="<INSERT VALID REASON>")
@pytest.mark.skipif(sys.platform == 'win32', reason="Not implemented on Windows")
def test_to_skip():
assert False
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )