日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

分布式训练

發(fā)布時間:2023/11/28 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分布式训练 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

分布式訓(xùn)練
深度學(xué)習(xí)中,越來越多的場景需要分布式訓(xùn)練。由于分布式系統(tǒng)面臨單機(jī)單卡所沒有的分布式任務(wù)調(diào)度、復(fù)雜的資源并行等問題,因此,通常情況下,分布式訓(xùn)練對用戶有一定的技術(shù)門檻。
在 OneFlow 中,通過頂層設(shè)計與工程創(chuàng)新,做到了 分布式最易用,用戶不需要特別改動網(wǎng)絡(luò)結(jié)構(gòu)和業(yè)務(wù)邏輯代碼,就可以方便地使用 OneFlow 進(jìn)行分布式訓(xùn)練。這是 OneFlow 區(qū)別于其它框架的 最重要特性。
本文將介紹:
? 如何將單機(jī)程序修改為分布式程序
? OneFlow 中節(jié)點概念及分工
OneFlow 分布式優(yōu)勢
? 采用去中心化的流式架構(gòu),而非 master 與 worker 架構(gòu),最大程度優(yōu)化節(jié)點網(wǎng)絡(luò)通信效率
? 提供 consistent view,使得用戶可以像編寫單機(jī)單卡程序那樣編寫分布式程序
? 提供 mirrored view,熟悉其它框架分布式訓(xùn)練的用戶可直接上手
? 極簡配置,由單機(jī)單卡的訓(xùn)練程序轉(zhuǎn)變?yōu)榉植际接?xùn)練程序,只需要幾行配置代碼
配置分布式訓(xùn)練網(wǎng)絡(luò)
只需要增加幾行簡單的配置代碼,指定分布式計算的節(jié)點 IP 以及每個節(jié)點使用 GPU 的數(shù)量,即可實現(xiàn)分布式的訓(xùn)練網(wǎng)絡(luò)。
換句話說,這使得單機(jī)訓(xùn)練程序與分布式訓(xùn)練程序幾乎是一樣的,作為 OneFlow 用戶,只需要專注于程序的 業(yè)務(wù)邏輯 及 模型結(jié)構(gòu)本身 ,而不用操心分布式執(zhí)行問題。分布式的一切問題,都由 OneFlow 處理。
下面,介紹一個例子:將單機(jī)版的訓(xùn)練程序,通過添加幾行配置代碼后將其改造為分布式訓(xùn)練程序。
單機(jī)訓(xùn)練程序
以下是單機(jī)訓(xùn)練程序的框架,因為其網(wǎng)絡(luò)結(jié)構(gòu)及業(yè)務(wù)邏輯與文末的分布式程序完全一樣,因此函數(shù)實現(xiàn)未詳細(xì)列出。
import numpy as np
import oneflow as flow
import oneflow.typing as tp

BATCH_SIZE = 100

def mlp(data):
#構(gòu)建網(wǎng)絡(luò)…

@flow.global_function(type=“train”)
def train_job(
images: tp.Numpy.Placeholder((BATCH_SIZE, 1, 28, 28), dtype=flow.float),
labels: tp.Numpy.Placeholder((BATCH_SIZE,), dtype=flow.int32),
) -> tp.Numpy:
#作業(yè)函數(shù)實現(xiàn)…
#配置訓(xùn)練優(yōu)化方法和參數(shù)

