Проверка кода в локальной среде
При каждом изменении кода в проекте машинного обучения необходимо проверить качество кода и модели.
Во время непрерывной интеграции вы создаете и проверяете ресурсы для приложения. Специалист по обработке и анализу данных, вероятно, сосредоточится на создании скриптов, используемых для подготовки данных и обучения модели. Инженер машинного обучения позже использует скрипты в конвейерах для автоматизации этих процессов.
Чтобы проверить скрипты, существуют две распространенные задачи:
- Анализ кода. Проверка на наличие программных или стилистических ошибок в скриптах Python или R.
- Модульное тестирование. Проверка производительности содержимого скриптов.
Проверяя код, вы предотвращаете ошибки или проблемы при развертывании модели. Вы можете проверить код локально, запустив анализаторы коды и модульные тесты локально в интегрированной среде разработки, например Visual Studio Code.
Вы также можете запускать анализаторы кода и модульные тесты в автоматизированном рабочем процессе с помощью Azure Pipelines или GitHub Actions.
Вы узнаете, как выполнять анализ кода и модульные тесты в Visual Studio Code.
Анализ кода
Качество кода зависит от стандартов, которые вы согласовали с командой. Чтобы убедиться в соблюдении требований к качеству, можно запустить анализаторы кода, которые будут проверять, соответствует ли код стандартам команды.
В зависимости от используемого языка кода существует несколько вариантов анализа кода. Например, при работе с Python можно использовать Flake8 или Pylint.
Использование Flake8 для анализа кода
Чтобы использовать Flake8 с Visual Studio Code:
- Установите Flake8 с помощью
pip install flake8
. - Создайте файл конфигурации
.flake8
и сохраните его в репозитории. - Настройте Visual Studio Code для использования Flake8 в качестве анализатора кода, перейдя к параметрам (
Ctrl+,
). - Найдите
flake8
. - Включите > Анализ кода > в Python с активированным Flake8.
- Задайте путь Flake8 к расположению в репозитории, где хранится файл
.flake8
.
Чтобы указать, какие стандарты вашей команды соответствуют качеству кода, можно настроить анализатор кода 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 для анализа кода, вы можете открыть любой файл кода, чтобы просмотреть результаты анализа. Все предупреждения или ошибки будут подчеркнуты. Вы можете выбрать Просмотреть проблему, чтобы проверить проблему для понимания ошибки.
Анализ кода с Azure Pipelines или GitHub Actions
Вы также можете автоматически запустить анализатор кода с помощью Azure Pipelines или GitHub Actions. Агент, предоставляемый любой платформой, будет запускать анализатор кода при выполнении следующих действий:
- Создайте файл конфигурации
.flake8
и сохраните его в репозитории. - Определите конвейер непрерывной интеграции или рабочий процесс в YAML.
- В качестве задачи или шага установите Flake8 с
python -m pip install flake8
. - В качестве задачи или шага выполните команду
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
для сравнения массивов, строк, объектов или элементов.
Совет
Узнайте больше о рекомендациях по тестированию при использовании Numpy для тестирования и поддержке тестов Numpy.
Например, чтобы проверить функцию 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 с помощью пользовательского интерфейса, выполните следующие действия:
- Установите все необходимые библиотеки для запуска скрипта обучения.
- Убедитесь, что
pytest
установлен и включен в Visual Studio Code. - Установка расширения Python для Visual Studio Code.
- Выберите сценарий
train.py
, который вы хотите протестировать. - Выберите вкладку Тестирование из меню слева.
- Настройте тестирование Python, выбрав pytest и задав расположения теста в вашей
tests/
папке. - Выполните все тесты, нажав кнопку воспроизведения, и просмотрите результаты.
Чтобы выполнить тест в конвейере Azure DevOps или GitHub Action:
- Убедитесь, что для запуска скрипта обучения установлены все необходимые библиотеки. В идеале используйте
requirements.txt
список всех библиотек сpip install -r requirements.txt
- Установка
pytest
с помощьюpip install pytest
- Запуск тестов с
pytest tests/
Результаты тестов будут отображаться в выходных данных выполняемого конвейера или рабочего процесса.
Примечание.
Если во время анализа кода или модульного тестирования возвращается ошибка, конвейер CI может дать сбой. Поэтому перед запуском конвейера CI лучше сначала проверить код локально.