chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

為OpenVINO添加對(duì)Paddle 2.5的支持

英特爾物聯(lián)網(wǎng) ? 來源:英特爾物聯(lián)網(wǎng) ? 2024-01-19 09:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者:盧暢,英特爾 OpenVINO工具套件領(lǐng)航者聯(lián)盟成員,PPDE

1. 前言

我是飛槳黑客馬拉松第五期OpenVINO賽題獲獎(jiǎng)?wù)摺獮?OpenVINO添加了對(duì) Paddle 2.5 的支持。在此記錄下來貢獻(xiàn)的過程,希望有更多的同學(xué)可以參與到 OpenVINO的社區(qū)建設(shè)當(dāng)中來。我在貢獻(xiàn)代碼的過程中,也遇到了一些問題,在此,非常感謝英特爾的技術(shù)老師們非常耐心地指導(dǎo)我,幫助我解決了問題!

那么,接下來就讓我們正式進(jìn)入正題!

2. 介紹

2.1OpenVINO 是什么?

OpenVINO是英特爾推出的一款深度學(xué)習(xí)推理框架,它可以將訓(xùn)練好的模型轉(zhuǎn)換為 OpenVINO支持的 IR 格式,從而可以在 OpenVINO的推理引擎上進(jìn)行推理。

OpenVINO支持多種深度學(xué)習(xí)框架,包括 Paddle、TensorFlow、PyTorch 等。

2.2任務(wù)說明

在這個(gè)任務(wù)完成之前,OpenVINO只支持 Paddle 2.4 的版本,由于 Paddle 2.5 的一些接口變動(dòng),OpenVINO無法直接支持 Paddle 2.5。同時(shí),由于 Paddle 2.4 版本并不支持 Python 3.11,因此 OpenVINO默認(rèn)關(guān)閉了對(duì) Paddle 的支持,需要手動(dòng)開啟,在手動(dòng)開啟后,又會(huì)遇到無法編譯出 Paddle 相關(guān)單側(cè)的問題。

本任務(wù)的目標(biāo)是為 OpenVINO添加對(duì) Paddle 2.5 的支持,并確保 OpenVINO可以正常編譯出 Paddle 相關(guān)單側(cè)且線上 CI 均可通過。

3. 開發(fā)過程

3.1問題分析

在任務(wù)開始之前,OpenVINO開啟對(duì) Paddle 的支持后主要會(huì)遇到兩個(gè)問題:

1API名稱變動(dòng)導(dǎo)致的編譯報(bào)錯(cuò),如:

paddle.fluid.layers.elementwise_add -> paddle.add

2API名稱變動(dòng)導(dǎo)致的編譯報(bào)錯(cuò),如:paddle.fluid.layers.elementwise_add -> paddle.add

針對(duì)上面這兩個(gè)問題,主要的解決方案如下:

1將老 API 與新 API 名稱映射

2修改名稱/屬性變動(dòng)的 API

3修復(fù)因 Op 行為變動(dòng)導(dǎo)致的單側(cè)報(bào)錯(cuò)

3.2將老 API 與新 API 名稱映射

由于 Paddle 2.5 版本在 API 層面發(fā)生了較大的變化,因此需要將老 API 與新 API 名稱進(jìn)行映射,這樣 OpenVINO中的代碼就可以使用新 API 名稱,從而解決 API 名稱變動(dòng)導(dǎo)致的編譯報(bào)錯(cuò)問題。該問題可參考 Paddle 官網(wǎng)的 API 映射表。

鏈接:

https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/model_convert/convert_from_older_versions/paddle_api_mapping_cn.html#paddle-1-8-paddle-2-0-api

為了兼容老版本的 API,OpenVINO中的代碼需要同時(shí)支持新 API 與老 API,因此需要在 generate_xxx.py中進(jìn)行相應(yīng)修改。

  with paddle.static.program_guard(paddle.static.Program(), paddle.static.Program()):
    node_x = paddle.static.data(name='x', shape=x.shape, dtype=x.dtype)
    node_i = paddle.full(shape=[1], fill_value=0, dtype='int64', name='i')
    if paddle.__version__ >= '2.0.0':
      node_i = paddle.add(node_i, node_x)
    else:
      paddle.fluid.layers.nn.elementwise_add(node_i, node_x)
    node_ten = paddle.full(shape=[1], fill_value=10, dtype='int64', name='ten')

左滑查看更多

