0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenVINO™ C++ 在哪吒开发板上推理 Transformer 模型|开发者实战

研扬科技AAEON 2024-09-28 08:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

使用 OpenVINO 定制你的 AI 助手丨开发者实战

作者:

王国强苏州嘉树医疗科技有限公司 算法工程师

指导:

颜国进 英特尔边缘计算创新大使

研扬科技针对边缘 AI 行业开发者推出的『哪吒』(Nezha)开发套件,以信用卡大小(85 x 56mm)的开发板-『哪吒』(Nezha)为核心,『哪吒』采用 Intel N97 处理器(Alder Lake-N),最大睿频 3.6GHz,Intel UHD Graphics 内核GPU,可实现高分辨率显示;板载 LPDDR5 内存、eMMC 存储及 TPM 2.0,配备 GPIO 接口,支持 Windows 和 Linux 操作系统,这些功能和无风扇散热方式相结合,为各种应用程序构建高效的解决方案,专为入门级人工智能应用和边缘智能设备而设计。英特尔开发套件能完美胜人工智能学习、开发、实训、应用等不同应用场景。适用于如自动化、物联网网关、数字标牌和机器人等应用。

1.1

OpenVINO 介绍

OpenVINO 是一个开源工具套件,用于对深度学习模型进行优化并在云端、边缘进行部署。它能在诸如生成式人工智能、视频、音频以及语言等各类应用场景中加快深度学习推理的速度,且支持来自 PyTorch、TensorFlow、ONNX 等热门框架的模型。实现模型的转换与优化,并在包括 Intel硬件及各种环境(本地、设备端、浏览器或者云端)中进行部署。

wKgaomcJ2AWAR4sFAAL5VEqUFNM039.png

图1-2 以深度学习为基础的AI技术在各行各业应用广泛

1.2

Ubuntu22.04 上的

OpenVINO 环境配置

OpenVINO 官方文档 https://docs.openvino.ai 有最新版本的安装教程,这里使用压缩包的方式安装,选择对应的 Ubuntu22 的版本:

wKgaomcJ2AWAXC05AAS3ae5XMbg898.png

下载到哪吒开发板上后将压缩包解压:

1 tar -zxvf l_openvino_toolkit_ubuntu22_2024.3.0.16041.1e3b88e4e3f_x86_64.tgz

进入解压目录,安装依赖:

1 cd l_openvino_toolkit_ubuntu22_2024.3.0.16041.1e3b88e4e3f_x86_64/ 2 sudo -E ./install_dependencies/install_openvino_dependencies.sh

然后配置环境变量:

1 source ./setupvars.sh

这样 OpenVINO 的环境就配置好了,可以直接在 Intel CPU 上推理模型,如果需要在 Intel iGPU 上推理,还需要另外安装 OpenCL runtime packages,参考官方文档:

https://docs.openvino.ai/2024/get-started/configurations/configurations-intel-gpu.html

这里使用 deb 包的方式安装,按照 Github

https://github.com/intel/compute-runtime

的说明下载7个 deb 包,然后 dpkg 安装

1 sudo dpkg -i *.deb

wKgZomcJ2AWAdAy0AAO7REDB9QU706.png

如果 dpkg 安装出现依赖报错,就需要先 apt 安装依赖,然后再 dpkg 安装7个 deb 包

1 sudo apt install ocl-icd-libopencl1

这样在哪吒开发板 Ubuntu22.04 上使用 Intel iGPU 进行 OpenVINO 推理的环境就配置完成了。

1.3

Transformer模型推理

模型是一个基于 Transformer 结构的模型,训练后生成 ONNX 中间表示,OpenVINO 可以直接使用 ONNX 模型进行推理,也可以转为 OpenVINO IR格式,转换命令如下:

1 ovc model.onnx

默认会生成 FP16 的模型,如果精度有较大损失,可指定 compress_to_fp16 为 False 就不会进行 FP16 量化了:

1 ovc model.onnx --compress_to_fp16=False

转换后将生成.xml和.bin两个文件,.xml文件描述了模型的结构,.bin文件包含了模型各层的参数。

