2017年1月19日 星期四

什麼是寫程式中常出現的 Runtime ?

這邊的這個回答中提到的例子蠻好理解的

运行时(runtime)到底什么意思,应该怎么理解,能举例吗?

如果一定要打个比方的话,你可以把工作中比喻成运行时编译期就好比你对工作的准备时间。那么运行时从时间上来说就是你开始工作到下班为止,在工作中有一些特定的行为,比如使用公司的电脑,向上司汇报工作,为新手指点迷津等

2017年1月18日 星期三

GPU Profiling 工具 - NVIDIA CUDA Toolkit Visual Profiler(nvvp)

NVVP

NVIDIA 有專門出 GPU 用的 Profiling Tool nsight

以下是 教學文件

Nsight Eclipse Edition Getting Started Guide

基本原則與 CPU Profiler 相同

比較特別的是

在 New in Nsight Eclipse Edition 6.0 中提到

除了可以遠端除錯,還與VTune的新功能一樣可以遠端 Profile 程式
Profile -> Profile As -> Remote C/C++ Application

Profiling

如果前面的部份已經很熟悉了,就可以直接跳到

3.8. Profiling CUDA applications

這裡有更詳細的 Profile 說明

Profiler User's Guide


---------------------------------------------------------------

官方教學文件

GPU Performance Analysis and Optimisation

Optimizing Application Performance with CUDA Profiling Tools


2017年1月17日 星期二

[AI] 邏輯思維 2016 跨年演講 - 智能革命

在2016 的邏輯思維跨年演講,講到了未來 5-10年,人工智慧很有可能大舉且快速的改變你我原本的社會。對於一個想在新時代潮流中尋找機會的人

機會 來了

2016 人工智慧新的里程碑

羅胖先舉了一個2016的例子,IBM Watson 在閱讀了相當於 193m 高的醫療文獻,給予了醫療團隊準確的治療解決方案,拯救了一名年長的女性

我相信,如果這名女性如果是你我的母親或是親人,這個意義將會有多麼重大
參與計畫的東條有伸教授表示藉由這起病例,說明「人工智慧在醫療領域具有無窮的潛力,未來能對診斷和治療提供巨大幫助。」這種機器學習使用方法,事實上就是大數據的進化版,只是不再用人工自己去找關聯性,而是由機器代替人類閱讀、分析。事實上 Watson 已廣泛運用在 商務 、金融、 法律 以及 資安 等許多領域上,搭配它強大的自然語言與系統溝通能力,將能有效透過機器學習協助人類做出更快、更好的決策。 -- 人工智慧真能救人一命!IBM Watson 在日本找出罕見白血病,助患者渡難關 Inside 
在第4戰 AlphaGO 輸給了李世石。但是在那晚,它進入了精神時光屋,與自己多對弈了100萬盤棋,隔天再度面對李世石的時候,又提升了一個檔次,順利在第5戰拿下勝利[]

中國企業狀況

中國企業巨頭中,百度 Baidu 是目前人工智慧領域中累積最多的(Ex. 百度研究院招攬了史丹佛大學資工系的吳恩達),在這波人工智慧浪潮中,未來可能會是出現最大突破的企業 [2]

人工智能未來一定會出現下一代巨頭,只是不知道是誰,於是大公司願意將工具開放出來給大家使用,像是 Google 的 Tenorflow,方便嗅出未來的趨勢

大數據的下一步? [3]

有個著名的奧斯卡姆剃刀原則,就是如無必要,不增複雜。但是,在深度學習有了突破之後,這個原則很有可能不適用這個領域

人工智慧在2016大爆發的原因是因為出現了能夠駕馭複雜的3個要素,分別是-演算法的進步(深度學習)、硬體的進步(Nvidia 的GPU)、大數據的進步

第一是深度学习在这几年才刚刚发展起来的原因是规模化。 
我喜欢做一个类比,建立人工智能就像是建立一个火箭一样,到底什么叫做火箭,你要造一个火箭首先需要一个大的引擎,然后需要很多的火箭燃料,这两个都是非常大。如果引擎非常大,但是燃料非常少,这个火箭也飞不了多远。如果说引擎非常小,燃料非常多,有可能火箭根本就无法起飞。
只有引擎非常大燃料非常多的时候才能建造一个非常好的火箭。神经网络就像火箭的引擎,现在我们能够建立这样的神经网络,是因为现在规模化,是因为GPU的发展。而前面提到的火箭燃料就是今天大量的互联网公司获得的数据。 
--- 百度吴恩达:怎样用GPU来造人工智能“火箭” | GTC China 2016

