五行代碼實現千萬類別分類網絡,飛槳大規模分類庫揭祕

“桃花一簇無開主,可愛深紅愛淺紅。

黃四孃家花滿蹊,千朵萬朵壓枝低。

留連戲蝶時時舞,自在嬌鶯恰恰啼。”

春天來了,經過一個冬天的“窖藏”,按耐不住的小夥伴紛紛行動了起來,踏一踏滿園的春色,趕一趟嬌豔的花叢。

這時候帶着小盆友的父母卻有一個共同的煩惱,因爲小盆友最愛問一個問題:“爸爸媽媽,這是什麼花?”此時不要慌,拿出你的手機,打開手機百度“掃一掃”,就會看到一個“識花”的功能,一拍即可識別花的種類。

再一次感慨科技帶來的便利的同時,你是否思考過這一神奇“魔法”背後的技術。自然界中花的種類多達45萬種,存在的生物種類更是有近億種之多。你是否想過,如何利用近年來火到爆棚的人工智能技術實現物種的分類和識別?這背後涉大規模圖像分類技術。

圖像分類技術日趨成熟,ResNet網絡在ImageNet數據集上的top5準確率已超過96%。然而,如何高效地完成百萬類別甚至是更大規模的分類任務,則是一個極具挑戰性的課題。

先從多分類神經網絡的實現角度分析,其最後一層通常是由全連接層和Softmax構成的組合層,全連接層輸出結點數掛鉤分類任務的類別數,所以對應的參數量隨分類類別數的增長而線性增長。因此,當類別數非常大時,神經網絡訓練過程佔用的顯存空間也會很大,甚至是超出單張GPU卡的顯存容量,導致神經網絡模型無法訓練。

以新聞推薦系統爲例,假設要對百萬類細分類別的新聞條目進行分類,那麼僅存儲全連接層參數就需要約2GB的顯存空間(這裏假設神經網絡最後一層隱層的輸出結點的維度爲512,並假設以32比特浮點數表示數據)。再考慮神經網絡訓練過程中生成的數量龐多的中間變量,那麼訓練過程中需要的存儲總量往往會超出單張GPU卡的顯存容量。

該如何解決這個問題呢?常用的做法是“拆分”。考慮到全連接層的線性可分性,可以將全連接層參數切分到多張GPU卡,採用模型並行方案,減少每張GPU卡的參數存儲量。

以下圖爲例,全連接層參數按行切分到不同的GPU卡上。每次訓練迭代過程中,各張GPU卡分別以各自的訓練數據計算隱層的輸出特徵(feature),並通過集合通信操作AllGather得到匯聚後的特徵。接着,各張GPU卡以匯聚後的特徵和部分全連接層參數計算部分logit值(partial logit),並基於此計算神經網絡的損失值。

這個方案可以有效解決全連接層參數量隨分類類別數線性增長導致的顯存空間不足的問題。然而,爲了實現這一方案,開發者需要基於現有的深度學習平臺設計和實現上例描述的所有操作,包括全連接層參數的切分和集合通信等,動輒需要數百行實現代碼,大大增加了開發者的負擔。

另外模型訓練完成後,如何基於預訓練模型便捷的部署預測服務並快速上線,也是開發者普遍關注的問題。

 

飛槳首次開源大規模分類庫PLSC

 

現在,開發者的福音來了,飛槳近期開源了基於核心框架構建的大規模分類庫(PLSC: PaddlePaddle Large Scale Classification),爲用戶提供了大規模分類任務從訓練到部署的全流程解決方案。只需數行代碼,即可實現千萬類別分類的神經網絡。並且,通過PLSC庫提供的serving功能用戶可以快速部署模型,提供一站式服務。

簡單易用,五行代碼實現千萬類別分類神經網絡

 

飛槳大規模分類庫PLSC(以下簡稱PLSC)封裝了大規模分類神經網絡實現,提供簡潔易用的高層API,用戶通過五行代碼即可實現千萬類別分類神經網絡。

