Microsoft Cognitive Services – Great Application

今年2016 MS Build釋出了這段影片,相當令人感動,值得撥出時間細細品嚐

其中就是用到 Cognitive Services,如Face API, CV API,以往要花時間實作實驗的演算法現在只要呼叫API即可達到,相信未來物聯網會有更多的應用出現。而現在只是個開始,未來仍有許多技術問題要去解決,像是不同語言的問題(目前仍主要在英文)、在地化、不透過雲端在IOT Device上運算的效能(為避免斷線影響或是latency)等等…

相信技術問題終究會被解決,在背後技術越來越完備的情況下,我們是否有辦法創造更多貼近使用者的應用,讓更多人的生活變得更好呢?我相信這是Data Science一大目標,用更多生活中的資料讓這世界更美好,能夠幫助更多需要幫助的人們。

Cortana Intelligence Suite – BIG DATA Ingestion

Cortana Intelligence Suit

Cortana Intelligence Suite

先前在Face API有稍微提到CIS (Cortana Intelligence Suite),當時主要研究的是在Intelligence下的Cognitive Services部分,現在回過頭來探討整個架構中資料汲取資料儲存的部分,分別是Information Management/Big Data Stores兩塊,這篇先聚焦在Information Management

Information Management

這部分提供了三塊服務

  • Data Factory
  • Data Catalog
  • Event Hub
Data Factory

Data Factory

中文可翻作資料工廠,顧名思義可以想像成一般工廠在處理加工物的行為,想像今天要製造可口可樂,一開始需要輸入可樂的原料、瓶子的原料等等,之後工廠進行可口可樂瓶的製造、可樂的製造,最後進行組裝將一瓶一瓶的可樂進行裝箱,送出到銷售端

Data Factory做的事情類似,INGEST步驟可消化來自不同的資料來源,進入的資料經過TRANSFORM&ANALYZE步驟,像是ETL轉換或是結構化資料等動作,最後PUBLISH步驟輸出到其他資料端進行資料儲存或是資料視覺化

Data Catalog

資料目錄服務是為了解決資料太多搜尋不易的問題而誕生的,幫助分析師、資料工程師、資料科學家等人員快速找到所需的資料,透過建立資料的Metadata讓整個資料集容易被存取

Event Hub

Event Hub為了解決來自各種Device產生的海量資料(event)所產生的可擴充性資料服務,每秒可接收百萬筆的資料進入,再將此資料流導向不同的應用,例如即時資料串流分析或是批次型資料分析

針對不同資料流提供不同的設定,不管是資料流每秒產生event,或是每分鐘產生event,都能夠對這些資料串流客製化,正確接收,另外提供了HTTP或是Advanced Message Queuing Protocol (AMQP)的protocol或是Naive client滿足不同的平台。

更詳細設計可見Azure Event Hubs overview

Microsoft Cognitive Services – Face API tutorial

Cognitive Services

Cortana Intelligence Suite

Cognitive Services(原Project Oxford) 為整個 Cortana Intelligence Suite 的其中一環(Intelligence),
主要提供了電腦與周遭環境(大多是非結構化資料)間的橋樑,幫助開發者精確運用這些資料,開發智慧應用。

Cognitive Services 提供一系列API,分為五大方向

  • Vision
  • Speech
  • Knowledge
  • Search
  • Language

Face API

進行人臉相關處理可以使用 Face API,目前為V1.0版本,共提供了以下幾類API

  • Face Detection – 偵測性別, 年齡
  • Face Verification – 分辨是否同一人
  • Similar Face Searching – 找相近的人臉
  • Face Grouping – 人臉分群
  • Face Identification – 辨別是哪個人

API使用方式大同小異,以下將用 Face Detection API 當作例子

Get Key

Sample Code

以下 code 是從API Doc修改而來

主要步驟

  1. 準備API url (即_url)
  2. 準備API key (即_key)
  3. 準備API POST參數 (param, headers)
  4. 此範例使用 returnFaceLandmarks = True 將會回傳 Face Landmark
  5. returnFaceAttributes = Age, Gender 將會回傳性別與年齡
  6. 將欲偵測圖片網址用json送出 (同時也提供了讀取圖檔的方式)