因此,除了演算法跟硬體以外,還要能夠貼近數據才能夠讓火箭起飛。例如,2016年,李飛飛,加入並主持谷歌新成立的人工智慧實驗室[4],希望能夠繼續推進機器學習在Google產品上的應用

上面有提到了一個規模畫的優勢,如果來看中國,規模化這個概念絕對適用。2016年,人工智慧領域有 40% 的論文來自中國,同時海量(TB等級)的數據每天都在中國的一棟互聯網產生,拿來使用、訓練機器學習得模型更顯威力

獵豹移動 轉型 人工智慧公司,手上有數據,就有機會將它發揮[5]


人工智慧革命帶來的衝擊

大象與騎象人的比喻 - 人工智慧越來越像一頭難以控制的大象,人類就像那位在大象背上的騎象人,人類偶爾能夠給予大象一些指令,但是整體的過程中,

未來律師和醫生這兩個行業很有可能慢慢退居幕後[6],某些基礎的知識工作者開始面臨強大的衝擊。傳統的人人之間的競爭關係,變成人機之間的競爭關係



我們該提早因應一個問題

2016/1/18 補充,一早起來,又看到一個高薪的工作可能被人工智慧取代的新聞 - 不動產估價師[7]

Q : 未來如果人工智慧能夠取代大部分的工作,到底該如何生活 ?

<未來簡史>一書中提出一個概念,在人工智慧時代,毫無用處的人,沒有被剝削的價值 (還記得好萊屋電影極樂世界(Elysium)中的主角以及其他社會底層的人嗎? )

現有的職業,未來將有 很高比例的47% 會被人工智慧取代。如果只有仰賴單一或少數專業技能,很有可能被取代。但是,反過來說,如果是展現領導力(組織相當困難的事)、創造力(創造從來不存在的事物同時大家喜愛的事物),則是不容易被取代

人工智慧這次所造成的新產業革命,不但來的又快又急(5-10年內即可能讓一個產業的從業人員大量失業),全面衝擊你我的未來

未來的工作者,很可能只需要遵守 20/80 法則,了解某個產業的80%內容即可。以前認為要在某個領域裡面中做到十分頂尖,未來很有可能人工智慧就能取而代之。如果剛好你我的專長是人工智慧能夠取代,即使我們做到頂尖,也是白忙一場

(聽到這段,我覺得一萬小時定理沒有失靈,只是要投資在能夠產生複利報酬的項目上。這個時候就是比選擇的智慧)

Ex. 跟生產線比製造速度? => 不切實際

( 延伸影片 - The first 20 hours -- how to learn anything | Josh Kaufman | TEDxCSU )

未來世界

未來人類很有可能以知識的遊牧民族型態,與人工智慧競爭。哪裡水草豐美,就轉場到哪裡。如此一來,人工智慧暫時拿人類沒辦法


關於這個議題,其實前幾期節目 罗辑思维 176 人工智能 乐观悲观都是错的 有做過

有興趣的朋友可以看看


延伸閱讀
[1] 淺談Alpha Go所涉及的深度學習技術AlphaGo 功臣黃士傑回台:第四戰替李世乭開心,但工程師要回去找 Bug 了
[2] 百度仿亞馬遜推智慧音響,拉 Nvidia 推自駕車[BAT] 百度人工智慧「百度醫療大腦」,發展醫療電商布局線上醫療生態圈百度创建独立风投公司 2亿美金聚焦人工智能
[3] 吴恩达:人工智能在百度应用超乎预想
[4] 「她」被認為改變了 AI 界,Google 的人工智慧將因她的加入出現巨大革變
[5] 转型做内容的猎豹,为何如此看重人工智能?
[6] 律師也被人工智慧搶生意?AI「ROSS」將正式步入事務所,提供法律諮詢!
[7] 利用机器学习预测房产价格,旧金山房产评估初创公司 HouseCanary 获得 3300 万美元风险投资

CPU性能調校(Profiling)工具 - Intel VTune Amplifier XE 簡易介紹 與 使用方法

Intel CPU Profiling Tool

Intel 官方出了一個專門 Profiling 自家產品的工具叫做 VTune Amplifier XE

(口頭上習慣稱呼VTune)

圖一、使用畫面


能夠呈現 CPU 的使用率

看看程式中的什麼函式被呼叫比率佔的最高

