Документация API AIMET (4)


1.1.6 API количественного моделирования

1.1.6.1 Ссылка на руководство пользователя

Чтобы узнать больше о квантовом моделировании, см. Квантовое моделирование.

1.1.6.2 Пример ссылки на блокнот

Комплексную записную книжку, показывающую, как использовать обучение с учетом квантования PyTorch, см. здесь .

1.1.6.3 Рекомендации

AIMET Quantization Sim требует, чтобы определения моделей PyTorch соответствовали определенным рекомендациям. Эти рекомендации подробно описаны здесь. Руководство по модели

AIMET предоставляет API для подготовки моделей, который позволяет пользователям готовить модели PyTorch для функций количественного анализа AIMET. API и примеры использования подробно описаны здесь. API-интерфейс подготовки модели

AIMET также включает в себя утилиту проверки модели, которая позволяет пользователям проверять определения своих моделей. Посмотреть API и примеры использования этой утилиты можно здесь. API валидатора модели

1.1.6.4 API верхнего уровня

класс aimet_torch.quantsim.QuantizationSimModel (модель, dummy_input, quant_scheme=<QuantScheme.post_training_tf_enhanced: 2>, rounding_mode='ближайший', default_output_bw=8, default_param_bw=8, in_place=False, config_file=None, default_data_type=<QuantizationDataType.int: 1>, master_opdef_file=Нет, backend_opdef_files=Нет)[источник]

Реализует механизм добавления операций квантового моделирования в модели. Это позволяет моделировать нецелевую точность вывода. Это также позволяет точно настроить модель для противодействия эффектам квантования.

Конструктор QuantizationSimModel.

параметр:

  • модель (Модуль) – добавьте модель для моделирования операции.
  • dummy_input (Union[Tensor, Tuple]) — передать входные данные в модель. Используется для анализа диаграмм модели. Если модель имеет несколько входных данных, передается кортеж. Пользователи должны размещать тензоры на соответствующих устройствах.
  • quant_scheme (Union[str, QuantScheme]) – Схема квантования. Схема квантования используется для вычисления квантованного кода. Есть несколько вариантов на выбор. См. определение перечисления QuantScheme.
  • rounding_mode (str) – Режим округления. Поддерживаемые параметры: «Недавние» или «Случайные».
  • default_output_bw (int) – разрядность по умолчанию (4–31), используемая для квантования всех входов и выходов слоя.
  • default_param_bw (int) – разрядность по умолчанию (4–31), используемая для квантования всех параметров слоя.
  • in_place (bool) – если True, измените данную «модель» на месте, чтобы добавить узел квантованного моделирования. Этот вариант рекомендуется только в том случае, если пользователь не хочет создавать копию модели.
  • config_file (Необязательно[str]) – Путь к файлу конфигурации квантователя модели.
  • default_data_type (QuantizationDataType) — тип данных по умолчанию, используемый для количественной оценки всех входных, выходных данных и параметров слоя. Возможные варианты: QuantizationDataType.int и QuantizationDataType.float. Обратите внимание, что шаблон default_data_type=QuantizationDataType.float поддерживает только default_output_bw=16 и default_param_bw=16.
  • master_opdef_file (Необязательно[str]) – путь к XML-файлу определения основной операции.
  • backend_opdef_files (Необязательно[List[str]]) – список путей к XML-файлам для определений серверных операций. Если соответствие не найдено, применяемая разрядность и тип данных будут обрабатываться в соответствии с порядком предоставленного XML.

Следующие API доступны для кодирования вычислительных моделей.

QuantizationSimModel.compute_encodings (forward_pass_callback, front_pass_callback_args) [источник]

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

параметр:

  • front_pass_callback — функция обратного вызова, которая просто работает вперед, передаст модель. Эта функция обратного вызова должна использовать репрезентативные данные для прямых проходов, поэтому рассчитанное кодирование применяется ко всем выборкам данных. Этот обратный вызов внутренне выбирает количество выборок данных, которые будут использоваться для вычисления кодировки.
  • front_pass_callback_args – эти аргументы передаются в функцию front_pass_callback как есть. Тип этого параметра определяется пользователем. Например, это может быть просто целое число, обозначающее количество используемых выборок данных. Или это может быть кортеж параметров или объект, представляющий что-то более сложное. Если установлено значение «Нет», функция «forward_pass_callback» будет вызываться без параметров.