face_detection.py

import time
import requests
import operator
import numpy as np
_url = 'https://api.projectoxford.ai/face/v1.0/detect'
_key = '??????' #API Key
_maxNumRetries = 10
def processRequest( json, data, headers, params = None ):
    """
    Helper function to process the request to Project Oxford
    Parameters:
    json: Used when processing images from its URL. See API Documentation
    data: Used when processing image read from disk. See API Documentation
    headers: Used to pass the key information and the data type request
    """
    retries = 0
    result = None
    while True:
        response = requests.request( 'post', _url, json = json, data = data, headers = headers, params = params )
        if response.status_code == 429:
            print "Message: %s" % ( response.json()['error']['message'] )
            if retries <= _maxNumRetries:
                time.sleep(1)
                retries += 1
                continue
            else:
                print 'Error: failed after retrying!'
                break
        elif response.status_code == 200 or response.status_code == 201:
            if 'content-length' in response.headers and int(response.headers['content-length']) == 0:
                result = None
            elif 'content-type' in response.headers and isinstance(response.headers['content-type'], str):
                if 'application/json' in response.headers['content-type'].lower():
                    result = response.json() if response.content else None
                elif 'image' in response.headers['content-type'].lower():
                    result = response.content
        else:
            print "Error code: %d" % ( response.status_code )
            print "Message: %s" % ( response.json()['error']['message'] )
        break
    return result
# Face detection parameters
params = { 'returnFaceAttributes': 'age,gender',
           'returnFaceLandmarks': 'true'}
headers = dict()
headers['Ocp-Apim-Subscription-Key'] = _key
headers['Content-Type'] = 'application/json'
# URL direction to image
urlImage = 'https://raw.githubusercontent.com/Microsoft/ProjectOxford-ClientSDK/master/Face/Windows/Data/identification1.jpg'
json = { 'url': urlImage }
data = None
# Load raw image file into memory
#pathToFileInDisk = r'D:\tmp\identification1.jpg'
#with open( pathToFileInDisk, 'rb' ) as f:
#    data = f.read()
#json = None
# Get result
result = processRequest( json, data, headers, params )

葉奇鑫 x 好奇心

今天和沛科技內部讀書會社團舉辦了葉奇鑫x好奇心座談會

葉奇鑫是和沛現任的營運長,曾跨法律電商雲端領域,擁有相當獨特的經歷

特別邀請來與我們分享一路上的心得

任何法律都是有道理的

營運長提到過去念法律的時候,短短三四年就從完全不懂到雙榜錄取

其中的秘訣在於理解

去找出每條法律背被背設計出來的原因,背後一定有道理

試著去找出來去理解它,去懂它而不是背誦

如此一來久了不容易忘,在不同的情境下也會懂得變通

學會用商業角度思考

營運長分享過去電商的一次經驗

當時資料量大到無法每筆資料都做索引(indexing),導致資料庫停止運作,網站因此停擺

若修復需花半年時間,然而這是個營運中且成長中的網站怎麼可能說停就停?

於是想到折衷的辦法,只取最新的資料做索引,太舊的資料就放棄了

從技術的角度是完全不被接受的,因為有一大半資料並沒有被索引被可搜尋

但是在商業上卻是個可營運的產品,而且使用者是可以接受的

很多時候從技術角度與商業角度看是兩回事,看這產品還不是100%沒有問題,但是從商業角度看已經是可成為產品,大多數使用者已能夠接受

從中學到理工背景出身的人,思維要翻轉,看事情角度要試著用商業端的思維思考,結果也許會完全不同

玩你的工作

營運長同時也分享為什麼他在各領域工作都能成功的秘訣

秘訣在於玩你的工作,是否有喜歡上你現在的工作

每天上班只是在數日子還有幾天放假嗎?如果有這樣的現象是不可能做到最好的

只是在應付這份工作而已,真正喜歡的工作你連下班的時候也會去思考

營運長說過去在電商幾乎很少放假,甚至在網站成長的兩年間沒有出國過

為什麼?因為每天的工作都是樂趣,自然做事就會用心,用心的結果自然會有人發覺