if name == ‘main’:
#調(diào)用作業(yè)函數(shù),開始訓(xùn)練…
loss = train_job(images, labels)
#…
GPU及端口配置
在 oneflow.config 模塊中,提供了分布式相關(guān)的設(shè)置接口,主要使用其中兩個:
? oneflow.config.gpu_device_num : 設(shè)置所使用的 GPU 的數(shù)目,這個參數(shù)會應(yīng)用到所有的機(jī)器中;
? oneflow.config.ctrl_port : 設(shè)置用于通信的端口號,所有機(jī)器上都將使用相同的端口號進(jìn)行通信。
以下代碼中,設(shè)置每臺主機(jī)使用的 GPU 數(shù)目為1,采用9988端口通信。大家可以根據(jù)自身環(huán)境的具體情況進(jìn)行修改。
#每個節(jié)點的 gpu 使用數(shù)目
flow.config.gpu_device_num(1)
#通信端口
flow.env.ctrl_port(9988)
注意,即使是單機(jī)的訓(xùn)練,只要有多張 GPU 卡,也可以通過 flow.config.gpu_device_num 將單機(jī)程序,設(shè)置為單機(jī)多卡的分布式程序,如以下代碼,設(shè)置1臺(每臺)機(jī)器上,2張 GPU 卡參與分布式訓(xùn)練:
flow.config.gpu_device_num(2)
節(jié)點配置
接著,需要配置網(wǎng)絡(luò)中的主機(jī)關(guān)系,需要提前說明的是,OneFlow 中,將分布式中的主機(jī)稱為節(jié)點(node)。
每個節(jié)點的組網(wǎng)信息,由一個 dict 類型存放,其中的 “addr” 這個 key 對應(yīng)了節(jié)點的 IP 。 所有的節(jié)點放置在一個 list 中,經(jīng)接口 flow.env.machine 告之 OneFlow ,OneFlow 內(nèi)部會自動建立各個節(jié)點之間的連接。
nodes = [{“addr”:“192.168.1.12”}, {“addr”:“192.168.1.11”}]
flow.env.machine(nodes)
如以上代碼中,的分布式系統(tǒng)中有2個節(jié)點,IP 分別為"192.168.1.12"與"192.168.1.11"。
注意,節(jié)點 list 中的第0個節(jié)點(以上代碼中的"192.168.1.12"),又稱為 master node,整個分布式訓(xùn)練系統(tǒng)啟動后,完成構(gòu)圖,其它節(jié)點等待;當(dāng)構(gòu)圖完成后,所有節(jié)點會收到通知,知曉各自聯(lián)系的其它節(jié)點,去中心化地協(xié)同運行。
在訓(xùn)練過程中,由 master node 保留標(biāo)準(zhǔn)輸出及保存模型,其它節(jié)點只負(fù)責(zé)計算。
可以將針對分布式的配置代碼封裝為函數(shù),方便調(diào)用:
def config_distributed():
print(“distributed config”)
#每個節(jié)點的gpu使用數(shù)目
flow.config.gpu_device_num(1)
#通信端口
flow.env.ctrl_port(9988)

#節(jié)點配置
nodes = [{"addr":"192.168.1.12"}, {"addr":"192.168.1.11"}]
flow.env.machine(nodes)

分布式訓(xùn)練及代碼
單機(jī)程序加入 OneFlow 的分布式配置代碼后,就成為了分布式程序,在所有的節(jié)點運行一樣的程序即可。
可以將分布式訓(xùn)練程序與上文的 單機(jī)訓(xùn)練程序 比較,會發(fā)現(xiàn)僅僅只是增加了 config_distributed 函數(shù)并調(diào)用,之前的單機(jī)訓(xùn)練腳本,就成為了分布式訓(xùn)練腳本。
分布式腳本代碼:distributed_train.py
在 192.168.1.12 及 192.168.1.12 上 均運行:
wget https://docs.oneflow.org/code/basics_topics/distributed_train.py
python3 distributed_train.py
192.168.1.12 機(jī)器上將顯示程序結(jié)果。
FAQ
? 運行本文分布式代碼后,程序長期等待,未顯示計算結(jié)果
a. 請檢查 ssh 配置,確保兩臺機(jī)器之間能夠免密 ssh 互聯(lián)
b. 請確保兩臺機(jī)器使用了相同版本的 OneFlow、運行的腳本程序完全一樣
c. 請確保訓(xùn)練使用的端口未被占用,或使用 oneflow.config.ctrl_port 更換端口
d. 如果在環(huán)境變量中設(shè)置了代理,請確保代理能夠正常工作,或者取消掉代理
? 在 docker 中跑訓(xùn)練,程序長期等待,未顯示計算結(jié)果
docker 默認(rèn)的模式下,物理機(jī)與容器中的端口是隔離的,請使用 --net=host host 模式,或者啟動容器時使用 -v 選項進(jìn)行端口映射。具體請查閱 docker 的手冊
? 存在虛擬網(wǎng)卡的情況
若存在虛擬網(wǎng)卡,可能因為 nccl 的通信走虛擬網(wǎng)卡而無法通信。此時需要通過 export NCCL_SOCKET_IFNAME=device_name 來指定通信網(wǎng)卡,具體可參閱 nccl 官方文檔

總結(jié)

以上是生活随笔為你收集整理的分布式训练的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。