样例代码解析【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge本实践采用模块化设计基于C语言结合GE图引擎 API与aclAscend Computing LanguageAPI实现完整代码请单击推荐网络高性能示例获取核心组件构成如下ModelInference::Builder构建器配置模型参数封装ModelInference对象的构建过程提供链式配置接口。ModelInference核心类提供模型初始化、资源管理、任务调度等核心能力。ModelInference::GraphWorker工作线程执行异步推理任务的线程单元。ModelInference::GraphTask任务单元封装单次推理请求输入/输出和回调的完整生命周期。下图为各个组件的UMLUnified Modeling Language统一建模语言类图图 1样例代码结构 接口调用流程样例代码主要执行流程以及涉及接口如下调用《Runtime运行时 API》中的“初始化和去初始化 aclInit”接口初始化acl调用《Runtime运行时 API》中的“Device管理 aclrtSetDevice”指定运行的Device。构建ModelInference实例并初始化特性开关开启批量H2D功能、配置AICore控核策略、使用多实例并行。ModelInference初始化调用Session构造函数创建Session类对象申请Session资源Session中的options中配置ge.aicoreNum参数。调用GEInitialize进行系统初始化。调用aclgrphParseTensorFlow解析模型获取Graph。调用AddGraph在Session类对象中添加定义好的图。调用CompileGraph完成图编译。调用《Runtime运行时 API》中的“Device管理 aclrtGetDevice”获取运行的Device。创建多个线程每个线程传入相同的SessionGraph IDDevice ID。提交推理任务到工作线程。下面以一个线程为例描述工作线程的执行流程调用《Runtime运行时 API》中的“Device管理 aclrtSetDevice”指定运行的Device调用“aclrtCreateStream”创建Stream。调用LoadGraph异步执行Graph场景将图模型加载到上一步骤创建的Stream上。监听任务队列接收并执行任务调用《Runtime运行时 API》中的“内存管理 aclrtMalloc”申请Device内存调用《Runtime运行时 API》中的“内存管理 aclrtMemcpyBatch”将数据从Host批量传输到Device。如果开启批量H2D功能使用aclrtMemcpyBatch接口不开启该功能则使用aclrtMemcpy接口。调用ExecuteGraphWithStreamAsync异步执行接口运行Graph。调用“aclrtSynchronizeStream”阻塞程序运行直到指定Stream中的所有任务都完成。调用aclrtMemcpyBatch将数据从Device批量回传到Host。调用《Runtime运行时 API》中的“内存管理 aclrtFree”释放内存。执行自定义的回调函数。调用GEFinalize释放系统资源调用《Runtime运行时 API》中的“初始化和去初始化 aclFinalize”释放相关资源。开发示例包含的头文件包括acl、C或C标准库、GE、样例ModelInference的头文件。#include acl.h #include acl_rt.h #include sstream #include random #include unordered_map #include chrono #include atomic #include complex #include iostream #include vector #include map #include model_inference.h #include getopt.h #include stringacl资源初始化设置Device。// 初始化acl aclError aerr aclInit(nullptr); if (aerr ! ACL_ERROR_NONE) { std::cerr Failed to init ACL, error aerr std::endl; return -1; } // 指定用于运算的Device aerr aclrtSetDevice(0); if (aerr ! ACL_ERROR_NONE) { std::cerr aclrtSetDevice failed, ret aerr std::endl; aclFinalize(); return -1; }设置推理参数。// 模型文件路径 const std::string model_path ../data/DCN_v2.pb; // 模型文件类型 const std::string model_type TensorFlow;指定构造模型解析参数样例模型输入数量为27个。std::stringstream ss; // 定义输入节点的数量 int input_size 27; for (int i 1; i input_size; i) ss Input_ i : batchSize ;; ss Input: batchSize ,8; // 构建一个map用于配置模型的解析参数 std::mapge::AscendString, ge::AscendString parser { // 设置输出节点 {ge::AscendString(ge::ir_option::OUT_NODES), ge::AscendString(Identity:0)}, // 设置输入shape {ge::AscendString(ge::ir_option::INPUT_SHAPE), ge::AscendString(ss.str().c_str())} };构建ModelInference实例并初始化。// 创建 ModelInference实例 auto model_inference gerec::ModelInference::Builder(cfg.model_path, cfg.model_type) .InputBatchCopy(enableBatchH2D) // 开启批量H2D功能 .AiCoreNum(aiCoreNum) // 配置AICore控核 .MultiInstanceNum(multiInstanceNum) // 多实例并行 .GraphParserParams(cfg.parser_params) // 设置图解析参数 .Build(); if (model_inference-Init() ! ge::SUCCESS) { std::cerr Init ModelInference failed std::endl; return ge::FAILED; }提交推理任务。// 回调函数用于在异步推理完成后执行清理和统计工作 auto callback [](https://gitcode.com/cann/ge/blob/243ea8d2d8f7623dd210c0867dde5782ec5594a9/docs/zh/user_guides/graph_dev/best_practices/std::shared_ptrstd::vectorgert::Tensor outputs, std::shared_ptrstd::vectorgert::Tensor inputs, bool status, long long exec_us?utm_sourcegitcode_repo_files) { if (status) { // 如果推理成功更新成功计数和执行时间总和 success_count.fetch_add(1, std::memory_order_relaxed); // 成功次数增加 total_exec_us.fetch_add(exec_us, std::memory_order_relaxed); // 累加执行时间微秒 } // 释放输出/输入Tensor占用的内存 FreeHostTensors(outputs); FreeHostTensors(inputs); }; // 执行多次异步推理 for (int i 0; i num_runs; i) { if (model_inference-RunGraphAsync(all_inputs[i], all_outputs[i], callback) ! ge::SUCCESS) { std::cerr RunGraphAsync failed at i std::endl; return ge::FAILED; } }[!NOTE]说明 RunGraphAsync接口采用异步执行模式需绑定回调函数Callback以处理推理结果。回调函数需满足以下签名规范using Callback std::functionvoid( std::shared_ptrstd::vectorgert::Tensor outputs, // 输出Tensor列表 std::shared_ptrstd::vectorgert::Tensor inputs, // 输入Tensor列表 bool status, // 操作执行状态 long long exec_us // 执行时延微秒 );释放资源。// acl去初始化 aclFinalize();【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考 SEO 优化官网定制响应式建站教育培训建站