[筆記] 視訊訊號處理與深度學習應用

上週六參加了視訊訊號處理與深度學習應用課程,

主講人是陳維超博士

投影片如下,有興趣的人可以自行閱讀

http://www.slideshare.net/tw_dsconf/ss-61255961

這是堂相當有份量的課,主要分成幾大塊主題 (更完整可看p6的knowledge map),每個主題都值得大量時間仔細咀嚼吸收

  1. CV基礎
  2. 多媒體資訊檢索
  3. 影像識別 (Visual Recognition)
  4. GPU
  5. OpenCV實作

其中OpenCV實作結合了PiBorg,運用簡單的內建function兜出了可以追蹤的物件轉彎的小汽車,從這小地方可以見到未來物聯網的無限可能性。

Image, Video是非結構資料(Unstructured data)的一種,而我們每天都在產生它,掌握這方面的處理相信是資料處理不可或缺的一環。

[翻譯] 如何修復 MariaDB Galera Cluster

Intro

這篇原是寫在Percona XtraDB Cluster的情境,但大多數情況可以套用在MySQL+Galera組合,不管來自Codership, MariaDB Galera Cluster或你自己的build。目前經過筆者的測試,在MariaDB Galera Cluster是符合的。

假設cluster中,有節點A, B, C。模擬在不同節點停止的情境下,如何修復正常。(圖片請參閱原文)

情境1

節點A正常停止。

像是為了系統維護或是更改環境設定等等,此時正常關掉節點A。在這情況下,其他節點會收到通知,因此會自動更新設定值,如cluster大 小,quorum的計算方式等等。一旦我們重啟節點A, 就會自動加入回cluster。這新加入的節點會等資料都同步完成後才開始服務。

同步方式:由writeset cache(gcache.size)資料決定,若要同步的資料都在此cache中,則會執行IST(Incremental State Transfers),較輕量且快速。若不是,則會執行SST(State Snapshot Transfer),將完整的binary data snapshot複製到節點A。

情境2

節點A, B正常停止。

此時cluster大小為1。此時節點C為primary component,可以正常服務。要將其他節點加入回cluster,就只要重啟即可。

同步方式:

節點C切換至 "Donor/Desynced" 模式,提供最後的狀態給第一個加入節點 (State Transfer)。有些負載平衡器 (Load Balancer) 會移除Donor模式的節點,所以應避免一個節點的情況。

重啟A, B節點時,由於gcache可能還存在該機器中,為了避免節點B使用到節點A的gcache,需設定這兩台的Donor為節點C

service mysql start --wsrep_sst_donor=nodeC

情境3

節點A, B, C正常停止。

這時候Cluster已經失效,所有節點已經停止,需要重新啟動Cluster。重新啟動需要由最後關機的機器開始,確保資料的完整性。從grastate.dat檔案可以得知,比較seqno,最大者的為最後關機的機器。

使用下列指令啟動Cluster

service mysql start --wsrep_new_cluster

或是

service mysql start --wsrep-cluster-address="gcomm://"

當第一台開啟完成,新的Cluster已經產生,其他機器便可直接啟動,只要確定wsrep-cluster-address含有第一台或是已經加入Cluster的機器位址,即可加入。

情境4

節點A消失。(這裏指的可能是停電,硬體損毀,mysqld掛點,系統Kernel掛點等可能性)

此情況下,節點B與C會試著與A連線,經過一小段時間發生timout,確定節點A已經消失,即將它移除Cluster。

同時更新Quorum,剩下兩個點2/3 > 1/2,所以系統正常運作。

節點A重開後即可自行加入Cluster。

情境5

節點A與B消失。

由於只剩下節點C還活著,Quorum計算 1/3 < 1/2,所以節點C會進入 non-primary 狀態,會停止系統服務。一旦節點進去 non-primary 狀態,所有 SQL Query 都無法執行。

修復方式:

有兩種。

  • 第一種較為簡單,即是等待其他節點恢復運作,此情況下,恢復運作的節點將加入節點C,Cluster將自動重新形成,節點C也回到 primary 狀態。

  • 第二種方式,若要捨去節點A, B(可能因為損毀無法立刻回來),單獨使節點C運作,進去MySQL Prompt輸入下列指令。此方法必須確認其他節點並沒有同時在服務,否則會造成資料不同步。

    SET GLOBAL wsrep_provider_options='pc.bootstrap=true';

情境6

節點皆消失。

在這情況下,要找出最後消失的節點,從該節點啟動Cluster,確保資料的完整性。Galera versions (3.6+?) 之後會自動透過gvwstate.dat,找到最後消失的節點,並且做完修復 primary component 的動作。

同步方式:

正常重啟Cluster即可。

情境7

最後一個情境是偶數數量的節點,分成兩部分彼此無法連線。

像是三個節點在本地端另外三個在資料中心,當其中的Switch停電失去作用的話,當導致彼此都進入大腦分離的狀態,類似情境5的情況 3/6 = 1/2 無法決定 primary component ,因此兩邊都為 non-primary ,設定 bootstrap 可解決

SET GLOBAL wsrep_provider_options='pc.bootstrap=true';

注意:此設定不可以同時在兩邊 non-primary ,會造成兩邊各自形成一個新的Cluster,即使中間連線恢復了也不會重新合併一個。此情況會持續到一邊關機重啟根據設定檔 gcomm 加入另一邊的Cluster為止。

本篇參考來源: 原文

[筆記] 安裝MariaDB Galera Cluster

簡介

MariaDB Galera Cluster是基於MariaDB系統下的叢集架構 (以下將以Cluster稱之),採用Multi Master設計,在Cluster中每個節點都可以作為Master進行讀寫動作。(注意:現在只支援 InnoDB/XtraDB storage engine。)

相較於傳統Master Slave設計 (例如MySQL Cluster) 提供的讀寫分離,Multi Master可以更彈性的規劃節點數量,加入新的節點而不影響現有規劃。

更能夠搭配 MariaDB MaxScale 提供HA, content routing, querying logging等服務。

安裝與設定

假設現在有三台機器要組成Cluster,資訊分別如下

NodeA 10.10.0.230
NodeB 10.10.0.231
NodeC 10.10.0.232

安裝

以 ubuntu 14.04 為例 (其他版本請用這頁選擇 source list)

加入source list

sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
sudo add-apt-repository 'deb http://ftp.osuosl.org/pub/mariadb/repo/10.0/ubuntu trusty main'

安裝

sudo apt-get update
sudo apt-get install mariadb-galera-server

設定

基本流程只要提供設定檔 + 啟動mariadb,確定有加入cluster,就完成。

加入基本設定檔 cluster.cnf 如下

cat /etc/mysql/conf.d/cluster.cnf
[mysqld]
query_cache_size=0
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_type=0
bind-address=0.0.0.0
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="test_cluster"
wsrep_sst_method=rsync

另外在NodeA加上

wsrep_cluster_address="gcomm://"

若是非NodeA則加上

wsrep_cluster_address="gcomm://10.10.0.230"

意思是NodeA會啟動一個新的cluster設定, 為test_cluster

其他機器(NodeB, NodeC)會透過10.10.0.230 即NodeA的IP加入此Cluster

(PS. 若是cluster有兩個以上節點,可以任意指定一個或多個加入cluster)

在NodeA啟動mariadb

sudo service mysql restart

NodeA已經啟動後,其他節點一樣啟動加入

sudo service mysql restart

狀態

此時Cluster已經產生,如果要確定機器已經加入

可以在MariaDB prompt下

MariaDB [(none)]> show status;
wsrep_incoming_addresses | 10.10.0.230:3306,10.10.0.231:3306,10.10.0.232:3306

有出現IP表示已經加入成功

[筆記] 資料科學的第一堂課 – 資料團隊的建立

資料團隊的建立
  • 三個出發方向:資訊,數學統計,該問題領域
    • 專精兩項很少
  • 個人特質:
    • 細心
    • 溝通能力
    • 富創意
  • 好的成員可以耳濡目染學習其他面向
  • 好的領導者可以把不同面向的成員組合起來
  • 最小團隊組成
    • PM
    • Data Scientist
    • Data Engineer * 2
    • Visual Designer