想辦法來修改程式中使用率最高的部份

看看如何能夠讓使用率最高的函式執行速度更快

以達成效能提昇的目的

安裝


按照步驟安裝完成之後

接下來,就可以來試玩VTune了

使用


如果要在 Linux 上面開啟 VTune 的 gui

按照Intel官方的 How to Start Intel® VTune™ Amplifier from Ubuntu* Launcher 文章

當以 ssh protocol 遠端連線到其他台電腦的時候

請這樣輸入

$ ssh -X <ip address>

-X 是讓我們能夠以 gui 開啟被遠端的電腦中安裝的程式[1]

然後才在命令視窗中輸入

$ source <install_dir>/vtune_amplifier_2017/amplxe-vars.sh
$ amplxe-gui&


&是讓程式在背景執行的意思,輸入完之後,按下enter之後就可以繼續輸入其他命令[2]

(補充資料:
  以 source 執行腳本:在父程序中執行; 以 sh 執行腳本:在子程序中執行;
  - 12.2.2 script 的執行方式差異 (source, sh script, ./script))

就可以將 VTune 的 GUI 開啟

圖二、Intel VTune Amplifier XE 起始畫面

當然,也可以在 bashrc 或是 zshrc 設定環境變數,設定

export VTUNE_AMPLIFIER_XE_2017_DIR=/opt/intel/vtune_amplifier_xe_2017.1.0.486011

PATH="/opt/intel/vtune_amplifier_xe_2017.1.0.486011/bin64:$PATH";export PATH

這樣以後就可以直接在命令列視窗輸入

amplxe-gui&

附上之前遇到的問題,在 root 環境底下不能執行 Tensorflow

libcudart.so.7.5: cannot open shared object file: No such file or directory-----but it exists in the path

Also, you shouldn't be running the library as root. The better solution is to fix your permissions and then not use sudo.

要小心的是,如果把命令列視窗關閉的話,vtune也會被關閉


開始 Profiling


若我想要分析這支程式[3]

於是,依據情況 Analysis Target 中 

如果選的是 Launch Application[4]

Application欄裡面需要是可執行的2進位檔

例如,要profiling python程式[5]的話,路徑需要是python可執行的路徑位置:

 /usr/bin/python

然後參數項才是該支程式的所在位置

### case 1 ###

Application欄 

點選所要執行的程式:
/home/username/tensorflow-models/inception/bazel-bin/inception/flowers_train
(本例中flowers_train為bin檔,username 是自己的使用者帳號名稱)

Application parameters欄 

填入執行程式的參數:
--train_dir=/home/username/flowerData/data/flowers/train --data_dir=/home/username/flowerData/data/flowers/data --pretrained_model_checkpoint_path=/home/username/inception-v3/model.ckpt-157585 --fine_tune=True --initial_learning_rate=0.001 -input_queue_memory_factor=1 --max_steps=500 --num_gpus 1 --batch_size=1
(username 說明同上)

### case 2 ###

Application欄 

/usr/bin/python

Application parameters欄 

home/paslab/yihong/benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --local_parameter_device=cpu --num_gpus=2 \ --batch_size=32 --model=resnet50 --variable_update=parameter_server --use_nccl=False

在 Analysis Type 中,有一整排的分析方式可供選擇(ex. Algorithm Analysis、Compute-Intensive  Application Analysis etc.)

點選你需要的分析類別之後

按下開始,就能開始進行該程式CPU的使用情況進行分析

圖三、Profiling 完後Buttom Up分頁的畫面

分析結果


上面的這份投影片中有提到profiling python code之後的結果要怎麽進行簡易分析

1. 程式碼與CPU花費時間

點選Bottom up選項之後

可以看到使用的函式所佔的時間多少

點選該函式之後,還可以看見原始的程式碼以及所花的時間分別是多少,如下圖四所示

圖四、profiling之後的結果

2. CPU使用率

Profiling 完之後,會分別顯示不同顏色的CPU使用率資訊

官網CPU使用率當中的四種 Utilization Type ,其說明[7] 如下圖五所示

圖五、CPU Utilization Type

若想知道Spin Time[8]與 Overhead time[9]  的意義,可以閱讀文章最下方的參考文獻

以指令方式運行 VTune


身為Windows的多年使用者,我本人習慣以視覺化的GUI介面進行操作

但是在Linux的世界中,大家習慣以指令完成任務

畢竟早些年的時候,在電腦上面運行GUI的速度可能會讓使用者慢到咋舌

