国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

TensorRT條件用于實現網絡子圖的條件執行

星星科技指導員 ? 來源:NVIDIA ? 作者:NVIDIA ? 2022-05-18 10:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

11.1. Defining A Conditional

if-conditional 由條件邊界層定義:

  • IConditionLayer表示predicate 并指定條件是應該執行真分支(then-branch)還是假分支(else-branch)。
  • IIfConditionalInputLayer指定兩個條件分支之一的輸入。
  • IIfConditionalOutputLayer指定條件的輸出。

每個邊界層都繼承自IIfConditionalBoundaryLayer類,該類具有獲取其關聯IIfConditional的方法getConditional()IIfConditional實例標識條件。所有具有相同IIfConditional的條件邊界層都屬于該條件。

條件必須恰好有一個IConditionLayer實例、零個或多個IIfConditionalInputLayer實例,以及至少一個IIfConditionalOutputLayer實例。

IIfConditional實現了一個if-then-else流控制結構,該結構提供基于動態布爾輸入的網絡子圖的條件執行。它由一個布爾標量predicate condition和兩個分支子圖定義:一個trueSubgraphcondition評估為true時執行,一個falseSubgraphcondition評估為false時執行

If condition is true then: 
	output = trueSubgraph(trueInputs);
Else
	output = falseSubgraph(falseInputs);
Emit output

真分支和假分支都必須定義,類似于許多編程語言中的三元運算符。

要定義if-conditional,使用方法INetworkDefinition::addIfConditional創建一個IIfConditional實例,然后添加邊界層和分支層。

IIfConditional* simpleIf = network->addIfConditional();

IIfConditional ::setCondition方法接受一個參數:條件張量。這個 0D 布爾張量(標量)可以由網絡中的早期層動態計算。它用于決定執行哪個分支。IConditionLayer有一個輸入(條件)并且沒有輸出,因為它由條件實現在內部使用。

// Create a condition predicate that is also a network input.
auto cond = network->addInput("cond", DataType::kBOOL, Dims{0});
IConditionLayer* condition = simpleIf->setCondition(*cond);

TensorRT 不支持實現條件分支的子圖抽象,而是使用IIfConditionalInputLayerIIfConditionalOutputLayer來定義條件的邊界。

  • IIfConditionalInputLayer將單個輸入抽象為IIfConditional的一個或兩個分支子圖。特定IIfConditionalInputLayer的輸出可以同時提供兩個分支。then-branchelse-branch的輸入不需要是相同的類型和形狀,每個分支可以獨立地包含零個或多個輸入。IIfConditionalInputLayer是可選的,用于控制哪些層將成為分支的一部分(請參閱條件執行)。如果分支的所有輸出都不依賴于IIfConditionalInputLayer實例,則該分支為空。當條件為false時沒有要評估的層時,空的else-branch可能很有用,并且網絡評估應按照條件進行(請參閱條件示例)。
// Create an if-conditional input.
// x is some arbitrary Network tensor.
IIfConditionalInputLayer* inputX = simpleIf->addInput(*x);
  • IIfConditionalOutputLayer抽象了if條件的單個輸出。它有兩個輸入:來自真子圖的輸出(輸入索引 0)和來自假子圖的輸出(輸入索引 1)。IIfConditionalOutputLayer的輸出可以被認為是最終輸出的占位符,最終輸出將在運行時確定。IIfConditionalOutputLayer的作用類似于傳統 SSA 控制流圖中的 $Φ(Phi)$ 函數節點。它的語義是:選擇真子圖或假子圖的輸出。IIfConditional的所有輸出都必須源自IIfConditionalOutputLayer實例。沒有輸出的 if 條件對網絡的其余部分沒有影響,因此,它被認為是病態的。兩個分支(子圖)中的每一個也必須至少有一個輸出。if-conditional的輸出可以標記為網絡的輸出,除非if-conditional嵌套在另一個if-conditional或循環中。
// trueSubgraph and falseSubgraph represent network subgraphs
IIfConditionalOutputLayer* outputLayer = simpleIf->addOutput(
    *trueSubgraph->getOutput(0), 
    *falseSubgraph->getOutput(0));

