Py accelerate的簡(jiǎn)介安裝使用方法詳解
accelerate的簡(jiǎn)介
Accelerate 是一個(gè)為 PyTorch 用戶設(shè)計(jì)的庫(kù),旨在幫助簡(jiǎn)化分布式訓(xùn)練和混合精度訓(xùn)練的過(guò)程。它提供了一種簡(jiǎn)單且靈活的方式來(lái)加速和擴(kuò)展您的 PyTorch 訓(xùn)練腳本,而無(wú)需編寫(xiě)冗長(zhǎng)的樣板代碼。使用戶能夠更輕松地利用大規(guī)模計(jì)算資源并加速模型訓(xùn)練過(guò)程。
2023年2月,Huggingface發(fā)布了Accelerate庫(kù),它可以在任何類型的設(shè)備上運(yùn)行你的原始PyTorch訓(xùn)練腳本。accelerate的易于集成的特點(diǎn)如下所示:
>> Accelerate是為PyTorch用戶設(shè)計(jì)的,它們喜歡編寫(xiě)PyTorch模型的訓(xùn)練循環(huán),但不愿意編寫(xiě)和維護(hù)使用多GPU/TPU/fp16所需的樣板代碼。
>> Accelerate僅抽象與多GPU/TPU/fp16相關(guān)的樣板代碼,并保持其余代碼不變。
當(dāng)您希望在分布式環(huán)境中輕松運(yùn)行您的訓(xùn)練腳本而又不希望放棄對(duì)訓(xùn)練循環(huán)的完全控制時(shí),您應(yīng)該使用Accelerate。這不是一個(gè)在PyTorch之上的高級(jí)框架,只是一個(gè)薄包裝,因此您不必學(xué)習(xí)一個(gè)新的庫(kù)。事實(shí)上,Accelerate的整個(gè)API只有一個(gè)類,即Accelerator對(duì)象。
但是,如果您不想自己編寫(xiě)訓(xùn)練循環(huán),那么您就不應(yīng)該使用Accelerate。有很多在PyTorch之上的高級(jí)庫(kù)可以提供這個(gè)功能,但Accelerate不是其中之一。
1、Accelerate 提供的主要功能和優(yōu)勢(shì):
分布式訓(xùn)練支持: Accelerate 可以幫助您在單個(gè)節(jié)點(diǎn)或多個(gè)節(jié)點(diǎn)上進(jìn)行分布式訓(xùn)練,包括多CPU、多GPU和TPU設(shè)置。它抽象出了與分布式訓(xùn)練相關(guān)的樣板代碼,使您可以專注于訓(xùn)練邏輯而不必?fù)?dān)心通信和同步問(wèn)題。
混合精度訓(xùn)練支持: Accelerate 提供了與混合精度訓(xùn)練(如半精度浮點(diǎn)數(shù))相關(guān)的工具和優(yōu)化。通過(guò)使用混合精度訓(xùn)練,您可以在幾乎不降低模型性能的同時(shí)減少內(nèi)存使用和計(jì)算成本。
設(shè)備放置和管理: Accelerate 可以自動(dòng)處理設(shè)備放置,將數(shù)據(jù)和模型移動(dòng)到正確的設(shè)備上,以便充分利用可用的計(jì)算資源。這簡(jiǎn)化了跨設(shè)備進(jìn)行訓(xùn)練的過(guò)程,并幫助您避免手動(dòng)管理設(shè)備分配的復(fù)雜性。
高度集成: Accelerate 可與 PyTorch 生態(tài)系統(tǒng)中的其他工具和庫(kù)無(wú)縫集成。它與常用的 PyTorch 數(shù)據(jù)加載器和優(yōu)化器兼容,并且可以與諸如 DeepSpeed、Megatron-LM 和 PyTorch Fully Sharded Data Parallel (FSDP) 等擴(kuò)展一起使用。
可配置的 CLI 工具: Accelerate 還提供了一個(gè)命令行界面 (CLI) 工具,使您能夠方便地配置和測(cè)試訓(xùn)練環(huán)境,而無(wú)需手動(dòng)編寫(xiě)啟動(dòng)腳本。
2、構(gòu)建在Accelerate之上的框架和庫(kù)
如果您喜歡Accelerate的簡(jiǎn)潔性,但希望在其功能上建立一個(gè)更高級(jí)的抽象層,一些構(gòu)建在Accelerate之上的框架和庫(kù)列在下面:
Animus | Animus是一個(gè)運(yùn)行機(jī)器學(xué)習(xí)實(shí)驗(yàn)的簡(jiǎn)約框架。Animus突出了ML實(shí)驗(yàn)中常見(jiàn)的“斷點(diǎn)”,并為它們提供了一個(gè)統(tǒng)一的界面。 |
Catalyst | Catalyst是一個(gè)用于深度學(xué)習(xí)研究和開(kāi)發(fā)的PyTorch框架。它專注于可重現(xiàn)性、快速實(shí)驗(yàn)和代碼重用,以便您可以創(chuàng)建新的東西,而不是編寫(xiě)另一個(gè)訓(xùn)練循環(huán)。Catalyst提供了一個(gè)Runner,用于連接實(shí)驗(yàn)的所有部分:硬件后端、數(shù)據(jù)轉(zhuǎn)換、模型訓(xùn)練和推理邏輯。 |
fastai | fastai是一個(gè)用于深度學(xué)習(xí)的PyTorch框架,它通過(guò)現(xiàn)代最佳實(shí)踐簡(jiǎn)化了快速訓(xùn)練和準(zhǔn)確的神經(jīng)網(wǎng)絡(luò)。fastai提供了一個(gè)Learner,用于處理深度學(xué)習(xí)算法的訓(xùn)練、微調(diào)和推理。 |
Finetuner | Finetuner是一個(gè)服務(wù),可以為語(yǔ)義搜索、視覺(jué)相似性搜索、跨模態(tài)文本<->圖像搜索、推薦系統(tǒng)、聚類、重復(fù)檢測(cè)、異常檢測(cè)或其他用途創(chuàng)建更高質(zhì)量的嵌入。 |
InvokeAI | InvokeAI是穩(wěn)定擴(kuò)散模型的創(chuàng)意引擎,提供業(yè)界領(lǐng)先的WebUI、終端使用支持,并作為許多商業(yè)產(chǎn)品的基礎(chǔ)。 |
Kornia | Kornia是一個(gè)可微分的庫(kù),可以將經(jīng)典計(jì)算機(jī)視覺(jué)集成到深度學(xué)習(xí)模型中。Kornia提供了一個(gè)Trainer,專門用于訓(xùn)練和微調(diào)庫(kù)中支持的深度學(xué)習(xí)算法。 |
Open Assistant | Open Assistant是一個(gè)基于聊天的助手,能夠理解任務(wù)、與其它系統(tǒng)進(jìn)行交互,并動(dòng)態(tài)檢索信息以完成任務(wù)。 |
pytorch-accelerated | pytorch-accelerated是一個(gè)輕量級(jí)的訓(xùn)練庫(kù),具有圍繞通用Trainer的簡(jiǎn)化功能集,非常注重簡(jiǎn)單性和透明性;使用戶可以了解底層發(fā)生了什么,但無(wú)需自己編寫(xiě)和維護(hù)樣板代碼! |
Stable Diffusion web UI | Stable Diffusion web UI是一個(gè)基于Gradio庫(kù)的開(kāi)源瀏覽器界面,用于穩(wěn)定擴(kuò)散。 |
torchkeras | torchkeras是一個(gè)簡(jiǎn)單的工具,可以以keras風(fēng)格訓(xùn)練pytorch模型,在notebook中提供了一個(gè)動(dòng)態(tài)且美觀的繪圖,用于監(jiān)視您的損失或指標(biāo)。 |
accelerate的安裝
1、安裝
本存儲(chǔ)庫(kù)在Python 3.8+和PyTorch 1.10.0+上進(jìn)行了測(cè)試,建議在虛擬環(huán)境中安裝Accelerate
首先,使用您要使用的Python版本創(chuàng)建一個(gè)虛擬環(huán)境并激活它。
然后,您將需要安裝PyTorch:請(qǐng)參閱官方安裝頁(yè)面以了解適用于您平臺(tái)的特定安裝命令。然后,可以使用pip安裝Accelerate,如下所示:
pip install accelerate
(1)、支持的集成
僅CPU
單個(gè)節(jié)點(diǎn)(機(jī)器上的多CPU)
多個(gè)節(jié)點(diǎn)(機(jī)器上的多CPU)
單個(gè)GPU
單個(gè)節(jié)點(diǎn)上的多GPU(機(jī)器上的多GPU)
多個(gè)節(jié)點(diǎn)上的多GPU(機(jī)器上的多GPU)
TPU
FP16/BFloat16混合精度
具有Transformer Engine的FP8混合精度
DeepSpeed支持(實(shí)驗(yàn)性)
PyTorch Fully Sharded(實(shí)驗(yàn)性)
2、啟動(dòng)腳本
>> Accelerate還提供了一個(gè)可選的命令行工具,允許您在啟動(dòng)腳本之前快速配置和測(cè)試您的訓(xùn)練環(huán)境。無(wú)需記住如何使用torch.distributed.run或編寫(xiě)特定的TPU訓(xùn)練啟動(dòng)器!在您的機(jī)器上只需運(yùn)行:
accelerate config
然后回答所提出的問(wèn)題。這將生成一個(gè)配置文件,將在執(zhí)行以下命令時(shí)自動(dòng)使用以正確設(shè)置默認(rèn)選項(xiàng):
accelerate launch my_script.py --args_to_my_script
例如,以下是如何在MRPC任務(wù)上運(yùn)行GLUE示例(從repo的根目錄):
accelerate launch examples/nlp_example.py
此CLI工具是可選的,您仍然可以根據(jù)需要使用python my_script.py或python -m torchrun my_script.py。
3、使用MPI啟動(dòng)多CPU運(yùn)行
這是另一種使用MPI啟動(dòng)多CPU運(yùn)行的方法。您可以在此頁(yè)面上了解如何安裝Open MPI。您也可以使用Intel MPI或MVAPICH。一旦在您的集群上設(shè)置了MPI,只需運(yùn)行:
mpirun -np 2 python examples/nlp_example.py
4、使用DeepSpeed啟動(dòng)訓(xùn)練
Accelerate支持使用DeepSpeed在單個(gè)/多個(gè)GPU上進(jìn)行訓(xùn)練。要使用它,您不需要更改訓(xùn)練代碼中的任何內(nèi)容;您可以使用accelerate config來(lái)設(shè)置所有內(nèi)容。但是,如果您希望從Python腳本中調(diào)整DeepSpeed相關(guān)參數(shù),我們?yōu)槟峁┝薉eepSpeedPlugin。
from accelerate import Accelerator, DeepSpeedPlugin # deepspeed需要預(yù)先知道梯度累積步數(shù),所以不要忘記傳遞它。請(qǐng)記住,您仍然需要自己進(jìn)行梯度累積,就像您在沒(méi)有使用deepspeed時(shí)所做的那樣 deepspeed_plugin = DeepSpeedPlugin(zero_stage=2, gradient_accumulation_steps=2) accelerator = Accelerator(mixed_precision='fp16', deepspeed_plugin=deepspeed_plugin) # 如何保存您的Transformer? accelerator.wait_for_everyone() unwrapped_model = accelerator.unwrap_model(model) unwrapped_model.save_pretrained(save_dir, save_function=accelerator.save, state_dict=accelerator.get_state_dict(model))
注意:目前DeepSpeed支持處于實(shí)驗(yàn)階段。如果遇到問(wèn)題,請(qǐng)?zhí)岢鰡?wèn)題。
5、從notebook啟動(dòng)訓(xùn)練
Accelerate還提供了一個(gè)notebook_launcher函數(shù),您可以在筆記本中使用它來(lái)啟動(dòng)分布式訓(xùn)練。這對(duì)于具有TPU后端的Colab或Kaggle筆記本特別有用。只需在一個(gè)訓(xùn)練功能中定義您的訓(xùn)練循環(huán),然后在您的最后一個(gè)單元格中添加:
from accelerate import notebook_launcher notebook_launcher(training_function)
您可以在此notebook中找到一個(gè)示例。在Colab中打開(kāi)
accelerate的使用方法
1、基礎(chǔ)用法
(1)、可以在任何類型的單節(jié)點(diǎn)或分布式節(jié)點(diǎn)設(shè)置:向任何標(biāo)準(zhǔn)的PyTorch訓(xùn)練腳本添加5行代碼
如您在這個(gè)例子中所見(jiàn),通過(guò)向任何標(biāo)準(zhǔn)的PyTorch訓(xùn)練腳本添加5行代碼,您現(xiàn)在可以在任何類型的單節(jié)點(diǎn)或分布式節(jié)點(diǎn)設(shè)置(單CPU,單GPU,多GPU和TPU),以及帶或不帶混合精度(fp16)下運(yùn)行。
import torch
import torch.nn.functional as F
from datasets import load_dataset
+ from accelerate import Accelerator
+ accelerator = Accelerator()
- device = 'cpu'
+ device = accelerator.device
model = torch.nn.Transformer().to(device)
optimizer = torch.optim.Adam(model.parameters())
dataset = load_dataset('my_dataset')
data = torch.utils.data.DataLoader(dataset, shuffle=True)
+ model, optimizer, data = accelerator.prepare(model, optimizer, data)
model.train()
for epoch in range(10):
for source, targets in data:
source = source.to(device)
targets = targets.to(device)
optimizer.zero_grad()
output = model(source)
loss = F.cross_entropy(output, targets)
- loss.backward()
+ accelerator.backward(loss)
optimizer.step()特別地,相同的代碼可以在本地機(jī)器上進(jìn)行調(diào)試,也可以在您的訓(xùn)練環(huán)境中運(yùn)行,而無(wú)需修改。
(2)、處理設(shè)備放置
Accelerate甚至為您處理設(shè)備放置(這需要對(duì)您的代碼進(jìn)行一些更改,但通常更安全),因此您甚至可以進(jìn)一步簡(jiǎn)化訓(xùn)練循環(huán):
import torch
import torch.nn.functional as F
from datasets import load_dataset
+ from accelerate import Accelerator
- device = 'cpu'
+ accelerator = Accelerator()
- model = torch.nn.Transformer().to(device)
+ model = torch.nn.Transformer()
optimizer = torch.optim.Adam(model.parameters())
dataset = load_dataset('my_dataset')
data = torch.utils.data.DataLoader(dataset, shuffle=True)
+ model, optimizer, data = accelerator.prepare(model, optimizer, data)
model.train()
for epoch in range(10):
for source, targets in data:
- source = source.to(device)
- targets = targets.to(device)
optimizer.zero_grad()
output = model(source)
loss = F.cross_entropy(output, targets)
- loss.backward()
+ accelerator.backward(loss)
optimizer.step()相關(guān)文章
PyTorch中的C++擴(kuò)展實(shí)現(xiàn)
這篇文章主要介紹了PyTorch中的C++擴(kuò)展實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
python socket多線程通訊實(shí)例分析(聊天室)
這篇文章主要介紹了python socket多線程通訊方法,以聊天室程序?qū)嵗治隽薖ython基于Socket實(shí)現(xiàn)多線程通信的相關(guān)技巧,需要的朋友可以參考下2016-04-04
詳談python3中用for循環(huán)刪除列表中元素的坑
下面小編就為大家分享一篇詳談python3中用for循環(huán)刪除列表中元素的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
解決pycharm運(yùn)行程序出現(xiàn)卡住scanning files to index索引的問(wèn)題
今天小編就為大家分享一篇解決pycharm運(yùn)行程序出現(xiàn)卡住scanning files to index索引的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Python3使用正則表達(dá)式爬取內(nèi)涵段子示例
這篇文章主要介紹了Python3使用正則表達(dá)式爬取內(nèi)涵段子,涉及Python正則匹配與文件讀寫(xiě)相關(guān)操作技巧,需要的朋友可以參考下2018-04-04
使用Python高效獲取網(wǎng)絡(luò)數(shù)據(jù)的操作指南
網(wǎng)絡(luò)爬蟲(chóng)是一種自動(dòng)化程序,用于訪問(wèn)和提取網(wǎng)站上的數(shù)據(jù),Python是進(jìn)行網(wǎng)絡(luò)爬蟲(chóng)開(kāi)發(fā)的理想語(yǔ)言,擁有豐富的庫(kù)和工具,使得編寫(xiě)和維護(hù)爬蟲(chóng)變得簡(jiǎn)單高效,本文將詳細(xì)介紹如何使用Python進(jìn)行網(wǎng)絡(luò)爬蟲(chóng)開(kāi)發(fā),包括基本概念、常用庫(kù)、數(shù)據(jù)提取方法、反爬措施應(yīng)對(duì)以及實(shí)際案例2025-03-03