Возврат: пусто

Следующие API можно использовать для сохранения и восстановления квантованных моделей.

quantsim.save_checkpoint (путь_к файлу)

Этот API предоставляет пользователям возможность сохранять контрольные точки квантованной модели, которые можно загрузить позже для продолжения точной настройки, например, см. также load_checkpoint().

параметр:

  • quant_sim_model (QuantizationSimModel) – QuantizationSimModel, используемая для сохранения контрольных точек.
  • file_path (str) – Путь к файлу, в котором будет сохранена контрольная точка.

Возврат: пусто

quantsim.load_checkpoint ()
загружает модель количественного анализа

Параметры: file_path (str) – путь к файлу для сохранения контрольной точки.
Тип возврата: QuantizationSimModel
Возвращает: новый экземпляр QuantizationSimModel, созданный после загрузки контрольной точки.

Следующие API можно использовать для экспорта моделей в целевые объекты.

QuantizationSimModel.export (путь, префикс имени_файла, dummy_input, onnx_export_args=None, propagate_encodings=False, Export_to_torchscript=False, use_embedded_encodings=False)[источник]

Этот метод экспортирует квантованную имитационную модель, чтобы ее можно было запустить на целевом объекте.

В частности, сохраните следующее:

  1. sim-модель экспортируется как обычная модель PyTorch без каких-либо операций моделирования.
  2. Кодировка квантования экспортируется в отдельный файл в формате JSON, который затем может быть импортирован целевой средой выполнения (при необходимости).
  3. (Необязательно) Экспортируйте эквивалентную модель в формате ONNX. Кроме того, узлы в моделях ONNX называются так же, как имена соответствующих модулей PyTorch. Это помогает сопоставить узел ONNX с его кодировкой квантования в № 2.

параметр:

  • path (str) – путь для хранения pth модели и кодировки
  • filename_prefix (str) – префикс для имен файлов модели pth и файлов кодировки.
  • dummy_input (Union[Tensor, Tuple]) — фиктивный ввод для модели. Используется для анализа диаграмм модели. Dummy_input необходимо разместить на процессоре.
  • onnx_export_args (Union[OnnxExportApiArgs, Dict[~KT, ~VT], None]) — необязательные аргументы экспорта с переопределениями, специфичными для onnx, предоставляемыми в виде словаря или объекта OnnxExportApiArgs. Если не указано, по умолчанию используется значение «opset_version» = None, «​​input_names» = None, «​​output_names» = None и «enable_onnx_checker» = False для версий факела < 1.10.0.
  • propagate_encodings (bool) — если True, записи кодирования для промежуточных операций (когда одна операция PyTorch приводит к созданию нескольких узлов ONNX) будут заполнены тем же BW и data_type, что и выходной тензор серии операций. По умолчанию — ложь.
  • Export_to_torchscript (bool) — если true, экспортировать в torchscript. В противном случае экспортируйте в onnx. По умолчанию — ложь.
  • use_embedded_encodings (bool) — если True, будет экспортирована другая модель onnx со встроенным узлом fakequant.

Формат кодирования описан в Спецификации квантового кодирования.

1.1.6.5 Определение перечисления

Перечисление схем квантования

класс aimet_common.defs.QuantScheme[источник]

Перечисление схем квантования

post_training_percentile = 6

Для тензоров выбирает скорректированные минимальное и максимальное значения на основе переданных значений процентиля. Код квантования рассчитывается с использованием скорректированных минимального и максимального значений.

post_training_tf = 1

Для тензоров для расчета квантованного кодирования используются абсолютные минимум и максимум значений тензора.

post_training_tf_enhanced = 2

Для тензоров найдите и выберите лучшие минимальные и максимальные значения, которые минимизируют шум квантования. Вычислите код квантования, используя выбранные минимальное и максимальное значения. '