下圖提供了 if 條件抽象模型的圖形表示。綠色矩形表示條件的內部,僅限于NVIDIA TensorRT 支持矩陣中的LayersFor Flow-Control Constructs部分中列出的層類型。

11.2. Conditional Execution

網絡層的條件執行是一種網絡評估策略,其中僅在需要分支輸出的值時才執行分支層(屬于條件子圖的層)。在條件執行中,無論是真分支還是假分支都被執行并允許改變網絡狀態。

相反,在斷定執行中,真分支和假分支都被執行,并且只允許其中之一改變網絡評估狀態,具體取決于條件斷定的值(即僅其中一個的輸出)子圖被饋送到以下層。

條件執行有時稱為惰性求值,斷定執行有時稱為急切求值。IIfConditionalInputLayer的實例可用于指定急切調用哪些層以及延遲調用哪些層。這是通過從每個條件輸出開始向后跟蹤網絡層來完成的。依賴于至少一個IIfConditionalInputLayer輸出的數據層被認為是條件內部的,因此被延遲評估。在沒有IIfConditionalInputLayer實例添加到條件條件的極端情況下,所有層都被急切地執行,類似于ISelectLayer

下面的三個圖表描述了IIfConditionalInputLayer放置的選擇如何控制執行調度。

在圖 A 中,真分支由 3 層(T1、T2、T3)組成。當條件評估為true時,這些層會延遲執行。

在圖 B 中,輸入層 I1 放置在層 T1 之后,它將 T1 移出真實分支。在評估 if 結構之前,T1 層急切地執行。

在圖表 C 中,輸入層 I1 被完全移除,這將 T3 移到條件之外。 T2 的輸入被重新配置以創建合法網絡,并且 T2 也移出真實分支。當條件評估為true時,條件不計算任何內容,因為輸出已經被急切地計算(但它確實將條件相關輸入復制到其輸出)。

11.3. Nesting and Loops

條件分支可以嵌套其他條件,也可以嵌套循環。循環可以嵌套條件。與循環嵌套一樣,TensorRT 從數據流中推斷條件和循環的嵌套。例如,如果條件 B 使用在循環 A 內定義的值,則 B 被認為嵌套在 A 內。

真分支中的層與假分支中的層之間不能有交叉邊,反之亦然。換句話說,一個分支的輸出不能依賴于另一個分支中的層。

例如,請參閱條件示例以了解如何指定嵌套。

11.4. Limitations

兩個真/假子圖分支中的輸出張量數必須相同。來自分支的每個輸出張量的類型和形狀必須相同。

請注意,這比 ONNX 規范更受限制,ONNX 規范要求真/假子圖具有相同數量的輸出并使用相同的輸出數據類型,但允許不同的輸出形狀。

11.5. Conditional Examples

11.5.1. Simple If-Conditional

下面的例子展示了如何實現一個簡單的條件,它有條件地對兩個張量執行算術運算。Conditional

condition = true
If condition is true:
        output = x + y
Else:
        output = x - y

Example

ITensor* addCondition(INetworkDefinition& n, bool predicate)
{
    // The condition value is a constant int32 input that is cast to boolean because TensorRT doesn't support boolean constant layers.

    static const Dims scalarDims = Dims{0, {}};
    static float constexpr zero{0};
    static float constexpr one{1};

    float* const val = predicate ? &one : &zero;

    ITensor* cond = 
        n.addConstant(scalarDims, DataType::kINT32, val, 1})->getOutput(0);

    auto* cast = n.addIdentity(cond);
    cast->setOutputType(0, DataType::kBOOL);
    cast->getOutput(0)->setType(DataType::kBOOL);

    return cast->getOutput(0);
}

IBuilder* builder = createInferBuilder(gLogger);
INetworkDefinition& n = *builder->createNetworkV2(0U);
auto x = n.addInput("x", DataType::kFLOAT, Dims{1, {5}});
auto y = n.addInput("y", DataType::kFLOAT, Dims{1, {5}});
ITensor* cond = addCondition(n, true);