因此VTune團隊也為Linux設計指令式的操作

使用的語法可以參考下方連結中的官方教學


------------------------------------------------------------------------------------------------
參考文獻

[1] ssh(1) - Linux man page

提及 -X' Enables X11 forwarding. This can also be specified on a per-host basis in a configuration file.

X11 forwarding是指:
由於在Linux的環境下,圖形介面是以X Server為基礎來進行顯示的,所以當我們以一般command-line模式連入時將會無法看到圖形介面,需要另外在本機啟動X Server,讓主機能將圖形介面送過來。 而X11的資料傳輸是採明碼傳輸的方式,因此比較沒那麼安全,透過SSH進行X11 forwarding的主要目的就是將主機要送過來的圖形介面加密後,透過SSH這通訊協定加密再傳到使用者端並顯示在使用者端的 X Server上,以達到保護資料的作用(這也稱為SSH Tunneling) --- SSH X11 Forwarding
[2] 鳥哥的linux私房菜 - 直接將指令丟到背景中『執行』的 &

[3] SPEED UP TRAINING WITH GPU-ACCELERATED TENSORFLOW

[4] 修正選項名稱Launch a process 為 Launch Application

[5] Python* Code Analysis

[6] Analyzing Python Performance with Intel® VTune™ Amplifier XE

[7] CPU Usage

[8] Spin Time - Spin time is Wait Time during which the CPU is busy

[9] Overhead time - Overhead time is the time the system takes to deliver a shared resource from a releasing owner to an acquiring owner. Ideally, the Overhead time should be close to zero because it means the resource is not being wasted through idleness. However, not all CPU time in a parallel application may be spent on doing real payload work.

2017年1月13日 星期五

[Tensorflow] 什麼是 Placeholder ?

之前有點不太清楚 Placeholder 到底在做什麼

下面是我查到的結果,詳細的可以

A placeholder is simply a variable that we will assign data to at a later date --- Placeholders - Learning Tensorflow.com

簡單來講就是一個之後可以儲存值的變數 (想像一下 向量 或是 Tensor )

x = tf.placeholder("float", 3)

First, we import tensorflow as normal. Then we create a placeholder called x, i.e. a place in memory where we will store value later on. The 3 on this line denotes that we will store three values in this placeholder.

所以,等等 x 可以被儲存3個浮點數進去

當然,也可以不指定 x 的儲存數量,例如以下

x = tf.placeholder("float", None)

2017年1月11日 星期三

[Linux] 工具Terminator:如何將 Command window 畫面多重分割 + 同時輸入

感謝培任大大介紹好東西


情境題:如果需要"同時"安裝同一個軟體到多台電腦上面該怎麽做 ?

How do I run the same linux command in more than one tab/shell simultaneously?

有一個工具叫做 Terminator (魔鬼終結者!?)

它能夠將螢幕畫面切分成為許多不同的子畫面(還可以大小不一)

安裝好之後,在cmd裡面輸入指令

terminator

就可以使用囉


如果有自己常用的設定可以寫好一個腳本程式

需要使用的時候,呼叫它即可

同時,它有一個重要的功能是 Broadcast(廣播)

它能夠讓多個終端機畫面輸入相同的指令

我們可以設定所有的終端機畫面,或是自己定義的終端機群組,輸入相同的指令



以下是常用的指令:

Alt + A (All)        -> 將所有分割畫面 group 起來(但是未必是同個group)

Alt + G (Group)   -> 將自己定義的群組分割畫面 group 起來

Windows符號/Fn鍵 + g ->  將所有分割畫面 group 起來 (歸類在同個叫作"全部"的group )

Alt + O (Off)       -> 取消廣播

Ctrl + D               -> 關閉當下的終端機分頁

Alt +  ↑ /↓ /←/→ -> 在不同的畫面間切換(相同標籤)

Ctrl + PageUp/PageDown  -> 在不同的標籤間切換(最上面一排的標籤)

其他的快捷鍵 Keybindings


2017年1月8日 星期日

NVIDIA GPU - Compute processes: not supported

在這篇討論區的文章(Compute processes: not supported)中

提到使用 nvidia-smi 指令的時候,最下面顯示的 GPU Process 竟然沒有出現處理中的程序

到底是怎麽回事呢?

例如我在跑 Tensorflow 需要使用的範例的時候,也是顯示一樣的畫面


這篇 討論文章有提到一些端倪

很有可能是最新的驅動程式不支援過舊版本的GPU卡

