在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3615

    瀏覽量

    93732
  • 開發板
    +關注

    關注

    25

    文章

    5050

    瀏覽量

    97456
  • 開發教程
    +關注

    關注

    0

    文章

    8

    瀏覽量

    9473
  • OpenVINO
    +關注

    關注

    0

    文章

    93

    瀏覽量

    201
收藏 人收藏

    評論

    相關推薦

    基于英特爾開發板開發ROS應用

    隨著智能機器人技術的快速發展,越來越多的研究開發者開始涉足這一充滿挑戰和機遇的領域。哪吒開發板,作為一款高性能的機器人開發平臺,憑借其強
    的頭像 發表于 12-20 10:54 ?698次閱讀
    基于英特爾<b class='flag-5'>開發板</b><b class='flag-5'>開發</b>ROS應用

    基于哪吒開發板部署YOLOv8模型

    開發板推理性能,同時測試所推出的 OpenVINO C# API (https://github.com/guojin-yan/OpenVINO
    的頭像 發表于 11-15 14:13 ?248次閱讀
    基于<b class='flag-5'>哪吒</b><b class='flag-5'>開發板</b>部署YOLOv8<b class='flag-5'>模型</b>

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

    OpenVINO Model Server(OVMS)是一個高性能的模型部署系統,使用C++實現,并在Intel架構的部署進行了優化,使用Open
    的頭像 發表于 11-01 14:19 ?286次閱讀
    使用<b class='flag-5'>OpenVINO</b> Model Server<b class='flag-5'>在哪吒</b><b class='flag-5'>開發板</b>上部署<b class='flag-5'>模型</b>

    使用OpenVINO C++在哪吒開發板推理Transformer模型

    OpenVINO 是一個開源工具套件,用于對深度學習模型進行優化并在云端、邊緣進行部署。它能在諸如生成式人工智能、視頻、音頻以及語言等各類應用場景中加快深度學習推理的速度,且支持來自 PyTorch
    的頭像 發表于 10-12 09:55 ?340次閱讀
    使用<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b><b class='flag-5'>在哪吒</b><b class='flag-5'>開發板</b><b class='flag-5'>上</b><b class='flag-5'>推理</b><b class='flag-5'>Transformer</b><b class='flag-5'>模型</b>

    i.MX Linux開發實戰指南—基于野火i.MX系列開發板

    電子發燒友網站提供《i.MX Linux開發實戰指南—基于野火i.MX系列開發板.pdf》資料免費下載
    發表于 10-10 17:23 ?11次下載

    KaihongOS 4.1.2開發者預覽版正式上線,誠邀開發者免費試用!

    開發者提供了獨特的搶先體驗機會,涵蓋了原生應用開發、分布式能力、原子化服務等核心功能特性,助力開發者探索國產操作系統的更多可能性。 此次發布的預覽版適配RK3568、RK3588、ESP32等
    的頭像 發表于 09-26 15:59 ?456次閱讀

    【飛凌嵌入式OK3576-C開發板體驗】rkllm推理

    /to/rkllm_model 通過以上步驟,即可在開發板正常啟動推理任務。執行結果如下: 可以看到模型能夠正常進行推理,但是0.5
    發表于 08-31 22:45

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優化與整理,已經是非常貼近
    的頭像 發表于 07-26 09:20 ?900次閱讀

    迅為RK3568手冊新 | RK3568開發板NPU例程測試

    iTOP -RK3568開發板使用手冊新,后續資料會不斷更新,不斷完善,幫助用戶快速入門,大大提升研發速度。 本次新增《itop-3568開發板NPU例程測試手冊》是NPU視頻教程的擴展手冊,目的
    發表于 07-12 14:44

    英特爾開發套件『哪吒』在Java環境實現ADAS道路識別演示 | 開發者實戰

    本文使用來自OpenModelZoo的預訓練的road-segmentation-adas-0001模型。ADAS代表高級駕駛輔助服務。該模型識別四個類別:背景、道路、路緣和標記。硬件環境此文使用了英特爾開發套件家族里的『
    的頭像 發表于 04-29 08:07 ?575次閱讀
    英特爾<b class='flag-5'>開發</b>套件『<b class='flag-5'>哪吒</b>』在Java環境實現ADAS道路識別演示 | <b class='flag-5'>開發者</b><b class='flag-5'>實戰</b>

    【轉載】英特爾開發套件“哪吒”快速部署YoloV8 on Java | 開發者實戰

    部署到生產系統中。通過簡化的開發工作流程,OpenVINO可賦能開發者在現實世界中部署高性能應用程序和算法。 今天我們將基于哪吒開發者套件平
    的頭像 發表于 03-23 08:05 ?563次閱讀
    【轉載】英特爾<b class='flag-5'>開發</b>套件“<b class='flag-5'>哪吒</b>”快速部署YoloV8 on Java | <b class='flag-5'>開發者</b><b class='flag-5'>實戰</b>

    基于英特爾哪吒開發者套件平臺來快速部署OpenVINO Java實戰

    OpenVINO 工具套件基于OneAPI開發,可以加快高性能計算機視覺和深度學習應用開發速度的工具套件,適用于從邊緣到云的各種英特爾計算平臺上
    的頭像 發表于 03-21 18:24 ?1493次閱讀
    基于英特爾<b class='flag-5'>哪吒</b><b class='flag-5'>開發者</b>套件平臺來快速部署<b class='flag-5'>OpenVINO</b> Java<b class='flag-5'>實戰</b>

    RISC-V SoC + AI | 在全志 D1「哪吒開發板,跑個 ncnn 神經網絡推理框架的 demo

    的 demo。 本文的完成參考了以下材料,非常感謝 nihui、BedRock 等開發者們在互聯網上的分享![1] D1 哪吒 - 在線文檔[2] nihui: 在全志d1開發板玩n
    發表于 02-26 10:51

    使用愛芯派Pro開發板部署人體姿態估計模型

    在經過之前對于開發板的使用,以及通過幾個愛芯派官方給出的示例demo(mobilenet/yolov5)在開發板的部署之后,筆者也逐漸了解了愛芯派這塊開發板利用其官方的
    的頭像 發表于 01-09 09:50 ?1431次閱讀
    使用愛芯派Pro<b class='flag-5'>開發板</b>部署人體姿態估計<b class='flag-5'>模型</b>

    OpenVINO? 賦能千元級『哪吒』AI開發套件大語言模型 | 開發者實戰

    ,大多數高性能模型通常需要昂貴的計算資源,使得它們的應用受限于有限的環境。本文將探討在OpenVINO的賦能下,如何在不足千元的AI開發板上部署Stable-Zeph
    的頭像 發表于 01-06 08:05 ?1528次閱讀
    <b class='flag-5'>OpenVINO</b>? 賦能千元級『<b class='flag-5'>哪吒</b>』AI<b class='flag-5'>開發</b>套件大語言<b class='flag-5'>模型</b> | <b class='flag-5'>開發者</b><b class='flag-5'>實戰</b>
    主站蜘蛛池模板: 国产成人一区二区在线不卡| 午夜影院黄色片| 欧美hhh| 亚洲男人的天堂久久香蕉| 色婷婷久久综合中文久久蜜桃| 狠狠鲁狠狠操| 国产精品夜夜春夜夜爽| 伊人久久大香线蕉资源| 黄a级免费| 爱操视频在线观看| 五月婷婷视频在线观看| 俺去啦最新网址| 日韩操穴| 色激情综合网| 午夜影院0606免费| 免费视频不卡| 久久三级国产| 国产第一页在线观看| 亚洲地址一地址二地址三| 国产精品永久免费自在线观看| www狠狠| 色婷婷六月天| 天天曰天天爽| 99久久国产免费 - 99久久国产免费 | 777成了人乱视频| 中文字幕一区视频| 欧美视频综合| 久久99操| 特黄特色视频| 天天摸天天| 曰韩高清一级毛片| 99视频全部免费| 日本免费一区二区三区视频| 久久久噜噜噜久久久午夜| 2018天天干天天操| 日本三级2018亚洲视频| 欧美黄色录象| 天天色影院| 奇米网在线观看| 婷婷色在线观看| 色视频亚洲|