auto* simpleIf = n.addIfConditional();
simpleIf->setCondition(*cond);

// Add input layers to demarcate entry into true/false branches.
x = simpleIf->addInput(*x)->getOutput(0);
y = simpleIf->addInput(*y)->getOutput(0);

auto* trueSubgraph = n.addElementWise(*x, *y, ElementWiseOperation::kSUM)->getOutput(0);
auto* falseSubgraph = n.addElementWise(*x, *y, ElementWiseOperation::kSUB)->getOutput(0);

auto* output = simpleIf->addOutput(*trueSubgraph, *falseSubgraph)->getOutput(0);
n.markOutput(*output);

11.5.2. Exporting from PyTorch

以下示例展示了如何將腳本化的 PyTorch 代碼導出到 ONNX。函數sum_even中的代碼執行嵌套在循環中的 if 條件。

import torch.onnx
import torch
import tensorrt as trt
import numpy as np

TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
EXPLICIT_BATCH = 1 << (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)

@torch.jit.script
def sum_even(items):
    s = torch.zeros(1, dtype=torch.float)
    for c in items:
        if c % 2 == 0:
            s += c
    return s

class ExampleModel(torch.nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, items):
        return sum_even(items)

def build_engine(model_file):
    builder = trt.Builder(TRT_LOGGER)
    network = builder.create_network(EXPLICIT_BATCH)
    config = builder.create_builder_config()
    parser = trt.OnnxParser(network, TRT_LOGGER)

    with open(model_file, 'rb') as model:
        assert parser.parse(model.read())
        return builder.build_engine(network, config)

def export_to_onnx():
    items = torch.zeros(4, dtype=torch.float)
    example = ExampleModel()
    torch.onnx.export(example, (items), "example.onnx", verbose=False, opset_version=13, enable_onnx_checker=False, do_constant_folding=True)

