Проверка кода в локальной среде

Завершено

При каждом изменении кода в проекте машинного обучения необходимо проверить качество кода и модели.

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

Чтобы проверить скрипты, существуют две распространенные задачи:

  • Анализ кода. Проверка на наличие программных или стилистических ошибок в скриптах Python или R.
  • Модульное тестирование. Проверка производительности содержимого скриптов.

Схема процесса проверки с локальным и автоматическим тестированием.

Проверяя код, вы предотвращаете ошибки или проблемы при развертывании модели. Вы можете проверить код локально, запустив анализаторы коды и модульные тесты локально в интегрированной среде разработки, например Visual Studio Code.

Вы также можете запускать анализаторы кода и модульные тесты в автоматизированном рабочем процессе с помощью Azure Pipelines или GitHub Actions.

Вы узнаете, как выполнять анализ кода и модульные тесты в Visual Studio Code.

Анализ кода

Качество кода зависит от стандартов, которые вы согласовали с командой. Чтобы убедиться в соблюдении требований к качеству, можно запустить анализаторы кода, которые будут проверять, соответствует ли код стандартам команды.

В зависимости от используемого языка кода существует несколько вариантов анализа кода. Например, при работе с Python можно использовать Flake8 или Pylint.

Использование Flake8 для анализа кода

Чтобы использовать Flake8 с Visual Studio Code:

  1. Установите Flake8 с помощью pip install flake8.
  2. Создайте файл конфигурации .flake8 и сохраните его в репозитории.
  3. Настройте Visual Studio Code для использования Flake8 в качестве анализатора кода, перейдя к параметрам (Ctrl+,).
  4. Найдите flake8.
  5. Включите > Анализ кода > в Python с активированным Flake8.
  6. Задайте путь Flake8 к расположению в репозитории, где хранится файл .flake8.

Снимок экрана: настройка Flake8 в Visual Studio Code.

Чтобы указать, какие стандарты вашей команды соответствуют качеству кода, можно настроить анализатор кода Flake8. Распространенным способом определения стандартов является создание файла .flake8, хранящегося в коде.

Файл .flake8 должен начинаться с [flake8], за которым должна следовать любая из конфигураций, которую вы хотите использовать.

Совет

Полный список возможных параметров конфигурации можно найти в документации Flake8.

Например, если вы хотите указать, что максимальная длина любой строки не может превышать 80 символов, в файл .flake8 будет добавлена следующая строка:

[flake8]
max-line-length = 80

Flake8 содержит предопределенный список ошибок, которые может возвращать. Кроме того, можно использовать коды ошибок, основанные на руководстве по стилю PEP 8. Например, можно включить коды ошибок, ссылающиеся на правильное использование отступов или пробелов.

Вы можете выбрать (select) набор кодов ошибок, которые будут частью анализатора кода или выбрать коды ошибок, которые следует игнорировать (ignore) из списка параметров по умолчанию.

В результате файл конфигурации .flake8 может выглядеть следующим образом:

[flake8]
ignore = 
    W504,
    C901,
    E41
max-line-length = 79
exclude = 
    .git,
    .cache,
per-file-ignores =
    code/__init__.py:D104
max-complexity = 10
import-order-style = pep8

Совет

Общие сведения о кодах ошибок, на которые можно ссылаться, см. в списке ошибок Flake8.

После того как вы настроили Visual Studio Code для анализа кода, вы можете открыть любой файл кода, чтобы просмотреть результаты анализа. Все предупреждения или ошибки будут подчеркнуты. Вы можете выбрать Просмотреть проблему, чтобы проверить проблему для понимания ошибки.

Снимок экрана: результаты Flake 8 в Visual Studio Code.

Анализ кода с Azure Pipelines или GitHub Actions

