91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

英特爾物聯(lián)網(wǎng) ? 來(lái)源:英特爾物聯(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 的支持。在此記錄下來(lái)貢獻(xiàn)的過(guò)程,希望有更多的同學(xué)可以參與到 OpenVINO的社區(qū)建設(shè)當(dāng)中來(lái)。我在貢獻(xiàn)代碼的過(guò)程中,也遇到了一些問(wèn)題,在此,非常感謝英特爾的技術(shù)老師們非常耐心地指導(dǎo)我,幫助我解決了問(wèn)題!

那么,接下來(lái)就讓我們正式進(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ù)說(shuō)明

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

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

3. 開(kāi)發(fā)過(guò)程

3.1問(wèn)題分析

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

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è)問(wèn)題,主要的解決方案如下:

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ò)問(wèn)題。該問(wèn)題可參考 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)的修改。如果沒(méi)有修改 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

左滑查看更多

通過(guò)實(shí)現(xiàn)代碼可以看到,新版本的 relu6在 Python 端并沒(méi)有修改 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 沒(méi)有修改底層 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 并沒(méi)有對(duì)應(yīng)的修改。想要修復(fù)這種問(wèn)題,需要結(jié)合單側(cè)報(bào)錯(cuò)的具體情況進(jìn)行相應(yīng)的修改。

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

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

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

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

// 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中,一般來(lái)說(shuō)每個(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),通過(guò)實(shí)現(xiàn)每一個(gè)Node,便可以通過(guò)組合實(shí)現(xiàn)更多的算子。

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

單測(cè)代碼需要寫(xiě)在 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ù)此類(lèi)問(wèn)題一般只能見(jiàn)招拆招,需要結(jié)合單側(cè)報(bào)錯(cuò)的具體情況進(jìn)行相應(yīng)的修改。比如 paddle.argmax新增了 0-d tensor的支持,但是 OpenVINO中的 Op 并沒(méi)有對(duì)應(yīng)的修改。因此,我們需要在 OpenVINO中的 Op 中添加對(duì) 0-d tensor的支持。經(jīng)過(guò)對(duì)代碼的分析我們可以發(fā)現(xiàn),OpenVINO中該 Op 是通過(guò) std::make_shared(node_reshape, k, axis, "max", "index", index_element_type);實(shí)現(xiàn)的,但是 TopK并沒(méi)有對(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ū)的問(wèn)題都會(huì)非常耐心的解答。我也是第一次在 PR 頁(yè)面有 144 次的 Conversation。

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

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

審核編輯:湯梓紅

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

    關(guān)注

    61

    文章

    10301

    瀏覽量

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

    關(guān)注

    1

    文章

    3752

    瀏覽量

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

    關(guān)注

    30

    文章

    4968

    瀏覽量

    73966
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    813

    瀏覽量

    14852
  • OpenVINO
    +關(guān)注

    關(guān)注

    0

    文章

    118

    瀏覽量

    767

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

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

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

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

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

    無(wú)法確定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)問(wèn)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)畫(huà)啟動(dòng)畫(huà)面的支持呢?

    大家好,如何在 stm32mp1 上添加對(duì)動(dòng)畫(huà)啟動(dòng)畫(huà)面的支持?我了解用于自定義引導(dǎo)屏幕的 psplash 配方,它工作得很好。我想在系統(tǒng)啟動(dòng)時(shí)播放動(dòng)畫(huà)。任何輸入都非常感謝。
    發(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ì)樹(shù)莓派2和3的系統(tǒng)支持

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

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

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

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

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

    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 ?3214次閱讀
    RT-Thread 4.1.0正式<b class='flag-5'>添加對(duì)</b>Arm Compiler 6<b class='flag-5'>支持</b>

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

    隨著 OpenVINO 2023.0 版本的發(fā)布,OpenVINO 工具庫(kù)中預(yù)置了全新的 PyTorch 前端,開(kāi)發(fā)者們提供了一條全新的 PyTorch 模型支持路徑,帶來(lái)更友好的用
    的頭像 發(fā)表于 06-27 16:39 ?1509次閱讀
    沒(méi)有“中間商賺差價(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自帶各種常見(jiàn)視覺(jué)任務(wù)支持的預(yù)訓(xùn)練模型庫(kù)Model Zoo,其中
    的頭像 發(fā)表于 09-24 15:31 ?2779次閱讀
    <b class='flag-5'>OpenVINO</b>場(chǎng)景文字檢測(cè)與文字識(shí)別教程

    OpenVINO? C# API詳解與演示

    OpenVINO C# API 支持 NuGet 程序包安裝方式,這與 OpenVINO C++ 庫(kù)的安裝過(guò)程相比,更加簡(jiǎn)單。如果使用 Visual Studio 開(kāi)發(fā) AI 項(xiàng)目,則可以通過(guò) NuGet 程序包管理功能直接安裝
    的頭像 發(fā)表于 10-13 16:39 ?1824次閱讀
    <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/),蘋(píng)果表示,2024年,iPhone將增加對(duì)RCS消息的支持
    的頭像 發(fā)表于 11-20 16:55 ?1725次閱讀