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

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

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

留連戲蝶時時舞,自在嬌鶯偏偏啼。」git

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

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

下載安裝命令

## CPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

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

圖像分類技術日趨成熟,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) 安裝飛槳

能夠參考官網下載並安裝飛槳。

下載安裝命令

## CPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

(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 Entry
if __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%。

下載安裝命令

## CPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

>> 訪問 PaddlePaddle 官網,瞭解更多相關內容

相關文章
相關標籤/搜索