分布式訓練

2022-02-03 02:45:10 字數 2987 閱讀 1201

分布式訓練

深度學習中,越來越多的場景需要分布式訓練。由於分布式系統面臨單機單卡所沒有的分布式任務排程、複雜的資源並行等問題,因此,通常情況下,分布式訓練對使用者有一定的技術門檻。

在 oneflow 中,通過頂層設計與工程創新,做到了 分布式最易用,使用者不需要特別改動網路結構和業務邏輯**,就可以方便地使用 oneflow 進行分布式訓練。這是 oneflow 區別於其它框架的最重要特性

oneflow 分布式優勢

配置分布式訓練網路

只需要增加幾行簡單的配置**,指定分布式計算的節點 ip 以及每個節點使用 gpu 的數量,即可實現分布式的訓練網路。

換句話說,這使得單機訓練程式與分布式訓練程式幾乎是一樣的,作為 oneflow 使用者,只需要專注於程式的業務邏輯模型結構本身,而不用操心分布式執行問題。分布式的一切問題,都由 oneflow 處理。

下面,介紹乙個例子:將單機版的訓練程式,通過新增幾行配置**後將其改造為分布式訓練程式。

單機訓練程式

以下是單機訓練程式的框架,因為其網路結構及業務邏輯與文末的分布式程式完全一樣,因此函式實現未詳細列出。

import numpy as np

import oneflow as flow

import oneflow.typing as tp

batch_size = 100

def mlp(data):

#構建網路...

@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:

#作業函式實現...

#配置訓練優化方法和引數

if __name__ == '__main__':

#呼叫作業函式,開始訓練...

loss = train_job(images, labels)

#...

gpu及埠配置

以下**中,設定每台主機使用的 gpu 數目為1,採用9988埠通訊。大家可以根據自身環境的具體情況進行修改。

#每個節點的 gpu 使用數目

flow.config.gpu_device_num(1)

#通訊埠

flow.env.ctrl_port(9988)

注意,即使是單機的訓練,只要有多張 gpu 卡,也可以通過 flow.config.gpu_device_num 將單機程式,設定為單機多卡的分布式程式,如以下**,設定1臺(每台)機器上,2張 gpu 卡參與分布式訓練:

flow.config.gpu_device_num(2)

節點配置

接著,需要配置網路中的主機關係,需要提前說明的是,oneflow 中,將分布式中的主機稱為節點(node)。

每個節點的組網資訊,由乙個 dict 型別存放,其中的 "addr" 這個 key 對應了節點的 ip 。 所有的節點放置在乙個 list 中,經介面 flow.env.machine 告之 oneflow ,oneflow 內部會自動建立各個節點之間的連線。

nodes = [, ]

flow.env.machine(nodes)

如以上**中,的分布式系統中有2個節點,ip 分別為"192.168.1.12"與"192.168.1.11"。

注意,節點 list 中的第0個節點(以上**中的"192.168.1.12"),又稱為 master node,整個分布式訓練系統啟動後,完成構圖,其它節點等待;當構圖完成後,所有節點會收到通知,知曉各自聯絡的其它節點,去中心化地協同執行。

在訓練過程中,由 master node 保留標準輸出及儲存模型,其它節點只負責計算。

可以將針對分布式的配置**封裝為函式,方便呼叫:

def config_distributed():

print("distributed config")

#每個節點的gpu使用數目

flow.config.gpu_device_num(1)

#通訊埠

flow.env.ctrl_port(9988)

#節點配置

nodes = [, ]

flow.env.machine(nodes)

分布式訓練及**

單機程式加入 oneflow 的分布式配置**後,就成為了分布式程式,在所有的節點執行一樣的程式即可。

可以將分布式訓練程式與上文的單機訓練程式比較,會發現僅僅只是增加了 config_distributed 函式並呼叫,之前的單機訓練指令碼,就成為了分布式訓練指令碼。

分布式指令碼**:distributed_train.py

在 192.168.1.12 及 192.168.1.12 上 均執行:

wget

python3 distributed_train.py

192.168.1.12 機器上將顯示程式結果。

faq請檢查 ssh 配置,確保兩台機器之間能夠免密 ssh 互聯

請確保兩台機器使用了相同版本的 oneflow、執行的指令碼程式完全一樣

請確保訓練使用的埠未被占用,或使用 oneflow.config.ctrl_port 更換埠

如果在環境變數中設定了**,請確保**能夠正常工作,或者取消掉**

docker 預設的模式下,物理機與容器中的埠是隔離的,請使用 --net=host host 模式,或者啟動容器時使用 -v 選項進行埠對映。具體請查閱 docker 的手冊

若存在虛擬網絡卡,可能因為 nccl 的通訊走虛擬網絡卡而無法通訊。此時需要通過 export nccl_socket_ifname=device_name 來指定通訊網卡,具體可參閱 nccl 官方文件

Ubuntu Ray 分布式訓練

sudo apt install awscli建立 anaconda 環境並保持 python 環境中的以下幾項在所有機器上均完全相同 python版本號 boto3版本號 torch版本號 torchvision版本號 ray版本號在要執行 的機器上開啟配置好的 python 環境,執行 ray ...

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...

分布式 分布式事務

是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...