export_to_onnx()
build_engine("example.onnx")

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

    關注

    14

    文章

    5592

    瀏覽量

    109723
  • gpu
    gpu
    +關注

    關注

    28

    文章

    5194

    瀏覽量

    135434
  • 人工智能
    +關注

    關注

    1817

    文章

    50097

    瀏覽量

    265316
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    跌落測試標準與條件詳解

    測試標準、試驗條件、試驗類型、嚴酷等級、跌落表面、測試條件以及最后的檢測流程。測試項目跌落測試是產品力學性能測試的一部分,它通常與其他測試項目一起進行,以全面評估
    的頭像 發表于 03-04 12:03 ?40次閱讀
    跌落測試標準與<b class='flag-5'>條件</b>詳解

    微電網能量平衡理論的實現條件在不同場景下有哪些差異?

    微電網能量平衡的核心實現條件可概括為“合理的電源配置、充足的儲能支撐、靈活的負荷調控、高效的控制策略、可靠的配電網絡”五大維度,其核心目標是保障任意時間尺度內系統能量的動態均衡。但受能源資源稟賦
    的頭像 發表于 02-27 14:23 ?876次閱讀
    微電網能量平衡理論的<b class='flag-5'>實現</b><b class='flag-5'>條件</b>在不同場景下有哪些差異?

    微電網能量平衡理論:核心原理與實現條件

    賴本地單元的協同調控。本文將系統拆解微電網能量平衡理論的核心原理,明確能量平衡的實現條件,為微電網的高效運行提供理論支撐。
    的頭像 發表于 02-25 14:03 ?665次閱讀
    微電網能量平衡理論:核心原理與<b class='flag-5'>實現</b><b class='flag-5'>條件</b>

    單片機的條件轉移指令

    條件轉移指令是指在滿足一定條件時進行相對轉移。 判A內容是否為0轉移指令 JZ rel JNZ rel 第一指令的功能是:如果(A)=0,則轉移,不然次序執行執行本指令的下一條指令)
    發表于 12-15 08:01

    條件執行語句

    條件執行語句大多在if語句中使用,也在使用關系運算符(<,==,>等) 或者布爾值表達式(,!等)計算復雜表達式時使用。對于包含函數調 用的代碼片段,由于函數返回值會被
    發表于 12-12 08:25

    C/C++條件編譯

    條件編譯是一種在編譯時根據條件選擇性地包含或排除部分代碼的處理方法。在 C/C++ 中,條件編譯使用預處理指令 #ifdef、#endif、#else 和 #elif 來實現。常用的
    發表于 12-05 06:21

    請問如何合理設置這些喚醒條件

    CW32A030 MCU支持從Sleep和DeepSleep模式通過外部中斷或實時時鐘喚醒。如何合理設置這些喚醒條件,以實現最佳的功耗和響應速度平衡呢?
    發表于 11-26 06:59

    提高條件分支指令預測正確率的方法

    寄存器,分別用于記錄條件分支指令個數branch_num和預測失敗次數prmiss_num。 上圖為運行coremark測試程序的波形,最后預測成功率超過百分之九十。而初始版本的E203處理器預測成功率僅46%。 可見采用基于
    發表于 10-22 08:22

    訂單多條件篩選接口設計與實現

    :$u = u_{text{specified}}$ 接口設計原則 RESTful風格 GET /orders?param1=value1?m2=value2 參數動態組合 支持任意條件自由組合,未傳參數視為不篩選 分頁機制 需包含page和size參數,避免全量查詢 核心實現
    的頭像 發表于 10-16 14:14 ?306次閱讀
    訂單多<b class='flag-5'>條件</b>篩選接口設計與<b class='flag-5'>實現</b>

    DeepSeek R1 MTP在TensorRT-LLM中的實現與優化

    TensorRT-LLM 在 NVIDIA Blackwell GPU 上創下了 DeepSeek-R1 推理性能的世界紀錄,Multi-Token Prediction (MTP) 實現了大幅提速
    的頭像 發表于 08-30 15:47 ?4447次閱讀
    DeepSeek R1 MTP在<b class='flag-5'>TensorRT</b>-LLM中的<b class='flag-5'>實現</b>與優化

    NTP網絡子母時鐘的特點優勢及應用場景介紹

    在數字化基礎設施高速發展的今天,時間同步已成為金融、醫療、交通等關鍵領域的核心需求。作為時間頻率領域的專業廠商,“同步天下”品牌旗下的SYN6109型NTP網絡子鐘,以卓越的技術性能和靈活的應用能力
    的頭像 發表于 08-09 15:12 ?1318次閱讀

    光耦的導通條件

    光耦的導通條件主要包括以下幾點: 一、輸入電流達到閾值 光耦的導通條件之一是輸入電流(通常是指發光二極管LED的電流If)需要達到一定的閾值。當輸入電流小于該閾值時,光耦處于關斷狀態;當輸入電流大于
    的頭像 發表于 07-31 09:59 ?1506次閱讀
    光耦的導通<b class='flag-5'>條件</b>

    基礎篇3:掌握Python中的條件語句與循環

    : # 條件為真時執行的代碼塊 如果條件表達式為真(即結果為True),則執行緊隨其后的代碼塊。 elif和else語句 當有多個條件
    發表于 07-03 16:13

    NTP網絡子鐘的技術架構與行業應用解析

    基準如同數字化時代的 “隱形基礎設施”,支撐著各領域的穩定運行。 作為深耕時間頻率領域多年的廠家,西安同步電子科技有限公司憑借 “同步天下” 品牌旗下的時間同步設備,包括 NTP 網絡子鐘系列產品,以卓越的技術實力和
    的頭像 發表于 06-06 13:48 ?445次閱讀

    在任何平臺上使用PetaLinux的先決條件

    本篇文章介紹了在任何平臺上使用 PetaLinux 的先決條件。PetaLinux 是一種嵌入式 Linux 軟件開發套件 (SDK),主要用于基于 FPGA 的系統級芯片 (SoC) 設計或 FPGA 設計。
    的頭像 發表于 04-24 10:40 ?1550次閱讀
    在任何平臺上使用PetaLinux的先決<b class='flag-5'>條件</b>