2015年6月15日

ipython parallel

  • automatic setting: ipcluster
  • manual setting: ipcontroller and ipengine

因為我們使用多台機器計算,所以使用ipcontroller and ssh方式設定。

設定profile

  • $ipython profile create --parallel --profile=ssh
  • 會在/home/chenhh/.ipython/profile_ssh/中建立許多設定檔

執行ipcontroller

  • $ipcontroller --profile=ssh --reuse
    • 必須指定profile=ssh才會讀取profile_ssh中的設定,否則預設讀取profile_default中的設定。
    • --reuse指定重複使用json檔,否則每次執行ipcontroller時會生成新的json檔。
  • 會在/home/chenhh/.ipython/profile_default/security/資料夾下生成ipcontroller-client.json與ipcontroller-engine.json兩個設定檔。 
  • 將engine的設定檔以scp方式傳給engine
    • scp /home/chenhh/.ipython/profile_ssh/security/ipcontroller-engine.json ./
  • 而engine使用以下命令執行
    • ipengine --file=./ipcontroller-engine.json

ipcontroller_config.py設定 

HubFactory

  • c.HubFactory.ip = u'*' 
    • #listen to all interface,此設定對應到ipcontroller-engine.json中的location內容。

IPControllerApp

  • c.IPControllerApp.work_dir = u'/home/chenhh/.ipython/profile_ssh'
  • c.IPControllerApp.profile = u'ssh'
  • c.IPControllerApp.reuse_files = True

engine

  • $ipython profile create --parallel --profile=ssh
  • 使用scp chenhh@192.168.1.1:/home/chenhh/.ipython/profile_ssh/security/ipcontroller-engine.json /tmp 將檔案複制到/tmp資料夾下。
  • $ipengine --file=/tmp/ipcontroller-engine.json --ssh=chenhh@192.168.1.1  --profile=ssh
    • 注意一個ipengine只會對應到一顆cpu, 如果要使用多個cpu時,上述指令多執行幾次即可。

ipython

  • from IPython.parallel import Client
  • rc = Client(profile="ssh")
  • 指定profile後,即可使用

debug

我的controller主機使用的zmq版本是4.0.4,而engine中,有一台的zmq版本是2.0.2,所以該台主機在連線時,一直出現heartbeat timeout。
解決方法:
  • 首先將engine的zmq-dev版本更新為libzmq3-dev:amd64的版本。
  • pip uninstall pyzmq
  • 然後抓取pyzmq的source code, python setup.py install後,使用ipython。
    • import zmq
    • zmq.zmq_version_info(), 檢查版本是否正確,正確後即解決此問題。