Training_range_learning_with_tf_enhanced_init = 4

Для тензоров закодированные значения инициализируются с использованием схемы post_training_tf_enhanced. Затем кодировка изучается во время обучения.

Training_range_learning_with_tf_init = 3

Для тензоров закодированные значения инициализируются с использованием схемы post_training_tf. Затем кодировка изучается во время обучения.

1.1.6.6 Пример кода — тренинг количественной осведомленности (QAT)

В этом примере показано, как использовать AIMET для выполнения QAT (обучение с учетом квантования). QAT — это функция AIMET, которая добавляет операции моделирования квантования (иногда называемые операциями псевдоквантования) к обученной модели машинного обучения и настраивает или обучает модель в течение нескольких эпох с использованием стандартного конвейера обучения. Полученная модель должна показать более высокую точность по сравнению с квантованным ускорителем машинного обучения.

Для краткости QAT — параметры квантования (например, активации для каждого тензорного масштаба/смещения) рассчитываются один раз. В процессе тонкой настройки веса модели обновляются, чтобы минимизировать влияние квантования при прямом распространении, сохраняя параметры квантования постоянными.

Нужно импортировать

import torch
import torch.cuda

Загрузить модель PyTorch

В этом примере мы загрузим предварительно обученную модель ResNet18 из torchvision. Аналогичным образом вы можете загрузить любую предварительно обученную модель PyTorch.

from torchvision.models import resnet18

    model = resnet18(pretrained=True)
    model = model.cuda()

Подготовить количественные имитационные модели

Количественное моделирование AIMET требует от пользователей следовать определенным рекомендациям при определении модели. Например, функции, определенные в прямом проходе, следует заменить на эквивалентные torch.nn.Module. В Руководстве пользователя AIMET перечислены все эти рекомендации. Следующий API ModelPreparer использует новые возможности преобразования графов, доступные в PyTorch 1.9+, и автоматизирует изменения определения модели, необходимые для соответствия приведенным выше рекомендациям.

Для получения более подробной информации см.: API-интерфейс подготовки модели :

from aimet_torch.model_preparer import prepare_model
    prepared_model = prepare_model(model)

Создание количественных имитационных моделей

Теперь мы создаем QuantizationSimModel, используя AIMET. По сути, это означает, что AIMET будет вставлять ложные операции квантования в граф модели и настраивать их. Вот объяснение некоторых параметров

from aimet_common.defs import QuantScheme
    from aimet_torch.quantsim import QuantizationSimModel
    input_shape = (1, 3, 224, 224)
    dummy_input = torch.randn(input_shape).cuda()

    quant_sim = QuantizationSimModel(prepared_model, dummy_input=dummy_input,
                                     quant_scheme=QuantScheme.post_training_tf_enhanced,
                                     default_param_bw=8, default_output_bw=8,
                                     config_file='../../TrainingExtensions/common/src/python/aimet_common/quantsim_config/'
                                                 'default_config.json')

Пример функции, созданной пользователем, из обратного вызова Compute_encodings()

Хотя AIMET добавил узел Quantizer в граф модели, модель еще не готова к использованию. Прежде чем мы сможем использовать сим-модель для вывода или обучения, нам нужно найти соответствующие параметры квантования масштаба/смещения для каждого узла «квантизатора». Для активации узла квантования нам необходимо передать немаркированные выборки данных через модель для сбора статистики диапазона, а затем позволить AIMET вычислить соответствующие параметры квантования масштаба/смещения. Этот процесс иногда называют калибровкой. AIMET просто называет это «вычислительным кодированием».

Поэтому мы создаем процедуру для передачи немаркированных выборок данных через модель. Это должно быть довольно просто — используйте существующий загрузчик обучающих или проверочных данных, чтобы получить несколько выборок и передать их в модель. Нам не нужно рассчитывать какие-либо показатели потерь и т. д. Поэтому мы можем игнорировать выходные данные модели для этой цели. Несколько советов по выборке данных