最小工作平台
  • command-line tools can be 235x faster than your hadoop cluster
  • most of time, workstation + R/Python is enough
  • Except: deep learning – 十億筆
  • Its not how much data you process, how much insight you analysis is key
  • BIG DATA, BIG MODEL往往不是重點
資料必須是一等公民
  • 資料不只是debug用途
  • 資料收集, 保存, 提供也是系統規格的一部份
  • 資料團隊在第一代就必須進行檢視log, 定義資料收集spec
讓資料成為企業資產,非部門資產
  • 所有資料由單一團隊統一管理
  • 資料團隊為戰略編組,高層火力支援
  • 提高資料重要性層級
永遠從簡單的資料分析開始
  • 複雜的model都是由簡單的開始
  • draft zero, end to end 做好再慢慢refine
企業導入資料科學團隊具有一定難度
  • 涉及paradigm shift
  • 經驗 -> 測量
  • 定義 -> 探索
  • 私有 -> 開放

[筆記] 資料科學的第一堂課 – 什麼是資料科學

陳昇瑋

課前閱讀:

台灣資料科學教父:好奇心比程式能力重要 (今周刊)
http://www.appledaily.com.tw/realtimenews/article/new/20151029/721370/

Gogolook 怎麼快速累積新台幣 5.29 億的價值?專訪中研院陳昇瑋談「如何培養資料科學家」
http://buzzorange.com/techorange/2013/12/30/interview-with-data-scientist/

投影片

http://www.slideshare.net/swchen11/ss-52517363

為什麼介紹這門課程?
"Let’s solve this problem by using the BIG DATA none of use have the slightest idea what to do with"

因著BIG DATA名詞的流行,想跟上資料分析的浪潮,但往往卻不知到該怎麼做。

定義Science 與 Data Science

Science
科學性的方法,可以反覆驗證被檢驗

Data Science
從資料中獲取知識的科學性方法

為什麼學資料科學?

資料科學是工具,幫助我們去更好更快速拿到知識的方法

Data Science是從數學,統計開始發展的領域,包含Pattern Recognition, Data Mining, Machine Learning, AI, Neural Networks, EDA, …

值得注意的一點:Big Data是DS的subset, 只有在符合某種條件下的資料,才算是Big Data

DS範例:
Street2shop, ICCV 2015

美國台灣做個人化車險, 藉由量測駕駛行為估計保費, 對個人省保費, 保險公司更能精算保費, 資料回饋到售車公司 三贏

台灣過去注重硬體, 很少做軟體, 普遍對資料的敏感度較低

HIPPO-driven to data-driven

為什麼資料科學很紅?
  • BIG DATA符合下列任一條件
    • Volume: 多大叫做大?
      • 傳統方法無法處理: E.g. mysql: 超過10TB就會非常慢, r,python: 超過1T
      • 資料儲存 / 資料分析
    • Velocity
      • 資料量輸入越來越快
      • 傳統資料是batch模式, 現在real time需求在某些情況更重要
    • Variety
      • 多樣性的資料帶來價值 (異質性)
        • 牛肉麵店 + 氣溫
        • twitter + 地震
      • 多樣性在格式上面 (computer vision/video, image)
      • Target’s Pregnancy Index (2012 個人化DM) 台灣目前還沒看過, 還停在很粗淺的敘述統計
  • Data Discovery
    • BI vs Data Discovery
      • BI: 企業本來就知道的問題 + 企業大概知道的答案 = 報表 (Data Analyst)
        • 智慧在於人的腦袋
      • DD: 企業不知道的問題 + 不知道的答案 (Data Scientist)
        • 先用資料來回答 問題在哪裡?
        • 難在於有能力列出假設
        • 還需要創意, 商業分析, 等等…

Relation -> NoSQL(Relation不能用時, 或是需要快速寫入) -> Hadoop(50TB)

靈魂人物:資料科學家

門檻高

  • 技能
    • 數學統計
    • 程式能力
    • Domain Knowledge+Soft skills
    • 溝通能力/視覺化能力
  • 心態
    • 好奇心強
    • 創意
    • 科學性做事方法