本文經(jīng)AI新媒體量子位(公眾號ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請聯(lián)系出處。
成都創(chuàng)新互聯(lián)公司長期為1000多家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為蚌山企業(yè)提供專業(yè)的成都網(wǎng)站設計、成都網(wǎng)站制作,蚌山網(wǎng)站改版等技術服務。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。自今年年初,由于疫情的原因,為了減少人員聚集,降低病毒擴散的可能性,各大中小學校都陸續(xù)開始了網(wǎng)上教學。上網(wǎng)課已經(jīng)成了家喻戶曉的一種學習方式了。
可是你知道嗎,在深度學習領域,模型訓練也是可以采用網(wǎng)課形式,不用那么震驚,這個真的有!這就是今天要講的LF AI基金會的EDL項目基于飛槳深度學習平臺推出的服務型蒸餾訓練方案!
什么是蒸餾訓練?
要講蒸餾訓練就要提到知識蒸餾。如今深度學習模型正在往越來越大,網(wǎng)絡層越來越深的方向發(fā)展。在很多場景下,模型越大,層數(shù)越多,模型效果就越好。但受限于推理速度,顯存資源等要求,大模型通常無法直接部署,需要對模型進行壓縮。
目前主流的壓縮方法有裁剪、量化、知識蒸餾等。其中知識蒸餾這一概念是由Hinton等人在2015年發(fā)表的《Distilling the Knowledge in a Neural Network》論文中提出的一個黑科技,一種非常經(jīng)典的模型壓縮技術,是將知識從一個復雜模型(Teacher)遷移到另一個輕量級模型(Student)上的方式來實現(xiàn)模型壓縮。
其實所謂知識的遷移,其實可以理解為一種訓練過程,就是使用Teacher模型來訓練Student模型,這種訓練方法就是蒸餾訓練。在訓練出一個效果良好的Student模型后,這個Student模型就可以被用于實際部署了。
如下圖所示,訓練步驟可以分為兩步:
訓練好一個Teacher模型。 訓練Student模型,即使用Teacher模型的知識來訓練Student模型。
△知識蒸餾架構(gòu)圖
所謂Teacher模型的知識是指Teacher模型的推理結(jié)果,我們稱之為soft label,這個soft label將作為Student網(wǎng)絡的訓練目標,Student的推理結(jié)果需要盡可能接近Teacher的推理結(jié)果。與soft label相對應的是hard label,hard label就是真實訓練數(shù)據(jù)的標簽。相比于hard label,soft label所含的信息量更大。
舉個例子,比如做區(qū)分驢和馬的分類任務的時候,soft label不會像hard label那樣只給馬的index值為1,其余類別為0,而是在驢的部分也會提供一個概率值(例如0.3或0.4之類),這樣的優(yōu)勢在于使soft label包含了不同類別之間的相似性信息。顯而易見,使用soft label訓練出來的模型肯定要比單獨使用hard label訓練出來的模型學習到更多的知識,也就更加的優(yōu)秀。
知識蒸餾訓練的目標函數(shù)可由distillation loss(對應teacher soft label)和student loss(對應標注的hard label)加權(quán)得到。公式如下,其中p表示Student模型的推理結(jié)果,q為teacher的推理結(jié)果,y為hard label。
什么是服務型蒸餾訓練?
說完蒸餾訓練了,下面我們進入正題,來看看我們這個服務型蒸餾訓練到底是個什么東東!蒸餾訓練可以分為如下三種方式:
離線蒸餾訓練
離線蒸餾訓練的方式很像是老師(Teacher)把要講課的內(nèi)容錄制成視頻交給學生(Student)去自學,然后學生根據(jù)課程視頻自學成才。所以離線蒸餾訓練就是先使用Teacher模型做推理并將結(jié)果保存在磁盤中,然后Student模型使用磁盤中保存的樣本和Teacher模型的推理結(jié)果作為數(shù)據(jù)集進行訓練。這種訓練方式下Student模型訓練和常規(guī)訓練一致,方法簡單。不過這種訓練方式一般需要數(shù)據(jù)增強,而且需要占用巨大的磁盤空間,因此應用環(huán)境受到了一定的限制。
△離線蒸餾訓練
常規(guī)蒸餾訓練
常規(guī)蒸餾訓練是指將Teacher模型和Student模型放入同一網(wǎng)絡中,固定Teacher模型參數(shù)只做前向,Student模型則正常做反向傳播訓練。這也是目前主流的蒸餾訓練方式。這和現(xiàn)實生活中常規(guī)的教學方式很像,老師和學生在一個教室里,老師說一句,學生聽一句。但是這種訓練方式不僅Teacher模型本身需要占用較大的空間,而且由于Teacher和Student是1對1的綁定關系,Student模型的訓練完全依賴Teacher模型,Student模型要等Teacher模型輸出一個batch的推理結(jié)果才可以訓練,而teacher模型也要等Student訓練完一個batch,才能開始下一個batch的推理,對整體的訓練速度有一定的影響。
服務型蒸餾訓練
服務型蒸餾訓練是基于EDL(Elastic Deep Learning,彈性深度學習框架)提出的一種訓練方案。EDL是Linux基金會(LF)旗下負責人工智能和大數(shù)據(jù)深度學習領域的基金會LF AI正在孵化的重要項目之一。如今在云計算資源蓬勃發(fā)展的條件下,利用彈性資源進行深度學習模型訓練和推理將成為一種普遍現(xiàn)象,因此EDL項目應運而生。EDL項目可以使云上深度學習模型的訓練和推理變得更容易和更有效。而服務型蒸餾訓練方案就是EDL項目結(jié)合百度飛槳開源深度學習平臺而推出了一種新的訓練方案,可謂出身名門!
與常規(guī)蒸餾訓練相比,服務型蒸餾訓練將Teacher模型和Student模型解耦,Teacher模型被部署為線上推理服務,Student模型則以客戶端的身份通過互聯(lián)網(wǎng)實時發(fā)送樣本到Teacher模型獲取推理結(jié)果進行訓練,這就如同讓模型上網(wǎng)課。那么讓模型上網(wǎng)課可以給用戶帶來什么收益呢?咱們往下看!
△服務蒸餾訓練
服務型蒸餾訓練的價值
相比于常規(guī)的蒸餾訓練模式相比,服務型蒸餾訓練可以給用戶帶來如下收益:
節(jié)約顯存資源。由于Student模型和Teacher模型的解耦,所以服務型蒸餾訓練可以使用異構(gòu)的資源,也就是把Student模型和Teacher模型的部署到不同的設備上。原先受限于顯存大小而難以部署到單個GPU卡上的蒸餾網(wǎng)絡可以通過該方式部署到不同卡上。 提升訓練速度。由于節(jié)約了顯存資源,這樣就可以使Student模型能夠訓練更大的batch size;同時由于Student模型和Teacher模型是異構(gòu)流水線,Student模型不用等Teacher模型推理結(jié)束后再訓練,綜合上述兩個原因,可以大大提高訓練速度。 提高訓練資源利用率。在實際應用中,我們可以將Teacher模型部署到線上的彈性預估卡集群,利用線上預估卡閑時的算力資源提升蒸餾任務中Teacher模型側(cè)的吞吐量。同時由于Teacher模型可以彈性調(diào)度,不用擔心高峰時線上實例被搶占造成的任務失敗。相當于把teacher對訓練卡的資源需求轉(zhuǎn)移到了在線GPU卡上,在v100等離線訓練資源受限的情況下,使用在線卡對訓練進行加速,以節(jié)約寶貴的訓練資源。此外,在離線集群上,結(jié)合調(diào)度策略,還可以將Teacher模型部署到集群碎片資源,或者如k40等使用率較低的資源上,充分利用集群的空閑、碎片資源。 提升訓練效率。用戶可以根據(jù)Teacher和Student的吞吐性能靈活設置Teacher和Student的比例,也就是說多個老師可以教多個學生,而不是只能保持1比1的家教模式,限度地提高訓練的產(chǎn)出。
為了驗證服務型蒸餾訓練的效果,我們在ImageNet數(shù)據(jù)集上使用普通訓練、常規(guī)蒸餾訓練和服務型蒸餾訓練幾個不同方式來訓練ResNet50_vd模型。
在精度上,可以看出相比于普通訓練,蒸餾訓練提升了ResNet50_vd模型近2%的精度。而服務型蒸餾訓練和常規(guī)蒸餾訓練在精度上持平。當然該模型的蒸餾精度遠不止于此,關于知識蒸餾更多提升精度的技巧請參考如下地址:
https://paddleclas.readthedocs.io/zh_CN/latest/advanced_tutorials/distillation/index.html
在速度上,相比于普通訓練,常規(guī)蒸餾訓練由于Teacher模型占用了很大一部分算力,所以在相同訓練資源的情況下,訓練速度僅為普通訓練的35.9%。而服務型蒸餾訓練由于使用了額外的在線P4彈性資源,將Teacher對訓練卡的資源需求轉(zhuǎn)移到了彈性卡上,所以相比于普通訓練,仍保持有82.8%的訓練效率,速度為常規(guī)蒸餾訓練2.3倍。
如果繼續(xù)增加Teacher資源,理論上EDL服務型蒸餾訓練的速度是可以和普通訓練速度持平的。當然常規(guī)蒸餾訓練如果加大資源,也是可以繼續(xù)加速的,不過這樣就占用了更多寶貴的v100訓練資源了。
服務型蒸餾訓練既然那么厲害,那它是怎么做到的呢?咱們來看看它的具體實現(xiàn)。
服務型蒸餾訓練的實現(xiàn)方案
從具體實現(xiàn)的角度看,服務型蒸餾訓練之所以被稱為服務,就是因為它將Teacher模型部署成了服務端,而Student模型成了客戶端。如下圖所示,該方案可以描述為將Teacher模型被部署為在線可容錯彈性服務,而在Student模型一側(cè)則通過DistillReader來封裝Student模型與Teacher模型之間的通信,訪問Teacher服務。下面咱們分別介紹下DistillReader和可容錯彈性服務都是啥?
△服務型蒸餾訓練架構(gòu)圖
DistillReader
DistillReader用來代表Student模型向Teacher模型進行通信,從而產(chǎn)生可供Student模型訓練的數(shù)據(jù)reader。如下圖所示,Student模型將訓練樣本和標簽傳入訓練reader,DistillReader從訓練reader中讀取訓練樣本發(fā)送給Teacher模型,然后獲取推理結(jié)果。推理結(jié)果和原訓練reader中的數(shù)據(jù)封裝在一起,返回一個包含推理結(jié)果的新reader給Student模型,這樣TEACHER模型的推理和STUDENT模型的訓練就可以流水行并行起來了。
△DistillReader功能示意圖
可容錯彈性服務
可容錯彈性服務的實現(xiàn)架構(gòu)如下圖所示,首先我們通過Paddle Serving將多個Teacher模型部署成服務,并注冊服務到Redis數(shù)據(jù)庫中;Student模型則作為客戶端從服務發(fā)現(xiàn)中查詢所需的Teacher服務;服務發(fā)現(xiàn)從Redis數(shù)據(jù)庫查詢并按某種負載均衡策略返回客戶端所需的Teacher列表;每當Teacher變化時,客戶端就可以實時拿到最新Teacher列表,連接Teacher進行蒸餾訓練,不用擔心發(fā)生由于連接到被收回的Teacher資源而導致任務失敗的請況。
△彈性伸縮服務架構(gòu)圖
如下圖所示,該圖是服務型蒸餾訓練運行的流程圖,圖中可以看到STUDENT模型給TEACHER模型發(fā)送樣本并獲取推理結(jié)果,而TEACHER模型服務側(cè)則可以隨意增刪,彈性調(diào)整。
△服務型蒸餾訓練流程圖
在了解了實現(xiàn)方案后,那么怎么使用服務蒸餾訓練呢?下面我們通過一個操作示例為大家簡單介紹一下。
服務型蒸餾訓練實踐
我們通過訓練圖像分類模型來給大家演示下如何使用服務型蒸餾訓練。由于僅是演示,這里我們使用的是單機環(huán)境,也就是說服務端和客戶端部署在了同一個服務器上,服務端的IP地址是127.0.0.1。如果部署在不同設備上,修改下代碼中的IP地址即可。
環(huán)境準備
請執(zhí)行如下命令拉取鏡像,鏡像為CUDA9.0的環(huán)境,在里面我們預裝了EDL、飛槳核心框架和Padde Serving等相關依賴。
dockerpullhub.baidubce.com/paddle-edl/paddle_edl:latest-cuda9.0-cudnn7nvidia-dockerrun-namepaddle_edlhub.baidubce.com/paddle-edl/paddle_edl:latest-cuda9.0-cudnn7/bin/bash 啟動Teacher模型
請執(zhí)行如下命令在1號GPU卡啟動Teacher服務,其中Teacher模型為圖像分類模型ResNeXt101_32x16d_wsl,服務的端口號為9898,并啟動了內(nèi)存優(yōu)化功能。
cdexample/distill/resnetwget--no-check-certificatehttps://paddle-edl.bj.bcebos.com/distill_teacher_model/ResNeXt101_32x16d_wsl_model.tar.gztar-zxfResNeXt101_32x16d_wsl_model.tar.gzpython-mpaddle_serving_server_gpu.serve--modelResNeXt101_32x16d_wsl_model--mem_optimTrue--port9898--gpu_ids1 啟動Student模型訓練
請執(zhí)行如下命令在0號GPU卡啟動Student模型,啟動的student模型為ResNet50_vd,。
python-mpaddle.distributed.launch--selected_gpus0./train_with_fleet.py--model=ResNet50_vd--data_dir=./ImageNet--use_distill_service=True--distill_teachers=127.0.0.1:9898
其中train_with_fleet.py是用于啟動訓練的腳本,用戶需要在其中添加蒸餾訓練相關的代碼,如果用戶想了解腳本的修改方法或可以參考如下地址。
https://github.com/elasticdeeplearning/edl/blob/develop/example/distill/README.md
當前名稱:模型也可以上網(wǎng)課?!一文看懂服務型蒸餾訓練方案
文章來源:http://www.rwnh.cn/article18/cjodgp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站改版、域名注冊、服務器托管、商城網(wǎng)站、品牌網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)