На практике для вычисления кодировки нам нужна небольшая часть всей выборки данных. Например, набор обучающих данных ImageNet содержит 1 миллион выборок. Для вычислительного кодирования нам нужно всего 500 или 1000 выборок.

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

def pass_calibration_data(sim_model, forward_pass_args=None):
    """
    The User of the QuantizationSimModel API is expected to write this function based on their data set.
    This is not a working function and is provided only as a guideline.

    :param sim_model:
    :param args: other arguments for the forwards
    :return:
    """

    # User action required
    # The following line of code is an example of how to use the ImageNet data's validation data loader.
    # Replace the following line with your own dataset's validation data loader.
    data_loader = ImageNetDataPipeline.get_val_dataloader()

    # User action required
    # For computing the activation encodings, around 1000 unlabelled data samples are required.
    # Edit the following 2 lines based on your batch size.
    # batch_size * max_batch_counter should be 1024
    batch_size = 64
    max_batch_counter = 16

    sim_model.eval()

    current_batch_counter = 0
    with torch.no_grad():
        for input_data, target_data in data_loader:

            inputs_batch = input_data  # labels are ignored
            sim_model(inputs_batch)

            current_batch_counter += 1
            if current_batch_counter == max_batch_counter:
                break

Вычисление квантованного кодирования

Теперь мы вызываем AIMET, используя описанную выше процедуру, чтобы передать данные в модель, а затем вычислить квантованное кодирование. Кодирование здесь относится к параметрам квантования масштаба/смещения.

quant_sim.compute_encodings(pass_calibration_data, forward_pass_callback_args=None)

Точная настройка количественных имитационных моделей

Чтобы выполнить обучение с учетом квантования (QAT), нам нужно обучить модель еще на несколько эпох (обычно 15-20 эпох). Как и при любом обучении, для достижения оптимальных результатов необходимо искать гиперпараметры. Хорошей отправной точкой является использование скорости обучения того же порядка, что и конечная скорость обучения при обучении исходной модели, и уменьшение скорости обучения в 10 раз каждые 5 эпох или около того.

Для целей этого примера мы будем обучаться только в течение 1 эпохи. Но вы можете изменить эти параметры по своему усмотрению.

# User action required
    # The following line of code illustrates that the model is getting finetuned.
    # Replace the following finetune() unction with your pipeline's finetune() function.
    ImageNetDataPipeline.finetune(quant_sim.model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10],
                                  use_cuda=use_cuda)

    # Determine simulated accuracy
    accuracy = ImageNetDataPipeline.evaluate(quant_sim.model, use_cuda)
    print(accuracy)

Экспортировать модель

Итак, у нас есть улучшенная модель после QAT. Теперь следующим шагом будет фактическое использование этой модели против цели. Для этого нам нужно получить модель с обновленными весами без использования ложных операций квантования. Мы также получаем кодировку (параметры квантования масштаба/смещения), обновляемую во время обучения после использования QAT. Для этой цели AIMET QuantizationSimModel предоставляет API экспорта.

# Export the model which saves pytorch model without any simulation nodes and saves encodings file for both
    # activations and parameters in JSON format
    quant_sim.export(path='./', filename_prefix='quantized_resnet18', dummy_input=dummy_input.cpu())

1.1.7 API адаптивного округления

1.1.7.1 Ссылка на руководство пользователя

Чтобы узнать больше об этой технологии, см. AdaRound.

1.1.7.2 Пример ссылки на блокнот

Комплексный блокнот, показывающий, как использовать PyTorch AdaRound, см. здесь .

1.1.7.3 API верхнего уровня

aimet_torch.adaround.adaround_weight.Adaround.apply_adaround (модель, dummy_input, параметры, путь, префикс имени_файла, default_param_bw=4, param_bw_override_list=None, ignore_quant_ops_list=None, default_quant_scheme=<QuantScheme.post_training_tf_enhanced: 2>, default_config_file=None)

Возвращает модель с оптимизированным округлением веса для каждого модуля (Conv и Linear) и сохраняет соответствующую кодировку квантования в отдельный файл в формате JSON, который затем можно импортировать с помощью QuantSim для вывода или QAT.

