0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用OpenVINO C++在哪吒開發(fā)板上推理Transformer模型

英特爾物聯(lián)網(wǎng) ? 來源:英特爾物聯(lián)網(wǎng) ? 2024-10-12 09:55 ? 次閱讀

作者:

王國(guó)強(qiáng)蘇州嘉樹醫(yī)療科技有限公司 算法工程師

指導(dǎo):

顏國(guó)進(jìn) 英特爾邊緣計(jì)算創(chuàng)新大使

1.1OpenVINO 介紹

OpenVINO 是一個(gè)開源工具套件,用于對(duì)深度學(xué)習(xí)模型進(jìn)行優(yōu)化并在云端、邊緣進(jìn)行部署。它能在諸如生成式人工智能、視頻、音頻以及語(yǔ)言等各類應(yīng)用場(chǎng)景中加快深度學(xué)習(xí)推理的速度,且支持來自 PyTorch、TensorFlow、ONNX 等熱門框架的模型。實(shí)現(xiàn)模型的轉(zhuǎn)換與優(yōu)化,并在包括 Intel硬件及各種環(huán)境(本地、設(shè)備端、瀏覽器或者云端)中進(jìn)行部署。

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

圖1-2 以深度學(xué)習(xí)為基礎(chǔ)的AI技術(shù)在各行各業(yè)應(yīng)用廣泛

1.2Ubuntu22.04 上的

OpenVINO 環(huán)境配置

OpenVINO 官方文檔 https://docs.openvino.ai最新版本的安裝教程,這里使用壓縮包的方式安裝,選擇對(duì)應(yīng)的 Ubuntu22 的版本:

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

下載到哪吒開發(fā)板上后將壓縮包解壓:

tar -zxvf l_openvino_toolkit_ubuntu22_2024.3.0.16041.1e3b88e4e3f_x86_64.tgz

進(jìn)入解壓目錄,安裝依賴:

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

然后配置環(huán)境變量:

source ./setupvars.sh

這樣 OpenVINO 的環(huán)境就配置好了,可以直接在 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個(gè) deb 包,然后 dpkg 安裝

sudo dpkg -i *.deb

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

如果 dpkg 安裝出現(xiàn)依賴報(bào)錯(cuò),就需要先 apt 安裝依賴,然后再 dpkg 安裝7個(gè) deb 包

sudo apt install ocl-icd-libopencl1

這樣在哪吒開發(fā)板 Ubuntu22.04 上使用 Intel iGPU 進(jìn)行 OpenVINO 推理的環(huán)境就配置完成了。

1.3Transformer模型推理

模型是一個(gè)基于 Transformer 結(jié)構(gòu)的模型,訓(xùn)練后生成 ONNX 中間表示,OpenVINO 可以直接使用 ONNX 模型進(jìn)行推理,也可以轉(zhuǎn)為 OpenVINO IR格式,轉(zhuǎn)換命令如下:

ovc model.onnx

默認(rèn)會(huì)生成 FP16 的模型,如果精度有較大損失,可指定 compress_to_fp16 為 False 就不會(huì)進(jìn)行 FP16 量化了:

ovc model.onnx --compress_to_fp16=False

轉(zhuǎn)換后將生成.xml和.bin兩個(gè)文件,.xml文件描述了模型的結(jié)構(gòu),.bin文件包含了模型各層的參數(shù)。

推理代碼如下:

#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 進(jìn)行構(gòu)建,在 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 構(gòu)建項(xiàng)目:

mkdir build && cd build
cmake ..
make

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

然后運(yùn)行生成的可執(zhí)行文件:

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

可以看到,在 Intel iGPU 上的推理速度還是很快的,前幾次推理稍慢,8ms,后續(xù)基本穩(wěn)定在 4ms,這跟我之前在 RTX4060 GPU 上用 TensorRT 推理并沒有慢多少。然后我這里修改了代碼改為 CPU 運(yùn)行,重新編譯、運(yùn)行,結(jié)果在 Intel CPU 上的速度還要更快一點(diǎn)。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 英特爾
    +關(guān)注

    關(guān)注

    60

    文章

    9858

    瀏覽量

    171240
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4886

    瀏覽量

    97019
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3105

    瀏覽量

    48643
  • Transformer
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    5966
  • OpenVINO
    +關(guān)注

    關(guān)注

    0

    文章

    83

    瀏覽量

    166