Вы также можете автоматически запустить анализатор кода с помощью Azure Pipelines или GitHub Actions. Агент, предоставляемый любой платформой, будет запускать анализатор кода при выполнении следующих действий:

  1. Создайте файл конфигурации .flake8 и сохраните его в репозитории.
  2. Определите конвейер непрерывной интеграции или рабочий процесс в YAML.
  3. В качестве задачи или шага установите Flake8 с python -m pip install flake8.
  4. В качестве задачи или шага выполните команду flake8, чтобы проанализировать код.

Модульные тесты

Там, где анализатор проверяет, как вы написали код, модульные тесты проверяют, как работает код. Модули ссылаются на код, который вы создаете. Поэтому модульное тестирование также называется тестированием кода.

Рекомендуется, чтобы код существовал в основном вне функций. Независимо от того, создали ли вы функции для подготовки данных или для обучения модели. Вы можете применить модульное тестирование, например:

  • Убедитесь в корректности имен столбцов.
  • Проверьте уровень прогнозирования модели на новых наборах данных.
  • Проверка распределения уровней прогнозирования.

При работе с Python можно использовать Pytest и Numpy (который использует платформу Pytest) для тестирования кода. Чтобы узнать больше о работе с Pytest, узнайте, как писать тесты с помощью Pytest.

Совет

Ознакомьтесь с более подробным пошаговым руководством по тестированию Python в Visual Studio Code.

Представьте, что вы создали обучающий скрипт train.py, который содержит следующую функцию:

# Train the model, return the model
def train_model(data, ridge_args):
    reg_model = Ridge(**ridge_args)
    reg_model.fit(data["train"]["X"], data["train"]["y"])
    return reg_model

Предположим, что вы сохранили обучающий скрипт в каталоге src/model/train.py репозитория. Чтобы протестировать функцию train_model, необходимо импортировать функцию из src.model.train.

Файл test_train.py создается в папке tests. Одним из способов тестирования кода Python является использование numpy. Numpy предлагает несколько функций assert для сравнения массивов, строк, объектов или элементов.

Например, чтобы проверить функцию train_model, можно использовать небольшой набор данных для обучения и assert проверки того, практически равны ли прогнозы стандартным метрикам производительности.

import numpy as np
from src.model.train import train_model

def test_train_model():
    X_train = np.array([1, 2, 3, 4, 5, 6]).reshape(-1, 1)
    y_train = np.array([10, 9, 8, 8, 6, 5])
    data = {"train": {"X": X_train, "y": y_train}}

    reg_model = train_model(data, {"alpha": 1.2})

    preds = reg_model.predict([[1], [2]])
    np.testing.assert_almost_equal(preds, [9.93939393939394, 9.03030303030303])

Чтобы протестировать код в Visual Studio Code с помощью пользовательского интерфейса, выполните следующие действия:

  1. Установите все необходимые библиотеки для запуска скрипта обучения.
  2. Убедитесь, что pytest установлен и включен в Visual Studio Code.
  3. Установка расширения Python для Visual Studio Code.
  4. Выберите сценарий train.py, который вы хотите протестировать.
  5. Выберите вкладку Тестирование из меню слева.
  6. Настройте тестирование Python, выбрав pytest и задав расположения теста в вашей tests/ папке.
  7. Выполните все тесты, нажав кнопку воспроизведения, и просмотрите результаты.

Снимок экрана: результаты успешно выполненного модульного теста в Visual Studio Code.

Чтобы выполнить тест в конвейере Azure DevOps или GitHub Action:

  1. Убедитесь, что для запуска скрипта обучения установлены все необходимые библиотеки. В идеале используйте requirements.txt список всех библиотек с pip install -r requirements.txt
  2. Установка pytest с помощью pip install pytest
  3. Запуск тестов с pytest tests/

Результаты тестов будут отображаться в выходных данных выполняемого конвейера или рабочего процесса.

Примечание.

Если во время анализа кода или модульного тестирования возвращается ошибка, конвейер CI может дать сбой. Поэтому перед запуском конвейера CI лучше сначала проверить код локально.