楼主: reminis123
44 0

CANN Samples(四):AclLite封装总览 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-4-27
最后登录
2018-4-27

楼主
reminis123 发表于 2025-11-27 15:06:29 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

在之前的内容中,我们手动完成了环境搭建,并成功运行了一个原生的

ACLHelloWorld

。你可能已经体会到,尽管首次运行成功令人兴奋,但每次都需要重复编写大量类似

aclInit

aclrtCreateContext

aclrtCreateStream

这样的固定模板代码,过程显得十分冗长且乏味。

这种问题在仅做初始化时尚可接受,一旦涉及模型推理或图像、视频处理等复杂任务,代码量和维护难度便会急剧上升。昇腾官方也意识到了这一痛点,因此推出了一个名为

AclLite

的封装库,旨在将这些重复性高、操作繁琐的底层流程进行整合,使开发者能更专注于核心业务逻辑的实现。

本文将深入探讨

AclLite

的本质、功能及其使用方法。

1. AclLite 是什么?为何需要它?

简而言之,

AclLite

是昇腾平台提供的一套针对 C++ 与 Python 的二次封装工具库。它位于应用程序与底层 AscendCL(ACL)接口之间,起到桥梁作用,帮助我们屏蔽了许多底层细节。

可以将其类比为一个“装修施工团队”。作为开发者,我们如同房主,只关心最终效果——例如“客厅要配备大屏用于观影”(对应模型推理)、“厨房需高效完成洗切操作”(对应图像处理)。我们并不希望亲自处理布线(资源初始化)、管道连接(Stream 管理)或材料调配(内存对齐)等琐碎工程。

AclLite

正是这支专业施工队,它将所有标准化、低层次的操作统一封装,我们只需下达高层指令即可完成任务。

关键术语说明:

  • 二次封装:指在已有接口(如 ACL)之上再构建一层更高级的抽象接口,使其更易用。类似于手机厂商基于 Android 内核定制 UI,虽底层一致,但用户体验更友好。
  • AscendCL (ACL):昇腾计算架构中的应用编程接口,是我们调用其硬件算力的“官方通道”。此前使用的
  • aclInit

    aclrtSetDevice

    均属于该体系的一部分。

在没有使用

AclLite

的情况下,我们的程序通常包含如下结构(回顾

ACLHelloWorld

中的示例):

// 各种头文件
#include "acl/acl.h"
int main() {
// 1. 初始化ACL
aclInit(nullptr);
// 2. 指定设备
aclrtSetDevice(0);
// 3. 创建上下文
aclrtContext context;
aclrtCreateContext(&context, 0);
// 4. 创建Stream
aclrtStream stream;
aclrtCreateStream(&stream);
// --- 这里才是你的业务逻辑 ---
// 5. 销毁Stream
aclrtDestroyStream(stream);
// 6. 销毁上下文
aclrtDestroyContext(context);
// 7. 重置设备
aclrtResetDevice(0);
// 8. 去初始化ACL
aclFinalize();
return 0;
}

而引入

AclLite

后,上述繁琐的初始化与清理流程可被极大简化(以 C++ 为例):

#include "AclLiteResource.h"
int main() {
// 一句话完成所有初始化
AclLiteResource aclResource;
aclResource.Init();
// --- 这里写你的业务逻辑 ---
// 对象析构时会自动完成所有资源的释放
return 0;
}

显然更加简洁明了。而这仅仅是资源管理方面的优化,在模型推理和图像视频处理方面,

AclLite

带来的提升更为显著。

2. AclLite 的核心功能模块

通过分析

samples/inference/acllite

目录下的源码与文档,可以看出

AclLite

主要由以下几个关键模块构成:

2.1 资源管理模块

这是整个框架中最基础且至关重要的部分,负责 ACL 的初始化以及 Device、Context 和 Stream 的全生命周期管理。

C++ 实现:主要依赖于

AclLiteResource

类。该类利用 C++ 的 RAII 特性(Resource Acquisition Is Initialization,即资源获取即初始化),在构造函数中完成资源申请(如调用

Init()

),并在析构函数中自动释放资源。开发者只需声明一个

AclLiteResource

实例,当其超出作用域时,系统会自动执行清理工作,有效避免因遗漏

aclFinalize

而导致的资源泄漏问题。

Python 实现:对应的是

acllite_resource.py

,提供了相同的

AclLiteResource

类封装,同样实现了初始化与资源回收流程的自动化。

2.2 模型推理模块

这是最受关注的功能模块之一。它大幅简化了从加载 OM 模型、准备输入输出数据、执行推理到获取结果的整套流程。

C++ 实现:通过

AclLiteModel

类实现。用户仅需传入模型路径创建对象,随后调用