(1) 安裝飛槳

可以參考官網下載並安裝飛槳。

(2) 安裝PLSC

執行下面的命令安裝PLSC。

pip install plsc

(3) 準備模型訓練配置代碼,保存爲train.py文件。

使用PLSC組建分類神經網絡主要包括下面三個步驟:

1.     從plsc包導入Entry類,Entry類封裝PLSC所有API的接口類;

2.     實例化Entry類的對象;

3.     調用Entry類的train方法,開始訓練過程。

默認情況下,該訓練腳本使用的loss值計算方法爲'dist_arcface',即將全連接層參數切分到多張GPU卡的模型並行方案,需要使用兩張或以上的GPU卡。



from plsc import Entryif __name__ == "main":        ins = Entry()        ins.set_class_num(1000000) #設置分類類別數        ins.train()

 

(4)   啓動訓練任務

可以使用下面的命令行啓動訓練任務,其中selected_gpus參數用於指定訓練中使用的GPU卡。

python -m paddle.distributed.launch \
            --selected_gpus=0,1,2,3,4,5,6,7 \
            train.py

 

PLSC訓練效果達到SOTA精度

 

PLSC庫在多個數據集上可以取得SOTA的訓練精度,下表列出PLSC庫分別使用MS1M-ArcFace和CASIA數據集作爲訓練數據,在不同驗證數據集上取得的精度。

備註:上述模型訓練使用的loss_type爲'dist_arcface'。更多關於ArcFace的內容請參考

ArcFace: Additive Angular Margin Loss for Deep Face Recognition

https://arxiv.org/abs/1801.07698

 

PLSC支持多機分佈式訓練和千萬規模分類

 

PLSC支持多機分佈式訓練。一方面,通過多機分佈式訓練可以將全連接層參數切分到更多的GPU卡,從而支持千萬類別分類,並且飛槳大規模分類庫理論上支持的分類類別數隨着使用的GPU卡數的增加而增加。例如,單機8張V100 GPU配置下支持的最大分類類別數相比不使用PLSC擴大2.52倍。

 

另一方面,使用多機分佈式訓練可以有效提升訓練速度。

 

通過下面幾行命令即可啓動多機分佈式訓練。其中,cluster_node_ips參數用於指定所有訓練節點的ip地址列表,node_ip參數用於指定當前訓練節點的ip地址。

python -m paddle.distributed.launch \
        --cluster_node_ips="127.0.0.1,127.0.0.2" \
        --node_ip="127.0.0.1" \
        --selected_gpus=0,1,2,3,4,5,6,7 \
        train.py

下圖給出使用不同數量的節點時的訓練速度(吞吐)。實驗中使用的訓練數據集爲MS1M-ArcFace,分類類別數爲85742,每個節點配備8張NVIDIA V100 GPUs,backbone模型爲ResNet50。如圖所示,使用飛槳大規模分類庫可以取得近似線性的加速比。

 

PLSC提供從訓練到部署的全流程解決方案

 

用戶完成分類神經網絡訓練後,通常要基於得到的預訓練模型部署預測服務。通過飛槳大規模分類庫提供的serving功能可實現快速部署。

飛槳大規模分類庫提供支持預測服務部署的serving端和client端。serving端基於飛槳服務器端部署庫Paddle Serving開發,使用serving端功能可以基於預訓練模型快速部署預測服務。client端則提供了和serving端的交互功能,用戶通過client端提交查詢請求並獲取預測結果。只需三步即可完成部署。

(1)  安裝serving端和client端。

pip install plsc-serving ujson

(2)  通過下面的腳本部署serving端:

from plsc_serving.run import PLSCServerfs = PLSCServer()# 設定使用的模型路徑fs.with_model(model_path = '/XXX/XXX')# gpu_index指定使用的gpu,port指定使用的端口fs.run(gpu_index = 0, port = 8010)


(3)  通過下面的腳本使用client端功能:

