文章目錄
- 一、關于 DeepSpeed
- 1、DeepSpeed 是什么
- 2、深度學習訓練和推理的極致速度和規模
- 3、DeepSpeed 的四大創新支柱
- 1)DeepSpeed 訓練
- 2)DeepSpeed 推理
- 3)DeepSpeed 壓縮
- 4)DeepSpeed4Science
- 4、DeepSpeed 軟件套件
- DeepSpeed 庫
- 推理模型實現 (MII)
- Azure 上的 DeepSpeed
- 5、DeepSpeed Adoption
- 6、構建管道狀態
- 二、安裝
- 要求
- 貢獻的硬件支持
- PyPI
- Windows
- 特征
- 三、編寫 DeepSpeed 模型
- 訓練
- 模型檢查點
- DeepSpeed 配置
- 四、啟動 DeepSpeed 訓練
- 資源配置(多節點)
- 多節點環境變量
- MPI 和 AzureML 兼容性
- 資源配置(單節點)
一、關于 DeepSpeed
1、DeepSpeed 是什么
DeepSpeed is a deep learning optimization library that makes distributed training and inference easy, efficient, and effective.
- 官網:https://www.deepspeed.ai
https://www.microsoft.com/en-us/research/project/deepspeed/ - github : https://github.com/microsoft/DeepSpeed
- 入門 : https://www.deepspeed.ai/getting-started/ 使用 DeepSpeed 的第一步
- DeepSpeed JSON 配置 : https://www.deepspeed.ai/docs/config-json/
- API文檔 : https://deepspeed.readthedocs.io/en/latest/ 生成的 DeepSpeed API 文檔
- 教程 : https://www.deepspeed.ai/tutorials/
- 博客 : https://www.deepspeed.ai/posts/
教程
- Deepspeed大模型分布式框架精講
https://www.bilibili.com/video/BV1mc411y7jW/
2、深度學習訓練和推理的極致速度和規模
DeepSpeed 支持世界上最強大的語言模型,例如MT-530B和BLOOM 。
它是一款易于使用的深度學習優化軟件套件,可為訓練和推理提供前所未有的規模和速度。借助 DeepSpeed,您可以:
- 訓練/推理 具有數十億或數萬億參數的密集或稀疏模型
- 實現出色的系統吞吐量 并 有效擴展到數千個 GPU
- 在資源受限的 GPU 系統上進行 訓練/推理
- 實現前所未有的低延遲和高吞吐量的推理
- 以低成本實現極限壓縮,實現無與倫比的推理延遲和模型尺寸減小
3、DeepSpeed 的四大創新支柱
1)DeepSpeed 訓練
DeepSpeed 提供了系統創新的融合,使大規模深度學習訓練變得有效、高效,大大提高了易用性,并在可能的規模方面重新定義了深度學習訓練格局。
ZeRO、3D-Parallelism、DeepSpeed-MoE、ZeRO-Infinity 等創新屬于訓練支柱。了解更多:DeepSpeed 訓練
2)DeepSpeed 推理
DeepSpeed 匯集了張量、管道、專家和零并行等并行技術的創新,并將它們與高性能定制推理內核、通信優化和異構內存技術相結合,以前所未有的規模實現推理,同時實現無與倫比的延遲、吞吐量和性能。
降低成本。這種推理系統技術的系統組合屬于推理支柱。了解更多:DeepSpeed-推理
3)DeepSpeed 壓縮
為了進一步提高推理效率,DeepSpeed 為研究人員和從業人員提供易于使用且組合靈活的壓縮技術 來壓縮他們的模型,同時提供更快的速度、更小的模型大小并顯著降低的壓縮成本。
此外,ZeroQuant 和 XTC 等 SoTA 在壓縮方面的創新也包含在壓縮支柱下。了解更多:DeepSpeed 壓縮
4)DeepSpeed4Science
秉承微軟解決人類最緊迫挑戰的使命,微軟 DeepSpeed 團隊響應這一機遇,推出了一項名為DeepSpeed4Science的新計劃,旨在通過人工智能系統技術創新構建獨特的能力,幫助領域專家解開當今最大的科學謎團。 了解更多信息:DeepSpeed4Science 網站和教程
4、DeepSpeed 軟件套件
DeepSpeed 庫
https://github.com/microsoft/DeepSpeed
DeepSpeed庫實現并將 DeepSpeed 訓練、推理和壓縮支柱中的創新和技術打包到一個易于使用的開源存儲庫中。
它允許在單個訓練、推理或壓縮管道中輕松組合多個特征。
DeepSpeed 庫被 DL 社區廣泛采用,并已用于啟用一些最強大的模型(請參閱DeepSpeed 采用)。
推理模型實現 (MII)
推理模型實現 (MII) 是一個開源存儲庫,通過減輕應用復雜系統優化技術本身的需要,使所有數據科學家都可以進行低延遲和高吞吐量的推理。
MII 開箱即用,支持數千種廣泛使用的深度學習模型,并使用 DeepSpeed-Inference 進行優化,只需幾行代碼即可部署,同時與普通開源版本相比,延遲顯著降低。
Azure 上的 DeepSpeed
DeepSpeed 用戶多種多樣,可以訪問不同的環境。我們建議嘗試 Azure 上的 DeepSpeed,因為這是最簡單、最容易的方法。
在 Azure 上嘗試 DeepSpeed 的推薦方法是通過 AzureML recipes。
作業提交和數據準備腳本已在此處提供。有關如何在 Azure 上使用 DeepSpeed 的更多詳細信息,請遵循Azure 教程。
5、DeepSpeed Adoption
DeepSpeed 是 Microsoft 新的 大規模 AI 計劃的重要組成部分,該計劃旨在大規模實現下一代 AI 功能,您可以在此處找到更多信息。
DeepSpeed 已被用于訓練許多不同的大型模型,下面列出了我們所知道的幾個示例(如果您想包含您的模型,請提交 PR):
- Megatron-Turing NLG (530B)
- Jurassic-1 (178B)
- BLOOM (176B)
- GLM (130B)
- xTrimoPGLM (100B)
- YaLM (100B)
- GPT-NeoX (20B)
- AlexaTM (20B)
- Turing NLG (17B)
- METRO-LM (5.4B)
DeepSpeed 已與多種不同的流行開源深度學習框架集成,例如:
文檔 | |
---|---|
![]() | Transformers with DeepSpeed |
![]() | 使用 DeepSpeed 加速 |
![]() | Lightning with DeepSpeed |
![]() | MosaicML with DeepSpeed |
![]() | Determined with DeepSpeed |
![]() | MMEngine with DeepSpeed |
6、構建管道狀態
Description | Status |
---|---|
NVIDIA | ![]() ![]() ![]() ![]() ![]() ![]() |
AMD | ![]() |
CPU | ![]() ![]() |
Intel Gaudi | ![]() |
Intel XPU | ![]() |
PyTorch Nightly | ![]() |
Integrations | ![]() ![]() ![]() ![]() ![]() ![]() |
Misc | ![]() ![]() ![]() ![]() |
二、安裝
開始使用 DeepSpeed 的最快方法是通過 pip,這將安裝最新版本的 DeepSpeed,該版本不依賴于特定的 PyTorch 或 CUDA 版本。
DeepSpeed 包含多個 C++/CUDA 擴展,我們通常將其稱為 ops
。
默認情況下,所有這些 extensions/ops 都將使用 torch 的 JIT C++ 擴展加載器即時構建(JIT),該加載器依賴 ninja在運行時構建和動態鏈接它們。
要求
- 在安裝 DeepSpeed之前必須安裝PyTorch 。
- 為了獲得完整的功能支持,我們建議使用 >= 1.9 的 PyTorch 版本,最好是最新的 PyTorch 穩定版本。
- CUDA 或 ROCm 編譯器,例如nvcc或hipcc,用于編譯 C++/CUDA/HIP 擴展。
- 下面列出了我們開發和測試的特定 GPU,這并不意味著您的 GPU 如果不屬于此類別就無法工作,只是 DeepSpeed 在以下方面進行了最充分的測試:
- NVIDIA:Pascal、Volta、Ampere 和 Hopper 架構
- AMD:MI100 和 MI200
貢獻的硬件支持
- DeepSpeed 現在支持各種硬件加速器。
貢獻者 | 硬件 | 加速器名稱 | 貢獻者已驗證 | 上游驗證 |
---|---|---|---|---|
華為 | 華為升騰NPU | 西北大學 | 是的 | 不 |
英特爾 | 英特爾? Gaudi? 2 人工智能加速器 | 高壓泵 | 是的 | 是的 |
英特爾 | 英特爾? 至強? 處理器 | 中央處理器 | 是的 | 是的 |
英特爾 | 英特爾? 數據中心 GPU Max 系列 | xpu | 是的 | 是的 |
PyPI
我們定期將版本推送到PyPI,并鼓勵用戶在大多數情況下從那里安裝。
pip install deepspeed
安裝后,您可以驗證安裝并通過 DeepSpeed 環境報告查看您的計算機與哪些擴展/操作兼容。
ds_report
如果您想預安裝任何 DeepSpeed 擴展/操作(而不是 JIT 編譯)或通過 PyPI 安裝預編譯操作,請參閱我們的高級安裝說明。
Windows
DeepSpeed 部分支持 Windows 支持。在 Windows 上,您可以通過以下步驟構建輪子,目前僅支持推理模式。
- 安裝pytorch,如pytorch 1.8 + cuda 11.1
- 安裝Visual cpp構建工具,例如VS2019 C++ x64/x86構建工具
- 使用管理員權限啟動 cmd 控制臺以創建所需的符號鏈接文件夾
- 運行以在文件夾
python setup.py bdist_wheel
中構建輪子dist
特征
請查看DeepSpeed-Training、DeepSpeed-Inference和DeepSpeed- Compression頁面,了解這三個支柱提供的全套功能。
三、編寫 DeepSpeed 模型
翻譯自:https://www.deepspeed.ai/getting-started/ (最后更新于 2024-05-14)
DeepSpeed 模型訓練是使用 DeepSpeed 引擎完成的。
該引擎可以包裝任何類型的任意模型torch.nn.module
,并具有用于訓練和檢查模型的最小 API 集。請參閱教程以獲取詳細示例。
初始化 DeepSpeed 引擎:
model_engine, optimizer, _, _ = deepspeed.initialize(args=cmd_args,model=model, model_parameters=params)
deepspeed.initialize
確保分布式數據并行 或 混合精度訓練 所需的所有必要設置 都在幕后適當完成。
除了包裝模型之外,DeepSpeed 還可以根據傳遞給 deepspeed.initialize
和 DeepSpeed 配置文件 的參數構建和管理訓練優化器、數據加載器和學習率調度器。
請注意,DeepSpeed 在每個訓練步驟中自動執行學習率計劃。
如果您已經有分布式環境設置,則需要替換:
torch.distributed.init_process_group(...)
為:
deepspeed.init_distributed()
默認情況下是使用 NCCL 后端,DeepSpeed 已對其進行了全面測試,但您也可以覆蓋默認值。
但如果您在 deepspeed.initialize()
之前不需要 分布式環境設置,則不必使用此功能,因為 DeepSpeed 會在其initialize
后自動初始化分布式環境。
無論如何,你需要刪除 torch.distributed.init_process_group
,如果您已經安裝了它。
訓練
DeepSpeed 引擎初始化后,就可以使用三個簡單的 API 來訓練模型,分別用于前向傳播(可調用對象)、后向傳播 ( backward
) 和權重更新 ( step
)。
for step, batch in enumerate(data_loader):#forward() methodloss = model_engine(batch)#runs backpropagationmodel_engine.backward(loss)#weight updatemodel_engine.step()
在底層,DeepSpeed 使用預定義的學習率調度程序以混合精度自動執行分布式數據并行訓練所需的必要操作:
- 梯度平均:在分布式數據并行訓練中,
backward
確保在train_batch_size
訓練后,在數據并行過程中 對梯度進行平均。 - 損失縮放:在 FP16/混合精度訓練中,DeepSpeed 引擎自動處理損失縮放以避免梯度中的精度損失。
- 學習率調度程序:當使用 DeepSpeed 的學習率調度程序(在文件中指定
ds_config.json
)時,DeepSpeedstep()
在每個訓練步驟(model_engine.step()
執行時)調用調度程序的方法。不使用 DeepSpeed 的學習率調度程序時:- 如果計劃應該在每個訓練步驟執行,則用戶可以 在初始化 DeepSpeed 引擎時將計劃程序傳遞給
deepspeed.initialize
,并讓 DeepSpeed 管理它以進行更新或保存/恢復。 - 如果計劃應該以任何其他間隔(例如,訓練時期)執行,則用戶不應在初始化期間將計劃程序傳遞給 DeepSpeed,并且必須顯式管理它。
- 如果計劃應該在每個訓練步驟執行,則用戶可以 在初始化 DeepSpeed 引擎時將計劃程序傳遞給
模型檢查點
保存和加載訓練狀態是通過 DeepSpeed 中的save_checkpoint
和 load_checkpoint
API 處理的,采用兩個參數來唯一標識檢查點:
ckpt_dir
:保存檢查點的目錄。ckpt_id
:唯一標識目錄中檢查點的標識符。
在下面的代碼片段中,我們使用損失值作為檢查點標識符。
# load checkpoint
_, client_sd = model_engine.load_checkpoint(args.load_dir, args.ckpt_id)
step = client_sd['step']# advance data loader to ckpt step
dataloader_to_step(data_loader, step + 1)for step, batch in enumerate(data_loader):#forward() methodloss = model_engine(batch)#runs backpropagationmodel_engine.backward(loss)#weight updatemodel_engine.step()#save checkpointif step % args.save_interval:client_sd['step'] = stepckpt_id = loss.item()model_engine.save_checkpoint(args.save_dir, ckpt_id, client_sd = client_sd)
DeepSpeed 可以自動保存和恢復模型、優化器和學習率調度器狀態,同時向用戶隱藏這些詳細信息。
但是,用戶可能希望保存給定模型訓練所獨有的附加數據。為了支持這些項目,
save_checkpoint
接受客戶端狀態字典client_sd
進行保存。
這些項目可以load_checkpoint
作為返回參數來檢索。
在上面的示例中,該step
值存儲為client_sd
.
重要提示:所有進程都必須調用此方法,而不僅僅是排名為 0 的進程。
這是因為每個進程都需要保存其主權重和調度程序+優化器狀態。
如果僅針對排名為 0 的進程調用此方法,則該方法將掛起等待與其他進程同步。
DeepSpeed 配置
可以使用應指定為 .json 的配置 JSON 文件來啟用、禁用或配置 DeepSpeed 功能args.deepspeed_config
。
下面顯示了示例配置文件。有關完整的功能集,請參閱API 文檔。
{"train_batch_size": 8,"gradient_accumulation_steps": 1,"optimizer": {"type": "Adam","params": {"lr": 0.00015}},"fp16": {"enabled": true},"zero_optimization": true
}
四、啟動 DeepSpeed 訓練
deepspeed
DeepSpeed 安裝啟動分布式訓練的入口點。我們通過以下假設來說明 DeepSpeed 的示例用法:
- 您已經將 DeepSpeed 集成到您的模型中
client_entry.py
是您模型的入口腳本client args
是argparse
命令行參數ds_config.json
是 DeepSpeed 的配置文件
資源配置(多節點)
DeepSpeed 使用與OpenMPI和Horovod兼容的主機文件配置多節點計算資源 。
主機文件是主機名(或 SSH 別名)(可通過無密碼 SSH 訪問的計算機)和插槽計數(指定系統上可用的 GPU 數量)的列表。例如,
worker-1 slots=4
worker-2 slots=4
指定名為worker-1和worker-2的兩臺機器各有四個GPU用于訓練。
主機文件是使用--hostfile
命令行選項指定的。如果未指定主機文件,DeepSpeed 將搜索/job/hostfile
.如果未指定或未找到主機文件,DeepSpeed 會查詢本地計算機上的 GPU 數量以發現可用的本地插槽數量。
以下命令在 中指定的所有可用節點和 GPU 上啟動 PyTorch 訓練作業myhostfile
:
deepspeed --hostfile=myhostfile <client_entry.py> <client args> \--deepspeed --deepspeed_config ds_config.json
或者,DeepSpeed 允許您將模型的分布式訓練限制為可用節點和 GPU 的子集。此功能通過兩個命令行參數啟用:--num_nodes
和--num_gpus
。例如,可以使用以下命令將分布式訓練限制為僅使用兩個節點:
deepspeed --num_nodes=2 \<client_entry.py> <client args> \--deepspeed --deepspeed_config ds_config.json
--include
您可以使用和 --exclude
標志來包含或排除特定資源。
例如,要使用節點 worker-2上 除 GPU 0 之外的所有可用資源以及 worker-3 上的GPU 0和1 :
deepspeed --exclude="worker-2:0@worker-3:0,1" \<client_entry.py> <client args> \--deepspeed --deepspeed_config ds_config.json
同樣,您只能在 worker-2 上使用GPU 0和1 :
deepspeed --include="worker-2:0,1" \<client_entry.py> <client args> \--deepspeed --deepspeed_config ds_config.json
多節點環境變量
當跨多個節點進行訓練時,我們發現支持傳播用戶定義的環境變量很有用。
默認情況下,DeepSpeed 將傳播設置的所有 NCCL 和 PYTHON 相關環境變量。
如果您想傳播其他變量,您可以在名為的點文件中指定它們,.deepspeed_env
該文件包含換行符分隔的條目列表 VAR=VAL
。
DeepSpeed 啟動器將查找您正在執行的本地路徑以及您的主目錄 ( ~/
)。
如果您想用自己的文件或路徑和名稱覆蓋該文件的默認名稱,則可以使用環境變量DS_ENV_FILE
.如果您要啟動多個需要不同變量的作業,這非常有用。
作為一個具體示例,某些集群需要在訓練之前設置特殊的 NCCL 變量。用戶可以簡單地將這些變量添加到 .deepspeed_env
其主目錄中的文件中,如下所示:
NCCL_IB_DISABLE=1
NCCL_SOCKET_IFNAME=eth0
然后,DeepSpeed 將確保在訓練作業中的每個節點上啟動每個進程時設置這些環境變量。
MPI 和 AzureML 兼容性
如上所述,DeepSpeed 提供了自己的并行啟動器來幫助啟動多節點/多 GPU 訓練作業。如果您更愿意使用 MPI(例如 mpirun)啟動訓練作業,我們會為此提供支持。應該注意的是,DeepSpeed 仍將使用 torch 分布式 NCCL 后端,而不是MPI 后端。
要使用 mpirun + DeepSpeed 或 AzureML(使用 mpirun 作為啟動器后端)啟動訓練作業,您只需安裝 mpi4py python 包。 DeepSpeed 將使用它來發現 MPI 環境并將必要的狀態(例如,世界大小、等級)傳遞到火炬分布式后端。
如果您使用模型并行性、管道并行性,或者在調用之前需要 torch.distributed 調用,deepspeed.initialize(..)
我們會通過額外的 DeepSpeed API 調用提供相同的 MPI 支持。將您的初始 torch.distributed.init_process_group(..)
呼叫替換為:
deepspeed.init_distributed()
資源配置(單節點)
如果我們僅在單個節點(具有一個或多個 GPU)上運行,則 DeepSpeed不需要如上所述的主機文件。如果未檢測到或未傳入主機文件,則 DeepSpeed 將查詢本地計算機上的 GPU 數量,以發現可用插槽的數量。和--include
參數 --exclude
正常工作,但用戶應指定“localhost”作為主機名。
另請注意,CUDA_VISIBLE_DEVICES
不能與 DeepSpeed 一起使用來控制應使用哪些設備。例如,要僅使用當前節點的 gpu1,請執行以下操作:
deepspeed --include localhost:1 ...
2024-05-15(三)