版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
01/41在當(dāng)下快節(jié)奏、技術(shù)驅(qū)動(dòng)的時(shí)代,人工智能(AI)不斷發(fā)展,對(duì)許多領(lǐng)域產(chǎn)生顛覆性的影響。PyTorch是一款開源的機(jī)器學(xué)習(xí)框架,已經(jīng)成為許多企業(yè)和機(jī)構(gòu)開發(fā)和部署深度學(xué)習(xí)模型的首選。模型訓(xùn)練是機(jī)器學(xué)習(xí)流程中計(jì)算最密集型的階段,需要持續(xù)進(jìn)行性能優(yōu)化。訓(xùn)練過程可能會(huì)既困難又耗時(shí)。本電子書是解決PyTorch訓(xùn)練性能和效率問題的首選寶典。適用對(duì)象包括AI/ML平臺(tái)工程學(xué)習(xí)工程師以及任何希望掌握PyTorch性能調(diào)優(yōu)技巧的專業(yè)人士。我們假定您具備基本的Python編程技能并了解Linux命令行的使用。本寶典中介紹的技術(shù)適用于對(duì)PyTorch的基礎(chǔ)設(shè)施及其使用的資源進(jìn)行調(diào)優(yōu)。這些調(diào)優(yōu)技巧典不針對(duì)模型參數(shù)進(jìn)行調(diào)優(yōu),例如選擇正確的超參數(shù)組合。您將了解到以下內(nèi)容:.影響機(jī)器學(xué)習(xí)流程中模型訓(xùn)練性能的因素;.優(yōu)化PyTorch模型訓(xùn)練的分步過程;.在數(shù)據(jù)加載、數(shù)據(jù)操作、GPU處理和CPU處理方面的最佳調(diào)優(yōu)技巧,附有代碼示例。通過這些技巧,平均訓(xùn)練epoch時(shí)長可縮短至原先的1/5-1/10;.在真實(shí)生產(chǎn)環(huán)境中使用Alluxio作為數(shù)據(jù)訪問層為模型訓(xùn)練賦能的案例研究。接下來,讓我們一起解鎖PyTorch在模型訓(xùn)練性能調(diào)優(yōu)方面的全部潛能吧!02/41第一章:了解PyTorch用于模型訓(xùn)練的基礎(chǔ)知識(shí)41.4神經(jīng)網(wǎng)絡(luò)模塊6第二章:PyTorch訓(xùn)練性能調(diào)優(yōu)技巧72.1使用監(jiān)控工具定位瓶頸82.1.1傳統(tǒng)命令行工具8 2.1.2TensorBoard9 2.1.3Visdom112.2性能調(diào)優(yōu)過程2.3優(yōu)化I/O性能14 2.3.2使用Alluxio作為高性能數(shù)據(jù)訪問層15 2.3.3啟用異步數(shù)據(jù)加載172.4數(shù)據(jù)操作優(yōu)化 2.4.1在正確的設(shè)備上創(chuàng)建張量18 2.4.2使用torch.as_tensor(等)19 2.4.3將non_blocking設(shè)置為True202.5針對(duì)GPU的優(yōu)化2.5.1如何選擇正確的GPU212.5.2編譯模型232.5.3使用DistributedDataParallel2.5.4使用低精度的數(shù)據(jù)類型262.6.1對(duì)結(jié)構(gòu)化數(shù)據(jù)使用更高效的文件格式272.6.3使用更高效的內(nèi)存分配器2903/41第三章:使用Alluxio作為數(shù)據(jù)訪問層的案例分享303.1支付寶:加速數(shù)十億文件的大規(guī)模計(jì)算機(jī)視覺模型訓(xùn)練313.3嗶哩嗶哩:訓(xùn)練性能提升3倍,實(shí)現(xiàn)預(yù)處理與訓(xùn)練數(shù)據(jù)的共享34第四章:總結(jié)和其他資源364.1要點(diǎn)總結(jié)4.2其他資源04/41在開始PyTorch調(diào)優(yōu)之前,您需要了解它的基本工作原理。本章將介紹張量、計(jì)算圖、自動(dòng)微分以及神經(jīng)網(wǎng)絡(luò)模塊的工作原理。一旦熟悉了這些基本概念即可開始優(yōu)化PyTorch代碼,從而實(shí)現(xiàn)性能提升。05/41在PyTorch中,張量是類似于NumPy的ndarrays的基本數(shù)據(jù)結(jié)構(gòu),類似于數(shù)組或矩陣。但不同的是,張量可以無縫地利用GPU資源來加速計(jì)算。這使得PyTorch成為深度學(xué)習(xí)模型訓(xùn)練在PyTorch中使用張量時(shí),有幾個(gè)關(guān)鍵屬性和操作在訓(xùn)練模型中起著至關(guān)重要的作用。首先,張量具有形狀屬性,提供了有關(guān)其維度的重要信息。了解張量的大小和結(jié)構(gòu)對(duì)于有效地設(shè)計(jì)和調(diào)試模型至關(guān)重要。此外,PyTorch提供了各類張量操作,包括逐元素操作(例如加法、乘法)、矩陣操作(例如矩陣乘法、矩陣求逆)和歸約操作(例如求和、平均值)。這些操作使得研究人員和從業(yè)者能夠在訓(xùn)練過程中高效地執(zhí)行計(jì)算和應(yīng)用張量。PyTorch的計(jì)算圖是捕獲深度學(xué)習(xí)模型中對(duì)張量進(jìn)行操作序列的基本組件。它在前向傳播過程中自動(dòng)跟蹤和記錄這些操作,創(chuàng)建動(dòng)態(tài)計(jì)算圖。計(jì)算圖對(duì)高效的自動(dòng)微分而言至關(guān)重要,允許在反向傳播過程中高效地計(jì)算梯度。通過利用計(jì)算圖,PyTorch能幫助實(shí)現(xiàn)高效的反向傳播,從而更輕松地優(yōu)化模型參數(shù)并有效地訓(xùn)練深度學(xué)習(xí)模型。PyTorch計(jì)算圖的一個(gè)主要優(yōu)點(diǎn)在于處理動(dòng)態(tài)模型架構(gòu)的靈活性,允許研究人員和從業(yè)者創(chuàng)建具有不同計(jì)算流程的模型,包括循環(huán)連接、條件分支,甚至自適應(yīng)網(wǎng)絡(luò)結(jié)構(gòu)。這種靈活性對(duì)于需要實(shí)時(shí)修改模型的高級(jí)研究和實(shí)驗(yàn)尤其有價(jià)值。通過動(dòng)態(tài)構(gòu)建計(jì)算圖,PyTorch讓用戶能夠探索復(fù)雜的網(wǎng)絡(luò)設(shè)計(jì),并推動(dòng)深度學(xué)習(xí)的邊界。06/41PyTorch的自動(dòng)微分功能是在神經(jīng)網(wǎng)絡(luò)訓(xùn)練中實(shí)現(xiàn)高效計(jì)算梯度的關(guān)鍵概念。通過在張量上設(shè)置requires_grad屬性,PyTorch會(huì)自動(dòng)跟蹤張量上的操作,并使用反向傳播算法計(jì)算梯度。這樣一來可使用基于梯度的優(yōu)化算法(如隨機(jī)梯度下降)來高效地優(yōu)化模型參數(shù)。PyTorch采用基于模塊的方法來構(gòu)建神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)模塊都是從基類nn.Module繼承而來的類,它們封裝了神經(jīng)網(wǎng)絡(luò)的層、激活函數(shù)和其他神經(jīng)網(wǎng)絡(luò)組件。這種模塊化設(shè)計(jì)簡化了在PyTorch中定義、組織和訓(xùn)練復(fù)雜神經(jīng)網(wǎng)絡(luò)架構(gòu)的流程。神經(jīng)網(wǎng)絡(luò)模塊提供了靈活性和重用性,使得構(gòu)建和嘗試不同的網(wǎng)絡(luò)結(jié)構(gòu)更加容易。07/41現(xiàn)在您已經(jīng)了解了PyTorch的工作原理,可開始定位有優(yōu)化空間的地方。本章將介紹性能調(diào)08/41在優(yōu)化系統(tǒng)之前,我們建議先定位系統(tǒng)中的瓶頸。這是因?yàn)槠款i可能因多種因素而異,例如數(shù)據(jù)集的大小、模型的復(fù)雜性以及使用的硬件。通過定位瓶頸,您可以將優(yōu)化工作集中在對(duì)性能影響最大的區(qū)域上。例如,如果數(shù)據(jù)集很大,瓶頸可能是數(shù)據(jù)加載步驟。如果模型非常復(fù)雜,瓶頸可能是模型訓(xùn)練步驟。在PyTorch中,瓶頸也可能因使用的特定代碼而異。例如,如果代碼未使用GPU加速,則瓶頸可能是CPU。但是,如果代碼使用了GPU加速,則瓶頸可能是GPU顯存或GPU之間的帶寬。通過定位系統(tǒng)中的瓶頸,您可以將優(yōu)化工作集中在對(duì)性能影響最大的區(qū)域上,從而顯著提升在本節(jié)中,我們將探討如何使用監(jiān)控工具來定位PyTorch訓(xùn)練中的瓶頸,并在接下來的章節(jié)中討論不同類型瓶頸的調(diào)優(yōu)技巧。2.1.1傳統(tǒng)命令行工具命令行工具對(duì)于監(jiān)控PyTorch訓(xùn)練和識(shí)別瓶頸非常有用。它們易于使用,可以從任何終端訪命令行工具只能提供有限的PyTorch訓(xùn)練過程視圖,不能提供有關(guān)導(dǎo)致瓶頸的具體操作信息。此外,對(duì)于不熟悉命令行工具的(通常是剛?cè)腴T的)用戶而言,命令行工具上手是比較困難的。09/41以下是常用于監(jiān)控資源使用情況的命令行工具列表:.nvidia-smi:該工具提供與NVIDIAGPU相關(guān)的GPU利用率、顯存使用率和其他相關(guān)指標(biāo)信息。.htop:這是一個(gè)命令行工具,以層次結(jié)構(gòu)化方式顯示系統(tǒng)進(jìn)程,并提供CPU和內(nèi)存使用情況的信息。.iotop:使用該工具可以監(jiān)控系統(tǒng)上運(yùn)行進(jìn)程的I/O使用情況。.nvtop:nvtop類似nvidia-smi,提供一套較為易用的展示界面,實(shí)時(shí)顯示GPU使用情況和其他指標(biāo)。.py-spy:這是一款針對(duì)Python代碼的采樣分析器,有助于定位代碼中產(chǎn)生性能瓶頸的位置。.strace:通過使用該工具能夠跟蹤程序?qū)ο到y(tǒng)的調(diào)用,從而了解其行為和資源使用的情況。2.1.2TensorBoardTensorBoard是一款可視化工具,可用于監(jiān)控PyTorch訓(xùn)練和定位瓶頸。它易于使用,并可通過任何Web瀏覽器訪問。TensorBoard可以監(jiān)控各種指標(biāo),包括數(shù)據(jù)加載時(shí)間、內(nèi)存拷貝以下是將TensorBoard與PyTorch集成的分步說明:.步驟1:安裝:通過運(yùn)行以下命令安裝TensorBoard:pippipinstalltorchtorchvisiontorch_tb_profilertensorboardfromtorch.utils.tensorboardimportSummaryWriter10/41.步驟3:初始化SummaryWriter:在您的Python腳本中創(chuàng)建SummaryWriter類的實(shí)例:writerwriter=SummaryWriter().步驟4:創(chuàng)建分析器來記錄執(zhí)行事件。示例如下:withwithfile(schedule=filer.schedule(wait=1,warmup=2,active=3,repeat=1),on_trace_ready=filer.tensorboard_trace_handler('./log/resnet50'),record_shapes=True,profile_memory=True,with_stack=True)asprof:forstep,datainenumerate(train_loader):train(data)prof.step().步驟5:啟動(dòng)TensorBoard。tensorboardtensorboard--logdir=./log.步驟6:在Web瀏覽器中打開TensorBoard的配置URLhttp://localhost:6006/#PyTorch_profiler您將看到如下的儀表盤:11/41在接下來的章節(jié)中,我們將討論如何從這個(gè)儀表盤中讀取信息。2.1.3Visdom對(duì)于PyTorch2.0而言,除非實(shí)現(xiàn)自己的SummaryWriter,否則TensorBoard將無法使用,但也可以使用Visdom代替。以下是將Visdom與PyTorch集成的分步說明:.步驟1:安裝:通過運(yùn)行以下命令安裝Visdom:pippipinstallvisdomimportimportvisdom.步驟3:啟動(dòng)Visdom服務(wù)器:通過在終端中運(yùn)行以下命令啟動(dòng)Visdom服務(wù)器,以提供可視化服務(wù):python-mvisdom.server12/41.步驟4:初始化Visdom:在Python腳本中創(chuàng)建visdom.Visdom類的實(shí)例:vizviz=visdom.Visdom().步驟5:創(chuàng)建一個(gè)用于監(jiān)控GPU利用率的函數(shù):定義一個(gè)函數(shù),用于監(jiān)控GPU利用率并使用Visdom更新可視化展示方式和結(jié)果,示例如下:defdefmonitor_gpu_utilization():whileTrue:#GetGPUutilizationusingPyTorchgpu_utilization=torch.cuda.max_memory_allocated()/(1024**3)#ConvertbytestoGB#UpdatetheVisdomplotviz.line(X=[i],Y=[gpu_utilization],win='gpu_util',opts={'title':'GPUUtilization','xlabel':'Time','ylabel':'Utilization(GB)'},update='append'ifi>0elseNone)#Sleepforacertainperiod(e.g.,1second)beforeupdatingtheplotagaintime.sleep(1).步驟6:開始監(jiān)控:啟動(dòng)監(jiān)控函數(shù),持續(xù)更新GPU利用率示圖。monitor_gpu_utilization()monitor_gpu_utilization()http://localhost:8097查看GPU利用率圖。該圖將實(shí)時(shí)更新,顯示GPU利用率隨時(shí)間變化的情況。是是是使用`使用`torch.as_tensor`函數(shù)。將`non_blocking`參數(shù)設(shè)置為使用DistributedDataParallel13/4114/41以上調(diào)優(yōu)流程提供了一種結(jié)構(gòu)化的方法,根據(jù)關(guān)鍵指標(biāo)來解決PyTorch性能瓶頸問題。您可以依據(jù)該決策樹來系統(tǒng)地定位相關(guān)的瓶頸,并應(yīng)用合適的優(yōu)化技術(shù)來提高PyTorch訓(xùn)練流程的效率和性能。I/O是訓(xùn)練過程中的主要瓶頸,這是因?yàn)閿?shù)據(jù)必須從存儲(chǔ)加載到GPU進(jìn)行處理。特別是當(dāng)您的數(shù)據(jù)集很大或位于遠(yuǎn)程存儲(chǔ)時(shí),這個(gè)過程可能非常耗時(shí)。根據(jù)我們與Uber、Shopee和支付寶等頂級(jí)科技公司的合作經(jīng)驗(yàn),數(shù)據(jù)加載可能占據(jù)端到端訓(xùn)練時(shí)間的近80%。優(yōu)化I/O后,我們通??梢詫?shí)現(xiàn)高達(dá)10倍的性能提升。中充分利用GPU,確保數(shù)據(jù)傳送到GPU的速度能和計(jì)算處理數(shù)據(jù)的速度相匹配。如果I/O速度您可以通過以下方式優(yōu)化I/O:.使用高性能的數(shù)據(jù)訪問層,在存儲(chǔ)之上搭建緩存機(jī)制。.并行化數(shù)據(jù)加載,例如使用多個(gè)PyTorchworker來加載數(shù)據(jù)。2.3.1將數(shù)據(jù)拷貝到本地NVMe(SSD)運(yùn)行的訓(xùn)練任務(wù)所需的數(shù)據(jù)預(yù)加載到NVMe硬盤中,將極大地加快數(shù)據(jù)加載速度。這種方法的局限性在于:.本地磁盤的存儲(chǔ)容量有限,可能無法容納整個(gè)訓(xùn)練數(shù)據(jù)集。.針對(duì)數(shù)據(jù)拷貝以及要及時(shí)從磁盤中刪除不活躍數(shù)據(jù)的管理任務(wù)十分繁重。15/412.3.2使用Alluxio作為高性能數(shù)據(jù)訪問層將數(shù)據(jù)拷貝到本地SSD存在不少局限性,而使用Alluxio作為高性能數(shù)據(jù)訪問層是更好的I/O優(yōu)化方式。Alluxio可帶來以下價(jià)值:.通過優(yōu)化I/O實(shí)現(xiàn)更快速的訓(xùn)練數(shù)據(jù)訪問。.通過減少數(shù)據(jù)拷貝的繁重管理任務(wù),提高數(shù)據(jù)工程團(tuán)隊(duì)的工作效率。.減少云存儲(chǔ)API和流量成本,如S3GET請(qǐng)求成本和數(shù)據(jù)傳輸成本等。.通過保持最佳I/O性能以及數(shù)據(jù)高吞吐率,確保GPU算力得到充分利用。以下是Alluxio與PyTorch共同部署的架構(gòu)圖??蓪lluxio與訓(xùn)練集群并置部署,從而獲得最大的性能優(yōu)勢。Alluxio的分布式緩存利用本地NVMe(SSD)盤來緩存遠(yuǎn)端的數(shù)據(jù)。按需加載時(shí)會(huì)從遠(yuǎn)端大規(guī)模存儲(chǔ)中讀取數(shù)據(jù),并使用LRU(最近最少使用)或FIFO(先進(jìn)先出)算法來驅(qū)逐不活躍的數(shù)據(jù)。3離線訓(xùn)練平臺(tái)3離線訓(xùn)練平臺(tái)1116/41KubernetesAlluxio個(gè) >>本地文件夾/數(shù)據(jù)集 >>Alluxio如圖所示,遠(yuǎn)端數(shù)據(jù)可以被掛載到本地文件夾,無需修改依賴本地?cái)?shù)據(jù)集進(jìn)行訓(xùn)練的已有代碼。整個(gè)數(shù)據(jù)集可以被掛載,但只有頻繁使用的數(shù)據(jù)會(huì)被緩存或存儲(chǔ)在本地磁盤中。Alluxio為熱讀取提供接近NVMeI/O帶寬的速度,而對(duì)于冷讀取則提供網(wǎng)絡(luò)I/O帶寬的讀取速度,從而提升訓(xùn)練數(shù)據(jù)的訪問性能。在I/O優(yōu)化以及高數(shù)據(jù)吞吐量的情況下,數(shù)據(jù)在訓(xùn)練流程的各個(gè)步驟中都被計(jì)算實(shí)例緩存在本本的同時(shí)實(shí)現(xiàn)更好的性能。以下是我們在ResNet50上實(shí)驗(yàn)得出的結(jié)果(對(duì)比S3-fuse更多信息可查看視頻。17/412.3.3啟用異步數(shù)據(jù)加載在PyTorch中,默認(rèn)情況下,數(shù)據(jù)加載是同步的,這意味著訓(xùn)練過程必須等待訓(xùn)練數(shù)據(jù)可用才能進(jìn)行。將num_workers的值設(shè)置大于0可以啟用異步數(shù)據(jù)加載。當(dāng)設(shè)置pin_memory=True時(shí),可以通過使用固定內(nèi)存(pinnedmemory)來實(shí)現(xiàn)從GPU的異步內(nèi)存拷貝。Pagebale?。。。㏄agebalePagebaleloader=Dataloader=DataLoader(data_set,num_workers=2,pin_memory=True)18/41請(qǐng)注意,pin_memory=True僅對(duì)張量的加載,或者張量的映射和可迭代對(duì)象的加載有幫助。pin_memory功能。classclassSimpleCustomBatch:def__init__(self,some_data):self.some_tensor=…#custommemorypinningmethodoncustomtypedefpin_memory(self):self.some_tensor.pin_memory()returnself2.4.1在正確的設(shè)備上創(chuàng)建張量我們強(qiáng)烈建議直接在打算執(zhí)行操作的設(shè)備上創(chuàng)建張量。例如下面的代碼,其中張量最初在cudaMemcpy函數(shù)在GPU和CPU之間傳輸數(shù)據(jù)。importimporttorchtensor_x=torch.randn([10,5]#TensercreatedonCPU’smemorydevice=torch.device("cuda")tensor_x=x.to(device)#TensormovedtoGPU’smemory19/41如果您通過性能儀表盤注意到內(nèi)存拷貝(memcpy)實(shí)際上是耗時(shí)很長的操作,并且也打算tensor_cudatensor_cuda=torch.randn((),device=device=torch.device('cuda'),dtype=dtype)通過直接在GPU上創(chuàng)建張量,可以避免不必要的內(nèi)存數(shù)據(jù)傳輸,進(jìn)而提升性能并降低開銷。該方法在處理深度學(xué)習(xí)任務(wù)中涉及大量GPU操作時(shí)特別有效。2.4.2使用torch.as_tensor(其他)使用torch.as_tensor()可以帶來幾個(gè)好處。與torch.tensor()不同,它能避免不必要的數(shù)據(jù)拷貝,將數(shù)據(jù)轉(zhuǎn)換為張量,并在可能的情況下共享底層數(shù)據(jù)和保留autograd歷史記錄。如果數(shù)據(jù)已經(jīng)是所請(qǐng)求的數(shù)據(jù)類型和設(shè)備上的張量,torch.as_tensor()將直接返回?cái)?shù)據(jù)本data.to(dtype=dtype,device=device)對(duì)數(shù)據(jù)進(jìn)行拷貝并創(chuàng)建一個(gè)新的張量。當(dāng)數(shù)據(jù)是所請(qǐng)求的數(shù)據(jù)類型和設(shè)備上的NumPy數(shù)組(ndarray)時(shí),torch.as_tensor()會(huì)使用torch.from_numpy()來構(gòu)建張量。這是在as_tensor()內(nèi)部調(diào)用的一個(gè)方法,相比使用torch.tensor(),它的速度要快得多。總之,torch.as_tensor()可高效地將數(shù)據(jù)轉(zhuǎn)換為張量,允許內(nèi)存共享并保留autograd歷史torch.as_tensor(),可以避免不必要的數(shù)據(jù)拷貝,從而提高性能并實(shí)現(xiàn)高效的張量創(chuàng)建。20/412.4.3將non_blocking設(shè)置為True以下示例展示了如何使用non_blocking=True并行加載數(shù)據(jù)到GPU設(shè)備內(nèi)存:datadata1=data1.to('cuda:0',non_blocking=True)#transfer1data2=data2.to('cuda:0',non_blocking=True)#transfer2output=model(data)#synchronouspoint如下圖所示,transfer1和transfer2可以并行處理。但是,模型訓(xùn)練必須等待數(shù)據(jù)被推送到SynchronousDataTransfertensor.to(...,non_blocking=False)TransferTransfer2TrainTransferTrainTransfer1AsynchronousDataTransfertensor.to(...,non_blocking=True)TransferTransfer1Transfer2Transfer2Train 重疊數(shù)據(jù)傳輸以節(jié)省運(yùn)行時(shí)間21/41##CreateCPUandGPUtensorscpu_tensor=torch.randn(32,3,224,224)gpu_tensor=torch.empty(32,3,224,224).cuda()#PerformasynchronouscopyfromCPUtoGPUwithnon_blocking=Truegpu_tensor.copy_(cpu_tensor,non_blocking=True)當(dāng)互不相關(guān)的數(shù)據(jù)傳輸和數(shù)據(jù)計(jì)算操作可能同時(shí)發(fā)生時(shí),使用non_blocking=True特別有效率。2.5.1如何選擇正確的GPUGPU的選擇是深度學(xué)習(xí)質(zhì)量的關(guān)鍵所在。以下是關(guān)于如何選擇最符合需求GPU的一些建議:.計(jì)算能力和顯存:選擇GPU時(shí)需考慮GPU的計(jì)算能力和顯存容量。較高的計(jì)算能力可以實(shí)現(xiàn)深度學(xué)習(xí)的高級(jí)功能和算法,而較大的顯存容量能處理更大的模型和數(shù)據(jù)集。選擇時(shí)應(yīng)確保GPU能滿足深度學(xué)習(xí)任務(wù)的需要。.性能與成本:評(píng)估GPU的性能成本比。根據(jù)預(yù)算和具體的深度學(xué)習(xí)需求,尋找符合性價(jià).與深度學(xué)習(xí)框架的兼容性:確認(rèn)選擇的GPU是否與主流的深度學(xué)習(xí)框架像PyTorch或Tensorflow兼容。查閱框架文檔或官方資源,獲取支持的GPU清單和推薦配置。22/41下圖展示不同GPU型號(hào)的計(jì)算能力:為了讓PyTorch代碼實(shí)現(xiàn)最大加速,應(yīng)考慮使用最新的NVIDIAGPU,例如A100,H100和V100。這些GPU能提供卓越的性能,特別是我們要在下一節(jié)中介紹的“pile”功能。23/41您可以使用下面的代碼確認(rèn)GPU是否可以利用PyTorch最新功能獲得最佳性能。//code//codefromPyTorchofficialsiteimporttorchimportwarningsgpu_ok=Falseiftorch.cuda.is_available():device_cap=torch.cuda.get_device_capability()ifdevice_capin((7,0),(8,0),(9,0)):gpu_ok=Trueifnotgpu_ok:warnings.warn("GPUisnotNVIDIAV100,A100,orH100.Speedupnumbersmaybelower""thanexpected.")參考上述建議選擇符合深度學(xué)習(xí)需求的GPU,即可確??焖俑咝У纳疃葘W(xué)習(xí)訓(xùn)練。2.5.2編譯模型您可以使用PyTorch2.0和最新型號(hào)的GPU(如A100)來編譯模型,并使用如下代碼://code//codefromPyTorchofficialsitedeffoo(x,y):a=torch.sin(x)b=torch.cos(y)returna+bopt_foo1=pile(foo)print(opt_foo1(torch.randn(10,10),torch.randn(10,10)))24/41您可以將想要優(yōu)化的任何Python函數(shù)傳遞給pile,然后使用pile的返回值作為優(yōu)化函數(shù)來替換原始函數(shù)。如果不想進(jìn)行顯式替換,也可以使用“@pile”裝飾現(xiàn)有碼中繼續(xù)使用原始函數(shù)名。//code//codefromPyTorchofficialsite@piledeffoo(x,y):a=torch.sin(x)b=torch.cos(y)returna+bprint(foo(torch.randn(10,10),torch.randn(10,10)))您還可以編譯模型,這對(duì)模型訓(xùn)練和測試均有幫助:modmod=MyModule()opt_mod=pile(mod)print(opt_mod(torch.randn(10,100)))請(qǐng)注意,通過pile優(yōu)化的函數(shù)和模型可能在初次迭代中花費(fèi)較長時(shí)間,因?yàn)楸仨殘?zhí)行模型編譯,但是在之后的迭代中,我們看到優(yōu)化后的函數(shù)和模型相較原始函數(shù)和模型呈現(xiàn)顯著加速效果。25/41PyTorch中的pile功能通過操作合并和圖捕獲使得函數(shù)執(zhí)行更快。操作合并將多個(gè)操作壓縮為更少的操作,減少開銷。圖捕獲在前向傳遞中支持動(dòng)態(tài)圖分析和優(yōu)化,可進(jìn)一步提升性能。兩者一起簡化執(zhí)行,消除冗余計(jì)算,提高PyTorch訓(xùn)練的整體效率。2.5.3使用DistributedDataParallel(DDP)在PyTorch中使用DistributedDataParallel(DDP)可跨多個(gè)GPU或機(jī)器實(shí)現(xiàn)分布式訓(xùn)練,從而顯著地提高計(jì)算能力并縮短訓(xùn)練時(shí)間。當(dāng)模型超出單個(gè)GPU的容量時(shí),DDP就變得很重要。importimporttorch.distributedasdistimporttorch.multiprocessingasmpfromtorch.nn.parallelimportDistributedDataParallelasDDPosos.environ['MASTER_ADDR']='localhost'os.environ['MASTER_PORT']='12355'dist.init_process_group("gloo",rank=rank,world_size=world_size)modelmodel=nn.Linear(10,10).to(rank)#yourexistingmodelddp_model=DDP(model,device_ids=[rank])#wrapthemodelasaDDPmodel26/41對(duì)于基本用例而言,DDP僅需要幾行額外代碼來設(shè)置進(jìn)程組。與眾所周知的DataParallel相.模型只復(fù)制一次.支持?jǐn)U展到多臺(tái)機(jī)器總而言之,在PyTorch中使用DDP可提供高效的多GPU訓(xùn)練,提高可擴(kuò)展性并簡化實(shí)現(xiàn)過程。但是,使用DDP也會(huì)產(chǎn)生通信開銷,增加內(nèi)存消耗,使得調(diào)試場景更復(fù)雜并且會(huì)依賴硬件和網(wǎng)絡(luò)配置。因此決定在PyTorch中使用DDP進(jìn)行分布式訓(xùn)練時(shí),應(yīng)仔細(xì)考慮上述因素。2.5.4使用低精度的數(shù)據(jù)類型PyTorch的低精度訓(xùn)練(RPT)使用較低精度的數(shù)值格式,例如用于模型參數(shù)和計(jì)算的半精度浮.顯存效率提高:低精度格式需要的顯存更少,允許在可用的GPU顯存限制下訓(xùn)練和部署更大規(guī)模的神經(jīng)網(wǎng)絡(luò)。.數(shù)據(jù)傳輸更快:低精度需要的顯存帶寬更小,因此在GPU顯存和其他組件之間的數(shù)據(jù)傳輸更快,整體性能得到提升。.數(shù)學(xué)運(yùn)算加速:數(shù)學(xué)運(yùn)算在低精度情況下運(yùn)行更快,特別是在有TensorCore支持的GPU上。例如,在A100GPU上float16的矩陣乘法和卷積可以比float32的快高達(dá)16倍。PyTorch的自動(dòng)混合精度(AMP)包推薦用于既需保持準(zhǔn)確性又要發(fā)揮低精度優(yōu)勢的場景。AMP可以識(shí)別需要高精度的步驟并對(duì)這些特定的步驟使用32位浮點(diǎn)數(shù),而在其他地方使用低精度(例如float16或bfloat16)。AMP中的autocast上下文管理器(autocastcontextmanager)或裝飾器(decorator)允許腳本的特定區(qū)域以混合精度方式運(yùn)行。通過在autocast中封裝網(wǎng)絡(luò)的前向傳遞(包括損失計(jì)算運(yùn)算操作會(huì)按照autocast選擇的特定數(shù)據(jù)類型執(zhí)行,從而既保持準(zhǔn)確性也提升性能。27/41withautocast(device_type='cuda',output=model(input)loss=loss_fn(output,target)dtype=torch.float16):注意,這里不推薦在autocast區(qū)域執(zhí)行反向傳播,因?yàn)榉聪虿僮鲬?yīng)當(dāng)以對(duì)應(yīng)的(autocast所選擇的)前向傳播操作的數(shù)據(jù)類型運(yùn)行。對(duì)于低精度訓(xùn)練的兼容性和支持可能因硬件架構(gòu)和軟件庫而異。建議使用支持FP16的硬件,特別是支持TensorCore。此外,對(duì)于低訓(xùn)練精度通常推薦使用Volta架構(gòu)或更高版本的通過利用低精度訓(xùn)練和PyTorch的混合精度包即可大幅節(jié)約顯存,加快數(shù)據(jù)傳輸以及數(shù)學(xué)運(yùn)算,提高深度學(xué)習(xí)模型的效率和性能。當(dāng)您的PyTorch訓(xùn)練作業(yè)瓶頸在于CPU時(shí),優(yōu)化CPU性能和減少計(jì)算瓶頸可顯著提高訓(xùn)練速度和效率。除了使用更高核數(shù)的CPU或?qū)iT用于高性能計(jì)算任務(wù)的CPU之外,以下也是針對(duì)PyTorch訓(xùn)練作業(yè)受限于CPU的優(yōu)化策略。2.6.1為結(jié)構(gòu)化數(shù)據(jù)使用更高效的文件格式Parquet和Arrow是兩種在設(shè)計(jì)上各有取舍的互補(bǔ)技術(shù)。Parquet是一種專注于最大化空間效率的存儲(chǔ)格式,而Arrow是一種用于矢量化計(jì)算內(nèi)核的優(yōu)化內(nèi)存格式。兩者之間主要的不同點(diǎn)在于Arrow提供對(duì)任何數(shù)組索引的O(1)隨機(jī)訪問查找能力,而Parquet不支持。Parquet通過dremelrecordshredding(記錄分解)、可變長度編碼方案、塊壓縮等技術(shù)來提高空間效率。但是,這些技術(shù)都是以喪失高性能隨機(jī)訪問查找為代價(jià)的。28/41有一種常見方法可利用這兩種技術(shù)優(yōu)勢,即將數(shù)據(jù)劃分成批(從類似parquet的壓縮格式讀出一千行,由千行組成一批然后將這些批數(shù)據(jù)以流式轉(zhuǎn)換成Arrow格式。然后,這些批數(shù)據(jù)便可以進(jìn)行逐個(gè)處理,既能利用到Arrow格式進(jìn)行高效計(jì)算,也能滿足內(nèi)存需求。計(jì)算得到的結(jié)果可以壓縮率更高的方式進(jìn)行累加和匯總。這種方法可以確保計(jì)算內(nèi)核對(duì)源數(shù)據(jù)和目標(biāo)數(shù)據(jù)的編碼方式無感知。根據(jù)2.1節(jié)中定位的瓶頸情況,如果瓶頸是CPU,則建議使用Arrow來節(jié)省CPU資源。Arrow的高效計(jì)算能力使其成為該場景下的合適選擇。如果瓶頸是IO,則使用Parquet可以幫助減少從磁盤加載或通過網(wǎng)絡(luò)傳輸?shù)淖止?jié)數(shù),從而優(yōu)化IO性能。通過定位具體的瓶頸并相應(yīng)地利用Parquet和Arrow的優(yōu)勢,可以在處理數(shù)據(jù)工作流時(shí)作出2.6.2啟用SIMDSIMD指單指令流多數(shù)據(jù)流,是一種允許在多個(gè)數(shù)據(jù)點(diǎn)上同時(shí)執(zhí)行同一指令的并行處理技術(shù)。該技術(shù)可顯著加速計(jì)算,減少需要執(zhí)行的指令數(shù)。覺任務(wù)而言,DALI的API與torchvision.transforms有著明顯不同,對(duì)用戶不太友好。因Pillow作為PIL的直接替代品,已經(jīng)因其超越其他圖像處理庫的速度優(yōu)勢而聞名,而Pillow-SIMD可以進(jìn)一步提升性能?;鶞?zhǔn)測試顯示,在相同硬件/平臺(tái)上,Pillow-SIMD比Pillow和其他庫(如ImageMagick,OpenCV,andIPP)快4-6倍。它通過使用可同時(shí)并行處理多數(shù)據(jù)點(diǎn)的SIMD技術(shù)來優(yōu)化常見的圖像操作指令,從而實(shí)現(xiàn)速度上的提升。29/41注意,在conda虛擬環(huán)境中安裝Pillow-SIMD時(shí),由于conda的自動(dòng)更新依賴處理,其他的Pillow-SIMD。首先,我們應(yīng)刪除以下包:pil,pillow,jpeg,libtiff和libjpeg-tubo:condacondauninstall-y--forcepillowpiljpeglibtifflibjpeg-turbopipuninstall-ypillowpiljpeglibtifflibjpeg-turbo然后,安裝pillow-simd并啟用SIMD:condacondainstall-ycconda-forgelibjpeg-turboCFLAGS="${CFLAGS}-mavx2"pipinstall--upgrade--no-cache-dir--force-reinstall--no-binary:all:--compilepillow-simd2.6.3使用更高效的內(nèi)存分配器在深度學(xué)習(xí)中,Jemalloc和TCMalloc相較于默認(rèn)的malloc內(nèi)存分配器是更優(yōu)的。它們能減少內(nèi)存碎片,優(yōu)化內(nèi)存分配和釋放,提高線程可擴(kuò)展性并高效地處理大內(nèi)存占用。此外,通過改善內(nèi)存管理,將開銷最小化,提高內(nèi)存利用率,提升模型訓(xùn)練任務(wù)的整體系統(tǒng)性通過更新環(huán)境變量LD_PRELOAD更改內(nèi)存分配器。exportexportLD_PRELOAD=jemalloc.so:$LD_PRELOADexportexportLD_PRELOAD=tcmalloc.so:$LD_PRELOAD30/4131/41支付寶是全球最大的移動(dòng)支付平臺(tái)之一,服務(wù)13億個(gè)人用戶和8000萬商戶。為了給用戶提供最佳體驗(yàn),支付寶依靠機(jī)器學(xué)習(xí)模型來支持各種功能,如欺詐檢測、風(fēng)險(xiǎn)評(píng)估和個(gè)性化推薦。然而,隨著支付寶用戶群和交易量的增長,公司開始在模型訓(xùn)練方面遭遇挑戰(zhàn)。計(jì)算和存儲(chǔ)性能之間的差異導(dǎo)致模型訓(xùn)練緩慢且效率低下。此外,專用硬件的高昂成本也給支付寶在預(yù)算方面帶來了壓力。為了應(yīng)對(duì)這些挑戰(zhàn),支付寶開始使用Alluxio—加速機(jī)器學(xué)習(xí)工作負(fù)載的統(tǒng)一數(shù)據(jù)訪問層。Alluxio提供位于計(jì)算層和存儲(chǔ)層之間的高性能緩存,降低延遲并提高吞吐量。使用Alluxio后,支付寶可以在普通硬件上訓(xùn)練模型,其性價(jià)比高于使用專用硬件。32/41除了提高性能,Alluxio還簡化了支付寶的數(shù)據(jù)管理。Alluxio提供按需數(shù)據(jù)訪問,免除了維護(hù)數(shù)據(jù)副本的需求。這使得數(shù)據(jù)工程師可以騰出時(shí)間專注于其他任務(wù),例如優(yōu)化模型性能。使用Alluxio后,支付寶的模型訓(xùn)練速度和效率都有了顯著提升。此外,基礎(chǔ)設(shè)施成本有所降低,數(shù)據(jù)工程師能有更多時(shí)間來專注于更具戰(zhàn)略性的任務(wù),了解更多?!霸卺槍?duì)我們的挑戰(zhàn)嘗試了各種方法后“在針對(duì)我們的挑戰(zhàn)嘗試了各種方法后,只有Alluxio能夠滿足我們對(duì)于AI大規(guī)模訓(xùn)練的要求。Alluxio大大促進(jìn)了我們在各個(gè)業(yè)務(wù)領(lǐng)域的AI訓(xùn)練工作?!?3/41知乎(NYSE:ZH)是中國領(lǐng)先的在線內(nèi)容社區(qū),目前擁有4億用戶、1億月活用戶和540億月瀏覽量。知乎訓(xùn)練自定義大語言模型(LLM)來支持其搜索和推薦功能。為了開發(fā)LLM,知乎需要一個(gè)高性能的數(shù)據(jù)訪問層有效地訪問來自多個(gè)云的數(shù)據(jù)。知乎團(tuán)隊(duì)在為LLM構(gòu)建高性能數(shù)據(jù)訪問層時(shí)面臨幾個(gè)挑戰(zhàn)。首先,需要找到一種方法高效地訪問來自多個(gè)云的數(shù)據(jù);其次,需要確保數(shù)據(jù)訪問層具有可擴(kuò)展性,能滿足LLM訓(xùn)練和部署不斷增長的需求;第三,需要確保數(shù)據(jù)訪問層是可靠的,并且能夠承受預(yù)期之外的故障。知乎團(tuán)隊(duì)選擇使用Alluxio作為LLM的高性能數(shù)據(jù)訪問層。Alluxio為模型訓(xùn)練和部署中的大規(guī)模數(shù)據(jù)訪問提供統(tǒng)一的加速解決方案。知乎部署Alluxio后,在性能、可擴(kuò)展性和可靠性方面都實(shí)現(xiàn)了顯著提升。LLM的訓(xùn)練速度提升了2-3倍,模型更新頻次由幾個(gè)小時(shí)或幾天提高到分鐘級(jí)別。此外,基礎(chǔ)設(shè)施成本也我們選擇將我們選擇將Alluxio作為高性能數(shù)據(jù)訪問層,解決我們遇到的技術(shù)挑戰(zhàn)。有了Alluxio,我們實(shí)現(xiàn)了90%的GPU利用率,基礎(chǔ)設(shè)施和運(yùn)營成本降低了50%,模型部署和更新速度從幾個(gè)小時(shí)加快到幾分鐘。34/41嗶哩嗶哩需要一個(gè)高性能的數(shù)據(jù)訪問層支持其不斷增長的機(jī)器學(xué)習(xí)工作負(fù)載,該公司之前的數(shù)據(jù)訪問層基于HDFS,但是無法滿足機(jī)器學(xué)習(xí)的需求。嗶哩嗶哩開始使用Alluxio作為機(jī)器學(xué)習(xí)的數(shù)據(jù)訪問層。Alluxio是一個(gè)分布式文件系統(tǒng),提供來自多個(gè)存儲(chǔ)系統(tǒng)的數(shù)據(jù)統(tǒng)一視圖。通過Alluxio,嗶哩嗶哩無需移動(dòng)數(shù)據(jù)即可訪問來自Alluxio提供了位于計(jì)算層和存儲(chǔ)層之間的高性能緩存,該緩存層降低了延遲并提高了吞吐量,從而顯著提高機(jī)器學(xué)習(xí)工作負(fù)載的性能。使用Alluxio后,嗶哩嗶哩的機(jī)器學(xué)習(xí)工作負(fù)載性能提升了3倍,此外,還降低了基礎(chǔ)設(shè)施成35/41AlluxioAlluxio在數(shù)據(jù)預(yù)處理和模型訓(xùn)練階段為我們的AI平臺(tái)提供了支持。使用Alluxio作為計(jì)算和存儲(chǔ)之間的數(shù)據(jù)層,我們的AI平臺(tái)提高了訓(xùn)練效率和模型準(zhǔn)確性,簡化了用戶側(cè)的數(shù)據(jù)訪問。36/4137/41本寶典介紹了優(yōu)化PyTorch模型訓(xùn)練性能的各種實(shí)踐和技術(shù)。.定位性能瓶頸:使用命令行工具和TensorBoard分析模型性能并定位瓶頸,解決這些瓶頸是優(yōu)化PyTorch模型訓(xùn)練的第一步。數(shù)據(jù)加載等技術(shù)可以顯著加快數(shù)據(jù)加載,縮短模型訓(xùn)練時(shí)間。.增強(qiáng)數(shù)據(jù)操作:使用torch.as_tensor函數(shù)在正確的設(shè)備上創(chuàng)建張量,并將non_blocking設(shè)置為True可以幫助優(yōu)化數(shù)據(jù)操作,提高整體性能。于充分利用GPU的處理能力至關(guān)重要。分配器等技術(shù)有助于優(yōu)化CPU處理,加速模型訓(xùn)練。.支付寶、知乎和嗶哩嗶哩的真實(shí)案例研究顯示:使用Alluxio作為數(shù)據(jù)訪問層可帶來加速端到端訓(xùn)練和提高GPU利用率的效果。采用這些優(yōu)化技術(shù)將確保資源的有效利用并加速模型訓(xùn)練,從而縮短AI驅(qū)動(dòng)型業(yè)務(wù)的上市時(shí)38/41如果想要進(jìn)一步加深理解,以及實(shí)施本電子書提供的相關(guān)優(yōu)化技術(shù),您可以參.PyTorch性能調(diào)優(yōu)指南:https://PyT/tutorials/recipes/recipes/tuning_guide.html/deeplearning/performance/index.html.充分解鎖Alluxio在AI基礎(chǔ)設(shè)施中的潛能:~詳細(xì)了解Alluxio的架構(gòu)、部署和配置最佳實(shí)踐:https://docs.alluxio.io/https://www.alluxio.io/product-school/~加入Alluxio社區(qū)Slack頻道,與11k+社區(qū)成員交流互動(dòng):https://alluxio.io/slack39/41[1]PyTorch:AnImperativeStyle,High-PerformanceDeepLearningLibrary:/pdf/1912.01703.pdf[2]PyTorchwebsite:https://PyT/[3]PyTorchGithubrepository:/PyTorch/PyTorch[4]PyTorchperformancetuningguide:https://PyT/tutorials/recipes
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全員A證考試附參考答案詳解(培優(yōu)a卷)
- 安全員A證考試綜合提升試卷(考點(diǎn)提分)附答案詳解
- 安全員A證考試能力測試備考題附參考答案詳解(培優(yōu))
- 安全員A證考試綜合檢測題型匯編(鞏固)附答案詳解
- 2025年內(nèi)蒙古興安盟單招職業(yè)傾向性測試題庫含答案詳解
- 安全員A證考試考前沖刺練習(xí)試題含答案詳解(滿分必刷)
- 2025年方言保護(hù)招聘考試題庫及參考答案解析
- 企業(yè)品牌推廣方案設(shè)計(jì)與執(zhí)行手冊
- 安全員A證考試綜合練習(xí)含完整答案詳解【名師系列】
- 安全員A證考試通關(guān)模擬題庫一套附答案詳解
- 綜合門診部管理制度
- 2025版6G智能軌道交通白皮書
- 《超純水制備培訓(xùn)資料》課件
- 定制手機(jī)采購合同協(xié)議
- CNAS-CL05-2009 實(shí)驗(yàn)室生物安全認(rèn)可準(zhǔn)則
- 2024-2025學(xué)年湖北省新高考聯(lián)考協(xié)作體高一上學(xué)期12月聯(lián)考生物B及答案
- 攻擊面管理技術(shù)應(yīng)用指南 2024
- 電梯井道腳手架搭設(shè)方案
- DL∕T 622-2012 立式水輪發(fā)電機(jī)彈性金屬塑料推力軸瓦技術(shù)條件
- 傳染病學(xué)-病毒性肝炎
- 重慶市沙坪壩小學(xué)小學(xué)語文五年級(jí)上冊期末試卷
評(píng)論
0/150
提交評(píng)論