.. _cpp-interface: ================================ MegEngine Lite C++ 接口介绍 ================================ Tensor 相关 API --------------------- Layout ^^^^^^^^^^^ Layout的 C++ 接口实现如下 .. code-block:: cpp struct Layout { static constexpr uint32_t MAXDIM = 7; size_t shapes[MAXDIM]; size_t ndim; LiteDataType data_type; }; 主要成员为: layout 维度信息 ndim (最大维度为7),每一维度的具体信息 shapes,以及数据类型,MegEngine Lite 中包含的数据类型有: .. code-block:: cpp typedef enum { LITE_FLOAT = 0, LITE_HALF = 1, LITE_INT = 2, LITE_INT16 = 3, LITE_INT8 = 4, LITE_UINT8 = 5, LITE_UINT = 6, LITE_UINT16 = 7, LITE_INT64 = 8, } LiteDataType; Tensor 创建 ^^^^^^^^^^^^^^^^ 创建 Tensor 时候用户可以指定一些 Tensor 的信息,包括创建 Tensor 的设备类型,是否是设备的 `锁页内存 `_,以及 Layout 信息等 .. code-block:: cpp Tensor(LiteDeviceType device_type, bool is_pinned_host = false); Tensor(LiteDeviceType device_type, const Layout& layout, bool is_pinned_host = false); Tensor(int device_id, LiteDeviceType device_type, const Layout& layout = {}, bool is_pinned_host = false); 参数: * LiteDeviceType :指定创建的 Tensor 所在的设备,默认是:LITE_CPU,目前主持的设备有: .. code-block:: cpp typedef enum { LITE_CPU = 0, LITE_CUDA = 1, LITE_ATLAS = 3, LITE_NPU = 4, LITE_DEVICE_DEFAULT = 5, } LiteDeviceType; * device_id:指明 Tensor 创建的设备号 * is_pinned_host:表示该 Tensor 是否为 `锁页内存 `_,默认为 false。 Tensor 信息获取 ^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp LiteDeviceType get_device_type() const; int get_device_id() const; Layout get_layout() const; bool is_pinned_host() const; size_t get_tensor_total_size_in_byte() const; bool is_continue_memory() const; * get_device_type:返回 Tensor 所在的设备类型 * get_device_id:返回 Tensor 所在的设备 id * get_layout:返回 Tensor 的 layout 信息 * is_pinned_host:判断该 Tensor 的内存是否是 `锁页内存 `_ * get_tensor_total_size_in_byte:获取这个 Tensor 总的内存大小,单位为字节 * is_continue_memory:获取这个 Tensor 的内存是否是连续的 get_memory_ptr ^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp void* get_memory_ptr() const; void* get_memory_ptr(const std::vector& idx) const; * 无参数 get_memory_ptr:将以 void* 的形式返回 Tensor 的内存地址,如果 Tensor 没有申请内存,将会申请内存 * 有参数 get_memory_ptr:返回指定 index 的内存地址, **参数 const std::vector 从 Tensor 高维到低维的 shape 索引**,其长度可以小于 Tensor 中 Layout 的维度,但是需要从高维度到低维度,中间不能有跳跃 示例: .. code-block:: cpp Layout layout{{1, 3, 224, 224}, 4}; Tensor tensor(LiteDeviceType::LITE_CPU, layout); // 获取 tensor 起始地址 void* start_ptr = tensor.get_memory_ptr(); // 获取 tensor 中 index 为(0,1,100,10)的地址 void* start_ptr = tensor.get_memory_ptr({0, 1, 1000, 10}); // 获取 tensor 中 index 为(0,1,100,0)的地址 void* index_ptr = tensor.get_memory_ptr({0, 1, 1000}); reset ^^^^^^^^^ 设置用户自己管理的内存地址到 Tensor 中 .. code-block:: cpp void reset(void* prepared_data, size_t data_length_in_byte); void reset(void* prepared_data, const Layout& layout); 参数: * prepared_data:用户自己管理的内存, **用户需要确保 prepared_data 生命周期大于 Tensor 持有这段 prepared_data 内存的生命周期**,Tensor 中不会对这段内存进行管理 * data_length_in_byte:这段 prepared_data 内存的长度,单位是字节 * layout:这段 prepared_data 的 Layout 信息 reshape ^^^^^^^^^^ .. code-block:: cpp void reshape(const std::vector& shape); 改变这个 Tensor 的 Layout 中的 shapes 为新的 shape,其中 **新的 shape 中元素个数需要和老的 shape 里面的元素个数相等** slice ^^^^^^^^ .. code-block:: cpp std::shared_ptr slice( const std::vector& start, const std::vector& end, const std::vector& step = {}); 对 Tensor 进行切片,返回一个新的 Tensor,新的 Tensor 和原来 Tensor 共享内存, **新的 Tensor 可能不连续** 参数: **start,end 的长度必须相等,长度可以小于 Tensor 的 Layout 的维度,如果传递了 step,则 step 也需要和 start,end 的长度相等** * start:Tensor 每一维度的起始 index 组成的数组,从高维到低维 * end:Tensor 每一维度的结束 index 组成的数组,从高维到低维 * step:Tensor 每一维度切片的间距,从高维到低维,默认为1 返回值:返回一个新的 Tensor,类型是一个 std::shared_ptr 示例: .. code-block:: cpp Layout layout{{20, 20}, 2}; Tensor tensor(LiteDeviceType::LITE_CPU, layout); // 对 Tensor 进行切片,返回 Tensor 为原来 Tensor 的 [0:1:20,0:1:10] auto slice0 = tensor.slice({0, 0}, {20, 10}); // 对 Tensor 进行切片,返回 Tensor 为原来 Tensor 的 [0:1:20,10:1:10] auto slice1 = tensor.slice({0, 10}, {20, 20}); // 对 Tensor 进行切片,返回 Tensor 为原来 Tensor 的 [0:2:20,:] auto slice1 = tensor.slice({0}, {20}, {2}); fill_zero ^^^^^^^^^^^^^ .. code-block:: cpp void fill_zero(); 将 Tensor 内存里面的数据全部设置为 0 copy_from ^^^^^^^^^^^^^^^^ .. code-block:: cpp void copy_from(const Tensor& src); 从 src Tensor 中 copy 数据到自己内存中, **如果 src 和自己的 layout 不相同时,会更改自身 Layout 信息为 src Layout** share_memory_with ^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp // share memory with other tensor void share_memory_with(const Tensor& src_tensor); 将会和 src_tensor 共享内存数据, **如果 src_tensor 和自己的 Tensor 信息(layout,device_type,device_id等)不相同时,会更改自身信息为 src 的信息** Network 相关 API --------------------- .. _option_config: 创建 Network ^^^^^^^^^^^^^^^^^^ .. code-block:: cpp Network(const Config& config = {}, const NetworkIO& networkio = {}); Network(const NetworkIO& networkio, const Config& config = {}); 根据用户配置的 Config,以及用户配置的 NetworkIO 信息创建 Network 参数: * config:可以不指定,不指定为默认值,Config 结构如下: .. code-block:: cpp struct Config { // 模型是否使用 lite 的方式压缩 bool has_compression = false; // Network 的 device_id 和 device_type 信息 int device_id = 0; LiteDeviceType device_type = LiteDeviceType::LITE_CPU; // MegEngine 默认为 LITE_DEFAULT LiteBackend backend = LiteBackend::LITE_DEFAULT; // 如果模型加密,模型加密算法名字 std::string bare_model_cryption_name = {}; // 优化选项 Options options = {}; }; * bare_model_cryption_name:目前 MegEngine Lite 中写了三种加密算法,分别是:"AES_default","RC4_default" 和 "SIMPLE_FAST_RC4_default" * options 定义了对 Network 进行优化的各种参数: .. code-block:: cpp struct Options { bool weight_preprocess = false; bool fuse_preprocess = false; bool fake_next_exec = false; bool var_sanity_check_first_run = true; bool const_shape = false; bool force_dynamic_alloc = false; bool force_output_dynamic_alloc = false; bool force_output_use_user_specified_memory = false; bool no_profiling_on_shape_change = false; uint8_t jit_level = 0; uint8_t comp_node_seq_record_level = 0; uint8_t graph_opt_level = 2; uint16_t async_exec_level = 1; //! layout transform options bool enable_nchw44 = false; bool enable_nchw44_dot = false; bool enable_nchw88 = false; bool enable_nhwcd4 = false; bool enable_nchw4 = false; bool enable_nchw32 = false; bool enable_nchw64 = false; }; * weight_preprocess:在推理时候,部分 Kernel 执行前需要对权重进行转换,或者 Relayout,开启这个选项之后,将权重处理放到 Kernel 执行之前,优化 Kernel 执行时间,但是 Network 初始化时间变长 * fuse_preprocess:开启该选项之后,模型中的部分前后处理 Operator 将会被融合在一起,优化模型执行的性能 * fake_next_exec:下一次执行 Inference 时候,是否为假的执行:仅仅完成内存分配等和计算无关的操作。这次假的执行完成之后将被设置为 false * var_sanity_check_first_run:第一次执行 Inference 时候是否需要对每一个 Operator 的输入输出 Tensor 的正确性进行检查,默认为 true * const_shape:指定 Network 的输入 shape 不会变化,这样不用在后面的执行时检查是否需要重新分配内存等操作 * force_dynamic_alloc:强制要求所有的 Tensor 都是运行时动态分配,且不进行内存优化,MegEngine 默认所有的 Tensor 都是执行前进行内存优化并静态申请 * force_output_dynamic_alloc:强制最后输出的 Tensor 的内存为动态申请,这样输出 Tensor 不用 copy 到用户的内存中,可以直接代理到返回内存给用户 * force_output_use_user_specified_memory:强制让输出 Tensor 的内存由用户指定,这样输出 Tensor 将不需要 copy 到用户内存,在最后一个 Kernel 计算时就写到了用户的内存地址中 * no_profiling_on_shape_change:当 Network 的输入 Tensor 的 shape 改变的时候,这时候 fast-run 将不会进行重新搜索最优的 kernel 算法实现 * jit_level:JIT 的级别,设置为 0 时:将关闭 JIT,设置为 1 时:仅仅只开启基本的 elemwise 的 JIT,当设置为 2 时:将开启 elemwise 和 reduce Operator 的 JIT * comp_node_seq_record_level:设置 MegEngine 的录制模式,当设置为 0 时:将不开启录制模式,设置为 1 时:将开启录制模式,不会析构这个计算图结构,当设置为 2 时:将开启录制模式,并释放掉整个计算图 * graph_opt_level:设置图优化等级,当设置为 0 时:关闭图优化,当设置为 1 时:算术计算 inplace 优化,当设置为 2 时:在 1 的基础上在加上全局优化,当设置为 3 时:在 2 的基础上再使能 JIT * enable_xxxx:开启对应的 layout 转换优化,不同的平台上不同的 layout 性能差异较大,见下表: +-------------------+----------------------------------------------------+-------------+ | 参数 | 作用 | 适用平台 | +===================+====================================================+=============+ | enable-nchw88 | 将输入nchw layout的模型转为nchw88 layout的模型 | X86 avx256 | +-------------------+----------------------------------------------------+-------------+ | enable-nchw44 | 将输入nchw layout的模型转为nchw44 layout的模型 | Arm float32 | +-------------------+----------------------------------------------------+-------------+ | enable-nchw44-dot | 将输入nchw layout的模型转为nchw44-dot layout的模型 | Arm V8.2 | +-------------------+----------------------------------------------------+-------------+ | enable-nchw4 | 将输入nchw layout的模型转为nchw4 layout的模型 | CUDA | +-------------------+----------------------------------------------------+-------------+ | enable-chwn4 | 将输入nchw layout的模型转为chwn4 layout的模型 | CUDA | +-------------------+----------------------------------------------------+-------------+ | enable-nchw32 | 将输入nchw layout的模型转为nchw32 layout的模型 | CUDA | +-------------------+----------------------------------------------------+-------------+ | enable-nhwcd4 | 将输入nchw layout的模型转为nhcw4 layout的模型 | 移动平台GPU | +-------------------+----------------------------------------------------+-------------+ * networkio:配置 Network 的输入输出信息,主要配置输入 Tensor 的来源从 CPU 还是 device,输出 Tensor 保存在 CPU 端还是 device 端,默认输入输出都在 CPU 端 .. code-block:: cpp struct IO { // 输入输出 Tensor 的名字 std::string name; // 是否来自、输出到 device 端 bool is_host = true; // 最后需要的是 Value 还是 Shape LiteIOType io_type = LiteIOType::LITE_IO_VALUE; // 该输入输出对应的 layout,不设置,Network 会使用模型 Layout config_layout = {}; }; struct NetworkIO { // 所有的输入配置 std::vector inputs = {}; // 所有的输出配置 std::vector outputs = {}; }; 示例: .. code-block:: std::string model_path = "./shufflenet.mge"; std::string input_name = "data"; NetworkIO IO; bool is_host = false; // 输入 tensor ”data“ 数据来自 device IO.inputs.push_back({input_name, is_host}); Config config; //! 配置 config config.options.var_sanity_check_first_run = false; config.options.comp_node_seq_record_level = 1; //! 构造 Network std::shared_ptr network = std::make_shared(IO,config); load_model ^^^^^^^^^^^^^^^ .. code-block:: cpp //! load the model form memory void load_model(void* model_mem, size_t size); //! load the model from a model path void load_model(std::string model_path); Network 加载模型,可以从一个指定的路径 **model_path**,或者一段内存 **model_mem** 和其对应的 size 进行加载 获取 Network 基本信息 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp // 获取模型的所有输入 Tensor 名字 std::vector get_all_input_name() const; // 获取模型的所有输出 Tensor 名字 std::vector get_all_output_name() const; // 获取模型的第 index 输入 Tensor 的名字 std::string get_input_name(size_t index) const; // 获取模型的第 index 输入 Tensor 的名字 std::string get_output_name(size_t index) const; // 通过名字获取输入或者输出 Tensor,如果输入输出名字有重复的情况,需要指定是输入还是输出:LiteTensorPhase std::shared_ptr get_io_tensor( std::string io_name, LiteTensorPhase phase = LiteTensorPhase::LITE_IO); // 获取模型的第 index 输入 Tensor std::shared_ptr get_input_tensor(size_t index); // 获取模型的第 index 输入 Tensor std::shared_ptr get_output_tensor(size_t index); // 获取 Network 的设备类型,device id,stream id LiteDeviceType get_device_type() const; int get_device_id() const; int get_stream_id() const; 设置 Network 基本信息 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp // 设置 Network 运行的 device id 和 stream id Network& set_device_id(int device_id); Network& set_stream_id(int stream_id); // 设置模型异步执行时候的回调函数 Network& set_async_callback(const AsyncCallback& async_callback); // 设置模型开始执行的回调函数 Network& set_start_callback(const StartCallback& start_callback); // 设置模型完成执行的回调函数 Network& set_finish_callback(const FinishCallback& finish_callback); Network 执行 ^^^^^^^^^^^^^^^^^ .. code-block:: cpp void forward(); void wait(); 执行该 Network 的推理,并等待推理结束 compute_only_configured_output ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp void compute_only_configured_output(); 配置模型只计算创建 Network 时候指定的 output tensor,其他 Tensor 不计算,不设置 Network 默认计算所有输出 Tensor 的值 get_static_memory_alloc_info ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp void get_static_memory_alloc_info(const std::string& log_dir = "logs/test") const; 获取 Network 运行该 模型时候的内存使用信息,该信息将以 json 文件形式保存在指定的 log_dir 中 enable_profile_performance ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp void enable_profile_performance(std::string profile_file_path); 测量 Network 运行该模型时候的每个 Op 的耗时信息,该信息将以 json 文件形式保存在指定的 profile_file_path 中 .. _get_model_extra_info: get_model_extra_info ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp const std::string& get_model_extra_info(); 如果 MegEngine Lite 模型在打包模型时候设置了额外的 information,将通过这个接口获得,返回一段 json 字符串,用户自己解析,如果没有额外 information 否则将返回空字符串 Network Runtime 配置 ------------------------------------ 模型的一部分配置在创建 Network 时候的 Config 中进行配置,另外 Runtime 相关配置封装在 Runtime 类型中,都是 Runtime 的静态函数 get/set_cpu_threads_number ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp static size_t get_cpu_threads_number(std::shared_ptr dst_network); static void set_cpu_threads_number( std::shared_ptr dst_network, size_t nr_threads); 获取或者设置 dst_network 运行时候的线程数量,dst_network 必须是运行在 CPU 上面 set_runtime_thread_affinity ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp static void set_runtime_thread_affinity( std::shared_ptr network, const ThreadAffinityCallback& thread_affinity_callback); 设置 dst_network 多线程运行时候,绑核的回调函数 set_cpu_inplace_mode ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp static bool is_cpu_inplace_mode(std::shared_ptr dst_network); static void set_cpu_inplace_mode(std::shared_ptr dst_network); 获取或者设置 dst_network 运行在 CPU 的 **inplace** 模式,inplace 模式为:运行模型时候只有一个线程,这个线程发送 Kernel 任务的同时,inplace 地将 kernel 执行计算任务。非 inplace 模式:将有2个线程,一个线程发送 Kernel 任务,一个线程执行 Kernel 任务。在一些单核处理器。 或者低端 cpu 上,设置 **inplace 模式性能会好一些**。 use_tensorrt ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp static void use_tensorrt(std::shared_ptr dst_network); 设置 dst_network 使用 TensorRT 引擎进行推理 .. _set_network_algo_policy_cpp: set_network_algo_policy ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp static void set_network_algo_policy( std::shared_ptr dst_network, LiteAlgoSelectStrategy strategy, uint32_t shared_batch_size = 0, bool binary_equal_between_batch = false); 设置 dst_network 模型运行时候选择算法的策略 参数: * strategy: 选择算法的策略,MegEngine Lite 中支持以下策略: .. code-block:: cpp typedef enum { // 经验性的选择算法 LITE_ALGO_HEURISTIC = 1 << 0, // 通过实际运行,选择最优的算法 LITE_ALGO_PROFILE = 1 << 1, // 选择多次执行没有差别的算法 LITE_ALGO_REPRODUCIBLE = 1 << 2, // 从具有优化的算法中选择算法 LITE_ALGO_OPTIMIZED = 1 << 3, } LiteAlgoSelectStrategy; 其中上面的策略在不冲突的情况下,可以进行组合 * binary_equal_between_batch: 多个 batch 同时进行计算时,如果输入完全一样,保证所有 batch 的计算结果完全一样 * shared_batch_size:binary_equal_between_batch 的时候,选择最优算法所依据的 batch 大小,设置 0 将使用模型默认的 batch size set_network_algo_workspace_limit ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp static void set_network_algo_workspace_limit( std::shared_ptr dst_network, size_t workspace_limit); 设置 dst_network 运行选择算法时候,算法能够允许的最大 workspace,超过最大 workspace 的算法将不会选择 set_memory_allocator ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp static void set_memory_allocator( std::shared_ptr dst_network, std::shared_ptr user_allocator); 设置 dst_network 运行时,使用用户自定义的内存分配器 .. _share_runtime_memory_with: share_runtime_memory_with ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp static void share_runtime_memory_with( std::shared_ptr dst_network, std::shared_ptr src_network); 设置 dst_network 运行和 src_network 共享运行时候的内存, **这时 dst_network 和 src_network 不能同时执行**, 运行时内存指:除了保存模型 weights 和图结构以外的所有需要的运行时内存 .. _shared_weight_with_network: shared_weight_with_network ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp static void shared_weight_with_network( std::shared_ptr dst_network, std::shared_ptr src_network); 设置 dst_network 运行和 src_network 共享同一份权重,但是可以对不同的输入数据进行推理,这两个 Network 可以同时运行 enable_io_txt_dump ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp static void enable_io_txt_dump( std::shared_ptr dst_network, std::string io_txt_out_file); 将 dst_network 运行时候的所有 IO tensor 输出到文本文件 io_txt_out_file 中。 enable_io_bin_dump ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp static void enable_io_bin_dump( std::shared_ptr dst_network, std::string io_bin_out_dir); 将 dst_network 运行时候的所有 IO tensor 以二进制的形式保存在 io_bin_out_dir 文件夹中。 Global 配置 ----------------- register_decryption_and_key ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp bool register_decryption_and_key( std::string decrypt_name, const DecryptionFunc& func, const std::vector& key); 向 MegEngine Lite 中注册 decrypt_name 名字的解密算法,该解密算法的方法为 func,秘钥为 key 参数: * decrypt_name: 新注册的解密算法的名字,字符串 * func:新注册的解密算法的方法,函数指针 * key:新注册的解密算法的秘钥,uint8_t 的数组 示例: .. code-block:: cpp std::vector decrypt_model( const void* model_mem, size_t size, const std::vector& key) { if (key.size() == 1) { std::vector ret(size, 0); const uint8_t* ptr = static_cast(model_mem); uint8_t key_data = key[0]; for (size_t i = 0; i < size; i++) { ret[i] = ptr[i] ^ key_data ^ key_data; } return ret; } else { printf("the user define decrypt method key length is wrong.\n"); return {}; } } // 注册 "just_for_test" 的加密算法,解密算法是 decrypt_model,秘钥是 15 register_decryption_and_key("just_for_test", decrypt_model, {15}); .. _update_decryption_or_key: update_decryption_or_key ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp bool update_decryption_or_key( std::string decrypt_name, const DecryptionFunc& func, const std::vector& key); 更新 MegEngine Lite 中注册的 decrypt_name 名字的解密算法,如果 func 不为空,则将之前的解密算法的方法更新为 func, 如果 key 的长度大于0,则将解密算法的秘钥更新为 key 示例: .. code-block:: cpp std::vector key(32, 0); for (size_t i = 0; i < 32; i++) { key[i] = 31 - i; } // 更新 "AES_default" 加密算法的秘钥为 key,解密 func 保持不变 update_decryption_or_key("AES_default", nullptr, key); .. _register_parse_info_func: register_parse_info_func ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp bool register_parse_info_func( std::string info_type, const ParseInfoFunc& parse_func); 向 MegEngine Lite 中注册 info_type 名字的模型信息解析方法,该模型信息解析方法的执行函数为 parse_func try_coalesce_all_free_memory ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp void try_coalesce_all_free_memory(); 配置 MegEngine Lite 将释放所有没有用到的内存,减少内存用量 set_loader_lib_path ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp void set_loader_lib_path(const std::string& loader_path); 设置使用 loader 对应的库文件路径为 loader_path set_persistent_cache ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp void set_persistent_cache( const std::string& cache_path, bool always_sync = false); 设置模型运行时候使用到的算法 cache,设置之后运行模型将直接从 cache 中获取对应算法,或者将选择的算法信息保存到该文件中 参数 * cache_path: 这个 fast-run cache 文件 * always_sync:是否这个 cache 文件时刻保持同步,如果是则:每次写 cache 都将写到文件中 dump_persistent_cache ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp void dump_persistent_cache(const std::string& cache_path); 将内存中的 fast-run cache 写到 cache_path 中 TensorRT cache ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp void set_tensor_rt_cache(std::string tensorrt_cache_path); void dump_tensor_rt_cache(); 设置或者保存 TensorRT 的 cache 文件 基本信息 ^^^^^^^^^^^ .. code-block:: cpp // 获取 MegEngine Lite 的版本信息 void get_version(int& major, int& minor, int& patch); // 设置 MegEngine Lite 的 log 级别 void set_log_level(LiteLogLevel level); // 获取 MegEngine Lite 的 log 级别 LiteLogLevel get_log_level(); // 获取指定设备类别的设备数量 size_t get_device_count(LiteDeviceType device_type); 物理地址和虚拟地址设置 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cpp // 全局设置 vir_ptr, phy_ptr 对到 MegEngine 对应的 device 和 backend 中 bool register_memory_pair( void* vir_ptr, void* phy_ptr, size_t length, LiteDeviceType device, LiteBackend backend = LiteBackend::LITE_DEFAULT); // 全局清除 MegEngine 对应的 device 和 backend 中的 vir_ptr, phy_ptr 对 bool clear_memory_pair( void* vir_ptr, void* phy_ptr, LiteDeviceType device, LiteBackend backend = LiteBackend::LITE_DEFAULT); // 通过虚拟地址查询对应 device 和 backend 中的物理地址,并返回 void* lookup_physic_ptr(void* vir_ptr, LiteDeviceType device, LiteBackend backend); 部分设备上有虚拟地址和物理地址的概念,这里提供用户操作虚拟地址和物理地址的接口,主要有: * 设置全局的物理地址和虚拟地址对 * 清除这些地址对 * 通过虚拟地址查询物理地址