Transformers documentation
Утилиты для Trainer
Утилиты для Trainer
На этой странице перечислены все вспомогательные функции, используемые в Trainer.
Большинство из них полезны только в том случае, если вы изучаете код класса Trainer в библиотеке.
Утилиты
класс transformers.EvalPrediction
< source >( predictions: numpy.ndarray | tuple[numpy.ndarray]label_ids: numpy.ndarray | tuple[numpy.ndarray]inputs: numpy.ndarray | tuple[numpy.ndarray] | None = Nonelosses: numpy.ndarray | tuple[numpy.ndarray] | None = None )
Вывод оценки (всегда содержит метки), используемый для вычисления метрик.
класс transformers.IntervalStrategy
< source >( valuenames = Nonemodule = Nonequalname = Nonetype = Nonestart = 1boundary = None )
Вспомогательная функция для воспроизводимого поведения при распределённом обучении. См. https://pytorch.org/docs/stable/notes/randomness.html для pytorch
transformers.set_seed
< source >( seed: intdeterministic: bool = False )
Вспомогательная функция для воспроизводимого поведения: устанавливает seed в random, numpy, torch (если установлено).
transformers.torch_distributed_zero_first
< source >( local_rank: int )
Декоратор, заставляющий все процессы в распределённом обучении ждать, пока каждый local_master выполнит определённое действие.
Внутреннее устройство колбэков
класс transformers.trainer_callback.CallbackHandler
< source >( callbacksmodelprocessing_classoptimizerlr_scheduler )
Внутренний класс, который просто вызывает список обратных вызовов по порядку.
Парсер аргументов Trainer
класс transformers.HfArgumentParser
< source >( dataclass_types: typing.Union[transformers.hf_argparser.DataClassType, collections.abc.Iterable[transformers.hf_argparser.DataClassType], NoneType] = None**kwargs )
Параметры
Этот подкласс argparse.ArgumentParser использует аннотации типов в dataclasses для генерации аргументов.
Класс спроектирован для удобной работы с нативным argparse. В частности, после инициализации вы можете добавить в парсер дополнительные аргументы (не поддерживаемые dataclass), и после разбора получите их в виде дополнительного namespace. Необязательно: для создания подгрупп аргументов используйте атрибут _argument_group_name в dataclass.
parse_args_into_dataclasses
< source >( args = Nonereturn_remaining_strings = Falselook_for_args_file = Trueargs_filename = Noneargs_file_flag = None ) → Tuple consisting of
Параметры
- args — Список строк для разбора. По умолчанию берётся из sys.argv. (аналогично argparse.ArgumentParser)
- return_remaining_strings — Если true, также возвращает список оставшихся строковых аргументов.
- look_for_args_file — Если установлено в true, будет искать файл «.args» с тем же базовым именем, что и сценарий точки входа для этого процесса, и добавлять его возможное содержимое к аргументам командной строки.
- args_filename — Если не None, используется этот файл вместо файла «.args», указанного в предыдущем аргументе.
- args_file_flag — Если не None, будет искать файл в аргументах командной строки, указанных с этим флагом. Флаг можно указать несколько раз, а приоритет определяется порядком (последний имеет преимущество).
Возвращает
Кортеж, состоящий из
- экземпляры dataclass в том же порядке, в котором они были переданы в инициализатор.
- при необходимости, дополнительное пространство имён для дополнительных (не основанных на dataclass) аргументов, добавляемых в парсер после инициализации.
- Потенциальный список оставшихся строковых аргументов. (аналогично argparse.ArgumentParser.parse_known_args)
Разобрать аргументы командной строки в экземпляры указанных типов dataclass.
Это опирается на ArgumentParser.parse_known_args из argparse. См. документацию по адресу:
docs.python.org/3/library/argparse.html#argparse.ArgumentParser.parse_args
parse_dict
< source >( args: dictallow_extra_keys: bool = False ) → Tuple consisting of
Параметры
- args (
dict) — словарь, содержащий значения конфигурации - allow_extra_keys (
bool, необязательный, по умолчаниюFalse) — По умолчанию False. Если False, будет вызвано исключение, если словарь содержит ключи, которые не были распознаны.
Возвращает
Кортеж, состоящий из
- экземпляры dataclass в том же порядке, в котором они были переданы в инициализатор.
Альтернативный вспомогательный метод, который вообще не использует argparse, а вместо этого использует словарь и заполняет типы dataclass.
parse_json_file
< source >( json_file: str | os.PathLikeallow_extra_keys: bool = False ) → Tuple consisting of
Параметры
- json_file (
strилиos.PathLike) — Имя файла JSON для разбора - allow_extra_keys (
bool, необязательный, по умолчаниюFalse) — По умолчанию False. Если False, будет вызвано исключение, если файл json содержит ключи, которые не обрабатываются.
Возвращает
Кортеж, состоящий из
- экземпляры dataclass в том же порядке, в котором они были переданы в инициализатор.
Альтернативный вспомогательный метод, который вообще не использует argparse, а вместо этого загружает json-файл и заполняет типы dataclass.
parse_yaml_file
< source >( yaml_file: str | os.PathLikeallow_extra_keys: bool = False ) → Tuple consisting of
Параметры
- yaml_file (
strилиos.PathLike) — Имя файла yaml для разбора - allow_extra_keys (
bool, необязательный, по умолчаниюFalse) — По умолчанию False. Если False, будет вызвано исключение, если файл json содержит ключи, которые не обрабатываются.
Возвращает
Кортеж, состоящий из
- экземпляры dataclass в том же порядке, в котором они были переданы в инициализатор.
Альтернативный вспомогательный метод, который вообще не использует argparse, а вместо этого загружает файл yaml и заполняет типы dataclass.
Утилиты отладки
класс transformers.debug_utils.DebugUnderflowOverflow
< source >( modelmax_frames_to_save = 21trace_batch_nums = Noneabort_after_batch_num = None )
Параметры
- model (
nn.Module) — Модель, которую нужно отладить. - max_frames_to_save (
int, необязательный, по умолчанию 21) — Сколько кадров назад записывать - trace_batch_nums(
list[int], необязательный, по умолчанию[]) — Номера батчей для трассировки (отключает обнаружение поворотов) - abort_after_batch_num (`int“, optional) — Следует ли прервать выполнение после завершения определённого номера батча
Этот класс отладки помогает обнаружить и понять, где модель начинает получать очень большие или очень малые значения, а что ещё важнее — элементы весов и активаций, равные nan или inf.
Существуют 2 рабочих режима:
- Обнаружение переполнения/недополнения (по умолчанию)
- Отслеживание абсолютных минимальных/максимальных значений конкретной партии без обнаружения
Режим 1: обнаружение переполнения/недополнения
Для активации обнаружения переполнения/недополнения инициализируйте объект с моделью:
debug_overflow = DebugUnderflowOverflow(model)
затем запустите обучение в обычном режиме, и если nan или inf обнаружится хотя бы в одном из элементов весов, входных или выходных данных, этот модуль выбросит исключение и выведет max_frames_to_save кадров, приведших к этому событию,
при этом каждый кадр сообщает
- полное имя модуля с указанием имени класса, для которого был выполнен
forward - абсолютные минимальное и максимальное значения всех элементов весов каждого модуля, а также входных и выходных данных
Например, ниже приведены заголовок и последние кадры отчёта о детекции для запуска google/mt5-small в fp16
смешанная точность:
Detected inf/nan during batch_number=0
Last 21 forward frames:
abs min abs max metadata
[...]
encoder.block.2.layer.1.DenseReluDense.wi_0 Linear
2.17e-07 4.50e+00 weight
1.79e-06 4.65e+00 input[0]
2.68e-06 3.70e+01 output
encoder.block.2.layer.1.DenseReluDense.wi_1 Linear
8.08e-07 2.66e+01 weight
1.79e-06 4.65e+00 input[0]
1.27e-04 2.37e+02 output
encoder.block.2.layer.1.DenseReluDense.wo Linear
1.01e-06 6.44e+00 weight
0.00e+00 9.74e+03 input[0]
3.18e-04 6.27e+04 output
encoder.block.2.layer.1.DenseReluDense T5DenseGatedGeluDense
1.79e-06 4.65e+00 input[0]
3.18e-04 6.27e+04 output
encoder.block.2.layer.1.dropout Dropout
3.18e-04 6.27e+04 input[0]
0.00e+00 inf outputЗдесь видно, что T5DenseGatedGeluDense.forward привело к выходным активациям, максимальное абсолютное значение которых составило около 62,7K, что очень близко к верхнему пределу fp16 в 64K. На следующем кадре мы видим Dropout, который перенормирует веса после обнуления некоторых элементов, что выталкивает максимальное абсолютное значение за пределы 64K, и возникает переполнение.
Как видно, именно предыдущие кадры следует рассматривать, когда значения начинают становиться очень большими для чисел fp16.
Отслеживание выполняется в прямом хуке, который вызывается сразу после завершения forward.
По умолчанию выводятся последние 21 кадр. Вы можете изменить это значение по умолчанию в соответствии со своими потребностями. Например:
debug_overflow = DebugUnderflowOverflow(model, max_frames_to_save=100)Чтобы убедиться, что вы правильно настроили эту функцию отладки и планируете использовать её в обучении, которое может занять несколько часов, сначала запустите её с обычным трассированием для нескольких батчей, как описано в следующем разделе.
Режим 2. Отслеживание конкретных абсолютных минимальных/максимальных значений батча без обнаружения
Второй режим работы — это трассировка по батчам с отключённой функцией обнаружения переполнения/недополнения.
Допустим, вы хотите отслеживать абсолютные минимальные и максимальные значения для всех компонентов каждого вызова forward
заданной партии, и выполнять это только для партий 1 и 3. Затем вы создаёте экземпляр этого класса как
debug_overflow = DebugUnderflowOverflow(model, trace_batch_nums=[1, 3])Теперь полные батчи 1 и 3 будут отслеживаться в том же формате, что описан выше. Нумерация батчей начинается с нуля.
Это полезно, если вы знаете, что программа начинает работать некорректно после определённого номера батча, — так вы можете сразу перейти к нужному участку.
Ранняя остановка:
Вы также можете указать номер батча, после которого следует остановить обучение, с помощью :
debug_overflow = DebugUnderflowOverflow(model, trace_batch_nums=[1, 3], abort_after_batch_num=3)Эта функция в основном полезна в режиме трассировки, но вы можете использовать её в любом режиме.
Производительность:
Поскольку этот модуль измеряет абсолютные min/`max каждого веса модели при каждом прямом проходе, он замедляет обучение. Поэтому не забудьте отключить его, как только необходимость в отладке будет устранена.