Организация кода и рефакторинг

Введение в версионирование данных с DVC

Ravi Bhadauria

Machine Learning Engineer

Прототип vs production-код

  • Прототипирование позволяет быстро итерировать
  • Но не подходит для production
    • Код не протестирован и подвержен ошибкам
    • Не модульный, содержит много повторяющихся блоков
    • Скорее всего, не воспроизводим
Введение в версионирование данных с DVC

Свойства хорошего production-кода

  • Воспроизводимость: одинаковые результаты в разных средах и в разное время

  • Модульность: код разбит на отдельные независимые и тестируемые модули

  • Согласованность: единый источник истины для всех параметров

    • Файл конфигурации/параметров

Схема, показывающая три свойства production-кода

Введение в версионирование данных с DVC

Файлы конфигурации и YAML

  • Файлы должны быть в поддерживаемом формате

    • YAML, JSON, TOML, Python
    • По умолчанию: params.yaml
  • Мы будем работать с YAML

    • YAML Ain't Markup Language
    • Универсальный формат для передачи данных между языками и приложениями
    • Простой и лаконичный формат
    • Допустимые расширения: .yaml или .yml
1 https://dvc.org/doc/command-reference/params#description
Введение в версионирование данных с DVC

Синтаксис YAML

  • Параметры задаются в виде словарей

    • Ключи и значения разделяются символом :
  • Комментарии начинаются с #

  • Типы данных:

    • Integer, Floats, Strings
  • Структуры данных:

    • Arrays
    • Nested Dictionaries
  • Отступы важны

# Key-value pairs
a: 1
b: 1.2
c: "String value"
# Arrays
a: [1, 2.2, 3, 4.8]
b:
  - 5
  - "String value"
# Nested dictionaries
a:
  b: "Some value"
  c: "Some other value"
Введение в версионирование данных с DVC

Пример файла конфигурации

# Data preprocessing paramters
preprocess:
  ...
  target_column: RainTomorrow
  categorical_features:
    - Location
    - WindGustDir
    - ...

# Model training/evaluation paramters train_and_evaluate: rfc_params: n_estimators: 2 ...
Введение в версионирование данных с DVC

Пример модульной функции

# In model.py
def evaluate_model(model, X_test, y_test):
    """Evaluate a model on a test set and return metrics."""
    y_pred = model.predict(X_test)
    precision = precision_score(y_test, y_pred)
    ...
    return { "accuracy": accuracy, "precision": precision,
        "recall": recall, "f1_score": f1 }
# In entry-point code (train_and_evaluate.py)
from model import evaluate_model
metrics = evaluate_model(model, X_test, y_test)
Введение в версионирование данных с DVC

Пример структуры кода проекта

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

Введение в версионирование данных с DVC

Давайте потренируемся!

Введение в версионирование данных с DVC

Preparing Video For Download...