代碼中的paddle.fluid.layers.nn.elementwise_add就是老版本的 API,而 paddle.add就是新版本的 API。

3.3修改名稱/屬性變動(dòng)的 API

對(duì)于部分 API 接口,老版本與新版本的名稱或?qū)傩园l(fā)生了變化,因此需要給 OpenVINO中的代碼進(jìn)行相應(yīng)的修改。比如 paddle.fluid.layers.relu6(x, threshold=6.0, name=None)和 paddle.nn.functional.relu6(x, name=None)的屬性發(fā)生了變化。

可以看到,paddle.fluid.dygraph.relu6中的 threshold屬性在新版本中被刪除了。

這種情況下需要確認(rèn) Python 源碼中是否修改底層 C++ 源碼,如果是修改了 C++ 源碼,那么需要在 OpenVINO的op源碼中進(jìn)行相應(yīng)的修改。如果沒有修改 C++ 源碼,那么只需要對(duì)應(yīng)修改 Python 源碼即可。

一般情況下,底層 C++ 源碼不會(huì)修改,Python 層一般是修改屬性的名稱,修改屬性的默認(rèn)值,刪除某個(gè)屬性等。

比如新版本 relu6在 Paddle 的 Python 端的實(shí)現(xiàn)如下:

def relu6(x, name=None):
  threshold = 6.0
  if in_dynamic_or_pir_mode():
    return _C_ops.relu6(x)


  check_variable_and_dtype(
    x, 'x', ['float16', 'uint16', 'float32', 'float64'], 'relu6'
  )
  helper = LayerHelper('relu6', **locals())
  out = helper.create_variable_for_type_inference(x.dtype)
  helper.append_op(
    type='relu6',
    inputs={'X': x},
    outputs={'Out': out},
    attrs={'threshold': threshold},
  )
  return out

左滑查看更多

通過實(shí)現(xiàn)代碼可以看到,新版本的 relu6在 Python 端并沒有修改 C++ 源碼,只是刪除了 threshold屬性,在調(diào)用 C++ 源碼時(shí),將 threshold屬性設(shè)置為了默認(rèn)值 6.0。

因此,對(duì)于這種情況,只需要修改 OpenVINO中的 Python 單側(cè)代碼即可,不需要修改 C++ 源碼。OpenVINO在進(jìn)行模型轉(zhuǎn)化的時(shí)候是對(duì)底層op 進(jìn)行轉(zhuǎn)化,因此只要 Paddle 沒有修改底層 Op 的行為,那么 OpenVINO就不需要修改 Op 相關(guān)的代碼。

3.4修復(fù)因 Op 行為變動(dòng)導(dǎo)致的單側(cè)報(bào)錯(cuò)

在 Paddle 2.5 版本中,部分 Op 的行為發(fā)生了變化,導(dǎo)致 OpenVINO中的單側(cè)報(bào)錯(cuò)。比如 paddle.argmax新增了 0-d tensor的支持,但是 OpenVINO中的 Op 并沒有對(duì)應(yīng)的修改。想要修復(fù)這種問題,需要結(jié)合單側(cè)報(bào)錯(cuò)的具體情況進(jìn)行相應(yīng)的修改。

在介紹如何修復(fù)單側(cè)報(bào)錯(cuò)之前,先介紹一下 OpenVINO的算子支持機(jī)制。

3.4.1 OpenVINO算子支持機(jī)制

接下來我們先看一下 OpenVINO中的算子支持機(jī)制。

通過 Paddle 官方提供的 Topk_v2 樣例進(jìn)行說明:

// Copyright (C) 2018-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0


#include "default_opset.hpp"
#include "openvino/frontend/paddle/node_context.hpp"


namespace ov {
namespace frontend {
namespace paddle {
namespace op {
NamedOutputs top_k_v2(const NodeContext& node) {
  auto x = node.get_input("X");
  Output k_expected_node;
  if (node.has_input("K")) {
    auto k_variable = node.get_input("K");
    auto k_var_node = std::make_shared(k_variable, element::i32);
    k_expected_node = std::make_shared(k_var_node);
  } else {
    const auto k_expected = node.get_attribute("k", 1);
    k_expected_node = default_opset::i32, {}, {k_expected});
  }


  auto axis = node.get_attribute("axis", -1);
  bool sorted = node.get_attribute("sorted", true);
  bool largest = node.get_attribute("largest", true);


  std::string sort_type = sorted ? "value" : "none";
  std::string mode = largest ? "max" : "min";


