Возможно, вам никогда не понадобятся эти длинные аргументы CLI для вашего train.py.

Управление моделями глубокого обучения может быть затруднено из-за огромного количества параметров и настроек, которые необходимы для всех модулей. Учебному модулю могут потребоваться такие параметры, как batch_size или num_epochs, или параметры для планировщика скорости обучения. Точно так же модулю предварительной обработки данных могут потребоваться train_test_split или параметры для увеличения изображения.

Наивный подход к управлению этими параметрами или их введению в конвейер состоит в том, чтобы использовать их в качестве аргументов CLI при выполнении сценариев. Аргументы командной строки могут быть сложными для ввода, а управление всеми параметрами в одном файле может оказаться невозможным. Файлы TOML обеспечивают более простой способ управления конфигурациями, а сценарии могут загружать необходимые части конфигурации в форме Python dict без необходимости использования стандартного кода для чтения/анализа аргументов командной строки.

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

Что такое файлы TOML?

TOML, расшифровывается как Очевидный минимальный язык Тома, представляет собой формат файла, разработанный специально для файлов конфигурации. Концепция файла TOML очень похожа на файлы YAML/YML, которые имеют возможность хранить пары ключ-значение в древовидной иерархии. Преимуществом TOML перед YAML является его удобочитаемость, что становится важным при наличии нескольких вложенных уровней.

Лично я не вижу никаких практических причин предпочитать TOML YAML, кроме улучшения читабельности. Использование YAML абсолютно нормально, вот пакет Python для разбора YAML.

Зачем нужны конфигурации в TOML?

Есть два преимущества использования TOML для хранения конфигурации модели/данных/развертывания для моделей ML:

Управление всеми конфигурациями в одном файле: с файлами TOML мы можем создавать несколько групп настроек, необходимых для разных модулей. Например, на рисунке 1 настройки, относящиеся к процедуре обучения модели, вложены в атрибут [train], аналогичным образом port и host, необходимые для развертывания модели, хранятся в deploy. Нам не нужно переключаться между train.py или deploy.py, чтобы изменить их параметры, вместо этого мы можем глобализировать все настройки из одного файла конфигурации TOML.

Это может быть очень полезно, если мы обучаем модель на виртуальной машине, где редакторы кода или IDE недоступны для редактирования файлов. Один файл конфигурации легко редактировать с помощью vim или nano, доступных на большинстве виртуальных машин.

Как мы читаем конфигурации из TOML?

Для чтения конфигурации из файлов TOML можно использовать два пакета Python: toml и munch. toml поможет нам прочитать файл TOML и вернуть содержимое файла в виде Python dict . munch преобразует содержимое dict, чтобы разрешить доступ к элементам в стиле атрибутов. Например, вместо записи config[ "training" ][ "num_epochs" ] мы можем просто написать config.training.num_epochs, что повышает читабельность.

Рассмотрим следующую файловую структуру,

- config.py
- train.py
- project_config.toml

project_config.toml содержит конфигурацию для нашего проекта машинного обучения, например,

[data]
vocab_size = 5589
seq_length = 10
test_split = 0.3
data_path = "dataset/"
data_tensors_path = "data_tensors/"

[model]
embedding_dim = 256
num_blocks = 5
num_heads_in_block = 3

[train]
num_epochs = 10
batch_size = 32
learning_rate = 0.001
checkpoint_path = "auto"

В config.py мы создаем функцию, которая возвращает munchified-версию этой конфигурации, используя toml и munch,

$> pip install toml munch
import toml
import munch

def load_global_config( filepath : str = "project_config.toml" ):
    return munch.munchify( toml.load( filepath ) )

def save_global_config( new_config , filepath : str = "project_config.toml" ):
    with open( filepath , "w" ) as file:
        toml.dump( new_config , file )

Теперь, теперь в любом из файлов нашего проекта, например train.py или predict.py, мы можем загрузить эту конфигурацию,

from config import load_global_config

config = load_global_config()

batch_size = config.train.batch_size
lr = config.train.learning_rate

if config.train.checkpoint_path == "auto":
    # Make a directory with name as current timestamp
    pass

Выход print( toml.load( filepath ) ) ) таков,

{'data': {'data_path': 'dataset/',
          'data_tensors_path': 'data_tensors/',
          'seq_length': 10,
          'test_split': 0.3,
          'vocab_size': 5589},
 'model': {'embedding_dim': 256, 'num_blocks': 5, 'num_heads_in_block': 3},
 'train': {'batch_size': 32,
           'checkpoint_path': 'auto',
           'learning_rate': 0.001,
           'num_epochs': 10}}

Если вы используете инструменты MLOps, такие как W&B Tracking или MLFlow, сохранение конфигурации в виде dict может быть полезным, поскольку мы можем напрямую передать его в качестве аргумента.

Конец

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

Вместо написания длинных аргументов CLI сценарии могли напрямую загружать конфигурацию из файла TOML. Если мы хотим обучить две версии модели с разными гиперпараметрами, нам просто нужно изменить файл TOML в config.py. Я начал использовать файлы TOML в своих последних проектах, и экспериментировать стало быстрее. Инструменты MLOps также могут управлять версиями модели вместе с их конфигурациями, но простота описанного выше подхода уникальна и требует минимальных изменений в существующих проектах.

Надеюсь, вам понравилось читать. Хорошего тебе дня!