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

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

3天内不再提示

使用OpenVINO C++在哪吒开发板上推理Transformer模型

英特尔物联网 来源:英特尔物联网 2024-10-12 09:55 次阅读

作者:

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

指导:

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

1.1OpenVINO 介绍

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

588bf46e-877c-11ef-b8af-92fbcf53809c.png

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

1.2Ubuntu22.04 上的

OpenVINO 环境配置

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

58ba4f58-877c-11ef-b8af-92fbcf53809c.png

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

tar -zxvf l_openvino_toolkit_ubuntu22_2024.3.0.16041.1e3b88e4e3f_x86_64.tgz

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

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

然后配置环境变量:

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 安装

sudo dpkg -i *.deb

58df7512-877c-11ef-b8af-92fbcf53809c.png

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

sudo apt install ocl-icd-libopencl1

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

1.3Transformer模型推理

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

ovc model.onnx

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

ovc model.onnx --compress_to_fp16=False

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

推理代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
const int length = 300;
void read_csv(const char* filepath, float* input)
{
  std::ifstream file(filepath);
  std::string line;
  if (file.is_open())
  {
    std::getline(file, line);
    for (int i = 0; i < 300; i++)
        {
            std::getline(file, line);
            std::stringstream ss(line);
            std::string field;
            if (std::getline(ss, field, ','))
            {
                if (std::getline(ss, field, ','))
                {
                    input[i] = std::stof(field);
                }
            }
        }
        file.close();
    }
    float maxVal = *std::max_element(input, input + 300);
    for (int i = 0; i < 300; i++)
    {
        input[i] /= maxVal;
    }
}
std::vector softmax(std::vector input)
{
  std::vector output(input.size());
  float sum = 0;
  for (int i = 0; i < input.size(); i++)
    {
        output[i] = exp(input[i]);
        sum += output[i];
    }
    for (int i = 0; i < input.size(); i++)
    {
        output[i] /= sum;
    }
    return output;
}
void warmup(ov::InferRequest request)
{
    std::vector inputData(length);
  memcpy(request.get_input_tensor().data(), inputData.data(), length * sizeof(float));
  request.infer();
}
int main()
{
  const char* modelFile = "/home/up/openvino/AutoInjector_Transformer/AutoInjector_Transformer/2024-07-17-17-28-00_best_model.xml";
  const char* dirpath = "/home/up/openvino/AutoInjector_Transformer/AutoInjector_Transformer/data";
  const char* device = "GPU";
  std::vector inputs(length);
  std::vector outputs(length * 4);
  ov::Core core;
  // Load Model
  std::cout << "Loading Model" << std::endl;
    auto start_load_model = std::now();
    auto model = core.read_model(modelFile);
    auto compiled_model = core.compile_model(model, device);
    ov::InferRequest request = compiled_model.create_infer_request();
    std::cout << "Model Loaded, " << "time: " << std::duration_cast(std::now() - start_load_model).count() << "ms" << std::endl;
    request.get_input_tensor().set_shape(std::vector{1, length});
  // Warmup
  warmup(request);
  for (auto& filename : std::directory_iterator(dirpath))
  {
    std::string pathObj = filename.path().string();
    const char* filepath = pathObj.c_str();
    std::cout << "Current File: " << filepath << std::endl;
        // Read CSV
        auto start = std::now();
        read_csv(filepath, inputs.data());
        memcpy(request.get_input_tensor().data(), inputs.data(), length * sizeof(float));
    // Infer
    request.infer();
    // Get Output Data
    memcpy(outputs.data(), request.get_output_tensor().data(), length * sizeof(float) * 4);
    // Softmax
    std::vector softmax_results(length);
    std::vector temp(4);
    std::vector softmax_tmp(4);
    for (int i = 0; i < length; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                temp[j] = outputs[j * length + i];
            }
            softmax_tmp = softmax(temp);
            auto maxVal = std::max_element(softmax_tmp.begin(), softmax_tmp.end());
            auto maxIndex = std::distance(softmax_tmp.begin(), maxVal);
            softmax_results[i] = maxIndex;
        }
        std::cout << "Infer time: " << std::duration_cast(std::now() - start).count() << "ms" << std::endl;
        
        // Print outputs
        for (int i = 0; i < length; i++)
        {
            std::cout << softmax_results[i] << " ";
        }
    }
    return 0;
}

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

