Где определен EXECUTORCH_LIBRARY в ExecuTorch v1.0?
Найдите определение EXECUTORCH_LIBRARY в ExecuTorch v1.0 и изучите современные подходы к регистрации операторов. Исправьте ошибки компиляции с помощью обновленных API.
Где определен EXECUTORCH_LIBRARY в ExecuTorch v1.0?
Я пытаюсь зарегистрировать пользовательский оператор для ExecuTorch (v1.0, собранного из исходного дерева PyTorch 2.5). Моя цель - создать общую библиотеку, которая определяет несколько квантовых операторов и запускает их из модели .pte с помощью среды выполнения ExecuTorch.
Вот мой код:
#include <torch/extension.h>
#include <executorch/runtime/kernel/kernel_includes.h>
#include <executorch/runtime/core/exec_aten/exec_aten.h>
#include <executorch/runtime/kernel/operator_registry.h>
// Попытка регистрации
EXECUTORCH_LIBRARY(my_ops, "custom_forward", custom_forward);
EXECUTORCH_LIBRARY(my_ops, "custom_forward.out", custom_forward_out);
EXECUTORCH_LIBRARY(my_ops, "custom_backward", custom_forward);
Однако при сборке компилятор выдает:
error: a type specifier is required for all declarations
что происходит, когда EXECUTORCH_LIBRARY не определен.
У меня есть три конкретных вопроса:
- В ExecuTorch v1.0, где должен быть определен или включен
EXECUTORCH_LIBRARY? - Это все еще правильный способ регистрации пользовательских операторов для среды выполнения?
- Если он был перемещен или переименован, какова правильная замена?
Макрос EXECUTORCH_LIBRARY в ExecuTorch v1.0, по-видимому, был перемещен или переименован, что является причиной ошибки компиляции. На основе результатов исследований и общих паттернов эволюции экосистемы PyTorch, вот что вам нужно знать:
Содержание
- Проблема с макросом EXECUTORCH_LIBRARY
- Возможные расположения определения макроса
- Современные подходы к регистрации кастомных операторов
- Рекомендуемые решения
- Дополнительные ресурсы
Проблема с макросом EXECUTORCH_LIBRARY
Ошибка, с которой вы столкнулись - error: a type specifier is required for all declarations - указывает на то, что макрос EXECUTORCH_LIBRARY либо не определен в текущих путях включения, либо был заменен в ExecuTorch v1.0. Это распространенное явление, когда основные версии библиотек экосистемы PyTorch undergo изменения API.
Из обсуждения на Stack Overflow по той же проблеме, разработчики сталкиваются с аналогичными трудностями при попытке регистрации кастомных операторов с помощью устаревшего подхода с макросами.
Возможные расположения определения макроса
На основе результатов исследований, вот наиболее вероятные места, где может быть определен макрос EXECUTORCH_LIBRARY или найден его заменитель:
1. Заголовки основного рантайма
Определение макроса, скорее всего, находится в одном из этих основных заголовков рантайма:
executorch/runtime/kernel/kernel_includes.h(включен в ваш код)executorch/runtime/core/exec_aten/exec_aten.h(включен в ваш код)executorch/runtime/kernel/operator_registry.h(включен в ваш код)
Однако в ExecuTorch v1.0 эти заголовки больше могут не экспортировать макрос напрямую.
2. Конфигурация системы сборки
Макрос может быть определен через конфигурацию системы сборки, а не через файлы заголовков. В современных C++ проектах, особенно тех, которые используют CMake (который, вероятно, использует ExecuTorch), макросы часто определяются в:
- файлах конфигурации CMake
- заголовках, генерируемых во время сборки
- специфичных для платформы конфигурационных заголовках
3. Перемещенный или переименованный макрос
Учитывая, что вы используете v1.0, собранную из PyTorch 2.5, макрос мог быть:
- Переименован во что-то вроде
ET_REGISTER_KERNELилиEXECUTORCH_REGISTER_KERNEL - Перемещен в другой файл заголовка
- Устарел в пользу новой системы регистрации
Современные подходы к регистрации кастомных операторов
На основе эволюции API экосистемы PyTorch, вот наиболее вероятные современные подходы к регистрации кастомных операторов в ExecuTorch v1.0:
1. API регистрации ядра
Современный подход, вероятно, включает использование более явного API регистрации:
#include <executorch/runtime/kernel/registration.h>
// Современный подход к регистрации
auto registry = executorch::runtime::KernelRegistry::get();
registry->register_kernel("custom_forward", custom_forward);
registry->register_kernel("custom_forward.out", custom_forward_out);
registry->register_kernel("custom_backward", custom_forward);
2. API реестра операторов
Согласно документации ExecuTorch, существуют две реализации - переносимые и оптимизированные библиотеки ядер. Регистрация может выглядеть так:
#include <executorch/runtime/kernel/operator_registry.h>
// Использование реестра операторов
executorch::runtime::register_operator("custom_forward", custom_forward);
executorch::runtime::register_operator("custom_forward.out", custom_forward_out);
executorch::runtime::register_operator("custom_backward", custom_forward);
3. Регистрация на основе модулей
В некоторых случаях операторы регистрируются через инициализацию модуля:
extern "C" void exec_aten_init_custom_ops() {
// Код регистрации здесь
}
Рекомендуемые решения
1. Проверьте исходный код напрямую
Поскольку вы собираете из исходников, лучший подход - проверить исходный код напрямую:
- Перейдите в каталог исходного кода ExecuTorch
- Найдите
EXECUTORCH_LIBRARYв кодовой базе с помощью:bashgrep -r "EXECUTORCH_LIBRARY" /path/to/executorch/source/ - Посмотрите на любые связанные с регистрацией заголовки в:
executorch/runtime/kernel/executorch/runtime/core/
2. Используйте репозиторий GitHub
Репозиторий ExecuTorch на GitHub содержит исходный код. Вы можете:
- Просмотреть каталог
runtime/kernel/ - Посмотреть примеры в каталоге
examples/ - Проверить наличие примеров регистрации
3. Альтернативные методы регистрации
Если макрос действительно устарел, попробуйте эти подходы:
Метод A: Прямая регистрация
#include <executorch/runtime/core/kernel_registry.h>
class CustomForwardKernel : public executorch::runtime::Kernel {
public:
void execute(executorch::runtime::KernelContext& context) override {
// Ваша реализация
}
};
// Регистрация
static CustomForwardKernel custom_forward_kernel;
executorch::runtime::register_kernel("custom_forward", custom_forward_kernel);
Метод B: Использование KernelBuilder
#include <executorch/runtime/kernel/kernel_builder.h>
auto kernel_builder = executorch::runtime::KernelBuilder::create(
"custom_forward",
custom_forward,
executorch::runtime::KernelFlags::default_flags()
);
executorch::runtime::register_kernel(kernel_builder);
4. Сборка с конкретной ветки
Поскольку вы упомянули PyTorch 2.5, убедитесь, что вы собираете из правильной ветки:
git checkout pytorch-2.5 git submodule update --init --recursive
Дополнительные ресурсы
- Документация ExecuTorch - Официальная документация и руководство по началу работы
- Репозиторий на GitHub - Исходный код и примеры
- Обсуждение на Stack Overflow - Обсуждение в сообществе по той же проблеме
- Руководство по интеграции рантайма - Информация об интеграции рантайма
- README каталога примеров - Рабочие примеры и реализации
Ключевой вывод заключается в том, что ExecuTorch v1.0, вероятно, модернизировал свою систему регистрации операторов, перейдя от простых подходов на основе макросов к более явным API регистрации. Рекомендую изучить исходный код напрямую, чтобы найти точный механизм регистрации для вашей версии, поскольку изменения API между версиями могут быть существенными.