所以完全讀不到任何正在處理中的程序

程序有可能正在執行,也有佔用了GPU的記憶體,但是沒辦法被讀到

所以才顯示 Not Supported

2017年1月5日 星期四

[Tensorflow] 安裝 Tensorflow r 0.12 + CUDA 8.0 + cudnn v 5.1

[前情提要]

重新安裝回去 Tensorflow  r 0.12 + CUDA 8.0 + CuDNN v 5.1 是因為遇到了下面的問題

原本的環境是 Tensorflow r 0.10 + CUDA 7.5(最穩定) + CuDNN v 5.1.3 + Ubuntu 16.04 LTS

執行 NVIDIA 官網上面訓練Google inception v3 的影像分類器之後得到以下的相同問題
NVIDIA- SPEED UP TRAINING WITH GPU-ACCELERATED TENSORFLOW


發現上面遇到的問題必須使用較新的Tensorflow r 0.11 版本

運行之後,發現貌似 r 0.11 只支援 CUDA 8.0
# Ubuntu/Linux 64-bit, GPU enabled, Python 2.7 # Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Install from sources" below. 
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.11.0-cp27-none-linux_x86_64.whl

---- 官方 r 0.11 的安裝


後來查證了 wiki 上 CUDA 的條目資訊

發現 CUDA 8.0 是能夠支援我現在所使用的GPU ( NVIDIA GeForce GTX 660 )

因此,為了執行後續其他的專案

保險起見,我還是先把 Tensorflow  r 0.12 + CUDA 8.0 + CuDNN v5 安裝起來

[前置作業]
解除安裝

解除安裝舊的 Tensorflow、CUDA toolkit、CuDNN

可以參考這篇 Removing nvidia cuda toolkit and installing new one

移除資料夾的方法可以參考這篇 rm – 刪除檔案及目錄指令
(特別注意:使用 rm 的時候請注意刪除的是什麼)

安裝

CUDA toolkit 8.0

先下載下來 CUDA toolkit 8.0

載完之後會有教使用者如何安裝的指令

Installation Instructions:
Run `sudo sh cuda_8.0.44_linux.run`
Follow the command-line prompts

CuDNN v5

一樣也是下載下來,再將 CuDNN 中的資料拷貝到 CUDA 的路徑中

sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

環境變數設定
按照以下的文字輸入進 .bashrc 檔(依據自己安裝的路徑進行調整)

export CUDA_HOME=/usr/local/cuda-8.0

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64:/usr/local/cuda/extras/CUPTI/lib64"

PATH="/usr/local/cuda-8.0/bin:$PATH";export PATH

設定完之後,請在 bash shell 中鍵入

source .bashrc

讓bashrc中的路徑設定進行更新

[配置]
進入tensorflow所在的資料夾,執行configure檔,例如以下的範例

$ ./configurePlease specify the location of python. [Default is /usr/bin/python]:

Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] N No Google Cloud Platform support will be enabled for TensorFlow

Do you wish to build TensorFlow with GPU support? [y/N] y GPU support will be enabled for TensorFlow Please specify which gcc nvcc should use as the host compiler. [Default is /usr/bin/gcc]:

Please specify the Cuda SDK version you want to use, e.g. 7.0. [Leave empty to use system default]: 8.0

Please specify the location where CUDA 8.0 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:

Please specify the cuDNN version you want to use. [Leave empty to use system default]: 5

Please specify the location where cuDNN 5 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:

Please specify a list of comma-separated Cuda compute capabilities you want to build with. You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus. Please note that each additional compute capability significantly increases your build time and binary size. [Default is: "3.5,5.2"]: 3.0

Setting up Cuda includeSetting up Cuda libSetting up Cuda binSetting up Cuda nvvmSetting up CUPTI includeSetting up CUPTI lib64Configuration finished

[常見錯誤]

心理準備

基本上安裝的時候會出現很多問題,Google 是你/妳最忠實的朋友,有問題就問它!


路徑位置

圖片檔經過轉換之後的TFRecord file 還有 訓練模型的 路徑位置請務必確認


GPU 記憶體大小

由於 GPU 內部的記憶體大小有限,所以一次處理過多的圖片會有記憶體爆炸的問題

所以可以先從較低的 batch_size 往上調,目前手邊的機器使用的是NVIDIA GTX 660

內部記憶體只有2G,我就遇到 ResourceExhaustError 這個錯誤,後來就從 batch_size  = 1開始往上調



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