CreateInput

设置输入数据,再调用

Execute

启动推理,最终从返回的

InferenceOutput

结构体中提取推理结果。

Python 实现:位于

acllite_model.py

中的

AclLiteModel

类提供了类似的接口。使用体验更为便捷,例如

execute

方法可直接接收一个 Python 数据结构作为输入,无需手动管理内存布局。

返回值同样是一个列表,作为输入的列表经过处理后,依然保持为列表形式,完美契合Python在数据科学领域的生态体系。

通过一个Python示例来直观感受其使用方式:

from acllite_model import AclLiteModel
# 1. 初始化模型,传入OM模型文件路径
model = AclLiteModel("../model/resnet50.om")

# 2. 准备输入数据(假设为一个numpy数组)
import numpy as np
input_data = np.random.rand(1, 3, 224, 224).astype(np.float32)

# 3. 执行推理操作
result_list = model.execute([input_data,])

# 4. 处理输出结果(result_list中包含推理生成的numpy数组)
print("Inference success, output shape:", result_list[0].shape)

相较于直接调用原生ACL接口实现推理流程,使用该方式是否明显提升了开发体验与效率?

numpy array

2.3 媒体处理模块(DVPP/VPC)

这是

AclLite

中的另一核心组成部分。昇腾芯片内置专用硬件单元用于图像与视频处理任务,例如DVPP(Digital Vision Pre-Processing)和VPC(Vision Pre-processing Core),能够高效完成JPEG、PNG、H.265、H.264等格式的编解码,以及图像缩放、裁剪、色彩空间转换等常见操作。

若直接使用原生ACL接口调用这些硬件功能,过程较为复杂,需手动管理内存对齐、格式转换等诸多底层细节。

AclLite

已将上述复杂性封装完毕。

C++ 实现:

提供了

AclLiteImageProc

AclLiteVideoProc

类,并封装了如

Resize

Crop

JpegD

(JPEG解码)、

Vdec

(视频解码)等简洁明了的接口函数。

Python 实现:

对应地提供了

acllite_imageproc.py

dvpp_vdec.py

模块,具备

jpegd

resize

等方法,统一采用

AclLiteImage

类来表示输入与输出数据,极大提升了使用的便捷性。

举例说明:若需将一张JPEG图片进行解码并缩放至224×224尺寸,使用

AclLite

可如下实现:

from acllite_imageproc import AclLiteImageProc
from acllite_image import AclLiteImage

# 假设已有AclLite资源实例 acl_resource
# 并已完成图像处理模块初始化
image_proc = AclLiteImageProc(acl_resource)

# 1. 加载图片
image = AclLiteImage("../data/cat.jpg")

# 2. 执行JPEG解码(转为YUV格式)
yuv_image = image_proc.jpegd(image)

# 3. 图像缩放处理
resized_image = image_proc.resize(yuv_image, 224, 224)

# resized_image.data 即为缩放后的图像数据,可直接送入模型进行推理

2.4 应用与多线程支持模块

此部分功能主要体现在C++版本中,通过

AclLiteApp

AclLiteThreadMgr

AclLiteThread

等类构建了一个轻量级的单例应用框架。开发者可以定义多个独立线程,分别承担不同任务——例如一个线程负责从摄像头采集数据,另一个执行模型推理,还有一个用于结果显示——并通过

AclLiteThreadMgr

统一调度管理。这种设计对于搭建完整且高性能的AI推理应用具有显著帮助。

3. 如何在项目中集成与使用 AclLite

需要注意的是,

AclLite

并未随CANN工具包默认安装,而是归属于

samples

代码仓库的一部分,因此其使用方式类似于“绿色软件”模式。

对于C++项目:

首先需根据

inference/acllite/cplusplus/README.md

提供的指引,编译生成

libacllite.so

动态链接库。此步骤可能需要预先安装ffmpeg等相关依赖项。

在实际项目中,引入

AclLite

头文件,并链接

libacllite.so

库文件即可完成集成。

对于Python项目:

集成更为简便,仅需将

inference/acllite/python

整个目录复制到项目所在路径或Python解释器可搜索到的任意位置。

随后根据

inference/acllite/python/README.md

文档指引,通过pip安装

av

numpy

Pillow

等必要的依赖包。

之后便可在代码中通过

from acllite_model import AclLiteModel

的方式直接导入并使用相关功能。

总体而言,

AclLite

是一款实用性强的官方辅助工具。尽管并非强制使用,但合理利用

AclLite

能显著减少重复性代码编写,使开发者更专注于核心业务逻辑与创新,建议在实际昇腾AI项目中积极尝试采用。

numpy array
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:samples Sample LITE AMPL ACL

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2026-1-6 17:52