weixin_52775498 2024-03-21 23:27 采纳率: 0%
浏览 51
已结题

ONNXruntime添加自己EP的详细步骤

微软的ONNXruntime文档中有涉及EP的添加,但内容很简略,不知道有没有朋友自己亲自实现过添加自己或者别人的加速器硬件的抽象到ONNXruntime中

  • 写回答

20条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-21 23:27
    关注
    获得0.60元问题酬金

    引自免费微信小程序:皆我百晓生

    为了在ONNXRuntime中添加一个新的执行提供者(Execution Provider,EP),你需要实现一系列接口并将其与运行时集成。以下是一个超详细步骤的概述:

    1. 定义新EP类: 首先,你需要创建一个继承自onnxruntime::Provider基类的新类,并实现必要的接口。例如:

      namespace MyAccelerator {
        class MyExecutionProvider : public onnxruntime::IExecutionProvider {
        public:
          explicit MyExecutionProvider(const OrtProviderOptions& options) : IExecutionProvider(kMyExecutionProvider, options) {}
      
          // 实现必须的方法
          virtual Status Initialize() override;
          virtual void Shutdown() override;
          virtual std::unique_ptr<onnxruntime::IDataTransfer> GetDataTransfer() const override;
          virtual std::shared_ptr<IDataAllocator> CreateDataAllocator(int device_id, const OrtMemoryInfo& info) override;
          virtual common::Status GetCapability(const onnxruntime::GraphViewer& graph_viewer, ExecutionProvider::Capabilities& out) override;
          virtual std::vector<std::unique_ptr<ComputeCapability>> GetCapability(
            const onnxruntime::GraphViewer& graph,
            const std::vector<const KernelRegistry*>& kernel_registries) override;
      
          // 添加对模型节点进行优化和执行的方法
          virtual Status Compile(const std::vector<Node*>& fused_nodes, std::vector<NodeComputeInfo>& node_compute_info) override;
          virtual Status Execute(const std::vector<OrtValue>& inputs, std::vector<OrtValue>& outputs,
                                const std::vector<NodeComputeInfo>& node_compute_info,
                                const std::string& provider_name) override;
        };
      }
      
    2. 实现核心功能

      • Initialize():初始化硬件或软件环境。
      • GetDataTransfer():如果需要数据传输层,则实现此方法以处理跨设备的数据移动。
      • CreateDataAllocator():为该EP创建内存分配器。
      • GetCapability():分析模型图,确定EP可以支持哪些运算符。
      • Compile()Execute():分别负责编译和执行由ONNX Runtime调度的计算图部分。
    3. 注册EP到ONNXRuntime: 在ONNXRuntime启动前,通过调用RegisterExecutionProvider()函数将你的EP注册到全局上下文中:

      using namespace onnxruntime;
      using namespace MyAccelerator;
      
      int main() {
        OrtEnv env(ORT_LOGGING_LEVEL_WARNING, "my_ort_session");
        OrtSessionOptions session_options;
        auto status = OrtSessionOptionsAppendExecutionProvider_MyExecutionProvider(session_options, /* your options */);
        if (!status.IsOK()) {
          // handle error
        }
      
        // 创建会话时使用session_options
        Ort::Session session(env, model_path.c_str(), session_options);
      
        // ...其余代码...
      }
      
      // 注册EP到ONNXRuntime的核心库
      extern "C" ONNX_EXPORT void RegisterCustomExecutionProvider() {
        auto creator = [](const OrtProviderOptions& options) {
          return std::make_unique<MyExecutionProvider>(options);
        };
        onnxruntime::RegisterExecutionProviderFactory(MyExecutionProvider::Type(), creator);
      }
      
    4. 构建和链接: 将包含新EP实现的源文件添加到ONNXRuntime项目的构建系统中,并确保正确链接所需的库或框架。

    5. 测试: 使用一些简单的ONNX模型来测试新EP是否能成功编译并执行模型中的操作。

    注意:上述代码示例是简化的,实际开发中需要根据具体硬件加速器特性进行适配。此外,ONNXRuntime的API可能会随着版本更新而变化,请参考最新版的官方文档和源码进行开发。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月29日
  • 创建了问题 3月21日

悬赏问题

  • ¥15 关于某款2.13寸墨水屏的问题
  • ¥15 obsidian的中文层级自动编号
  • ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做