在 Triton 推理服務(wù)器的使用中,模型(model)類(lèi)別與調(diào)度器(scheduler)、批量處理器(batcher)類(lèi)型的搭配,是整個(gè)管理機(jī)制中最重要的環(huán)節(jié),三者之間根據(jù)實(shí)際計(jì)算資源與使用場(chǎng)景的要求去進(jìn)行調(diào)配,這是整個(gè) Triton 服務(wù)器中比較復(fù)雜的部分。
在模型類(lèi)別中有“無(wú)狀態(tài)(stateless)”、“有狀態(tài)(stateful)”與“集成(ensemble)”三種,調(diào)度器方面則有“標(biāo)準(zhǔn)調(diào)度器(default scheduler)”與“集成調(diào)度器(ensemble scheduler)”兩種,而標(biāo)準(zhǔn)調(diào)度器下面還有“動(dòng)態(tài)批量處理器(dynamic batcher)”與“序列批量處理器(sequence batcher)”兩種批量處理器。
模型類(lèi)別與調(diào)度器/批量處理器之間存在一些關(guān)聯(lián)性,以下整理出一個(gè)簡(jiǎn)單的配合表格,提供大家參考:
類(lèi)別 |
調(diào)度器 |
批量處理器 |
使用場(chǎng)景 |
無(wú)狀態(tài) |
標(biāo)準(zhǔn)調(diào)度器 |
動(dòng)態(tài)批量處理器 |
面向各自獨(dú)立的推理模型 |
有狀態(tài) |
標(biāo)準(zhǔn)調(diào)度器 |
序列批量處理器 |
處理存在交互關(guān)系的推理模型組 |
集成 |
集成調(diào)度器 |
創(chuàng)建復(fù)雜的工作流水線 |
接下去就要為這幾個(gè)管理機(jī)制的組合進(jìn)行說(shuō)明,由于內(nèi)容較多并且不均衡,特別是“有狀態(tài)模型”與“集成模型”兩部分的使用是相對(duì)復(fù)雜的,因此這些組合會(huì)分為三篇文章來(lái)進(jìn)行較為深入的說(shuō)明。
1. 無(wú)狀態(tài)(Stateless)模式:
這是 Triton 默認(rèn)的模型模式,最主要的要求就是“模型所維護(hù)的狀態(tài)不跨越推理請(qǐng)求”,也就是不存在與其他推理請(qǐng)求有任何交互關(guān)系,大部分處于最末端的獨(dú)立推理模型,都適合使用這種模式,例如車(chē)牌檢測(cè)最末端的將圖像識(shí)別成符號(hào)的推理、為車(chē)輛識(shí)別顏色/種類(lèi)/廠牌的圖像分類(lèi)等,還有 RNN 以及具有內(nèi)部?jī)?nèi)存的類(lèi)似模型,也可以是無(wú)狀態(tài)的。
2. 有狀態(tài)(Stateful)模式:
很多提供云服務(wù)的系統(tǒng),需要具備同時(shí)接受多個(gè)推理請(qǐng)求去形成一系列推理的能力,這些推理必須路由到某些特定模型實(shí)例中,以便正確更新模型維護(hù)的狀態(tài)。此外,該模型可能要求推理服務(wù)器提供控制信號(hào),例如指示序列的開(kāi)始和結(jié)束。
Triton 服務(wù)器提供動(dòng)態(tài)(dynamic)與序列(sequence)兩種批量處理器(batcher),其中序列批量處理器必須用于這種有狀態(tài)模式,因?yàn)樾蛄兄械乃型评碚?qǐng)求都被路由到同一個(gè)模型實(shí)例,以便模型能夠正確地維護(hù)狀態(tài)。
序列批量處理程序還需要與模型相互傳遞信息,以指示序列的開(kāi)始、結(jié)束、具有可執(zhí)行推理請(qǐng)求的時(shí)間,以及序列的關(guān)聯(lián)編號(hào)(ID)。當(dāng)對(duì)有狀態(tài)模型進(jìn)行推理請(qǐng)求時(shí),客戶端應(yīng)用程序必須為序列中的所有請(qǐng)求提供相同的關(guān)聯(lián)編號(hào),并且還必須標(biāo)記序列的開(kāi)始和結(jié)束。
下面是這種模式的控制行為有“控制輸入”、“隱式狀態(tài)管理”與“調(diào)度策略”三個(gè)部分,本文后面先說(shuō)明控制輸入的內(nèi)容,另外兩個(gè)部分在下篇文章內(nèi)講解。
(1) 控制輸入(control inputs)
為了使有狀態(tài)模型能夠與序列批處理程序一起正確運(yùn)行,模型通常必須接受 Triton 用于與模型通信的一個(gè)或多個(gè)控制輸入張量。
模型配置的sequence_batching里的control_input部分,指示模型如何公開(kāi)序列批處理程序應(yīng)用于這些控件的張量。所有控件都是可選的,下面是模型配置的一部分,顯示了所有可用控制信號(hào)的示例配置:
-
開(kāi)始(start):
這個(gè)輸入張量在配置中使用“CONTROL_SEQUENCE_START”指定,上面配置表明模型有一個(gè)名為“START”的輸入張量,其數(shù)據(jù)類(lèi)型為 32 位浮點(diǎn)數(shù),序列批量處理程序?qū)⒃趯?duì)模型執(zhí)行推理時(shí)定義此張量。
START 輸入張量必須是一維的,大小等于批量大小,張量中的每個(gè)元素指示相應(yīng)批槽中的序列是否開(kāi)始。上面配置中“fp32_false_true”表示,當(dāng)張量元素等于 0 時(shí)為“false(不開(kāi)始)”、等于 1 時(shí)為“ture(開(kāi)始)”。
-
結(jié)束(End):
結(jié)束輸入張量在配置中使用“CONTROL_SEQUENCE_END”指定,上面配置表明模型有一個(gè)名為“END”的輸入張量,具有 32 位浮點(diǎn)數(shù)據(jù)類(lèi)型,序列批處理程序?qū)⒃趯?duì)模型執(zhí)行推理時(shí)定義此張量。
END 輸入張量必須是一維的,大小等于批量大小,張量中的每個(gè)元素指示相應(yīng)批槽中的序列是否開(kāi)始。上面配置中“fp32_false_true”表示,當(dāng)張量元素等于 0 時(shí)為“false(不結(jié)束)”、等于 1 時(shí)為“ture(結(jié)束)”。
-
準(zhǔn)備就緒(Ready):
就緒輸入張量在配置中使用“CONTROL_SEQUENCE_READY”指定,上面配置表明模型有一個(gè)名為“READY”的輸入張量,其數(shù)據(jù)類(lèi)型為 32 位浮點(diǎn)數(shù),序列批處理程序?qū)⒃趯?duì)模型執(zhí)行推理時(shí)定義此張量。
READY 輸入張量必須是一維的,大小等于批量大小,張量中的每個(gè)元素指示相應(yīng)批槽中的序列是否開(kāi)始。上面配置中“fp32_false_true”表示,當(dāng)張量元素等于 0 時(shí)為“false(未就緒)”、等于1時(shí)為“ture(就緒)”。
-
關(guān)聯(lián)編號(hào)(Correlation ID):
關(guān)聯(lián)編號(hào)輸入張量在配置中使用“CONTROL_SEQUENCE_CORRID”指定,上面置表明模型有一個(gè)名為“CORRID”的輸入張量,其數(shù)據(jù)類(lèi)型為無(wú)符號(hào) 64 位整數(shù),序列批處理程序?qū)⒃趯?duì)模型執(zhí)行推理時(shí)定義此張量。
CORRID 張量必須是一維的,大小等于批量大小,張量中的每個(gè)元素表示相應(yīng)批槽中序列的相關(guān)編號(hào)。
(2) 隱式狀態(tài)管理(implicit State Management)
這種方式允許有狀態(tài)模型將其狀態(tài)存儲(chǔ)在 Triton 服務(wù)器中。當(dāng)使用隱式狀態(tài)時(shí),有狀態(tài)模型不需要在模型內(nèi)部存儲(chǔ)推理所需的狀態(tài)。不過(guò)隱式狀態(tài)管理需要后端(backend)支持。目前只有 onnxruntime_backend 和 tensorrt_backend 支持隱式狀態(tài)。
下面是模型配置的一部分,在sequence_batching配置中的 state 部分,就是用于指示該模型正在使用隱式狀態(tài):
sequence_batching {
state [
{
input_name: "INPUT_STATE"
output_name: "OUTPUT_STATE"
data_type: TYPE_INT32
dims: [ -1 ]
}
]
}
這里做簡(jiǎn)單的說(shuō)明:
-
字段說(shuō)明:
- input_name 字段:指定將包含輸入狀態(tài)的輸入張量的名稱(chēng);
- output_name 字段:描述由包含輸出狀態(tài)的模型生成的輸出張量的名稱(chēng);
- dims 字段:指定狀態(tài)張量的維度。
-
執(zhí)行要點(diǎn):
- 序列中第 i 個(gè)請(qǐng)求中模型提供的輸出狀態(tài),將用作第 i+1 個(gè)請(qǐng)求中的輸入狀態(tài);
- 當(dāng) dims 字段包含可變大小的維度時(shí),輸入狀態(tài)和輸出狀態(tài)的尺度不必匹配;
- 出于調(diào)試目的,客戶端可以請(qǐng)求輸出狀態(tài)。為了實(shí)現(xiàn)這個(gè)目的,模型配置的輸出部分必須將輸出狀態(tài)(OUTPUT_STATE)列為模型的一個(gè)輸出;
- 由于需要傳輸額外的張量,從客戶端請(qǐng)求輸出狀態(tài)可能會(huì)增加請(qǐng)求延遲。
默認(rèn)情況下,序列中的啟動(dòng)請(qǐng)求包含輸入狀態(tài)的未初始化數(shù)據(jù)。模型可以使用請(qǐng)求中的開(kāi)始標(biāo)志來(lái)檢測(cè)新序列的開(kāi)始,并通過(guò)在模型輸出中提供初始狀態(tài)來(lái)初始化模型狀態(tài),如果模型狀態(tài)描述中的 dims 部分包含可變尺度,則 Triton 在開(kāi)始請(qǐng)求時(shí)將每個(gè)可變尺寸設(shè)置為“1”。對(duì)于序列中的其他非啟動(dòng)請(qǐng)求,輸入狀態(tài)是序列中前一個(gè)請(qǐng)求的輸出狀態(tài)。
對(duì)于狀態(tài)初的初始化部分,有以下兩種狀況需要調(diào)整:
-
啟動(dòng)請(qǐng)求時(shí):則模型將“OUTPUT_STATE”設(shè)置為等于“INPUT”張量;
-
非啟動(dòng)請(qǐng)求時(shí):將“OUTPUT_STATE”設(shè)為“INPUT”和“INPUT_STATE”張量之和。
除了上面討論的默認(rèn)狀態(tài)初始化之外,Triton 還提供了“從 0 開(kāi)始”與“從文件導(dǎo)入”兩種初始化狀態(tài)的機(jī)制。下面提供兩種初始化的配置示例:
兩個(gè)配置只有粗體部分不一樣,其余內(nèi)容都是相同的,提供讀者做個(gè)參考。
以上是關(guān)于有狀態(tài)模型的“控制輸入”與“隱式狀態(tài)管理”的使用方式,剩下的“調(diào)度策略”部分,會(huì)在后文中提供完整的說(shuō)明。
原文標(biāo)題:NVIDIA Triton 系列文章(11):模型類(lèi)別與調(diào)度器-1
文章出處:【微信公眾號(hào):NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
英偉達(dá)
+關(guān)注
關(guān)注
22文章
3771瀏覽量
90999
原文標(biāo)題:NVIDIA Triton 系列文章(11):模型類(lèi)別與調(diào)度器-1
文章出處:【微信號(hào):NVIDIA-Enterprise,微信公眾號(hào):NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論