淺嘗ncnn優(yōu)化&&vulkan api的應(yīng)用

vulkan 的顯存管理

  • 一個 VkBuffer 對象,多個 offset

    • 使用同一塊 VkBuffer 存儲中間層的特征數(shù)據(jù)是整,不同的 blob 使用不同的offset進行區(qū)分 瞧剖。
VkDeviceMemory結(jié)構(gòu)
  • 可以在內(nèi)存架構(gòu)方面做到零拷貝

    • 集成顯卡和手機上采用unified內(nèi)存架構(gòu)(統(tǒng)一內(nèi)存架構(gòu))拭嫁,這種架構(gòu)下可免,GPU可以直接訪問CPU上的主存。利用這種架構(gòu)上的特性做粤,在GPU計算的時候就不用把 內(nèi)存上的數(shù)據(jù) 拷貝到 顯存 上浇借,計算完成后也不需要將 顯存上的數(shù)據(jù) 拷貝到 內(nèi)存
不同內(nèi)存架構(gòu)的對比

對GPU存儲布局的優(yōu)化

1.[c,h,w] 這種布局不太適合在GPU上做IO:[c, h, w] ---> [c/4, h, w, 4]

  • 因為GPU訪問和讀寫顯存用的時候更多的是使用 vec4 的類型驮宴,ncnn 通過將布局改為[c/4,h,w,4]逮刨,使得GPU的IO效率得到大幅度提升
  1. 減少內(nèi)存帶寬的需求

    • ncnn 中的 Tensor float數(shù)據(jù)可以使用半精度
    • 在一些不直接支持 fp16 存儲的情況下呕缭,ncnn 使用 packHalf2x16unpackHalf2x16 來模擬 fp16fp32 的轉(zhuǎn)換(這兩個函數(shù)是 GLSL 內(nèi)置的函數(shù))
  2. 更加方便的維護代碼

    • ncnn 中創(chuàng)建了一個 GLSL 的宏堵泽。

      所以寫代碼的時候可以不用管類型上的事,運行時會自動轉(zhuǎn)換為設(shè)備支持的 fp32fp16 的對應(yīng)代碼


cpu-gpu 混合推理

  • 模型中有些層恢总,在沒有GPU實現(xiàn)的時候迎罗,我們需要自動切換到CPU上去做推理。這就涉及到存儲布局相互轉(zhuǎn)換
CPU和GPU轉(zhuǎn)換
  • ncnn 提供了一套pipline片仿,使用一套pipline實現(xiàn)端到端的完成 最佳的布局轉(zhuǎn)換纹安。在獨顯上也傾向使用 fp16 做上傳和下載,能用半精度砂豌,也會優(yōu)先使用厢岂。

并行推理

  • ncnn 在GPU上實現(xiàn)并行推理的方式。

    • Vulkan的api中同一塊gpu會暴露多個隊列阳距。

      例如:nvidia的gpu中有8個隊列塔粒,那么就可以使用多線程的方式同時在8個隊列上提交8個任務(wù)。

      好處:可以增加GPU的使用率 筐摘,從而提高效率卒茬。

11個任務(wù)同時在三塊gpu上做推理

GLSL->SPIR-V 運行編譯

  • 原因:有些驅(qū)動需要對 GLSL 或者 SPIR-V 的源代碼進行特殊的處理,所以只能采用運行時編譯
  • 好處:不需要在離線時編譯多個 SPIR-V 的二進制文件咖熟,減少二進制文件的體積圃酵。

Swiftshader

  • swiftshader項目地址:google在cpu上實現(xiàn) vulkan驅(qū)動 的項目,可以實現(xiàn)在cpu上執(zhí)行vulkan的代碼馍管,可以保證每次代碼運行結(jié)果都是一致的郭赐。

復(fù)用 VkPipeline 和相關(guān)的 vulkan object

  • 模型加載的時候, 特別是第一次加載模型的時候确沸,由于沒有離線的cache和優(yōu)化的手段堪置, pipeline的編譯是一個十分耗時的操作。
  • 有些模型層的參數(shù)(kernal size, stride)是一樣的张惹。ncnn 在運行時就將 層的參數(shù)vulkan對象 的關(guān)系記錄下來舀锨,當遇到具有相同參數(shù)層的時候,就可以直接復(fù)用之前創(chuàng)建好的 vulkan對象宛逗,這樣可以顯著降低第一次加載模型的耗時坎匿。
降低第一次加載模型的耗時
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子替蔬,更是在濱河造成了極大的恐慌告私,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件承桥,死亡現(xiàn)場離奇詭異驻粟,居然都是意外死亡,警方通過查閱死者的電腦和手機凶异,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門蜀撑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剩彬,你說我怎么就攤上這事酷麦。” “怎么了喉恋?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵沃饶,是天一觀的道長。 經(jīng)常有香客問我轻黑,道長糊肤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任氓鄙,我火速辦了婚禮馆揉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玖详。我一直安慰自己把介,他們只是感情好,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布蟋座。 她就那樣靜靜地躺著拗踢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪向臀。 梳的紋絲不亂的頭發(fā)上巢墅,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音券膀,去河邊找鬼君纫。 笑死,一個胖子當著我的面吹牛芹彬,可吹牛的內(nèi)容都是我干的蓄髓。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼舒帮,長吁一口氣:“原來是場噩夢啊……” “哼会喝!你這毒婦竟也來了陡叠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤肢执,失蹤者是張志新(化名)和其女友劉穎枉阵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體预茄,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡兴溜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了耻陕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拙徽。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淮蜈,靈堂內(nèi)的尸體忽然破棺而出斋攀,到底是詐尸還是另有隱情已卷,我是刑警寧澤梧田,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站侧蘸,受9級特大地震影響裁眯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讳癌,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一穿稳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晌坤,春花似錦逢艘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至商乎,卻和暖如春央拖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹉戚。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工鲜戒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抹凳。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓遏餐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赢底。 傳聞我的和親對象是個殘疾皇子失都,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容