1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-recommenders

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 15 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 05:23 6594845

Как создавать тесты для ноутбуков

Для тестирования ноутбуков этого репозитория мы разработали исполнитель ноутбуков Recommenders, который позволяет параметризировать и выполнять ноутбуки для тестирования.

Исполнитель ноутбука находится в recommenders/utils/notebook_utils.py. Основные функции:

  • execute_notebook: выполняет ноутбук и сохраняет вывод в новом ноутбуке. При необходимости можно внедрить параметры в ноутбук. Для этого необходимо пометить ячейки тегом parameters. Каждую ячейку с тегом parameters можно ввести переменными, переданными в словаре parameters.
  • store_metadata: сохраняет выходные данные переменной. Выходные данные сохраняются в метаданных ноутбука Jupyter и могут быть прочитаны функцией read_notebook.
  • read_notebook: считывает выходной ноутбук и возвращает словарь с переменными, записанными с помощью store_metadata.

Разработка тестов 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 с
],
  1. Добавьте тест в группу, добавьте время его выполнения и обновите общее время группы.
"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 с
],
  1. Если все группы вашей среды превышают пороговое значение, добавьте новую группу.

Настройка GitHub Actions с кластерами вычислений AzureML

В этом разделе объясняется, как создать инфраструктуру AzureML для запуска тестов в GitHub Actions.

Чтобы выполнить тесты в Recommenders, нам нужны два типа виртуальных машин: без GPU для выполнения тестов CPU и Spark и с GPU для выполнения тестов GPU. Поэтому первым шагом является запрос достаточного квоты для вашей подписки.

Затем выполните следующие шаги, чтобы создать инфраструктуру AzureML:

  1. Создайте новое рабочее пространство AzureML.

    • Имя: azureml-test-workspace
    • Группа ресурсов: recommenders_project_resources
    • Расположение: Убедитесь, что у вас достаточно квоты в выбранном вами расположении
  2. Создайте два новых кластера: cpu-cluster и gpu-cluster. Перейдите в раздел «вычислить», затем «кластер вычислений», затем «новый».

    • Выберите базовую виртуальную машину с процессором. Всё, что выше 64 ГБ ОЗУ и 8 ядер, должно подойти.
    • Выберите базу виртуальной машины с графическим процессором. Всё, что превышает 56 ГБ ОЗУ, 6 ядер и NVIDIA K80, должно быть в порядке.
  3. Добавьте идентификатор подписки в секреты действий GitHub здесь. Создайте новый секрет репозитория под названием AZUREML_TEST_SUBID и добавьте идентификатор подписки в качестве значения.

  4. Убедитесь, что вы установили Azure CLI, и... ## Вы вошли в систему: az login.

  5. Выберите подписку: az account set -s $AZURE_SUBSCRIPTION_ID.

  6. Создайте субъект-службу: 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/"
    }
  7. Добавьте вывод в качестве секрета действий GitHub AZUREML_TEST_CREDENTIALS в разделе Настройки > Безопасность > Секреты и переменные > Действия репозитория.

Как выполнять тесты в локальной среде

Чтобы вручную выполнить тесты на CPU, GPU или Spark, сначала убедитесь, что вы находитесь в правильной среде, как описано в SETUP.md.

Тесты на CPU

Обратите внимание, что следующие инструкции выполняют тесты из корневой папки.

Для выполнения тестов на 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

Для выполнения тестов на 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

Для выполнения 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-recommenders.git
git@api.gitlife.ru:oschina-mirror/mirrors-recommenders.git
oschina-mirror
mirrors-recommenders
mirrors-recommenders
main