MXNet: wait_to_read 方法
wait_to_read
在mxnet中,類ndarray
可以呼叫 wait_to_read
,官方給出的該函式解釋是:
Waits until all previous write operations on the current array are finished.
This method guarantees that all previous write operations that pushed
into the backend engine for execution are actually finished.
Examples
>>> import time
>>> tic = time.time()
>>> a = mx.nd.ones((1000,1000))
>>> b = mx.nd.dot(a, a)
>>> print(time.time() - tic) # doctest: +SKIP
0.003854036331176758
>>> b.wait_to_read()
>>> print(time.time() - tic) # doctest: +SKIP
0.0893700122833252
翻譯過來就是,呼叫該方法可以保證,之前進行的該ndarray的所有寫操作都完成了。由於MXNet是一個非同步框架,我們使用python介面呼叫方法的時候,只是將該方法push給了執行者,由執行者來安排什麼時候執行。所以,我們就無法知道,某一個操作是不是完成了。
那麼,在知道了該方法的功能後,我們的疑問就變成了,mxnet是怎麼做到的呢?
在mxnet的類ndarray中定義了WaitToRead
方法,如下:
inline void WaitToRead() const {
if (is_none()) return;
Engine::Get()->WaitForVar(ptr_->var);
}
其中ptr_->var
指向了該ndarray例項對應的唯一的var
,engine會根據該var
來進行判斷,當前操作對應的是哪個ndarray。
那麼,我們只需要知道Engine
對應的WariForVar
做了什麼就好了。在mxnet中實現了很多種engine
。但是我們用的engine都繼承了類ThreadedEngine
的WaitForVar
方法。沒有過載。
在這個方法裡面,主要做了一件事情,就是將一個操作push給了engine。
該操作需要完成的函式是:
this, &done](RunContext, CallbackOnComplete on_complete) {
if (engine_info_) {
LOG(INFO) << "Sync is executed";
}
{
std::unique_lock<std::mutex> lock{finished_m_};
done.store(true);
}
finished_cv_.notify_all();
if (engine_info_) {
LOG(INFO) << "Sync is notified";
}
on_complete();
}
輸出是var
。
函式將done
賦值為true,它被初始化為false。之後會呼叫finished_cv_.notify_all();
來通知該方法繼續執行。
因為,該方法會在將操作push之後,呼叫
{
std::unique_lock<std::mutex> lock{finished_m_};
finished_cv_.wait(lock, [this, &done]() {
return done.load() || kill_.load();
});
}
導致一直等待,直到done
為true。
到這裡,我們大概明白了ndarray的wait_to_read
的方法如何實現等待。
總體思路就是,呼叫了engine的WaitForVar方法。這個方法會將一個操作非同步push給engine,這個操作將一個原子變數done從false改變為true。由於push是非同步的,它會立刻返回,返回後,WaitForVar一直等待,知道done為true。
而engine會根據變數來安排執行,由於這次push的操作的輸出是ndarray對應的var,因此,engine會保證所有之前的寫入操作完成。
相關文章
- Caffe轉mxnet模型——mxnet工具模型
- Caffe轉mxnet模型——mmdnn模型DNN
- 深度框架 MXNet/Gluon 初體驗框架
- MXNET:多層神經網路神經網路
- 使用mmdnn將MXNET轉成Tensorflow模型DNN模型
- insightface之mxnet model轉caffemodel
- Mxnet R FCN 訓練自己的資料集
- 深度學習(五十九)mxnet移植至android深度學習Android
- Mxnet模型檔案轉換為Pb模型檔案模型
- Mxnet-R-FCN-訓練自己的資料集
- (ML with go) 分享一個mxnet環境搭建的dockerfileGoDocker
- 亞馬遜挑中MXNet後,機器之心和他們聊了聊亞馬遜
- 快速入門MXBoard:MXNet資料視覺化工具視覺化
- AWS上使用MXNet進行分散式深度學習分散式深度學習
- MxNet預訓練模型到Pytorch模型的轉換模型PyTorch
- mxnet資料格式轉換為tensorflow,pytorch資料PyTorch
- 雲上深度學習實踐分享——雲上MXNet實踐深度學習
- 使用Mxnet基於skip-gram模型實現word2vect模型
- TensorFlow和Caffe、MXNet、Keras等深度學習框架的對比Keras深度學習框架
- Mxnet模型轉化為ncnn模型,並驗證轉化正確性模型CNN
- 從PyTorch到Mxnet ,對比7大Python深度學習框架PyTorchPython深度學習框架
- 圖森未來開源:Mask R-CNN的完整MXNet復現CNN
- 深度學習框架跑分測驗(TensorFlow/Caffe/MXNet/Keras/PyTorch)深度學習框架KerasPyTorch
- 伯克利AI分散式框架Ray,相容TensorFlow、PyTorch與MXNetAI分散式框架PyTorch
- MXNet的資料格式轉化為tensorflow訓練用的資料格式
- 從VGG到ResNet,你想要的MXNet預訓練模型輕鬆學模型
- 基於MXNET框架的線性迴歸從零實現(房價預測為例)框架
- 亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統亞馬遜樹莓派
- 從三大神經網路,測試對比TensorFlow、MXNet、CNTK、Theano四個框架神經網路框架
- MXNet 0.11釋出,加入動態圖介面Gluon,還有兩位CMU教授的親筆教程
- 手把手 | Apache MXNet助力數字營銷,檢測社交網路照片中的商標品牌Apache
- CVPR 2017李沐介紹MXNet新介面Gluon:高效支援命令式與符號式程式設計符號程式設計
- [譯]搭建個人深度學習平臺:GTX 1080 + Ubuntu 16.04 + CUDA 8.0RC + CuDNN 7 + Tensorflow/Mxnet/深度學習UbuntuDNN
- AWS 部落格:一張速查表實現 Apache MXNet 深度學習框架五大特徵的開發利用Apache深度學習框架特徵
- Mxnet速查_CPU和GPU的mnist預測訓練_模型匯出_模型匯入再預測_匯出onnx並預測GPU模型
- 運用深度學習讓無人駕駛卡車駛入了快車道:深入瞭解創業公司TuSimple如何使用MXNet深度學習創業
- Java中parse方法,ValueOf方法,toString方法Java
- Python例項方法、類方法、靜態方法Python