本文翻譯了 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
+關注
關注
25文章
5466瀏覽量
134095 -
模型
+關注
關注
1文章
3226瀏覽量
48809 -
Docker
+關注
關注
0文章
457瀏覽量
11846
原文標題:0x4. 總結
文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論