  auto node_topk = std::make_shared(x, k_expected_node, axis, mode, sort_type);


  NamedOutputs named_outputs;
  named_outputs["Out"] = OutputVector{node_topk->output(0)};
  named_outputs["Indices"] = OutputVector{node_topk->output(1)};


  return named_outputs;
}
} // namespace op
} // namespace paddle
} // namespace frontend
} // namespace ov

左滑查看更多

在 OpenVINO中,一般來說每個(gè)算子都是一個(gè)單獨(dú)的文件,比如 Topk_v2 算子對(duì)應(yīng)的文件就是 topk_v2.cpp。在這個(gè)文件中,我們可以看到 top_k_v2函數(shù),這個(gè)函數(shù)就是 OpenVINO中的 Topk_v2 算子的實(shí)現(xiàn)。

在這個(gè)函數(shù)中,我們可以看到 auto x = node.get_input("X");,這個(gè)函數(shù)就是獲取輸入的 Tensor,auto node_topk = std::make_shared(x, k_expected_node, axis, mode, sort_type);這個(gè)函數(shù)就是創(chuàng)建 Topk_v2 算子,named_outputs["Out"] = OutputVector{node_topk->output(0)};這個(gè)函數(shù)就是獲取輸出的 Tensor。

每個(gè)Op都可以映射為一個(gè)圖結(jié)構(gòu),數(shù)據(jù)根據(jù)圖結(jié)構(gòu)在不同的計(jì)算節(jié)點(diǎn)之間流通和計(jì)算,而Node便定義了圖結(jié)構(gòu)中的數(shù)據(jù)節(jié)點(diǎn),通過實(shí)現(xiàn)每一個(gè)Node,便可以通過組合實(shí)現(xiàn)更多的算子。

Op 轉(zhuǎn)換的代碼需要寫在 src/frontends/paddle/src/op/目錄下,并在 src/frontends/paddle/src/op_table.cpp中進(jìn)行注冊(cè)。

單測(cè)代碼需要寫在 src/core/tests/frontend/paddle/test_models/gen_scripts目錄中,并在 src/core/tests/frontend/paddle/op_fuzzy.cpp中進(jìn)行注冊(cè)。

3.4.2 修復(fù)因 Op 行為變動(dòng)導(dǎo)致的單側(cè)報(bào)錯(cuò)

下面以 paddle.argmax為例,介紹如何修復(fù)因 Op 行為變動(dòng)導(dǎo)致的單側(cè)報(bào)錯(cuò)。

修復(fù)此類問題一般只能見招拆招,需要結(jié)合單側(cè)報(bào)錯(cuò)的具體情況進(jìn)行相應(yīng)的修改。比如 paddle.argmax新增了 0-d tensor的支持,但是 OpenVINO中的 Op 并沒有對(duì)應(yīng)的修改。因此,我們需要在 OpenVINO中的 Op 中添加對(duì) 0-d tensor的支持。經(jīng)過對(duì)代碼的分析我們可以發(fā)現(xiàn),OpenVINO中該 Op 是通過 std::make_shared(node_reshape, k, axis, "max", "index", index_element_type);實(shí)現(xiàn)的,但是 TopK并沒有對(duì) 0-d tensor進(jìn)行支持。我們可以判斷 output_size 是否為 0,如果為 0,那么就組合一個(gè) Slice節(jié)點(diǎn)返回即可。以下是修改后的代碼:

NamedOutputs argmax(const NodeContext& node) {
  auto data = node.get_input("X");
  bool flatten = node.get_attribute("flatten");
  const element::Type& index_element_type = element::i64;
  const Output k = ov::i64, {}, {1});


  if (!flatten) {
    auto axis = node.get_attribute("axis");
    const auto axis_to_remove = ov::u64, Shape{}, {axis});
    auto node_topk = std::make_shared(data, k, axis, "max", "index", index_element_type);
    const auto reshaped_indices = std::make_shared(node_topk->output(1), axis_to_remove);
    return node.default_single_output_mapping(
      {std::make_shared(reshaped_indices, element::i64)},
      {"Out"});
  } else {
    int64_t axis = 0;
    const Output reshape_flatten = ov::i64, {1}, {-1});
    auto node_reshape = std::make_shared(data, reshape_flatten, true);
    auto node_topk = std::make_shared(node_reshape, k, axis, "max", "index", index_element_type);
    const auto output_info = node.get_output_port_infos("Out");
    // 獲取輸出的維度
    size_t output_size = output_info[0].second.size();
    // 如果輸出的維度為0,那么就組合一個(gè)Slice節(jié)點(diǎn)返回
    if (output_size == 0) {
      auto out = std::make_shared(node_topk->output(1));
      return node.default_single_output_mapping({std::make_shared(out, element::i64)},
                           {"Out"});
    } else {
      return node.default_single_output_mapping(
        {std::make_shared(node_topk->output(1), element::i64)},
        {"Out"});
    }
  }
}

