2017年2月22日 星期三

Coding 修羅場 - Online Judge

除了  LeetCode / TopCoder 等常見的程式練習

下面列出了幾個常見的線上解題系統

UVa Online Judge

Virtual Judge  (華中科大 online judge )

HDU Online Judge System


2017年2月21日 星期二

[Tensorflow] 以Intel Vtune amplifier 對 Tensorflow 分散式學習 Profiling

硬體配置 - 4台PC  負責運算的worker 上面各有2張 NVIDIA 的 GTX 1080

我以負責其中一台 node0 當作 parameter server

Analysis Target

Application : /usr/bin/python  #填入執行 python 的 binary 所在位置

Application parameters : /home/paslab/workspace/benchmark/tensorflow/exercise-01/example.py python example.py --job_name="ps" --task_index=0  #這邊相當於填入command line裡面的內容,我們在這邊輸入要profile程式的位置,接下來在輸入執行 python 訓練程式所在的位置

Working Directory : 選擇你要把分析完的結果存放在那理

Analysis Type

選擇自己需要的分析方式


以上都填寫正確並選擇完畢之後

按下 start 之後,如果一切正確,就可以看到分散式訓練順利的開始執行,如下圖一所示


圖一、VTune 成功執行分散式運算

表示 VTune 開始執行該支程式並開始 Profiling

[Tensorflow] [Linux] 執行分散式學習常見問題

Q1 : 在Linux環境底下,Parameter Server 該如何關閉 ?


A1 : 有個方法,先按下  [Ctrl] + [Z] 將該程式丟到背景並暫停

並在 cmd window 裡面下

pkill python

pkill 指令與 killall 指令類似,也是可以指定程式名稱,但是其所指定的名稱會直接以常規表示法(regular expression)的方式比對,只要比對成功,就會中止該程式。 對於不熟悉常規表示法的初學者而言,用此程式可能比較危險,如果使用不正確的常規表示法,可能會把不該中止的程式也砍了,所以使用上要注意。 --- 在 Linux 中使用 kill、killall 與 xkill 等指令強迫關閉程式

接下來再輸入

fg

fg 是將背景工作移動到前景,目的是確認該支程式已經被關閉 (Terminated)





Q2 :  明明檢查了cmd輸入的指令,還有不同台負責作工作分配的Parameter Server、算權重的Worker 它們運行的程式,為什麼不能執行?


A2 : 有個問題可能是之前執行的 python 程式並未正確關閉沒有結束,因此在GPU當中依舊存在殭屍程序。如果GPU的廠牌是 Nvidia,這個時候可以透過以下的指令

nvidia-smi

檢查 GPU 裡面運行的Process有那些,再利用以下的指令把它關閉

kill -9 process / kill -9 PID

kill -9 process 這個指令可以在沒有 admin 權限下把我自己帳號產生的 python 程序強制關閉,這邊要注意我所說的強制的意思,就是在這樣的關閉情況底下,程式所產生的暫存檔會消失。所以使用上需要特別注意,除非 -15 沒辦法正常關閉,不然不要隨意使用。

-9  :代表立刻強制刪除一個工作

-15:以正常的程序方式結束一件工作,與 -9 關閉的方式不同(類似直接關閉電腦的電源或是長按電腦的電源鍵 vs 正常程序關機)
不過,畢竟正常的作法中,你應該先使用 fg 來取回前景控制權,然後再離開 vim 才對~因此,以上面的範例二為例,其實 kill 確實無法使用 -15 正常的結束掉 vim 的動作喔!此時還是不建議使用 -9 啦!因為你知道如何正常結束該程序不是嗎? 通常使用 -9 是因為某些程式你真的不知道怎麼透過正常手段去終止他,這才用到 -9 的! ---  第十六章、程序管理與 SELinux 初探 - 管理背景當中的工作: kill

在 Linux 當中,常常遇到下的指令不符合權限這個問題,因此需要特別注意

由前面一連幾個章節的資料看來,我們一直強調在 Linux 底下所有的指令與你能夠進行的動作都與權限有關, 而系統如何判定你的權限呢?當然就是第十三章帳號管理當中提到的 UID/GID 的相關概念,以及檔案的屬性相關性囉!再進一步來解釋,你現在大概知道,在 Linux 系統當中:『觸發任何一個事件時,系統都會將他定義成為一個程序,並且給予這個程序一個 ID ,稱為 PID,同時依據啟發這個程序的使用者與相關屬性關係,給予這個 PID 一組有效的權限設定。』 從此以後,這個 PID 能夠在系統上面進行的動作,就與這個 PID 的權限有關了!---  第十六章、程序管理與 SELinux 初探
第十六章 程序管理與 SELinux 初探 這個是基礎知識補充,有需要再查詢即可

2017年2月16日 星期四

恆毅力 Grit : The power of passion and perseverance

Grit 這本書在台灣的書名翻譯作 恆毅力

這是作者Angela Lee Duckworth 在 TED 上的演講 Grit: The power of passion and perseverance

