精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

DeepSpeed安裝和使用教程

jf_pmFSk4VX ? 來源:GiantPandaCV ? 2023-06-20 11:47 ? 次閱讀

本文翻譯了 Getting Started 和 Installation Details 和 CIFAR-10 Tutorial 三個教程,可以讓新手安裝和簡單使用上 DeepSpeed 來做模型訓練。

0x0. 前言

這個系列是對DeepSpeed的教程做一下翻譯工作,在DeepSpeed的Tutorials中提供了34個Tutorials。這些Tutorials不僅包含配置DeepSpeed完成分布式訓練的標準流程,還包含一些DeepSpeed支持的一些Feature比如低比特優化器,Zero等等。最近有使用DeepSpeed做一些簡單的模型訓練實驗的需求,所以開一下這個專題,盡量翻譯完DeepSpeed的大多數Tutorials,不定期更新。這篇首先翻譯一下Getting Started 和 Installation Details,CIFAR-10 Tutorial 這三個Tutorials。基于 PyTorch 2.0 版本運行 CIFAR-10 Tutorial 中碰到一些報錯也給出了解決的方法。

0x1. Getting Started

安裝

安裝DeepSpeed非常簡單,只需運行以下命令:pip install deepspeed。有關更多詳細信息,請參閱官方文檔,也就是稍后會翻譯的文檔。

要在AzureML上開始使用DeepSpeed,請參閱AzureML Examples GitHub。這里的鏈接404了。

DeepSpeed與HuggingFace Transformers和PyTorch Lightning進行了直接集成。HuggingFace Transformers用戶現在可以通過簡單的--deepspeed標志和配置文件輕松加速他們的模型。有關更多詳細信息,請參見官方文檔。PyTorch Lightning通過Lightning Trainer提供了對DeepSpeed的易于訪問。有關更多詳細信息,請參見官方文檔。

DeepSpeed在AMD上可通過我們的ROCm鏡像使用,例如docker pull deepspeed/rocm501:ds060_pytorch110。