推理代码如下:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 const int length = 300; 9 void read_csv(const char* filepath, float* input) 10 { 11 std::ifstream file(filepath); 12 std::string line; 13 if (file.is_open()) 14 { 15 std::getline(file, line); 16 for (int i = 0; i < 300; i++)       17  {             18 std::getline(file, line);             19 std::stringstream ss(line);             20 std::string field;           21  if (std::getline(ss, field, ','))           22  {               23  if (std::getline(ss, field, ','))                 24 {                     25 input[i] = std::stof(field);   26               }           27  }       28  }       29  file.close();   30 }     31 float maxVal = *std::max_element(input, input + 300); 32  for (int i = 0; i < 300; i++)   33 {       34  input[i] /= maxVal; 35  } 36 } 37 std::vector softmax(std::vector input) 38 { 39     std::vector output(input.size());   40  float sum = 0;     41 for (int i = 0; i < input.size(); i++)     42 {         43 output[i] = exp(input[i]);         44 sum += output[i];     45 }     46 for (int i = 0; i < input.size(); i++)   47 {         48 output[i] /= sum;     49 }     50 return output; 51 } 52 void warmup(ov::InferRequest request) 53 {     54 std::vector inputData(length);   55 memcpy(request.get_input_tensor().data(), inputData.data(), length * sizeof(float));     56 request.infer(); 57 } 58 int main() 59 {   60 const char* modelFile = "/home/up/openvino/AutoInjector_Transformer/AutoInjector_Transformer/2024-07-17-17-28-00_best_model.xml";     61 const char* dirpath = "/home/up/openvino/AutoInjector_Transformer/AutoInjector_Transformer/data";     62 const char* device = "GPU";     63 std::vector inputs(length);     64 std::vector outputs(length * 4);     65 ov::Core core;   66  // Load Model 67    std::cout << "Loading Model" << std::endl;     68 auto start_load_model = std::chrono::high_resolution_clock::now(); 69    auto model = core.read_model(modelFile);     70 auto compiled_model = core.compile_model(model, device);   71  ov::InferRequest request = compiled_model.create_infer_request();     72 std::cout << "Model Loaded, " << "time: " << std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_load_model).count() << "ms" << std::endl;     73 request.get_input_tensor().set_shape(std::vector{1, length});     74 // Warmup     75 warmup(request);     76 for (auto& filename : std::filesystem::directory_iterator(dirpath))     77 {         78 std::string pathObj = filename.path().string();         79 const char* filepath = pathObj.c_str();         80 std::cout << "Current File: " << filepath << std::endl;         81 // Read CSV         82 auto start = std::chrono::high_resolution_clock::now();         83 read_csv(filepath, inputs.data());       84  memcpy(request.get_input_tensor().data(), inputs.data(), length * sizeof(float));         85 // Infer         86 request.infer();         87 // Get Output Data         88 memcpy(outputs.data(), request.get_output_tensor().data(), length * sizeof(float) * 4);         89 // Softmax         90 std::vector softmax_results(length);         91 std::vector temp(4);         92 std::vector softmax_tmp(4);         93 for (int i = 0; i < length; i++)       94  {             95 for (int j = 0; j < 4; j++)           96  {               97 temp[j] = outputs[j * length + i];           98  }             99 softmax_tmp = softmax(temp);             100 auto maxVal = std::max_element(softmax_tmp.begin(), softmax_tmp.end());             101 auto maxIndex = std::distance(softmax_tmp.begin(), maxVal);             102 softmax_results[i] = maxIndex;         103 }         104 std::cout << "Infer time: " << std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start).count() << "ms" << std::endl; 105 106          // Print outputs         107 for (int i = 0; i < length; i++)       108  {             109 std::cout << softmax_results[i] << " ";       110  }     111 }     112 return 0; 113 }

使用 cmake 进行构建,在 CMakeLists.txt 中指定变量 ${OpenVino_ROOT} 为前面解压的 OpenVINO 压缩包路径:

1 cmake_minimum_required(VERSION 3.10.0) 2 3 project(AutoInjector_Transformer) 4 5 set(CMAKE_CXX_STANDARD 20) 6 set(CMAKE_CXX_STANDARD_REQUIRED ON) 7 set(OpenVino_ROOT /home/up/openvino/l_openvino_toolkit_ubuntu22_2024.3.0.16041.1e3b88e4e3f_x86_64/runtime) 8 set(OpenVINO_DIR ${OpenVino_ROOT}/cmake) 9 10 find_package(OpenVINO REQUIRED) 11 12 include_directories( 13 ${OpenVino_ROOT}/include 14 ${OpenVino_ROOT}/include/openvino 15 ) 16 17 link_directories( 18 ${OpenVino_ROOT}/lib 19 ${OpenVino_ROOT}/lib/intel64 20 ) 21 22 add_executable(AutoInjector_Transformer AutoInjector_Transformer.cpp) 23 target_link_libraries(AutoInjector_Transformer openvino)

然后 cmake 构建项目:

1 mkdir build && cd build 2 cmake .. 3 make

wKgZomcJ2AaAa6ZGAAP66NDOA5Y092.png

然后运行生成的可执行文件:

wKgaomcJ2AaAWfODAAQNGh1gBJg693.png

可以看到,在 Intel iGPU 上的推理速度还是很快的,前几次推理稍慢,8ms,后续基本稳定在 4ms,这跟我之前在 RTX4060 GPU 上用 TensorRT 推理并没有慢多少。然后我这里修改了代码改为 CPU 运行,重新编译、运行,结果在 Intel CPU 上的速度还要更快一点。

wKgZomcJ2AeAdjzUAASI3n3KDgg444.png
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    90

    文章

    3708

    浏览量

    96770
  • 开发板
    +关注

    关注

    25

    文章

    6129

    浏览量

    113488
  • 开发教程
    +关注

    关注

    0

    文章

    8

    浏览量

    9623
  • OpenVINO
    +关注

    关注

    0

    文章

    117

    浏览量

    717
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    这块乐鑫科技ESP32-C3开发板太懂开发者了!双无线+全接口,不要太实用

    做智能家居项目时,开发板接口不够用?调试工业传感器时,无线连接总是不稳定?想快速验证创意,却被复杂的烧录流程耽误半天时间?不要慌!真正懂开发者的物联网开发板来了!WT9901C3-SN
    的头像 发表于 12-01 18:02 325次阅读
    这块乐鑫科技ESP32-<b class='flag-5'>C</b>3<b class='flag-5'>开发板</b>太懂<b class='flag-5'>开发者</b>了!双无线+全接口,不要太实用

    迅为iTOP-3568开发板 Linux驱动开发实战:menuconfig图形化配置实验

    迅为iTOP-3568开发板 Linux驱动开发实战:menuconfig图形化配置实验
    的头像 发表于 11-24 15:29 532次阅读
    迅为iTOP-3568<b class='flag-5'>开发板</b> Linux驱动<b class='flag-5'>开发</b><b class='flag-5'>实战</b>:menuconfig图形化配置实验

    【获奖名单】2025开发板评测大赛优秀开发者、最受欢迎开发板公布

    各位发烧友们,大家好!2025开发板试用评测大赛已圆满落幕。经过厂商与发烧友平台的共同评选,优秀作品及人选名单现已评选完成,共选出24位优秀作品开发者,被评选上的用户将获得荣誉证书。各工程师参与完
    发表于 11-21 09:31

    迅为RK3568开发板模型推理测试实战LPRNet 车牌识别

    迅为RK3568开发板模型推理测试实战LPRNet 车牌识别
    的头像 发表于 08-25 14:55 1074次阅读
    迅为RK3568<b class='flag-5'>开发板</b><b class='flag-5'>模型</b><b class='flag-5'>推理</b>测试<b class='flag-5'>实战</b>LPRNet 车牌识别

    启扬受邀参加2025瑞芯微开发者大会

    微战略合作伙伴,受邀参加本次开发者大会。本次开发者大会,启扬智能将携全新发布的RK3576、RK3506开发板亮相。启扬RK3576开发板,搭载8核高性能处理器,
    的头像 发表于 07-10 17:25 1074次阅读
    启扬受邀参加2025瑞芯微<b class='flag-5'>开发者</b>大会

    68元撬动智能硬件未来:SSD2351开发板如何重塑开发者生态?

    在物联网、人工智能与智能硬件技术深度融合的今天,开发者开发工具的需求已从“能用”进化为“好用且高效”。传统开发板往往陷入“高性能高成本”或“低成本低性能”的两难困境,而明远智睿推出的SSD2351
    的头像 发表于 06-27 15:06 1105次阅读

    【免费试用】开发板评测大赛开启!OH 、RISC-V、Rockchip顶级开发板等你试用~

    技术人的狂欢,开发者的盛宴!2025年最值得期待的硬核赛事——电子发烧友开发板评测大赛正式启动!无论你是开源生态的探索、芯片架构的极客,还是物联网领域的创新达人,本次大赛三大赛
    的头像 发表于 06-05 08:05 757次阅读
    【免费试用】<b class='flag-5'>开发板</b>评测大赛开启!OH 、RISC-V、Rockchip顶级<b class='flag-5'>开发板</b>等你试用~

    开发板评测大赛开启!顶级开发板等你来战!

    技术人的狂欢,开发者的盛宴!2025年最值得期待的硬核赛事——电子发烧友开发板评测大赛正式启动!无论你是开源生态的探索、芯片架构的极客,还是物联网领
    的头像 发表于 05-20 08:07 377次阅读
    <b class='flag-5'>开发板</b>评测大赛开启!顶级<b class='flag-5'>开发板</b>等你来战!

    【米尔-STM32MP257开发板试用体验】初次体验米尔-STM32MP257开发板

    接口。 为了帮助开发者更好地理解与应用STM32MP257D处理器和MYD-LD25X开发板,米尔将与ST在2025年1月7日和2025年1月10日分别于南京、北京联合举办线下培训会,培训会上将详细介绍
    发表于 04-30 16:21

    创建了用于OpenVINO推理的自定义C++和Python代码,从C++代码中获得的结果与Python代码不同是为什么?

    创建了用于OpenVINO推理的自定义 C++ 和 Python* 代码。 在两个推理过程中使用相同的图像和模型。 从
    发表于 03-06 06:22

    为什么无法在运行时C++推理中读取OpenVINO模型

    使用模型优化器 2021.1 版OpenVINO™转换模型 使用 Runtime 2022.3 版本在 C++ 推理实现 ( core.r
    发表于 03-05 06:17

    RK3588开发板上部署DeepSeek-R1大模型的完整指南

    与OK3588-C开发板的深度融合,标志着国产AI大模型从云端向边缘端的延伸。这种“先进算法+定制化芯片”的协同模式,不仅解决了边缘侧实时性、隐私保护等关键需求,更构建起从技术研发到产业赋能的完整价值链条,为
    发表于 02-27 16:45

    添越智创基于 RK3588 开发板部署测试 DeepSeek 模型全攻略

    能精准理解自然语言,生成高质量文本,还免费向全球开发者开放,极大地推动了 AI 技术的普及与应用,为无数开发者打开了全新的探索大门。今天,我们就一起深入探讨如何在 RK3588 开发板
    发表于 02-14 17:42

    英特尔的开发板评测

    Linux系统,测试比较方便,虽然Windows+Python代码也可以开发,搞点难度的Ubuntu+     配置一下OpenVINO ,参考手册。这个主要后面写代码和转模型用。但是我用C+
    的头像 发表于 01-24 09:37 1654次阅读
    英特尔的<b class='flag-5'>开发板</b>评测

    基于英特尔开发板开发ROS应用

    随着智能机器人技术的快速发展,越来越多的研究开发者开始涉足这一充满挑战和机遇的领域。哪吒开发板,作为一款高性能的机器人开发平台,凭借其强
    的头像 发表于 12-20 10:54 2206次阅读
    基于英特尔<b class='flag-5'>开发板</b><b class='flag-5'>开发</b>ROS应用