from face_service import FaceService
with open('./data/00000000.jpg', 'rb') as f:
    image = f.read()
fc = FaceService()
# 添加server端連接
fc.connect('127.0.0.1:8010')
#調用server端預測
result = fc.encode([image])
print(result[0])
fc.close()

PLSC支持混合精度訓練

 

單機8張Nvidia Tesla v100 GPU配置下,混合精度比常規單精度訓練速度提升42%。

使用混合精度訓練可以提升訓練的速度,同時減少訓練使用的顯存開銷。開啓混合精度訓練方法如下:

from plsc import Entry
def main():    ins = Entry()    ins.set_mixed_precision(True)    ins.train()if __name__ == "__main__":main()


在單機8張Nvidia Tesla v100 GPU配置下,對比resnet50模型單精度訓練和混合精度訓練的效果,混合精度訓練速度可提升42%:

關於混合精度訓練的內容請參考:

https://arxiv.org/abs/1710.03740

 

PLSC支持Base64格式圖像數據預處理

 

實際業務中,一種常見的數據存儲格式是將圖像數據編碼爲base64格式,訓練數據文件的每一行存儲一張base64格式編碼的圖像數據和該圖像的標籤,並通常以製表符('\t')分隔圖像數據和圖像標籤。

 

神經網絡訓練過程中,通常需要對訓練數據做全局shuffle。此外,需要切分訓練數據,確保每張GPU卡使用相同數量的訓練數據。對Base64格式的數據做全局shuffle的開銷較大,若在訓練過程中執行全局shuffle,會嚴重影響訓練速度。

 

飛槳大規模分類庫內置Base64格式數據預處理工具,可以對訓練數據做全局shuffle,並將訓練數據均分到多個數據文件,確保數據文件的數量和訓練中使用的GPU卡數相同,且每個數據文檔包含相同數量的訓練數據。訓練效率顯著提升。

 

PLSC支持fine-tuning訓練時GPU卡數的動態調整

 

我們有時需要基於預訓練模型做fine-tuning這種場景下,fine-tuning階段的訓練GPU卡數和預訓練階段使用的GPU卡數可能不同,尤其是當預訓練和fine-tuning是分別由不同的組織執行時。考慮全連接層參數是根據使用的GPU卡數切分的這一情形,當fine-tuning階段和預訓練階段使用不同的GPU卡數時,在加載模型參數前,用戶需要重構模型參數,以適應fine-tuning階段的GPU卡數。爲了簡化用戶操作,飛槳大規模分類庫提供了自動化的模型參數重構功能。當fine-tuning階段使用的GPU卡數和預訓練階段不同時,飛槳大規模分類庫在加載預訓練模型參數時會自動根據fine-tuning階段使用的GPU卡數重構預訓練模型參數,以適應fine-tuning階段的GPU卡數。

 

PLSC助力百度AI口罩檢測方案快速上線

 

面對疫情,百度近期攻克了戴口罩人臉識別技術難關,快速上線了AI口罩檢測方案,並在地鐵、園區、廠區等場所上線,高效保障防疫工作。

百度AI口罩檢測方案採用百度最新的PyramidBox-lite檢測算法,加入超過10萬張口罩人臉訓練數據。爲了解決數百萬ID數據訓練問題,採用飛槳大規模分類庫PLSC實現了快速訓練。在準確率不變的情況下,召回率提升30%,佩戴口罩的人臉檢測準確率超過99%。

 

更多飛槳PLSC的應用方法,歡迎訪問飛槳PLSC項目地址:

https://github.com/PaddlePaddle/PLSC

如果您加入官方QQ羣,您將遇上大批志同道合的深度學習同學。

官方QQ羣:703252161。

如果您想詳細瞭解更多飛槳的相關內容,請參閱以下文檔。

官網地址:https://www.paddlepaddle.org.cn

飛槳開源框架項目地址:

GitHub: https://github.com/PaddlePaddle/Paddle

Gitee:  https://gitee.com/paddlepaddle/Paddle

 

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章