Возможно, вам никогда не понадобятся эти длинные аргументы 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 также могут управлять версиями модели вместе с их конфигурациями, но простота описанного выше подхода уникальна и требует минимальных изменений в существующих проектах.
Надеюсь, вам понравилось читать. Хорошего тебе дня!