Yacs вырос из экспериментов аналогичного типа, использованных в детекторе 2.

YACS был создан как облегченная библиотека для определения и управления конфигурациями системы, например, тех, которые обычно встречаются в программном обеспечении, предназначенном для научных экспериментов. Эти «конфигурации» обычно охватывают такие понятия, как гиперпараметры, используемые при обучении модели машинного обучения, или гиперпараметры настраиваемой модели, такие как глубина сверточной нейронной сети. Поскольку вы занимаетесь наукой, воспроизводимость имеет первостепенное значение, и поэтому вам нужен надежный способ сериализации экспериментальных конфигураций. YACS использует YAML как простой, удобочитаемый формат сериализации. Парадигма: your code + a YACS config for experiment E (+ external dependencies + hardware + other nuisance terms ...) = reproducible experiment E. Возможно, вы не сможете контролировать все, но, по крайней мере, вы можете контролировать свой код и экспериментальную конфигурацию.

Вот базовый API, который вам нужно знать.

Применение

YACS можно использовать различными гибкими способами. Существует две основные парадигмы:

  • Конфигурация как локальная переменная
  • Конфигурация как глобальный синглтон

Какой вариант вы предпочитаете использовать, решать вам, хотя рекомендуется использовать локальный переменный маршрут.

Чтобы использовать YACS в своем проекте, вы сначала создаете файл конфигурации проекта, обычно называемый config.py или defaults.py. Этот файл является универсальной отправной точкой для всех настраиваемых параметров. Он должен быть очень хорошо документирован и обеспечивать разумные значения по умолчанию для всех параметров.

# my_project/config.py
from yacs.config import CfgNode as CN


_C = CN()

_C.SYSTEM = CN()
# Number of GPUS to use in the experiment
_C.SYSTEM.NUM_GPUS = 8
# Number of workers for doing things
_C.SYSTEM.NUM_WORKERS = 4

_C.TRAIN = CN()
# A very important hyperparameter
_C.TRAIN.HYPERPARAMETER_1 = 0.1
# The all important scales for the stuff
_C.TRAIN.SCALES = (2, 4, 8, 16)


def get_cfg_defaults():
  """Get a yacs CfgNode object with default values for my_project."""
  # Return a clone so that the defaults will not be altered
  # This is for the "local variable" use pattern
  return _C.clone()

# Alternatively, provide a way to import the defaults as
# a global singleton:
# cfg = _C  # users can `from config import cfg`

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

# my_project/experiment.yaml
SYSTEM:
  NUM_GPUS: 2
TRAIN:
  SCALES: (1, 2)

ConfigNode — это самый простой объект в Yacs. Вы можете создать рекурсивную древовидную структуру, чтобы лучше организовать ваши конфигурации.

Ссылки:

Репо Yacs: https://github.com/rbgirshick/yacs