MXNet: Barrier

1. KVStore里的Barrier

在mxnet的分布式訓(xùn)練里四濒,主要模式就是參數(shù)服務(wù)器换况。每個(gè)worker或者agent就是一臺(tái)machine,server用于參數(shù)的更新峻黍。那么复隆,當(dāng)我們期望在不同的worker之間進(jìn)行同步的時(shí)候拨匆,就會(huì)需要到barrier這個(gè)方法姆涩。
當(dāng)代碼運(yùn)行在worker的時(shí)候,我們可以通過(guò)調(diào)用kv._barrier()來(lái)進(jìn)行同步惭每。它的作用就是骨饿,會(huì)阻塞代碼運(yùn)行亏栈,直到每個(gè)worker都運(yùn)行了kv._barrier()。然后接著運(yùn)行宏赘。這樣就實(shí)現(xiàn)了同步绒北。
那么它是怎么做到的呢?

通過(guò)源碼察署,我們不難發(fā)現(xiàn)闷游,python端的接口調(diào)用了c++端的方法:

void Barrier() override {
    ps::Postoffice::Get()->Barrier(ps_worker_->get_customer()->customer_id(), ps::kWorkerGroup);
}

這個(gè)全局的PostofficeBarrier方法的部分源碼如下:

void Postoffice::Barrier(int customer_id, int node_group) {
  // 省略部分代碼
  // 省略部分代碼


  std::unique_lock<std::mutex> ulk(barrier_mu_);
  barrier_done_[0][customer_id] = false;
  Message req;
  req.meta.recver = kScheduler;
  req.meta.request = true;
  req.meta.control.cmd = Control::BARRIER;
  req.meta.app_id = 0;
  req.meta.customer_id = customer_id;
  req.meta.control.barrier_group = node_group;
  req.meta.timestamp = van_->GetTimestamp();
  CHECK_GT(van_->Send(req), 0);
  barrier_cond_.wait(ulk, [this, customer_id] {
      return barrier_done_[0][customer_id];
    });
}

可以看到該方法會(huì)首先對(duì)barrier_mu_上鎖,之后將對(duì)應(yīng)的barrier_done_設(shè)置為false贴汪。然后將這次的barrier信息發(fā)送給scheduler脐往。告訴scheduler需要進(jìn)行一次barrier。然后就阻塞等待barrier_done_被設(shè)置為true扳埂,代表完成了barrier业簿,也就是其他的worker也都進(jìn)行了barrier。

那么問(wèn)題就變成了阳懂,每個(gè)worker都是怎么直到其他worker也進(jìn)行了barrier的梅尤?

首先我們要知道,在參數(shù)服務(wù)器也就是PS中岩调,每個(gè)進(jìn)程都會(huì)建立kvstore巷燥。如果是worker,會(huì)在構(gòu)造函數(shù)中運(yùn)行如下代碼:

if (IsWorkerNode()) {
      int new_customer_id = GetNewCustomerId();
      ps_worker_ = new ps::KVWorker<char>(0, new_customer_id);
      ps::StartAsync(new_customer_id, "mxnet\0");
      if (!ps::Postoffice::Get()->is_recovery()) {
        ps::Postoffice::Get()->Barrier(
          new_customer_id,
          ps::kWorkerGroup + ps::kServerGroup + ps::kScheduler);
      }
    }

其中ps::StartAsync如下:

inline void StartAsync(int customer_id, const char* argv0 = nullptr) {
  Postoffice::Get()->Start(customer_id, argv0, false);
}

也就是說(shuō)誊辉,worker在建立起ps_worker_后矾湃,開始運(yùn)行postoffice,而postoffice的Start會(huì)進(jìn)行一系列的操作堕澄,并調(diào)用van_->Start邀跃,接著vanStart會(huì)進(jìn)行一系列的初始化后,開啟接受消息的線程蛙紫,也就是

receiver_thread_ = std::unique_ptr<std::thread>(
            new std::thread(&Van::Receiving, this));

receiving函數(shù)會(huì)使用ProcessBarrierCommand處理barrier信號(hào)拍屑,該函數(shù)會(huì)++barrier_count_[group],也就是將對(duì)應(yīng)group的barrier次數(shù)進(jìn)行統(tǒng)計(jì)坑傅。當(dāng)barrier_count_[group]等于這個(gè)group的個(gè)數(shù)的時(shí)候僵驰。它會(huì)發(fā)送類似于ACK的返回信息。

然后worker會(huì)調(diào)用Manage方法來(lái)處理該message唁毒。Manage發(fā)現(xiàn)是barrier的返回信息蒜茴,將barrier_done_設(shè)置為true,然后將等待的線程喚醒浆西。也就是python端調(diào)用barrier后被阻塞的地方粉私。

至此,就完成了一次worker之間的barrier近零。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诺核,一起剝皮案震驚了整個(gè)濱河市抄肖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窖杀,老刑警劉巖漓摩,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異入客,居然都是意外死亡管毙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門桌硫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锅风,“玉大人,你說(shuō)我怎么就攤上這事鞍泉≈宀海” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵咖驮,是天一觀的道長(zhǎng)边器。 經(jīng)常有香客問(wèn)我,道長(zhǎng)托修,這世上最難降的妖魔是什么忘巧? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮睦刃,結(jié)果婚禮上砚嘴,老公的妹妹穿的比我還像新娘。我一直安慰自己涩拙,他們只是感情好际长,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兴泥,像睡著了一般工育。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搓彻,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天如绸,我揣著相機(jī)與錄音,去河邊找鬼旭贬。 笑死怔接,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稀轨。 我是一名探鬼主播扼脐,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼靶端!你這毒婦竟也來(lái)了谎势?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤杨名,失蹤者是張志新(化名)和其女友劉穎脏榆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體台谍,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡须喂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趁蕊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坞生。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掷伙,靈堂內(nèi)的尸體忽然破棺而出是己,到底是詐尸還是另有隱情,我是刑警寧澤任柜,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布卒废,位于F島的核電站,受9級(jí)特大地震影響宙地,放射性物質(zhì)發(fā)生泄漏摔认。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一宅粥、第九天 我趴在偏房一處隱蔽的房頂上張望参袱。 院中可真熱鬧,春花似錦秽梅、人聲如沸抹蚀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)况鸣。三九已至,卻和暖如春竹观,著一層夾襖步出監(jiān)牢的瞬間镐捧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工臭增, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懂酱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓誊抛,卻偏偏與公主長(zhǎng)得像列牺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拗窃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • iOS多線程編程 基本知識(shí) 1. 進(jìn)程(process) 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序瞎领,就是一段程序的執(zhí)...
    陵無(wú)山閱讀 6,043評(píng)論 1 14
  • 寫在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,753評(píng)論 0 8
  • feisky云計(jì)算泌辫、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,844評(píng)論 0 5
  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應(yīng)用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進(jìn)行...
    月亮是我踢彎得閱讀 5,965評(píng)論 3 28
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,744評(píng)論 0 10