書中探討一個有趣的現象

就是關於成功的一個關鍵要素之一

猶記得羅胖在這集 怎樣成為一個高手  有提到

一個成長最簡單的方式就是,讓自己投身在一個你想要學習項目的環境

並且持續的做自己不會做的事情



提供一條道路給想要不斷升級自己心智作業系統的人

[MPI] MPI學習資源

MPI 的全名是 Message Passing Interface

它是一種 平行運算的通信協定

MPI is a communication protocol for programming parallel computers  
-- Message Passing Interface, wiki

網路上找到一個 MPI 的教學 (該網站的解說

雖然撰寫的文字是英文,但是使用的文字淺顯易懂,不會艱澀

而我所使用的軟體是這款  MPICH ,它是符合 MPI 標準通信協定的軟體

MPI 是 Messages Passing Interface 的縮寫,他本身是一個規格很嚴密的通訊標準,主要的功能是在處理平行運算之間各個 node 的資料交換,請注意, MPI 並不是一套軟體喔!而至於 MPICH 就是符合 MPI 這個標準通訊協定的一套軟體了!因此,我們可以經由 MPICH 這個軟體提供的 MPI 函式庫來達成平行運算的功能喔!也就是說,我們所寫的程式,只要能夠使用 MPICH 提供的函式庫,那麼該程式就可以進行平行運算時候所需要的功能了,這就可以避免程式開發者還要去處理通訊節點上面的問題,而可以將程式開發的重心著重在程式本身的問題上面! MPICH 是由 Mathematics and Computer Science Division的 Argonne 實驗室所發展 --- 鳥哥的Linux私房菜 簡易 Cluster 架設


同時也運行在中國超級電腦太湖之光上,顯見其效能與穩定性

在架構上面,MPI 是使用分散式記憶體


--- 圖片出自此文 OpenMP與MPI的差別


如果是中文影片教學的話,網路上剛好有 黃杰森 教授的線上課程 MPI 平行計算

有興趣的朋友可以參考

2017年2月13日 星期一

[Linux] 系統常用指令整理

切換資料夾

切換需要前往的資料夾
$cd /所要/前往/資料夾/路徑

切回上一個所在的資料夾(與電視兩個最後看的頻道兩個互相切換)

$ cd -

切回home目錄
$ cd
或是
$ cd ~



命令列視窗 - 以 Terminator 為例

單視窗分割


橫向分割  |

Ctrl + Shift + hOrizontal

縱向分割  —

Ctrl + Shift + vErtical

新增分頁

Ctrl + Shift + Tab

單視窗畫面內切換

Alt + 上/下/左/右鍵

不同分頁間切換

Ctrl + Page Up / Page Down鍵


關於權限

請進到擁有權限的資料夾進行操作

stackoverflow - fatal: could not create work tree dir 'kivy' : Permission denied 

[Linux] 關於資料路徑 $環境變數 的問題

最近在進行分散式學習的時候

犯了一個錯

所以今天我們就來把 路徑 的問題給釐清


在 Google Tensorflow 上的教學 Inception in TensorFlow 中

在 worker 0 的其中一個參數 data_dir =$HOME/imagenet-data \,如圖一所示

這邊是告訴負責運算的 worker,訓練用的資料是放在什麼位置


小知識 - 這邊的 \ 符號是指由於要輸入的內容太多,先以此作分隔

因此按下 [enter] 鍵之後,cmd的畫面會變成輸入下一行指令

當然,也可以將各項變數以 [space] 鍵隔開

圖一、分散式訓練

這邊的$HOME 這個是一個環境變數,其中,HOME一定是大寫

PATH 前面加的 $ 表示後面接的是變數,所以會顯示出目前的 PATH ! ---鳥哥的Linux私房菜  6.1.3 關於執行檔路徑的變數: $PATH
所以,在$符號後面輸入路徑位置的話,按下 [tab] 鍵

由於系統不知道你的變數是什麼

所以不會如我們所想的把路徑位置給自動填字的秀在 cmd 上





2017年2月11日 星期六

[Tensorflow] 權重更新機制 Parameter Server (參數服務器) 介紹

由於神經網路大小與訓練資料數量越來越龐大

所以分散式訓練已經成為機器學習的趨勢

其中 Tensorflow 的參數更新的方式是使用 parameter server 來作為權重更新的機制


不同框架的比較

以下是在知乎上很完整的介紹

最近比较火的parameter server是什么?

論文 Parameter Server for Distributed Machine Learning

論文作者本人李沐的介紹頁面


動畫解釋

另一篇【深度学习&分布式】Parameter Server 详解


看完這兩篇

對於參數服務器會有更深入的認識

[AI] MarI/O - Machine Learning for Video Games

MarI/O - Machine Learning for Video Games

MarI/O is a program made of neural networks and genetic algorithms that kicks butt at Super Mario World.

Source Code: http://pastebin.com/ZZmSNaHX

Paper: Evolving Neural Networks through Augmenting Topologies


/* 載入prettify的autoloader */ /* 載入JQuery */