編寫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配置文件(https://www.deepspeed.ai/getting-started/#deepspeed-configuration)的參數構建和管理訓練優化器、數據加載器和學習率調度器。請注意,DeepSpeed會在每個訓練步驟自動執行學習率調度。

如果你已經設置了分布式環境,則需要進行以下替換:

torch.distributed.init_process_group(...)

替換為:

deepspeed.init_distributed()

默認情況下,DeepSpeed使用已經經過充分測試的NCCL后端,但您也可以覆蓋默認設置(https://deepspeed.readthedocs.io/en/latest/initialize.html#distributed-initialization)。但是,如果直到deepspeed.initialize()之后才需要設置分布式環境,則無需使用此函數,因為DeepSpeed將在其初始化期間自動初始化分布式環境。無論如何,你都需要刪除torch.distributed.init_process_group。

訓練

一旦DeepSpeed引擎被初始化,就可以使用三個簡單的API來進行前向傳播(callable object)、反向傳播(backward)和權重更新(step)來訓練模型。

forstep,batchinenumerate(data_loader):
#forward()method
loss=model_engine(batch)

#runsbackpropagation
model_engine.backward(loss)

#weightupdate
model_engine.step()

Gradient Averaging: 在分布式數據并行訓練中,backward 確保在對一個 train_batch_size 進行訓練后,梯度在數據并行進程間進行平均。

Loss Scaling: 在FP16/混合精度訓練中, DeepSpeed 引擎會自動處理縮放損失,以避免梯度中的精度損失。

Learning Rate Scheduler: 當使用 DeepSpeed 的學習率調度器(在ds_config.json文件中指定)時, DeepSpeed 會在每次訓練步驟(執行model_engine.step()時)調用調度器的step()方法。當不使用DeepSpeed的學習率調度器時:

如果調度期望在每次訓練步驟都執行, 那么用戶可以在初始化 DeepSpeed 引擎時將調度器傳遞給 deepspeed.initialize, 讓 DeepSpeed 進行管理、更新或保存/恢復。

如果調度應該在任何其它間隔(例如訓練周期)執行,則用戶在初始化期間不應將調度傳遞給 DeepSpeed,必須顯式地管理它。

模型檢查點

使用 DeepSpeed 中的 save_checkpoint 和 load_checkpoint API 處理訓練狀態的保存和加載,需要提供兩個參數來唯一識別一個檢查點:

ckpt_dir: 檢查點將保存到此目錄。

ckpt_id:在目錄中唯一標識檢查點的標識符。在下面的代碼片段中,我們使用損失值作為檢查點標識符。

#loadcheckpoint
_,client_sd=model_engine.load_checkpoint(args.load_dir,args.ckpt_id)
step=client_sd['step']

#advancedataloadertockptstep
dataloader_to_step(data_loader,step+1)

forstep,batchinenumerate(data_loader):

#forward()method
loss=model_engine(batch)

#runsbackpropagation
model_engine.backward(loss)

#weightupdate
model_engine.step()

#savecheckpoint
ifstep%args.save_interval:
client_sd['step']=step
ckpt_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 的一部分。

重要提示:所有進程都必須調用此方法,而不僅僅是rank 0的進程。這是因為每個進程都需要保存其主節點權重和調度器+優化器狀態。如果僅為rank 0的進程調用此方法,它將掛起等待與其它進程同步。

DeepSpeed 配置

可以使用一個配置 JSON 文件來啟用、禁用或配置 DeepSpeed 功能,該文件應該作為 args.deepspeed_config 指定。下面是一個示例配置文件。有關完整功能集,請參見 API 文檔(https://www.deepspeed.ai/docs/config-json/) 。

{
  "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 兼容的 hostfile 配置多節點計算資源。hostfile 是一個主機名(或 SSH 別名)列表,這些機器可以通過無密碼 SSH 訪問,并且還包括 slot counts,用于指定系統上可用的 GPU 數量。例如:

worker-1 slots=4
worker-2 slots=4

上述示例指定了兩個名為 worker-1 和 worker-2 的機器,每臺機器都有四個 GPU 用于訓練。

可以使用 --hostfile 命令行選項指定 hostfile。如果沒有指定 hostfile,則 DeepSpeed 會搜索 /job/hostfile 。如果沒有指定或找到 hostfile,則 DeepSpeed 查詢本地計算機上的 GPU 數量,以發現可用的本地 slot 數量。

下面的命令在 myhostfile 中指定的所有可用節點和 GPU 上啟動 PyTorch 訓練工作:

deepspeed --hostfile=myhostfile   
  --deepspeed --deepspeed_config ds_config.json

另外,DeepSpeed 允許您將模型的分布式訓練限制在可用節點和 GPU 的子集上。此功能通過兩個命令行參數啟用:--num_nodes 和 --num_gpus。例如,可以使用以下命令將分布式訓練限制為僅使用兩個節點:

deepspeed--num_nodes=2

--deepspeed--deepspeed_configds_config.json

您也可以使用 --include 和 --exclude 標志來包含或排除特定的資源。例如,要使用除節點 worker-2 上的 GPU 0 和節點 worker-3 上的 GPU 0 和 1 之外的所有可用資源:

deepspeed --exclude="worker-2:0@worker-3:0,1" 
  
--deepspeed --deepspeed_config ds_config.json

類似地,可以僅在 worker-2 上使用 GPU 0 和 1:

deepspeed --include="worker-2:0,1" 
  
--deepspeed --deepspeed_config ds_config.json

多節點環境變量

當在多個節點上進行訓練時,我們發現支持傳播用戶定義的環境變量非常有用。默認情況下,DeepSpeed 將傳播所有設置的 NCCL 和 PYTHON 相關環境變量。如果您想傳播其它變量,可以在名為 .deepspeed_env 的文件中指定它們,該文件包含一個行分隔的 VAR=VAL 條目列表。DeepSpeed 啟動器將查找你執行的本地路徑以及你的主目錄(~/)。

以一個具體的例子來說明,有些集群需要在訓練之前設置特殊的 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 環境,并將必要的狀態(例如 world size、rank 等)傳遞給 torch 分布式后端。

如果你正在使用模型并行,Pipline 并行或者在調用 deepspeed.initialize(..) 之前需要使用 torch.distributed 調用,我們為你提供了額外的 DeepSpeed API 調用以支持相同的 MPI。請將您的初始 torch.distributed.init_process_group(..) 調用替換為:

deepspeed.init_distributed()

資源配置(單節點)

如果我們只在單個節點上運行(具有一個或多個GPU),DeepSpeed不需要像上面描述的那樣使用 hostfile。如果沒有檢測到或傳遞 hostfile,則 DeepSpeed 將查詢本地計算機上的 GPU 數量來發現可用的插槽數。--include 和 --exclude 參數與正常工作相同,但用戶應將“localhost”指定為主機名。

另外需要注意的是,CUDA_VISIBLE_DEVICES 不能用于 DeepSpeed 來控制應該使用哪些設備。例如,要僅使用當前節點的 gpu1,請執行以下操作:

deepspeed--includelocalhost:1...

0x2. Installation Details

對應原文:https://www.deepspeed.ai/tutorials/advanced-install/

安裝細節

通過 pip 是最快捷的開始使用 DeepSpeed 的方式,這將安裝最新版本的 DeepSpeed,不會與特定的 PyTorch 或 CUDA 版本綁定。DeepSpeed 包含若干個 C++/CUDA 擴展,我們通常稱之為“ops”。默認情況下,所有這些 extensions/ops 將使用 torch 的 JIT C++ 擴展加載器即時構建(JIT)(https://pytorch.org/docs/stable/cpp_extension.html) ,該加載器依賴 ninja 在運行時進行動態鏈接。

pip install deepspeed

安裝完成后,你可以使用 ds_report 或 python -m deepspeed.env_report 命令查看 DeepSpeed 環境報告,以驗證你的安裝并查看你的機器與哪些 ops 兼容。我們發現,在調試 DeepSpeed 安裝或兼容性問題時,這個報告很有用。

ds_report

預安裝DeepSpeed的Ops

注意:在預編譯任何 DeepSpeed 的 c++/cuda ops 之前,必須先安裝 PyTorch。但是,如果使用 ops 的默認 JIT 編譯模式,則不需要預編譯安裝。

有時我們發現,將一些或全部 DeepSpeed C++/CUDA ops 預先安裝而不使用 JIT 編譯路徑是有用的。為了支持預安裝,我們引入了構建環境標志以打開/關閉特定 ops 的構建。

您可以通過設置 DS_BUILD_OPS 環境變量為 1 來指示我們的安裝程序(install.sh 或 pip install)嘗試安裝所有 ops,例如:

DS_BUILD_OPS=1 pip install deepspeed

DeepSpeed 只會安裝與你的機器兼容的 ops。有關系統兼容性的更多詳細信息,請嘗試上面描述的 ds_report 工具。

如果你只想安裝特定的 op(例如 FusedLamb),你可以在安裝時使用 DS_BUILD 環境變量進行切換。例如,要僅安裝帶有 FusedLamb op 的 DeepSpeed,請使用:

DS_BUILD_FUSED_LAMB=1 pip install deepspeed

可用的 DS_BUILD 選項包含:

DS_BUILD_OPS 切換所有 ops

DS_BUILD_CPU_ADAM 構建 CPUAdam op

DS_BUILD_FUSED_ADAM 構建 FusedAdam op (from apex)

DS_BUILD_FUSED_LAMB 構建 FusedLamb op

DS_BUILD_SPARSE_ATTN 構建 sparse attention op

DS_BUILD_TRANSFORMER 構建 transformer op

DS_BUILD_TRANSFORMER_INFERENCE 構建 transformer-inference op

DS_BUILD_STOCHASTIC_TRANSFORMER 構建 stochastic transformer op

DS_BUILD_UTILS 構建各種優化工具

DS_BUILD_AIO 構建異步 (NVMe) I/O op

為了加速 build-all 過程,您可以使用以下方式并行編譯:

DS_BUILD_OPS=1 pip install deepspeed --global-option="build_ext" --global-option="-j8"

這應該可以使完整構建過程加快 2-3 倍。您可以調整 -j 來指定在構建過程中使用多少個 CPU 核心。在此示例中,它設置為 8 個核心。

你還可以構建二進制 whell,并在具有相同類型的 GPU 和相同軟件環境(CUDA 工具包、PyTorch、Python 等)的多臺機器上安裝它。

DS_BUILD_OPS=1 python setup.py build_ext -j8 bdist_wheel

這將在 dist 目錄下創建一個 PyPI 二進制輪,例如 dist/deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whl,然后你可以直接在多臺機器上安裝它,在我們的示例中:

pip install dist/deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whl

源碼安裝 DeepSpeed

在從 GitHub 克隆 DeepSpeed 倉庫后,您可以通過 pip 在 JIT 模式下安裝 DeepSpeed(見下文)。由于不編譯任何 C++/CUDA 源文件,此安裝過程應該很快完成。

pip install .

對于跨多個節點的安裝,我們發現使用 github 倉庫中的 install.sh (https://github.com/microsoft/DeepSpeed/blob/master/install.sh) 腳本安裝 DeepSpeed 很有用。這將在本地構建一個 Python whell,并將其復制到你的主機文件(通過 --hostfile 給出,或默認為 /job/hostfile)中列出的所有節點上。

當使用 DeepSpeed 的代碼首次運行時,它將自動構建僅運行所需的 CUDA 擴展,并默認將它們放置在 ~/.cache/torch_extensions/ 目錄下。下一次執行相同的程序時,這些已預編譯的擴展將從該目錄加載。

如果你使用多個虛擬環境,則可能會出現問題,因為默認情況下只有一個 torch_extensions 目錄,但不同的虛擬環境可能使用不同的設置(例如,不同的 python 或 cuda 版本),然后加載另一個環境構建的 CUDA 擴展將失敗。因此,如果需要,你可以使用 TORCH_EXTENSIONS_DIR 環境變量覆蓋默認位置。因此,在每個虛擬環境中,你可以將其指向一個唯一的目錄,并且 DeepSpeed 將使用它來保存和加載 CUDA 擴展。

你還可以在特定運行中更改它,使用:

 TORCH_EXTENSIONS_DIR=./torch-extensions deepspeed ...

選擇正確的架構進行構建

如果你在運行 DeepSpeed 時遇到以下錯誤:

RuntimeError: CUDA error: no kernel image is available for execution on the device

這意味著 CUDA 擴展沒有為你嘗試使用的卡構建。

從源代碼構建 DeepSpeed 時,DeepSpeed 將嘗試支持各種架構,但在 JIT 模式下,它只支持在構建時可見的架構。

你可以通過設置 TORCH_CUDA_ARCH_LIST 環境變量來專門為所需的一系列架構構建:

TORCH_CUDA_ARCH_LIST="6.1;7.5;8.6" pip install ...

當你為更少的架構構建時,這也會使構建更快。

這也是為了確保使用你的確切架構而建議的。由于各種技術原因,分布式的 PyTorch 二進制文件沒有完全支持所有架構,跳過兼容的二進制文件可能會導致未充分利用你的完整卡的計算能力。要查看 deepspeed 來源構建中包含哪些架構 - 保存日志并搜索 -gencode 參數。

完整的 NVIDIA GPU 列表及其計算能力可以在這里 (https://developer.nvidia.com/cuda-gpus) 找到。

CUDA 版本不匹配

如果在運行時碰到以下錯誤:

Exception: >- DeepSpeed Op Builder: Installed CUDA version {VERSION} does not match the version torch was compiled with {VERSION}, unable to compile cuda/cpp extensions without a matching cuda version.

你安裝的 CUDA 版本與用于編譯 torch 的 CUDA 版本不匹配。我們僅需要主版本匹配(例如,11.1 和 11.8 是可以的)。但是,主版本不匹配可能會導致意外的行為和錯誤。

解決此錯誤的最簡單方法是更改已安裝的 CUDA 版本(使用 nvcc --version 檢查)或更新 torch 版本以匹配已安裝的 CUDA 版本(使用 python3 -c "import torch; print(torch.version)" 檢查)。

如果你想跳過此檢查并繼續使用不匹配的 CUDA 版本,請使用以下環境變量:

DS_SKIP_CUDA_CHECK=1

針對特定功能的依賴項

一些 DeepSpeed 功能需要 DeepSpeed 的一般依賴項之外的特定依賴項。

有關每個功能/op 的 Python 包依賴項,請參閱我們的 requirements 目錄(https://github.com/microsoft/DeepSpeed/tree/master/requirements)。

我們盡力將系統級依賴項最小化,但某些功能需要特殊的系統級軟件包。請查看我們的 ds_report 工具輸出,以查看您是否缺少給定功能的系統級軟件包。

0x3. CIFAR-10 Tutorial

如果你還沒有閱讀入門指南,我們建議你先閱讀入門指南(就是上面2節),然后再按照本教程逐步操作。

在本教程中,我們將向 CIFAR-10 模型中添加 DeepSpeed,這是一個小型圖像分類模型。

首先,我們將介紹如何運行原始的 CIFAR-10 模型。然后,我們將逐步啟用此模型以在 DeepSpeed 中運行。

運行原始的 CIFAR-10

CIFAR-10 教程的原始模型代碼見(https://github.com/pytorch/tutorials/blob/main/beginner_source/blitz/cifar10_tutorial.py)。我們已將其復制到 DeepSpeedExamples/training/cifar/ (https://github.com/microsoft/DeepSpeedExamples/tree/master/training/cifar)下,并作為子模塊提供。要下載,請執行:

git clone git@github.com:microsoft/DeepSpeedExamples.git

安裝 CIFAR-10 模型的 requirements:

cd DeepSpeedExamples/training/cifar
pip install -r requirements.txt

運行 python cifar10_tutorial.py,它會在第一次運行時下載訓練數據集。

Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz
170500096it [00:02, 61124868.24it/s]
Extracting ./data/cifar-10-python.tar.gz to ./data
Files already downloaded and verified
  cat  frog  frog  frog
[1,  2000] loss: 2.170
[1,  4000] loss: 1.879
[1,  6000] loss: 1.690
[1,  8000] loss: 1.591
[1, 10000] loss: 1.545
[1, 12000] loss: 1.467
[2,  2000] loss: 1.377
[2,  4000] loss: 1.374
[2,  6000] loss: 1.363
[2,  8000] loss: 1.322
[2, 10000] loss: 1.295
[2, 12000] loss: 1.287
Finished Training
GroundTruth:    cat  ship  ship plane
Predicted:    cat  ship plane plane
Accuracy of the network on the 10000 test images: 53 %
Accuracy of plane : 69 %
Accuracy of   car : 59 %
Accuracy of  bird : 56 %
Accuracy of   cat : 36 %
Accuracy of  deer : 37 %
Accuracy of   dog : 26 %
Accuracy of  frog : 70 %
Accuracy of horse : 61 %
Accuracy of  ship : 51 %
Accuracy of truck : 63 %
cuda:0

我這里本地使用torch 2.0版本,運行這個腳本會報錯。AttributeError: '_MultiProcessingDataLoaderIter' object has no attribute 'next' 。這個錯誤通常發生在使用 PyTorch 1.7 及更高版本時,因為在這些版本中,.next() 方法被棄用了,并被 .__next__() 方法取代了。因此,你可以把代碼中的2處 .next() 替換成 .next()來解決這個錯誤。

使能 DeepSpeed

參數解析

使能 DeepSpeed 的第一步是向 CIFAR-10 模型添加 DeepSpeed 參數,可以使用以下方式的 deepspeed.add_config_arguments() 函數:

importargparse
importdeepspeed

defadd_argument():

parser=argparse.ArgumentParser(description='CIFAR')

#Data.
#Cuda.
parser.add_argument('--with_cuda',default=False,action='store_true',
help='useCPUincasethere'snoGPUsupport')
parser.add_argument('--use_ema',default=False,action='store_true',
help='whetheruseexponentialmovingaverage')

#Train.
parser.add_argument('-b','--batch_size',default=32,type=int,
help='mini-batchsize(default:32)')
parser.add_argument('-e','--epochs',default=30,type=int,
help='numberoftotalepochs(default:30)')
parser.add_argument('--local_rank',type=int,default=-1,
help='localrankpassedfromdistributedlauncher')

#IncludeDeepSpeedconfigurationarguments.
parser=deepspeed.add_config_arguments(parser)

args=parser.parse_args()

returnargs

初始化

我們使用 deepspeed.initialize 創建 model_engine、optimizer 和 trainloader,deepspeed.initialize 的定義如下:

definitialize(args,
model,
optimizer=None,
model_params=None,
training_data=None,
lr_scheduler=None,
mpu=None,
dist_init_required=True,
collate_fn=None):

在這里,我們使用 CIFAR-10 模型(net)、args、parameters 和 trainset 初始化 DeepSpeed:

parameters=filter(lambdap:p.requires_grad,net.parameters())
args=add_argument()

#InitializeDeepSpeedtousethefollowingfeatures
#1)Distributedmodel.
#2)Distributeddataloader.
#3)DeepSpeedoptimizer.
model_engine,optimizer,trainloader,_=deepspeed.initialize(args=args,model=net,model_parameters=parameters,training_data=trainset)

初始化 DeepSpeed 后,原始 device 和 optimizer 會被刪除:

#fromdeepspeed.acceleratorimportget_accelerator
#device=torch.device(get_accelerator().device_name(0)ifget_accelerator().is_available()else"cpu")
#net.to(device)

#optimizer=optim.SGD(net.parameters(),lr=0.001,momentum=0.9)

訓練API

deepspeed.initialize 返回的模型是 DeepSpeed 模型引擎,我們將使用它來使用 forward、backward 和 step API 訓練模型。

fori,datainenumerate(trainloader):
#Gettheinputs;dataisalistof[inputs,labels].
inputs=data[0].to(model_engine.device)
labels=data[1].to(model_engine.device)

outputs=model_engine(inputs)
loss=criterion(outputs,labels)

model_engine.backward(loss)
model_engine.step()

在使用 mini-batch 更新權重之后,DeepSpeed 會自動處理梯度清零。

配置

使用 DeepSpeed 的下一步是創建一個配置 JSON 文件 (ds_config.json)。該文件提供由用戶定義的 DeepSpeed 特定參數,例如批2?大小、優化器、調度器和其他參數。

{
   "train_batch_size": 4,
   "steps_per_print": 2000,
   "optimizer": {
     "type": "Adam",
     "params": {
       "lr": 0.001,
       "betas": [
         0.8,
         0.999
       ],
       "eps": 1e-8,
       "weight_decay": 3e-7
     }
   },
   "scheduler": {
     "type": "WarmupLR",
     "params": {
       "warmup_min_lr": 0,
       "warmup_max_lr": 0.001,
       "warmup_num_steps": 1000
     }
   },
   "wall_clock_breakdown": false
 }

運行啟用 DeepSpeed 的 CIFAR-10 模型

要使用 DeepSpeed 開始訓練已應用 DeepSpeed 的 CIFAR-10 模型,請執行以下命令,默認情況下它將使用所有檢測到的 GPU。

deepspeed cifar10_deepspeed.py --deepspeed_config ds_config.json

DeepSpeed 通常會打印更多的訓練細節供用戶監視,包括訓練設置、性能統計和損失趨勢。

deepspeed.pt cifar10_deepspeed.py --deepspeed_config ds_config.json
Warning: Permanently added '[192.168.0.22]:42227' (ECDSA) to the list of known hosts.
cmd=['pdsh', '-w', 'worker-0', 'export NCCL_VERSION=2.4.2; ', 'cd /data/users/deepscale/test/ds_v2/examples/cifar;', '/usr/bin/python', '-u', '-m', 'deepspeed.pt.deepspeed_launch', '--world_info=eyJ3b3JrZXItMCI6IFswXX0=', '--node_rank=%n', '--master_addr=192.168.0.22', '--master_port=29500', 'cifar10_deepspeed.py', '--deepspeed', '--deepspeed_config', 'ds_config.json']
worker-0: Warning: Permanently added '[192.168.0.22]:42227' (ECDSA) to the list of known hosts.
worker-0: 0 NCCL_VERSION 2.4.2
worker-0: WORLD INFO DICT: {'worker-0': [0]}
worker-0: nnodes=1, num_local_procs=1, node_rank=0
worker-0: global_rank_mapping=defaultdict(, {'worker-0': [0]})
worker-0: dist_world_size=1
worker-0: Setting CUDA_VISIBLE_DEVICES=0
worker-0: Files already downloaded and verified
worker-0: Files already downloaded and verified
worker-0:  bird   car horse  ship
worker-0: DeepSpeed info: version=2.1, git-hash=fa937e7, git-branch=master
worker-0: [INFO 2020-02-06 1949] Set device to local rank 0 within node.
worker-0: 1 1
worker-0: [INFO 2020-02-06 1956] Using DeepSpeed Optimizer param name adam as basic optimizer
worker-0: [INFO 2020-02-06 1956] DeepSpeed Basic Optimizer = FusedAdam (
worker-0: Parameter Group 0
worker-0:     betas: [0.8, 0.999]
worker-0:     bias_correction: True
worker-0:     eps: 1e-08
worker-0:     lr: 0.001
worker-0:     max_grad_norm: 0.0
worker-0:     weight_decay: 3e-07
worker-0: )
worker-0: [INFO 2020-02-06 1956] DeepSpeed using configured LR scheduler = WarmupLR
worker-0: [INFO 2020-02-06 1956] DeepSpeed LR Scheduler = 
worker-0: [INFO 2020-02-06 1956] rank:0 step=0, skipped=0, lr=[0.001], mom=[[0.8, 0.999]]
worker-0: DeepSpeedLight configuration:
worker-0:   allgather_size ............... 500000000
worker-0:   allreduce_always_fp32 ........ False
worker-0:   disable_allgather ............ False
worker-0:   dump_state ................... False
worker-0:   dynamic_loss_scale_args ...... None
worker-0:   fp16_enabled ................. False
worker-0:   global_rank .................. 0
worker-0:   gradient_accumulation_steps .. 1
worker-0:   gradient_clipping ............ 0.0
worker-0:   initial_dynamic_scale ........ 4294967296
worker-0:   loss_scale ................... 0
worker-0:   optimizer_name ............... adam
worker-0:   optimizer_params ............. {'lr': 0.001, 'betas': [0.8, 0.999], 'eps': 1e-08, 'weight_decay': 3e-07}
worker-0:   prescale_gradients ........... False
worker-0:   scheduler_name ............... WarmupLR
worker-0:   scheduler_params ............. {'warmup_min_lr': 0, 'warmup_max_lr': 0.001, 'warmup_num_steps': 1000}
worker-0:   sparse_gradients_enabled ..... False
worker-0:   steps_per_print .............. 2000
worker-0:   tensorboard_enabled .......... False
worker-0:   tensorboard_job_name ......... DeepSpeedJobName
worker-0:   tensorboard_output_path ......
worker-0:   train_batch_size ............. 4
worker-0:   train_micro_batch_size_per_gpu  4
worker-0:   wall_clock_breakdown ......... False
worker-0:   world_size ................... 1
worker-0:   zero_enabled ................. False
worker-0:   json = {
worker-0:     "optimizer":{
worker-0:         "params":{
worker-0:             "betas":[
worker-0:                 0.8,
worker-0:                 0.999
worker-0:             ],
worker-0:             "eps":1e-08,
worker-0:             "lr":0.001,
worker-0:             "weight_decay":3e-07
worker-0:         },
worker-0:         "type":"Adam"
worker-0:     },
worker-0:     "scheduler":{
worker-0:         "params":{
worker-0:             "warmup_max_lr":0.001,
worker-0:             "warmup_min_lr":0,
worker-0:             "warmup_num_steps":1000
worker-0:         },
worker-0:         "type":"WarmupLR"
worker-0:     },
worker-0:     "steps_per_print":2000,
worker-0:     "train_batch_size":4,
worker-0:     "wall_clock_breakdown":false
worker-0: }
worker-0: [INFO 2020-02-06 1956] 0/50, SamplesPerSec=1292.6411179579866
worker-0: [INFO 2020-02-06 1956] 0/100, SamplesPerSec=1303.6726433398537
worker-0: [INFO 2020-02-06 1956] 0/150, SamplesPerSec=1304.4251022567403

......

worker-0: [2, 12000] loss: 1.247
worker-0: [INFO 2020-02-06 2023] 0/24550, SamplesPerSec=1284.4954513975558
worker-0: [INFO 2020-02-06 2023] 0/24600, SamplesPerSec=1284.384033658866
worker-0: [INFO 2020-02-06 2023] 0/24650, SamplesPerSec=1284.4433482972925
worker-0: [INFO 2020-02-06 2023] 0/24700, SamplesPerSec=1284.4664449792422
worker-0: [INFO 2020-02-06 2023] 0/24750, SamplesPerSec=1284.4950124403447
worker-0: [INFO 2020-02-06 2023] 0/24800, SamplesPerSec=1284.4756105952233
worker-0: [INFO 2020-02-06 2024] 0/24850, SamplesPerSec=1284.5251526215386
worker-0: [INFO 2020-02-06 2024] 0/24900, SamplesPerSec=1284.531217073863
worker-0: [INFO 2020-02-06 2024] 0/24950, SamplesPerSec=1284.5125323220368
worker-0: [INFO 2020-02-06 2024] 0/25000, SamplesPerSec=1284.5698818883018
worker-0: Finished Training
worker-0: GroundTruth:    cat  ship  ship plane
worker-0: Predicted:    cat   car   car plane
worker-0: Accuracy of the network on the 10000 test images: 57 %
worker-0: Accuracy of plane : 61 %
worker-0: Accuracy of   car : 74 %
worker-0: Accuracy of  bird : 49 %
worker-0: Accuracy of   cat : 36 %
worker-0: Accuracy of  deer : 44 %
worker-0: Accuracy of   dog : 52 %
worker-0: Accuracy of  frog : 67 %
worker-0: Accuracy of horse : 58 %
worker-0: Accuracy of  ship : 70 %
worker-0: Accuracy of truck : 59 %

補充:你可以使用 --include localhost:1 類似的命令在單卡上運行模型。此外,--num_gpus可以指定使用多少張GPU來運行。

0x4. 總結

本文翻譯了 Getting Started 和 Installation Details 和 CIFAR-10 Tutorial 三個教程,可以讓新手安裝和簡單使用上 DeepSpeed 來做模型訓練。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • amd
    amd
    +關注

    關注

    25

    文章

    5441

    瀏覽量

    133934
  • 模型
    +關注

    關注

    1

    文章

    3171

    瀏覽量

    48711
  • Docker
    +關注

    關注

    0

    文章

    454

    瀏覽量

    11814

原文標題:0x4. 總結

文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    openeuler安裝教程三:openeuler安裝步驟指導

    本章以光盤安裝為例介紹安裝openEuler,其他安裝方式除在啟動安裝時的引導方式不同外,待啟動安裝后則
    的頭像 發表于 12-06 16:53 ?1.5w次閱讀
    openeuler<b class='flag-5'>安裝</b>教程三:openeuler<b class='flag-5'>安裝</b>步驟指導

    pads2005安裝方法 安裝說明 安裝步驟

    pads2005安裝方法 安裝說明 安裝步驟
    發表于 11-28 09:23 ?0次下載
    pads2005<b class='flag-5'>安裝</b>方法 <b class='flag-5'>安裝</b>說明 <b class='flag-5'>安裝</b>步驟

    pads2007的安裝方法 怎么安裝 無法安裝

    pads2007的安裝方法 怎么安裝  無法安裝:圖解說明,非常詳細
    發表于 12-03 13:01 ?0次下載
    pads2007的<b class='flag-5'>安裝</b>方法 怎么<b class='flag-5'>安裝</b> 無法<b class='flag-5'>安裝</b>

    led吸頂燈如何安裝安裝教程)_led吸頂燈安裝圖解

    led燈飾越來越受大眾喜歡,雖然led燈飾好看但是安裝卻是個大難題。那么它應該要如何安裝呢?這篇文章主要就是介紹led吸頂燈的安裝教程_led吸頂燈安裝圖解。
    發表于 12-22 14:00 ?31.8w次閱讀

    RealViewMDK的安裝概述和驅動安裝

    本文的主要內容介紹的是RealViewMDK的安裝概述和驅動安裝
    發表于 05-09 09:15 ?16次下載

    微軟為 DeepSpeed 申請了商標保護,考慮通過在線云服務提供 DeepSpeed

    微軟已經為深度學習優化庫 DeepSpeed 申請了商標保護。該商標于2020年12月8日提交,其中提到“為人工智能處理和深度學習提供臨時使用的在線不可下載的計算機軟件”,這表明微軟可能在考慮通過
    的頭像 發表于 12-16 11:49 ?1936次閱讀

    微軟可能在考慮通過在線云服務提供DeepSpeed

    微軟已經為深度學習優化庫 DeepSpeed 申請了商標保護。該商標于2020年12月8日提交,其中提到“為人工智能處理和深度學習提供臨時使用的在線不可下載的計算機軟件”,這表明微軟可能在考慮通過
    的頭像 發表于 12-16 15:44 ?1142次閱讀

    OpenSSL安裝使用:OpenSSL安裝說明

    安裝ActivePerl軟件根據提示一步一步進行安裝即可,安裝過程軟件會自動設置環境變量。要確認是否安裝成功,我們可以利用cmd命令行的形式輸入指令進入到
    的頭像 發表于 11-11 14:11 ?1603次閱讀

    openeuler安裝教程二:openeuler安裝方式介紹

    (HostOS為openEuler,虛擬化組件為發布包中的qemu、KVM)創建的虛擬化平臺和華為公有云的x86虛擬化平臺。 安裝方式當前僅支持光盤、USB盤安裝、網絡安裝、qcow2鏡像安裝
    的頭像 發表于 12-06 16:48 ?4080次閱讀
    openeuler<b class='flag-5'>安裝</b>教程二:openeuler<b class='flag-5'>安裝</b>方式介紹

    微軟開源“傻瓜式”類ChatGPT模型訓練工具

    DeepSpeed-RLHF 模塊:DeepSpeed-RLHF 復刻了 InstructGPT 論文中的訓練模式,并確保包括 a) 監督微調(SFT),b) 獎勵模型微調和 c) 基于人類反饋
    的頭像 發表于 04-14 09:36 ?1042次閱讀

    DeepSpeed里面和Zero相關技術教程

    使用原始的 Megatron-LM 訓練 GPT2 設置訓練數據 運行未修改的Megatron-LM GPT2模型 開啟DeepSpeed DeepSpeed 使用 GPT-2 進行評估 Zero
    的頭像 發表于 06-12 10:25 ?3619次閱讀
    <b class='flag-5'>DeepSpeed</b>里面和Zero相關技術教程

    DeepSpeed結合Megatron-LM訓練GPT2模型筆記

    是如何結合DeepSpeed的特性進行訓練Megatron GPT2,由于篇幅原因這篇文章只寫了第一部分,主要是非常細致的記錄了跑起來Megatron GPT2訓練流程碰到的一些問題和如何解決的。本文主要以這里的codebase展開寫作。
    的頭像 發表于 06-19 14:45 ?3391次閱讀
    <b class='flag-5'>DeepSpeed</b>結合Megatron-LM訓練GPT2模型筆記

    Profile工作判斷模型的計算以及內存瓶頸

    DeepSpeed運行時一起使用 在Megatron-LM中使用 在 DeepSpeed 運行環境之外的使用方法 訓練工作流例子 0x0. 前言 這篇翻譯是對 https://www.deepspeed
    的頭像 發表于 06-26 10:45 ?1381次閱讀

    安裝Linux的系統安裝工具

    安裝_Linux的系統安裝工具,可以安裝各類Linux操作系統。通過iso鏡像文件的格式安裝。也可以安裝在U盤上,本人親測通過。 ?
    發表于 09-11 10:21 ?0次下載

    深度學習框架DeepSpeed使用指南

    各個GPU上。 今天要給大家介紹的DeepSpeed,它就能實現這個拆散功能,它通過將模型參數拆散分布到各個
    的頭像 發表于 10-30 10:09 ?3022次閱讀
    深度學習框架<b class='flag-5'>DeepSpeed</b>使用指南