之前訓練faster的時候一直沒有辦法進行多gpu訓練,以為是自己的錯,今天看了/include/caffe/layers/python_layer.h發現原來這是caffe的緣故。
原來caffe在寫的時候就不允許python使用多gpu訓練。
其是主要的是python的緣故。
這裡提到乙個gil。這裡的gil是 python 的global interpreter lock (全域性直譯器鎖) 一次只允許乙個thread在python直譯器中執行。
什麼是全域性直譯器鎖呢?
python**的執行由python虛擬機器(也叫直譯器主迴圈)來控制。python在設計之初就考慮到要在主迴圈中,同時至於乙個執行緒在執行,就像但cpu的系統中執行多個程序那樣,記憶體中可以存放多個程式,但在任意時刻,只有乙個程式在cpu中執行。同樣地,雖然python直譯器可以「執行」多個執行緒,但在任意時刻,只有乙個執行緒在直譯器中執行。
對python虛擬機器的訪問由全域性直譯器鎖(global interpreter lock gil)來控制,正是這個鎖能保證同一時刻只有乙個執行緒在執行。在多執行緒環境中,python虛擬機器按以下方式執行。
設定gil
切換到乙個執行緒執行。
執行:
a. 指定數量的位元組碼的指令,或者
b. 執行緒主動讓出控制(可以呼叫time.sleep(0))
把執行緒設定為睡眠狀態。
解鎖gil。
再次重複以上所有步驟。
在呼叫外部**(如c/c++擴充套件函式)的時候,gil將會被鎖定,知道這個函式結束為止(由於在這期間沒有python的位元組碼被執行,所以不會有執行緒切換)。編寫拓展的程式設計師可以主動解鎖gil。不過,python的開發人員則不用擔心在這些情況下你的python**會被鎖住。
高手總是有的。
方案1:
提供者:naibaf7 berkeley vision and learning center member
release the gil for the forward/backward passes in the opencl branch。
方案2:
提供者:alessandroferrari
added scopedgilrelease for easy gil release. modified _caffe.cpp in pycaffe accordingly.
caffe編譯關於protobuf錯誤的解決辦法
問題 當主機上裝了tensorflow和anaconda時,再去編譯caffe就會遇到關於protobuf的錯誤。原因 系統使用的protoc是anaconda下的,一般版本是3.6 通過後面命令檢視 protoc version which protoc 而編譯caffe需要的protoc版本需要...
python 關於非同步的函式如何寫?
1 說在前面的話 目前我知道的庫 trio asyncio 這兩個庫 下面分別對這兩個庫的使方法進行舉例 2 asyncio 使用方法很簡單 客戶端 import time from pynng import pub0,sub0,timeout import asyncio address tcp ...
關於Windows下安裝caffe
目前只為練手,因此只用cpu練習。配環境。等cpu上面熟練了再練習安裝cuda。先說目前遇到的bug。2.我用的visual studio2013 ultimate版本。3.進入解壓的caffe master commonsettings.props.example重名名為commonsetting...