图像分类服务器端SDK集成文档-Linux-Atlas
简介
本文档介绍EasyEdge/EasyDL的Linux Atlas SDK的使用方法。
注意Atlas有两种产品形态,Atlas 200和Atlas 300, 请参见此处的文档说明
- 网络类型支持:图像分类
-
硬件支持:
- CPU: aarch64
- Atlas 300 卡
- 操作系统支持:Atlas指定的Linux版本, Ubuntu 16.04 x86_64 或 centos 7 x86_64 , 请从Atlas文档中下载。
Release Notes
时间 | 版本 | 说明 |
---|---|---|
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服务器 | 31ms |
atlas 300 加速卡注意事项
一般服务器(HOST侧)安装多个300加速卡,,每个300加速卡有4个芯片。一个芯片(DEVICE侧)可以认为是一个单独的系统,并且不共享储存系统。
每个芯片都有独立的device-id,可以通过命令查看:sudo npu-smi info
由于模型需要在芯片上运行。因此运行SDK前,需要手动将模型复制到每个单独芯片的储存系统上。
测试atlas 300的官方demo
环境准备
请参见此处的文档说明, 搭建环境,测试HelloDavinci demo通过后,再测试本demo
修改300加速卡SSH密码(可选)
请在咨询华为技术人员后,修改Device登录密码
ssh HwHiAiUser@192.168.1.199
#登录后会强制修改密码
ssh HwHiAiUser@192.168.1.198
快速开始
SDK在以下环境中测试通过
- ubuntu 16.04, Atlas 800 服务器指定版本;
Atlas DDK 的ddk_info信息:
{
"VERSION": "1.3.8.B902",
"NAME": "DDK",
"TARGET": "ASIC"
}
1.安装软件
sudo apt-get install sshpass build-essential
2. 测试Demo
编译运行:
下载后,模型资源文件默认已经打包在开发者下载的SDK包中,
Step 0:使用HwHiAiUser登录
Step 1: 运行一次install-demo.sh脚本,会得到测试demo。
Step 2:请在官网获取序列号,填写在demo_async.cpp及demo_sync.cpp
的开始处license_key字段。
step3: 准备测试图片
覆盖image目录下的 1.jpg,更多图片可以用于demo中的批量测试模式
step4(可选): 修改test_300.sh下的以下开发板登录信息
export DDK_PATH=$HOME/tools/che/ddk/ddk # ddk的安装路径
declare -a DIVICE_IPS=("192.168.1.199") # 300加速卡芯片的ip地址,device=0 对应192.168.1.199
DEVICE_PASSWORD="Huawei@SYS3" # 之前 修改300加速卡SSH密码
MAIN_CPP="demo_async.cpp" # demo_async.cpp" 异步接口, “demo_async.cpp" 同步接口
OpenCV_install_dir=/home/HwHiAiUser/opencv_x64/ # OpenCV 3.4版本,需要存在${OpenCV_install_dir}/share/OpenCV/OpenCVConfig.cmake文件
step5: 运行demo,会自动编译OpenCV 3.4库, 如果报错请自行编译,目录设置在 OpenCV_install_dir
cd demo
sh test_300.sh
图像分类demo运行效果:
[stat] [100001]image/1.jpg(4 images) time used: 41ms (at 1583765958531) total:705ms
[result][100001][image/1.jpg][281470472005664] is: n07747607 orange 0.973633 950;
n07747607 orange 分类名
0.973633 分类概率
950 分类名的序号
物体检测的demo运行效果:
[stat] time used : 101ms; all time used:478
images[3] result:
label:no2_ynen;prob:0.985352 loc:[(0.459961,0.839844), (0.5625,0.988281)]
no2_ynen 分类名 , 也可以获取分类名的序号
0.985352 分类概率
loc:[(0.459961,0.839844), (0.5625,0.988281)], 检测框的位置。 (0.459961,0.839844)表示左上角的点,(0.5625,0.988281)右下角的点;
如原始图片608, 左上角(0.459961*608,0.839844*608), 右下角(0.5625*608,0.988281*608)
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. 超时参数略微大些。 |