EasyEdge平台Atlas-300适配SDK开发文档
简介
本文档介绍EasyEdge/EasyDL的Linux Atlas SDK的使用方法。
注意Atlas有两种产品形态,Atlas 200和Atlas 300, 请参见此处的文档说明
- 网络类型支持:图像分类
-
硬件支持:
- CPU: x86_64
- Atlas 300 卡
- 操作系统支持:Atlas指定的Linux版本, Ubuntu 18.04 x86_64 或 centos 7 x86_64 , cann 推理库请从Atlas官网中下载。
- 飞腾 + Atlas300I推理卡的环境配置(Linux aarch64)与使用方式类似Atlas300 可参照使用
Release Notes
时间 | 版本 | 说明 |
---|---|---|
2022.06.29 | 1.6.0 | atlas 300支持aipp预处理加速,单算子推理 |
2022.05.18 | 1.5.0 | atlas 300在BML扩展支持15+新网络 |
2022.03.25 | 1.4.0 | atlas 300在EasyDL模型增加多个量化加速版本 |
2020.12.22 | 1.3.5 | SDK升级到CANN5.0.3, SDK包含编译好的demo二进制文件 |
2020.10.20 | 1.3.4 | 在CANN上丰富分类检测网络的支持,完善图片推理demo,HTTP Demo, 视频流demo |
2020.06.29 | 1.3.1 | SDK升级到CANN 20.1 |
2020.06.15 | 0.2 | 支持物体检测 |
2020.3.23 | 0.1 | 初始版本,支持图像分类 |
性能数据
数据仅供参考,实际数值根据使用线程数、利用率等情况可能有所波动
模型类型 | 模型算法 | 芯片类型 | SDK类型 | 实测硬件 | 单次预测耗时 |
---|---|---|---|---|---|
EasyDL 图像分类 | 高性能 | Atlas 300 | Atlas 300 | Atlas 800服务器 | 9ms |
EasyDL 图像分类 | 高精度 | Atlas 300 | Atlas 300 | Atlas 800服务器 | 12ms |
EasyDL 物体检测 | 高性能 | Atlas 300 | Atlas 300 | Atlas 800服务器 | 11ms |
EasyDL 物体检测 | 高精度 | Atlas 300 | Atlas 300 | Atlas 800服务器 | 18 ms |
atlas 300 加速卡注意事项
一般服务器(HOST侧)安装多个300加速卡,,每个300加速卡有4个芯片。一个芯片(DEVICE侧)可以认为是一个单独的系统,并且不共享储存系统。
每个芯片都有独立的device-id,可以通过命令查看:sudo npu-smi info
由于模型需要在芯片上运行。因此运行SDK前,需要手动将模型复制到每个单独芯片的储存系统上。
快速开始
SDK在以下环境中测试通过
- ubuntu 18.04, Atlas 800 服务器指定版本;
1.环境准备
sudo apt-get install sshpass build-essential
升级安装CANN5.0.3,涉及到对应的固件及驱动更新,按照昇腾https://www.hiascend.com官方指导安装验证
2. 测试Demo
####下载sdk并获取序列号 在EasyEdge,BML和EasyDL平台都可以通过离线部署或EasyEdge本地部署模块发布离线部署包,下载SDK并获取对应的序列号之后就可以开始后续的demo验证;
编译运行:
cd src
mkdir build && cd build
cmake .. && make
sudo ldconfig
./demo_image_inference/easyedge_image_inference {模型RES文件夹} {测试图片路径或仅包含图片的文件夹路径} {序列号}
在sdk/bin目录下也有编译好的二进制可执行demo文件,可以直接运行验证;
demo运行示例:
export LD_LIBRARY_PATH=path_to_sdk/lib/:path_to_sdk/thirdparty/opencv/lib/:$LD_LIBRARY_PATH
./demo_image_inference/easyedge_image_inference ../../../../RES/ /home/images/mix008.jpeg
2020-08-06 20:56:30,665 INFO [EasyEdge] 548125646864 Compiling model for fast inference, this may take a while
...
Results of image /ljay/images/mix008.jpeg:
2, kiwi, p:0.997594 loc: 0.352087, 0.56119, 0.625748, 0.868399
2, kiwi, p:0.993221 loc: 0.45789, 0.0730294, 0.73641, 0.399429
2, kiwi, p:0.992884 loc: 0.156876, 0.0598725, 0.3802, 0.394706
1, tomato, p:0.992125 loc: 0.523592, 0.389156, 0.657738, 0.548069
1, tomato, p:0.991821 loc: 0.665461, 0.419503, 0.805282, 0.573558
1, tomato, p:0.989883 loc: 0.297427, 0.439999, 0.432197, 0.59325
1, tomato, p:0.981654 loc: 0.383444, 0.248203, 0.506606, 0.400926
1, tomato, p:0.971682 loc: 0.183775, 0.556587, 0.286996, 0.711361
1, tomato, p:0.968722 loc: 0.379391, 0.0386965, 0.51672, 0.209681
Done
检测结果展示:
测试Demo HTTP 服务
编译demo完成之后,会同时生成一个http服务,运行
export LD_LIBRARY_PATH=path_to_sdk/lib/:path_to_sdk/thirdparty/opencv/lib/:$LD_LIBRARY_PATH
# ./easyedge_serving {res_dir} {serial_key} {host, default 0.0.0.0} {port, default 24401}
./easyedge_serving ../../../../RES "1111-1111-1111-1111" 0.0.0.0 24401
日志中会显示
HTTP is now serving at 0.0.0.0:24401
字样,此时,开发者可以打开浏览器,http://{设备ip}:24401
,选择图片来进行测试。
同时,可以调用HTTP接口来访问服务,具体参考下文接口说明。
SDK接口使用
使用该方式,将运行库嵌入到开发者的程序当中。
同步接口使用流程
请优先参考Demo的使用流程。遇到错误,请优先参考文件中的注释解释,以及日志说明。
// step 0: 设置序列号
global_controller()->set_licence_key("set your license here");
// step 1: 配置模型资源目录
AtlasConfig config;
config.model_dir = {模型文件目录};
// step 2: 创建并初始化Predictor;
auto predictor = global_controller()->CreateEdgePredictor(config);
int ret = predictor->init();
# 若返回非0,请查看输出日志排查错误原因。
auto img = cv::imread({图片路径});
// step 3: 预测图像
std::vector<EdgeResultData> result2;
predictor->infer(img, result2);
# 解析result2即可获取结果
异步接口使用流程
// step 0: 设置序列号
global_controller()->set_licence_key("set your license here");
// step 1: 配置模型资源目录
AtlasConfig config;
config.model_dir = {模型文件目录};
// step 3: 创建Predictor;这这里选择合适的引擎
auto predictor = global_controller()->CreateEdgePredictor(config);
// step 4: 设置异步回调
predictor->set_result_handler(YOUR_HANDLER);
// step 5: 初始化
int ret = predictor->init();
# 若返回非0,请查看输出日志排查错误原因。
// step 6: 预测图像
auto img = cv::imread({图片路径});
color_format = kBGR;
float threshold = 0.1;
uint64_t seq_id;
predictor->infer_async(img, color_format, 0.1, nullptr, seq_id);
# YOUR_HANDLER里面有seq_id的回调结果
设置序列号
请在网页控制台中申请序列号,并在init初始化前设置。 LinuxSDK 首次使用需联网授权。
- 接口
virtual int set_licence_key(const std::string& license) = 0;
日志配置
设置 EdgeLogConfig
的相关参数。具体含义参考文件中的注释说明。
EdgeLogConfig log_config;
log_config.enable_debug = true;
global_controller()->set_log_config(log_config);
日志及报错
日志
日志需要开启Atlas 的 INFO级别,/etc/slog.conf中配置关闭zip格式。清空/var/dlog 目录,运行atlas 300 官方示例代码,可以在/var/dlog目录下看见host和device开头的2个日志文件,中间是明文的info级别的日志
日志共有3处:
- host 测的easyedge.log。 当前运行目录下。
- device侧的easyedge.device.xxx.log。 device侧的日志,在芯片的同名目录下。
- /var/dlog host 与device开头的log文件,ddk运行日志,其中device侧有略微延时
通用错误码
错误码 | 常量 | 解释 |
---|---|---|
1000004 | RESOURCE_LOAD_FAIL | 缺少data/model/conf.json文件或者该文件以及被改动。下载包中的data/model下的所有文件都不要改动,尝试使用默认配置。或者按照报错复制到对应目录。 |
7000001 | AUTH_FAILED | 服务端校验序列号失败 |
7000002 | AUTH_LICENSE_INVALID | 校验序列号 |
7000003 | AUTH_LICENSE_EXPIRED | 序列号过期 |
500001 | NET_CURL_PERFORM_FAILED | 服务端校验序列号的请求因为网络原因失败 |
600001 | GET_MACHINE_ID_FAILED | 没有相关权限,请反馈 |
Atlas SDK 错误码
错误码值 | 常量 | 含义 | 报错示例信息 | 示例解释及解决方式 |
---|---|---|---|---|
12000011 | FILE_NOT _READABLE | 资源文件不可读 | data/model/params IS NOT READABLE | data/model/params,这个文件不可读。SDK下载包中的data/model下的所有文件都不要改动,尝试使用默认配置。或者按照报错复制到对应目录。 |
12000012 | HIAI_ERRORLIST _FILE | status.h.list不是原始文件 | data/model/status.h.list IS TOO SMALL | 下载包中的data/model下的所有文件都不要改动,包括status.h.list |
12000102 | PREDICTOR_NOT_INITED | create后没有调用init()函数 | please call init() first | 调用infer函数前没有调用init() |
12000103 | PREDICTOR_NO_HANDLER | create后没有调用set_result_handler()函数 | please call set_result_handler() first | 调用infer_async函数前没有调用set_result_handler(),建议init前调用 |
12000104 | PREDICTOR_ALREADY_INITED | init()不管是否成功,不能连续调用。 | don't call init() more than once | 如果失败,请再次新建一个Predictor |
12000105 | BATCH_SIZE | AltasConfig里的batch_size设置与model_name不符合 | model batch size is 1; your config batch size is 4 | batch_size设置里4,model_name设置里params,不对应导致报错。model_name应该设置为params-batch4 |
12000106 | INPUT_WIDTH | preprocess_args.json被改动 | model input tensor width is 224; your config resize is 226 | 请勿修改preprocess_args.json |
12000107 | INPUT_HEIGHT | 同上 | 同上 | 同上 |
12000201 | BATCH_TOO_MANY_IMAGES | 一次输入的图片大于batch_size | too_many_images input:2; batch_size is 1 | 调用infer函数,输入了2张图片,大于batch数。如果batch=1的话,每次infer只能传一张图。 |
12000202 | IMAGE_FORMAT_CHANNELS | infer函数输入的color_format与cv::Mat里的channel数不匹配 | EdgeColorFormat is not according to cv channels; format is 101; channels is 3; seq_id1 | 101表示kRGBA,cv::Mat里channel应该期望是4。如果是直接读的图片,填kBGR。 |
12200001 | ENGINE_MATRIX _COMMON | Atlas DDK Matrix部分(非CreateGraph函数)接口报错。即返回值HIAI_StatusT不是HIAI_OK。具体解释见Atlas官方文档。 | hiai::Graph::ParseConfigFile (graph.prototxt) ; status Code is 16855066 ; HIAI ERROR CODE is 101 HIAI_GRAPH_PROTO_FILE _PARSE_FAILED_CODE, | 调用hiai::Graph:: ParseConfigFile()返回16855066, 对应的status.h.list中的错误码是101。保留日志,具体见Atlas官方文档。 |
12200002 | ENGINE_AI_COMMON | Atlas DDK Device引擎部分hiai::AIStatus 不为hiai::SUCCESS | _ai_model_manager->Process() | 保留日志,具体见Atlas官方文档。 |
12200003 | ENGINE_MATRIX_INIT | Atlas DDK CreateGraph() 初始化DDK报错。具体解释见Atlas官方文档。 | hiai::Graph::CreateGraph(); data/model/graph.prototxt ; status Code is 16855190 ; HIAI ERROR CODE is 225 HIAI_FILE_NOT_EXIST_CODE, | 示例为缺少libatlas_device.so导致 |
12200004 | EDGEATLAS_ENGINE MATRIX_INIT_DEVICE | Atlas DDK CreateGraph() 初始化DDK报错,这个报错很可能是device侧出现问题 | hiai::Graph::CreateGraph() ;data/model/graph.prototxt ; status Code is 16855057 ; HIAI ERROR CODE is 92 HIAI_GRAPH_ENGINE _INIT_FAILED_CODE | 需要具体排查DEVICE侧日志再次找具体报错,发现原因 |
12200005 | ENGINE_ARGS_NULL | 内部错误 | 请反馈 | |
12300001 | SYNC_INFER_TIMEOUT | 调用infer同步接口时,内部会调用infer_async函数,这个函数超时 | infer sync wait timout more than 10ms | 内部会调用infer_async函数超过10ms。1.不要并发过高 2. 超时参数略微大些。 |