cmake_minimum_required(VERSION 3.10.0)


project(AutoInjector_Transformer)


set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(OpenVino_ROOT /home/up/openvino/l_openvino_toolkit_ubuntu22_2024.3.0.16041.1e3b88e4e3f_x86_64/runtime)
set(OpenVINO_DIR ${OpenVino_ROOT}/cmake)


find_package(OpenVINO REQUIRED)


include_directories(
  ${OpenVino_ROOT}/include
  ${OpenVino_ROOT}/include/openvino
  )


link_directories(
  ${OpenVino_ROOT}/lib
  ${OpenVino_ROOT}/lib/intel64
)


add_executable(AutoInjector_Transformer AutoInjector_Transformer.cpp)
target_link_libraries(AutoInjector_Transformer openvino)

然后 cmake 构建项目:

mkdir build && cd build
cmake ..
make

58f96ff8-877c-11ef-b8af-92fbcf53809c.png

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

590e1d9a-877c-11ef-b8af-92fbcf53809c.png

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

5933c1f8-877c-11ef-b8af-92fbcf53809c.png

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

    关注

    60

    文章

    9848

    浏览量

    171187
  • 开发板
    +关注

    关注

    25

    文章

    4871

    浏览量

    96959
  • 模型
    +关注

    关注

    1

    文章

    3097

    浏览量

    48622
  • Transformer
    +关注

    关注

    0

    文章

    138

    浏览量

    5965
  • OpenVINO
    +关注

    关注

    0

    文章

    83

    浏览量

    162

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