左滑查看更多

除了 argmax 之外,還有一些 Op 也需要進(jìn)行相應(yīng)的修改:

?p_norm

?reduce_ops

?matmul_v2

?elementwise_floordiv

具體的修改可以參考 PR

4. 總結(jié)

這次的黑客松活動(dòng),讓我對(duì) OpenVINO有了更深入的了解。

OpenVINO的工程師們非常熱心,對(duì)于社區(qū)的問題都會(huì)非常耐心的解答。我也是第一次在 PR 頁面有 144 次的 Conversation。

整個(gè) PR 的周期大概是 3 個(gè)月,期間經(jīng)歷了很多次的修改,最終才能夠被合并。在這次的活動(dòng)中,我也學(xué)到了很多知識(shí),比如 OpenVINO的算子支持機(jī)制,Op 的單側(cè)測(cè)試等。

希望有更多的同學(xué)可以參與到 OpenVINO的社區(qū)建設(shè)當(dāng)中來,為 OpenVINO的發(fā)展及開源社區(qū)的建設(shè)貢獻(xiàn)自己的力量!

審核編輯:湯梓紅

聲明:本文內(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)注

    61

    文章

    10196

    瀏覽量

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

    關(guān)注

    1

    文章

    3521

    瀏覽量

    50440
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70758
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    809

    瀏覽量

    13966
  • OpenVINO
    +關(guān)注

    關(guān)注

    0

    文章

    115

    瀏覽量

    484