параметр:

  • модель (Модуль) – Модель для Adaround
  • dummy_input (Union[Tensor, Tuple]) — фиктивный ввод для модели. Используется для анализа диаграмм модели. Если модель имеет несколько входных данных, передается кортеж. Пользователи должны размещать тензоры на соответствующих устройствах.
  • params (AdaroundParameters) – Параметры Adaround.
  • path (str) – путь для хранения кодировки параметров
  • filename_prefix (str) – префикс, используемый для имени закодированного файла.
  • default_param_bw (int) – разрядность по умолчанию (4–31), используемая для квантования параметров слоя.
  • param_bw_override_list (Необязательно[List[Tuple[Module, int]]]) – Список кортежей. Каждый кортеж представляет собой модуль и соответствующую ширину параметра, который будет использоваться этим модулем.
  • ignore_quant_ops_list (Необязательно[List[Module]]) – перечисленные здесь операции пропускаются во время квантования, требуемого AdaRounding. Не указывайте в этом списке модули Conv и Linear. Это повлияет на точность
  • default_quant_scheme (QuantScheme) – Схема квантования. Поддерживаемые параметры используют перечисление QuantScheme QuantScheme.post_training_tf или QuantScheme.post_training_tf_enhanced
  • default_config_file (Необязательно[str]) – файл конфигурации по умолчанию для квантователя модели.

Тип возвращаемого значения: Module
Возвращает: моделируется с использованием весов Adarounded и сохраняет соответствующий JSON-файл с кодировкой параметров по указанному пути.

1.1.7.4 Параметры Adaround

класс aimet_torch.adaround.adaround_weight.AdaroundParameters (data_loader, num_batches, default_num_iterations=None, default_reg_param=0,01, default_beta_range=(20, 2), default_warm_start=0,2,forward_fn=None)[источник]

Параметры конфигурации Adaround

параметр:

  • data_loader (DataLoader[+T_co]) – загрузчик данных
  • num_batches (int) – количество пакетов, которые будут использоваться для Adaround. Обычно рекомендуемое значение для этого параметра — меньшее из (1) len(data_loader) и (2) ceil(2000/batch_size).
  • default_num_iterations (Необязательно[int]) – количество итераций вокруг каждого слоя. Значение по умолчанию — 10 КБ для моделей с весом 8 бит или выше и 15 КБ для моделей с весом менее 8 бит.
  • default_reg_param (float) – параметр регуляризации, который компенсирует потери при округлении и потери при реконструкции. По умолчанию 0,01
  • default_beta_range (Tuple) – параметры запуска и остановки бета-версии (start_beta, end_beta) для округления потерь при отжиге. По умолчанию(20, 2)
  • default_warm_start (float) – период прогрева, в течение которого влияние потерь округления равно нулю. По умолчанию 20% (0,2)
  • front_fn (Optional[Callable[[Module, Any], Any]]) — дополнительная функция адаптера, которая выполняет прямой проход с учетом входных данных, сгенерированных моделью и загрузчиком данных. Функция ожидает модель в качестве первого аргумента и входную модель в качестве второго аргумента.
1.1.7.5 Определение перечисления

Перечисление схем квантования

класс aimet_common.defs.QuantScheme [источник]

Перечисление схем квантования

post_training_percentile = 6

Для тензоров выбирает скорректированные минимальное и максимальное значения на основе переданных значений процентиля. Код квантования рассчитывается с использованием скорректированных минимального и максимального значений.

post_training_tf = 1

Для тензоров для расчета квантованного кодирования используются абсолютные минимум и максимум значений тензора.

post_training_tf_enhanced = 2

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

Training_range_learning_with_tf_enhanced_init = 4

Для тензоров закодированные значения инициализируются с использованием схемы post_training_tf_enhanced. Затем кодировка изучается во время обучения.

Training_range_learning_with_tf_init = 3

Для тензоров закодированные значения инициализируются с использованием схемы post_training_tf. Затем кодировка изучается во время обучения.

おすすめ

転載: blog.csdn.net/weixin_38498942/article/details/133070299