原文標(biāo)題:OpenVINO? C++ 在哪吒開發(fā)板上推理 Transformer 模型|開發(fā)者實(shí)戰(zhàn)

文章出處:【微信號(hào):英特爾物聯(lián)網(wǎng),微信公眾號(hào):英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于OpenHarmony開發(fā)板測(cè)試Native C++應(yīng)用開發(fā)

    本文主要分享在軟通動(dòng)力揚(yáng)帆系列“競(jìng)”O(jiān)penHarmony開發(fā)板測(cè)試Native C++應(yīng)用開發(fā),實(shí)現(xiàn)eTS調(diào)用Native C++ 程序
    的頭像 發(fā)表于 10-08 14:37 ?3839次閱讀

    如何在哪吒D1開發(fā)板適配4G模塊實(shí)現(xiàn)4G上網(wǎng)

    4G上網(wǎng)是嵌入式設(shè)備的常見功能,本文介紹了如何在哪吒D1開發(fā)板適配4G模塊實(shí)現(xiàn)4G上網(wǎng)(以EC20為例),并開源了所需的PPP撥號(hào)上網(wǎng)驅(qū)動(dòng)
    發(fā)表于 08-02 09:58 ?1209次閱讀
    如何<b class='flag-5'>在哪吒</b>D1<b class='flag-5'>開發(fā)板</b><b class='flag-5'>上</b>適配4G模塊實(shí)現(xiàn)4G上網(wǎng)

    在Ubuntu搭建OpenVINO C++程序開發(fā)環(huán)境

    這種集成開發(fā)環(huán)境,為了在 Ubuntu 也能擁有類似 Visual Studio 的開發(fā)體驗(yàn),筆者探索出基于 Anaconda 和 VS Code,搭建 OpenVINO
    發(fā)表于 08-09 09:42 ?965次閱讀
    在Ubuntu<b class='flag-5'>上</b>搭建<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b>程序<b class='flag-5'>開發(fā)</b>環(huán)境

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

    ,故今天我們將向大家展示使用 OpenVINO C++ API 部署 FastSAM 模型,并且對(duì)比預(yù)處理、推理、后處理等時(shí)間的消耗。
    的頭像 發(fā)表于 11-17 09:53 ?824次閱讀
    如何使用<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b> API部署FastSAM<b class='flag-5'>模型</b>

    使用OpenVINO運(yùn)行C++ API創(chuàng)建輸入tensor并執(zhí)行推理遇到的問題求解

    使用 OpenVINO? 運(yùn)行時(shí) C++ API 創(chuàng)建輸入 tensor 并執(zhí)行推理: ov::Tensor input_tensor = ov::Tensor(input_type
    發(fā)表于 08-15 08:22

    在AI愛克斯開發(fā)板OpenVINO?加速YOLOv8分類模型

    本系列文章將在 AI 愛克斯開發(fā)板使用 OpenVINO 開發(fā)套件依次部署并測(cè)評(píng) YOLOv8 的分類模型、目標(biāo)檢測(cè)
    的頭像 發(fā)表于 05-05 11:47 ?992次閱讀
    在AI愛克斯<b class='flag-5'>開發(fā)板</b><b class='flag-5'>上</b>用<b class='flag-5'>OpenVINO</b>?加速YOLOv8分類<b class='flag-5'>模型</b>

    在AI愛克斯開發(fā)板OpenVINO?加速YOLOv8目標(biāo)檢測(cè)模型

    《在 AI 愛克斯開發(fā)板OpenVINO 加速 YOLOv8 分類模型》介紹了在 AI 愛克斯開發(fā)板
    的頭像 發(fā)表于 05-12 09:08 ?1232次閱讀
    在AI愛克斯<b class='flag-5'>開發(fā)板</b><b class='flag-5'>上</b>用<b class='flag-5'>OpenVINO</b>?加速YOLOv8目標(biāo)檢測(cè)<b class='flag-5'>模型</b>

    AI愛克斯開發(fā)板使用OpenVINO加速YOLOv8目標(biāo)檢測(cè)模型

    《在AI愛克斯開發(fā)板OpenVINO加速YOLOv8分類模型》介紹了在AI愛克斯開發(fā)板使用
    的頭像 發(fā)表于 05-26 11:03 ?1156次閱讀
    AI愛克斯<b class='flag-5'>開發(fā)板</b><b class='flag-5'>上</b>使用<b class='flag-5'>OpenVINO</b>加速YOLOv8目標(biāo)檢測(cè)<b class='flag-5'>模型</b>

    在AI愛克斯開發(fā)板OpenVINO?加速YOLOv8-seg實(shí)例分割模型

    《在 AI 愛克斯開發(fā)板OpenVINO 加速 YOLOv8 目標(biāo)檢測(cè)模型》介紹了在 AI 愛克斯開發(fā)板
    的頭像 發(fā)表于 06-05 11:52 ?932次閱讀
    在AI愛克斯<b class='flag-5'>開發(fā)板</b><b class='flag-5'>上</b>用<b class='flag-5'>OpenVINO</b>?加速YOLOv8-seg實(shí)例分割<b class='flag-5'>模型</b>

    OpenVINO? C++ API編寫YOLOv8-Seg實(shí)例分割模型推理程序

    本文章將介紹使用 OpenVINO 2023.0 C++ API 開發(fā)YOLOv8-Seg 實(shí)例分割(Instance Segmentation)模型的 AI
    的頭像 發(fā)表于 06-25 16:09 ?1486次閱讀
    用<b class='flag-5'>OpenVINO</b>? <b class='flag-5'>C++</b> API編寫YOLOv8-Seg實(shí)例分割<b class='flag-5'>模型</b><b class='flag-5'>推理</b>程序

    在AI愛克斯開發(fā)板OpenVINO?加速YOLOv8-seg實(shí)例分割模型

    《在 AI 愛克斯開發(fā)板OpenVINO 加速 YOLOv8 目標(biāo)檢測(cè)模型》介紹了在 AI 愛克斯開發(fā)板
    的頭像 發(fā)表于 06-30 10:43 ?840次閱讀
    在AI愛克斯<b class='flag-5'>開發(fā)板</b><b class='flag-5'>上</b>用<b class='flag-5'>OpenVINO</b>?加速YOLOv8-seg實(shí)例分割<b class='flag-5'>模型</b>

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

    應(yīng)用中,我們?yōu)榱伺c當(dāng)前軟件平臺(tái)集成更多會(huì)采用 C++ 平臺(tái),因此在本文中,我們將基于 OpenVINO C++ API 向大家展示了不包含后處理的 RT-DETR 模型的部署流程,并向
    的頭像 發(fā)表于 11-03 14:30 ?743次閱讀
    基于<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 模型 | 開發(fā)者實(shí)戰(zhàn)》和《基于 OpenVINO C++ API 部署 RT-DETR 模型
    的頭像 發(fā)表于 11-10 16:59 ?693次閱讀
    基于<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做了大量的優(yōu)化與整理,已經(jīng)是非常貼近
    的頭像 發(fā)表于 07-26 09:20 ?706次閱讀

    使用OpenVINO Model Server在哪吒開發(fā)板上部署模型

    OpenVINO Model Server(OVMS)是一個(gè)高性能的模型部署系統(tǒng),使用C++實(shí)現(xiàn),并在Intel架構(gòu)的部署進(jìn)行了優(yōu)化,使用Open
    的頭像 發(fā)表于 11-01 14:19 ?111次閱讀
    使用<b class='flag-5'>OpenVINO</b> Model Server<b class='flag-5'>在哪吒</b><b class='flag-5'>開發(fā)板</b>上部署<b class='flag-5'>模型</b>