原文標(biāo)題:代碼貢獻(xiàn):為 OpenVINO? 支持 Paddle 2.5 | 開發(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)推薦
    熱點(diǎn)推薦

    OpenVINO?是否與TensorFlow集成支持Raspberry Pi?

    無法確定OpenVINO?是否與 TensorFlow* 集成支持 Raspberry Pi。
    發(fā)表于 03-05 08:26

    2022.3.0 OpenVINO?是否支持MYRIAD設(shè)備?

    無法確定 2022.3.0 OpenVINO?是否支持 MYRIAD 設(shè)備。
    發(fā)表于 03-06 08:15

    請(qǐng)問OpenVINO? 是否支持 Rust 綁定?

    無法確定OpenVINO?是否支持 Rust 綁定。
    發(fā)表于 06-25 07:45

    PADS添加對(duì)象,添加一個(gè)BMP文件,為什么只顯示圖標(biāo)?

    PADS9.3添加對(duì)象,添加一個(gè)BMP文件的LOGO,為什么只顯示圖標(biāo),如何顯示圖片內(nèi)容?
    發(fā)表于 02-23 22:09

    請(qǐng)問u32 omap_bootmode=MMCSD_MODE_FAT要添加 bootmode的選擇,該怎么添加?我想增加對(duì)nand的支持?

    本帖最后由 一只耳朵怪 于 2018-6-20 15:16 編輯 在 SDK5.6 中。Boot_common.c 文件中 默認(rèn)的啟動(dòng)方式是 SD 卡啟動(dòng)。u32 omap_bootmode=MMCSD_MODE_FAT我要添加 bootmode 的選擇,該怎么添加
    發(fā)表于 06-20 01:43

    如何在stm32mp1上添加對(duì)動(dòng)畫啟動(dòng)畫面的支持呢?

    大家好,如何在 stm32mp1 上添加對(duì)動(dòng)畫啟動(dòng)畫面的支持?我了解用于自定義引導(dǎo)屏幕的 psplash 配方,它工作得很好。我想在系統(tǒng)啟動(dòng)時(shí)播放動(dòng)畫。任何輸入都非常感謝。
    發(fā)表于 12-16 06:07

    永久設(shè)置OpenVINO trade Windows reg10的工具套件環(huán)境變量

    ;gt;環(huán)境變量的控制面板。在系統(tǒng)變量下,以以下各項(xiàng)的相應(yīng)值添加以下作為新變量,如下所示: 可變名稱可變值筆記 INTEL_OPENVINO_DIRC:\\Program Files (x86
    發(fā)表于 08-15 07:18

    Fedora項(xiàng)目團(tuán)隊(duì)宣布添加對(duì)樹莓派2和3的系統(tǒng)支持

    Fedora項(xiàng)目團(tuán)隊(duì)于今天宣布添加對(duì)樹莓派2和3的系統(tǒng)支持。項(xiàng)目負(fù)責(zé)人Peter Robinson說道:“過去幾年反饋?zhàn)疃嗟囊缶褪菍?duì)樹莓派設(shè)備的支持,為此我們也付出了諸多努力。早期
    發(fā)表于 04-02 14:44 ?325次閱讀

    特斯拉可能會(huì)增加對(duì)Apple Music的支持

    12月29日 消息:特斯拉經(jīng)常會(huì)通過軟件更新方式,來眾多車主更新特斯拉汽車上的新功能,包括汽車相關(guān)的安全、便利功能,也會(huì)增加很多影音娛樂的功能。就在近日推特用戶@greentheonly爆料稱,可能很快會(huì)增加對(duì)Apple Music的
    的頭像 發(fā)表于 12-29 10:32 ?2204次閱讀

    AMD添加對(duì)高端線程撕裂者Pro平臺(tái)支持

    在去年更新并發(fā)布了StoreMI 2.0后,用戶在使用SSD加機(jī)械硬盤時(shí)就已經(jīng)方便了不少。而最近,AMD再度更新StoreMI,添加了對(duì)于高端的線程撕裂者Pro平臺(tái)的支持,并且新增了使用SSD分區(qū)進(jìn)行緩存加速的特性。
    的頭像 發(fā)表于 02-18 16:45 ?1633次閱讀

    RT-Thread 4.1.0正式添加對(duì)Arm Compiler 6支持

    在 RT-Thread 4.1.0 正式發(fā)布版中,添加了對(duì) Arm Compiler 6 的支持,用戶可以修改 rtconfig.py 指定生成 mdk5 工程時(shí)使用的編譯器
    的頭像 發(fā)表于 06-01 15:20 ?2561次閱讀
    RT-Thread 4.1.0正式<b class='flag-5'>添加對(duì)</b>Arm Compiler 6<b class='flag-5'>支持</b>

    沒有“中間商賺差價(jià)”, OpenVINO? 直接支持 PyTorch 模型對(duì)象

    隨著 OpenVINO 2023.0 版本的發(fā)布,OpenVINO 工具庫中預(yù)置了全新的 PyTorch 前端,開發(fā)者們提供了一條全新的 PyTorch 模型支持路徑,帶來更友好的用
    的頭像 發(fā)表于 06-27 16:39 ?1125次閱讀
    沒有“中間商賺差價(jià)”, <b class='flag-5'>OpenVINO</b>? 直接<b class='flag-5'>支持</b> PyTorch 模型對(duì)象

    OpenVINO場(chǎng)景文字檢測(cè)與文字識(shí)別教程

    OpenVINO是英特爾推出的深度學(xué)習(xí)模型部署框架,當(dāng)前最新版本是OpenVINO2023版本。OpenVINO2023自帶各種常見視覺任務(wù)支持的預(yù)訓(xùn)練模型庫Model Zoo,其中
    的頭像 發(fā)表于 09-24 15:31 ?2221次閱讀
    <b class='flag-5'>OpenVINO</b>場(chǎng)景文字檢測(cè)與文字識(shí)別教程

    OpenVINO? C# API詳解與演示

    OpenVINO C# API 支持 NuGet 程序包安裝方式,這與 OpenVINO C++ 庫的安裝過程相比,更加簡(jiǎn)單。如果使用 Visual Studio 開發(fā) AI 項(xiàng)目,則可以通過 NuGet 程序包管理功能直接安裝
    的頭像 發(fā)表于 10-13 16:39 ?1227次閱讀
    <b class='flag-5'>OpenVINO</b>?  C# API詳解與演示

    iPhone將增加對(duì)RCS消息的支持

    根據(jù)9to5Mac的一份報(bào)告(9to5mac.com/2023/11/16/apple-rcs-coming-to-iphone/),蘋果表示,2024年,iPhone將增加對(duì)RCS消息的支持
    的頭像 發(fā)表于 11-20 16:55 ?1265次閱讀