2015年6月15日

ipython parallel import

如果平行處理時需要import package時,可使用以下方式:
rc = Client(profile='ssh')
rc.block = True
dview = rc.direct_view()
dview.use_dill()

with dview.sync_imports():
   import numpy as np

# update dict
dview['np'] = np
dview['MyDerive'] = MyDerive

如果有自已定義的package(e.g. ipro)時,必須在每台機器設定PYTHONPATH,以保證可以直接在python當中import pro。

ipython parallel serialization

平行處理時,不論使用direct view或是loadbalance view, 物件序列化都是一個很麻煩的問題,後來找解法時,發現可以使用dill處理。

因為只有direct view支援use_dill() function, 如果loadbalace view也要使用dill時,可使用以下方法 (stackoverflow)。
rc = Client()
rc.direct_view().use_dill()
lv = rc.load_balanced_view()
如果要使用自定義的class時,還要考慮Data movement via DirectView, 否則無法呼叫class instance method,
class MyObject(object):

    def __init__(self, val):
        import os
        import platform
        self.name = platform.node()
        self.pid = os.getpid()
        self.val = val

    def run(self):
        return "{}, myobject {}_{}".format(self.val, self.name, self.pid)


def MyObjectrun(val):
    obj = MyObject(val)
    return obj.run()


def test_parallel():
    rc = Client(profile='ssh')
    rc.block = True
    print "nodes: {}".format(len(rc.ids))
    rc.direct_view().use_dill()

    rc.direct_view()['MyObject'] = MyObject
    lview = rc.load_balanced_view()
    res = lview.apply_sync(MyObjectrun, 10)
    print res

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(), 檢查版本是否正確,正確後即解決此問題。

2015年3月29日

TEJ股價調整方式

調整後股價=原始股價×調整因子
調整因子=當日之後所有〝調整係數〞累乘
調整係數=除權參考價/(除權前收盤價-現金股息)

2014年11月21日

django manual release query objects

之前在寫程式的時間,會在程式當中直接使用django的ORM,但是在查詢大量資料後,發現記憶體被吃完了,原因是如果不是使用網頁的方式執行ORM, 必須自行手動使用 
https://docs.djangoproject.com/en/dev/faq/models/#why-is-django-leaking-memory

from django.db import reset_queries
reset_queries()

來清除query object cache, 使用後,記憶體的使用量就變正常了。

2014年6月4日

MPICH3.1安裝

  • 已成功安裝在Ubuntu 14.04, Gentoo與Mint 16上,大部份機器使用icc/icpc與iort,部份機器使用gcc/gfortran。
  • 所有軟體均安裝在/opt/mpich資料夾下。
安裝步驟:
  1. 下載mpich3.tar.gz至/tmp目錄下並解壓縮
  2. cd /tmp/mpich-3.1/
    ./configure --prefix=/opt/mpich 
  3. make -j4 2
  4. sudo make install (要注意sudo的environment會重設的問題)

設定PATH: 
  • sudo vim /etc/bash.bashrc
  • sudo export PATH="$PATH:/opt/mpich/bin"
  • 確認PATH設定成功:mpicc

設定LDCONFIG:
  • sudo touch /etc/ld.so.conf.d/mpich.conf
  • sudo echo "/opt/mpichbin" >> /etc/ld.so.conf.d/mpich.conf
  • sudo ldconfig
  • 確認ldconfig設定成功:ldconfig -p|grep mpich



sudo的PATH重置問題

sudo在執行的時候預設會重置PATH環境變數
而不是使用root的PATH環境變數.

例.以root帳號開啟終端機(需先修改PATH讓他跟預設不同)
$env
PATH=/root/cbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

$sudo env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

看出差別了嗎?
root帳號有我自己加進去的/root/cbin
而用sudo去執行就沒有,因為他會重置成/etc/login.defs裡面的設定

方法1:在.bashrc設定alias,在sudo時帶入PATH環境變數(僅套用至目前帳號) 
$nano ~/.bashrc
加入以下這行
alias sudo='sudo env PATH=$PATH'

方法2:直接修改login.defs(影響全系統)
$nano /etc/login.defs

在這兩行修改成自己想要的
ENV_SUPATH      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV_PATH        PATH=/usr/local/bin:/usr/bin:/bin:/usr/games

方法3:關閉重置環境變數的設定(影響全系統) 
$visudo
打開sudo設定檔,加入或修改以下這行
Defaults    !env_reset


方法4:設定保留PATH環境變數的設定(影響全系統) 
$visudo
打開sudo設定檔,加入或修改以下這行
Defaults    env_keep = "PATH"