Предварительная компиляция (AOT) компилирует и сериализует вычисление XLA в одной среде, что позволяет загрузить и выполнить полученный бинарный артефакт позже в отдельно развернутой среде выполнения.
В отличие от компиляции «на лету» (JIT), которая выполняет вычисления в запущенном процессе при первом выполнении, AOT исключает компиляцию из пути обслуживания, что уменьшает задержку при запуске и позволяет выполнять компиляцию в выделенной среде сборки.
Рабочие процессы и API
Стандартный конвейер AOT состоит из этапов компиляции, сериализации и загрузки/десериализации:
- Точки входа PjRt: В интерфейсе PjRt на C++ (
xla/pjrt/pjrt_client.h) компиляция инициируется с помощьюPjRtClient::Compile(илиCompileAndLoad). Полученный исполняемый файл сериализуется в строку с помощьюPjRtExecutable::SerializeExecutable. На хосте, обслуживающем приложение, среда выполнения восстанавливает исполняемый файл с помощьюPjRtClient::DeserializeExecutableили загружает его непосредственно для выполнения с помощьюPjRtClient::LoadSerializedExecutable. - Артефакты на уровне компилятора: На уровне компилятора предварительная компиляция создает объект
GpuAotCompilationResult(CompiledModule;AotCompilationResult— устаревший псевдоним). Этот объект инкапсулирует сериализованныйGpuExecutableProtoи предоставляет доступ кSerializeAsString()иLoadExecutable(). Инструменты командной строки: Инструмент
xla_compileкомпилирует модули HLO или StableHLO в сериализованные исполняемые файлы:xla_compile --module_file=module.hlo --output_file=output.bin \ --platform=gpu --gpu_target_config=gpu_target_config.pbtxtКомпиляция может выполняться на хосте без графического процессора при условии указания конфигурации целевого устройства (см. файл README
xla/backends/gpu/target_config).
Что такое сериализованный
Контейнером верхнего уровня для сериализованных программ для графического процессора является GpuExecutableProto :
-
thunks: Последовательность выполнения thunk-функций. Kernel thunks (например,CustomKernelThunk) встраивают собственный скомпилированный двоичный файл ядра (cubinдля NVIDIA,hsacoдля ROCm), поэтому большая часть кода устройства находится здесь. -
binary: Двоичный файл устройства на уровне модуля. Сегодня он содержит только буферы констант модуля; ядра больше здесь не хранятся. -
buffer_allocations: Размеры буферов и срезы выделения памяти. -
gpu_compute_capability: Возможности аппаратной архитектуры целевого объекта компиляции. -
executable_abi_version: Версии ABI инструментария и среды выполнения. -
hlo_module_with_config: Встроенный сериализованныйHloModuleProtoи отладочные метаданные.
Каждое протокольное сообщение и поле, транзитивно достижимое из GpuExecutableProto является частью контракта совместимости, описанного в руководстве по совместимости GPU AOT .
Как загружается и выполняется артефакт
- Восстановите граф thunk-функций: десериализуйте записи
ThunkProtoв последовательность thunk-функций в памяти, разрешая при этом пользовательские символы вызовов, FFI и ядра. Встроенный модуль HLO также анализируется, поэтому код операции HLO, неизвестный загружаемому двоичному файлу, приводит к сбою загрузки. - Выполнение проходов преобразования графа thunk: Выполните оптимизацию во время загрузки и проходы преобразования для thunk-объектов, находящихся в памяти (например, создание
CommandBufferThunkво время выполнения для отправки работы через CUDA Graphs).CommandBufferThunkдинамически перестраивается во время загрузки и никогда не сериализуется напрямую. - Выделение буферов: инициализация областей памяти и выделение буферов в соответствии с последовательно распределенными фрагментами назначения буферов.
- Выполнить: Отправить подготовленную последовательность thunk-функций в потоки данных устройства.
Изменения в параметрах Pass, Fusion, Codegen и Autotuning, сохраняющие целостность сериализованной схемы и семантики времени выполнения, не влияют на совместимость с AOT.
Устранение неполадок: сбои загрузки, не связанные с ошибками версионирования.
Не все сбои загрузки исполняемых файлов вызваны ошибками сериализации. Два распространенных несоответствия среды приводят к ошибкам во время загрузки:
- Несоответствие вычислительных возможностей:
GpuExecutable::FromProtoпроверяет, соответствует ли сериализованнаяgpu_compute_capabilityцелевому устройству. Исполняемый файл, скомпилированный для NVIDIA Hopper, не может работать на NVIDIA Ampere. - Несоответствие ABI инструментария CUDA:
CudaRuntimeAbiVersion::IsCompatibleWithпроверяет, соответствуют ли версии инструментария CUDA, cuDNN и CUB среды выполнения минимальным версиям, указанным вExecutableAbiVersionProto, или превышают их. Если среда драйвера или библиотеки хоста старше, чем целевая среда компиляции, загрузка завершается с ошибкойFailedPreconditionError.