文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于OpenHarmony开发板测试Native C++应用开发

    本文主要分享在软通动力扬帆系列“竞”OpenHarmony开发板测试Native C++应用开发,实现eTS调用Native C++ 程序
    的头像 发表于 10-08 14:37 3828次阅读

    如何在哪吒D1开发板适配4G模块实现4G上网

    4G上网是嵌入式设备的常见功能,本文介绍了如何在哪吒D1开发板适配4G模块实现4G上网(以EC20为例),并开源了所需的PPP拨号上网驱动
    发表于 08-02 09:58 1205次阅读
    如何<b class='flag-5'>在哪吒</b>D1<b class='flag-5'>开发板</b><b class='flag-5'>上</b>适配4G模块实现4G上网

    在Ubuntu搭建OpenVINO C++程序开发环境

    这种集成开发环境,为了在 Ubuntu 也能拥有类似 Visual Studio 的开发体验,笔者探索出基于 Anaconda 和 VS Code,搭建 OpenVINO
    发表于 08-09 09:42 958次阅读
    在Ubuntu<b class='flag-5'>上</b>搭建<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b>程序<b class='flag-5'>开发</b>环境

    如何使用OpenVINO C++ API部署FastSAM模型

    ,故今天我们将向大家展示使用 OpenVINO C++ API 部署 FastSAM 模型,并且对比预处理、推理、后处理等时间的消耗。
    的头像 发表于 11-17 09:53 813次阅读
    如何使用<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b> API部署FastSAM<b class='flag-5'>模型</b>

    使用OpenVINO运行C++ API创建输入tensor并执行推理遇到的问题求解

    使用 OpenVINO™ 运行时 C++ API 创建输入 tensor 并执行推理: ov::Tensor input_tensor = ov::Tensor(input_type
    发表于 08-15 08:22

    在AI爱克斯开发板OpenVINO™加速YOLOv8分类模型

    本系列文章将在 AI 爱克斯开发板使用 OpenVINO 开发套件依次部署并测评 YOLOv8 的分类模型、目标检测
    的头像 发表于 05-05 11:47 985次阅读
    在AI爱克斯<b class='flag-5'>开发板</b><b class='flag-5'>上</b>用<b class='flag-5'>OpenVINO</b>™加速YOLOv8分类<b class='flag-5'>模型</b>

    在AI爱克斯开发板OpenVINO™加速YOLOv8目标检测模型

    《在 AI 爱克斯开发板OpenVINO 加速 YOLOv8 分类模型》介绍了在 AI 爱克斯开发板
    的头像 发表于 05-12 09:08 1218次阅读
    在AI爱克斯<b class='flag-5'>开发板</b><b class='flag-5'>上</b>用<b class='flag-5'>OpenVINO</b>™加速YOLOv8目标检测<b class='flag-5'>模型</b>

    AI爱克斯开发板使用OpenVINO加速YOLOv8目标检测模型

    《在AI爱克斯开发板OpenVINO加速YOLOv8分类模型》介绍了在AI爱克斯开发板使用
    的头像 发表于 05-26 11:03 1150次阅读
    AI爱克斯<b class='flag-5'>开发板</b><b class='flag-5'>上</b>使用<b class='flag-5'>OpenVINO</b>加速YOLOv8目标检测<b class='flag-5'>模型</b>

    在AI爱克斯开发板OpenVINO™加速YOLOv8-seg实例分割模型

    《在 AI 爱克斯开发板OpenVINO 加速 YOLOv8 目标检测模型》介绍了在 AI 爱克斯开发板
    的头像 发表于 06-05 11:52 927次阅读
    在AI爱克斯<b class='flag-5'>开发板</b><b class='flag-5'>上</b>用<b class='flag-5'>OpenVINO</b>™加速YOLOv8-seg实例分割<b class='flag-5'>模型</b>

    OpenVINOC++ API编写YOLOv8-Seg实例分割模型推理程序

    本文章将介绍使用 OpenVINO 2023.0 C++ API 开发YOLOv8-Seg 实例分割(Instance Segmentation)模型的 AI
    的头像 发表于 06-25 16:09 1466次阅读
    用<b class='flag-5'>OpenVINO</b>™ <b class='flag-5'>C++</b> API编写YOLOv8-Seg实例分割<b class='flag-5'>模型</b><b class='flag-5'>推理</b>程序

    在AI爱克斯开发板OpenVINO™加速YOLOv8-seg实例分割模型

    《在 AI 爱克斯开发板OpenVINO 加速 YOLOv8 目标检测模型》介绍了在 AI 爱克斯开发板
    的头像 发表于 06-30 10:43 835次阅读
    在AI爱克斯<b class='flag-5'>开发板</b><b class='flag-5'>上</b>用<b class='flag-5'>OpenVINO</b>™加速YOLOv8-seg实例分割<b class='flag-5'>模型</b>

    基于OpenVINO C++ API部署RT-DETR模型

    应用中,我们为了与当前软件平台集成更多会采用 C++ 平台,因此在本文中,我们将基于 OpenVINO C++ API 向大家展示了不包含后处理的 RT-DETR 模型的部署流程,并向
    的头像 发表于 11-03 14:30 737次阅读
    基于<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b> API部署RT-DETR<b class='flag-5'>模型</b>

    基于OpenVINO C# API部署RT-DETR模型

    Python API 部署 RT-DETR 模型 | 开发者实战》和《基于 OpenVINO C++ API 部署 RT-DETR 模型
    的头像 发表于 11-10 16:59 682次阅读
    基于<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C</b># API部署RT-DETR<b class='flag-5'>模型</b>

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都觉得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的优化与整理,已经是非常贴近
    的头像 发表于 07-26 09:20 683次阅读

    使用OpenVINO Model Server在哪吒开发板上部署模型

    OpenVINO Model Server(OVMS)是一个高性能的模型部署系统,使用C++实现,并在Intel架构的部署进行了优化,使用Open
    的头像 发表于 11-01 14:19 57次阅读
    使用<b class='flag-5'>OpenVINO</b> Model Server<b class='flag-5'>在哪吒</b><b class='flag-5'>开发板</b>上部署<b class='flag-5'>模型</b>