Другое

Где определен EXECUTORCH_LIBRARY в ExecuTorch v1.0?

Найдите определение EXECUTORCH_LIBRARY в ExecuTorch v1.0 и изучите современные подходы к регистрации операторов. Исправьте ошибки компиляции с помощью обновленных API.

Где определен EXECUTORCH_LIBRARY в ExecuTorch v1.0?

Я пытаюсь зарегистрировать пользовательский оператор для ExecuTorch (v1.0, собранного из исходного дерева PyTorch 2.5). Моя цель - создать общую библиотеку, которая определяет несколько квантовых операторов и запускает их из модели .pte с помощью среды выполнения ExecuTorch.

Вот мой код:

cpp
#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 не определен.

У меня есть три конкретных вопроса:

  1. В ExecuTorch v1.0, где должен быть определен или включен EXECUTORCH_LIBRARY?
  2. Это все еще правильный способ регистрации пользовательских операторов для среды выполнения?
  3. Если он был перемещен или переименован, какова правильная замена?

Макрос EXECUTORCH_LIBRARY в ExecuTorch v1.0, по-видимому, был перемещен или переименован, что является причиной ошибки компиляции. На основе результатов исследований и общих паттернов эволюции экосистемы PyTorch, вот что вам нужно знать:

Содержание

Проблема с макросом 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 регистрации:

cpp
#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, существуют две реализации - переносимые и оптимизированные библиотеки ядер. Регистрация может выглядеть так:

cpp
#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. Регистрация на основе модулей

В некоторых случаях операторы регистрируются через инициализацию модуля:

cpp
extern "C" void exec_aten_init_custom_ops() {
    // Код регистрации здесь
}

Рекомендуемые решения

1. Проверьте исходный код напрямую

Поскольку вы собираете из исходников, лучший подход - проверить исходный код напрямую:

  1. Перейдите в каталог исходного кода ExecuTorch
  2. Найдите EXECUTORCH_LIBRARY в кодовой базе с помощью:
    bash
    grep -r "EXECUTORCH_LIBRARY" /path/to/executorch/source/
    
  3. Посмотрите на любые связанные с регистрацией заголовки в:
    • executorch/runtime/kernel/
    • executorch/runtime/core/

2. Используйте репозиторий GitHub

Репозиторий ExecuTorch на GitHub содержит исходный код. Вы можете:

  • Просмотреть каталог runtime/kernel/
  • Посмотреть примеры в каталоге examples/
  • Проверить наличие примеров регистрации

3. Альтернативные методы регистрации

Если макрос действительно устарел, попробуйте эти подходы:

Метод A: Прямая регистрация

cpp
#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

cpp
#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, убедитесь, что вы собираете из правильной ветки:

bash
git checkout pytorch-2.5
git submodule update --init --recursive

Дополнительные ресурсы

  1. Документация ExecuTorch - Официальная документация и руководство по началу работы
  2. Репозиторий на GitHub - Исходный код и примеры
  3. Обсуждение на Stack Overflow - Обсуждение в сообществе по той же проблеме
  4. Руководство по интеграции рантайма - Информация об интеграции рантайма
  5. README каталога примеров - Рабочие примеры и реализации

Ключевой вывод заключается в том, что ExecuTorch v1.0, вероятно, модернизировал свою систему регистрации операторов, перейдя от простых подходов на основе макросов к более явным API регистрации. Рекомендую изучить исходный код напрямую, чтобы найти точный механизм регистрации для вашей версии, поскольку изменения API между версиями могут быть существенными.

Источники

  1. Stack Overflow - Проблема с определением EXECUTORCH_LIBRARY
  2. Репозиторий ExecuTorch на GitHub
  3. Документация по интеграции рантайма ExecuTorch
  4. Руководство по началу работы с ExecuTorch
  5. README примеров ExecuTorch
Авторы
Проверено модерацией
Модерация