顯示具有 雲端 標籤的文章。 顯示所有文章
顯示具有 雲端 標籤的文章。 顯示所有文章

2020年5月15日 星期五

五分鐘學會使用TPU訓練BERT自然語言模型





大家好我是Jerry老師,這篇帶來了五分鐘學會系列,主要跟大家分享如何在GCP上採用TPU來訓練自然語言模型,整個過程不包含「訓練時間、主機設定與安裝時間」只需要五分鐘就可以幾行指令就可以完成訓練操作。



首先大家必須要有GCP帳號,只要有申請Gmail,就可以快速開通。目前有300元美金免費試用,所以不用擔心費用,開通請往這裡



有了主控台之後,就可以開始玩了。
在主控台畫面,點選「新增專案」

接著可以會有一個自動產生的專案名稱,我們可以自己輸入,但是要記得輸入的名稱。
像是我在自動產生的名稱前後加上jerry跟tpu。

接著回主控台,在畫面右上角,開啟「Cloud Shell」



1.接著輸入以下參數
export PROJECT_NAME=jerry-project87630-tpu(注意這是剛剛我設定的ID)
請在紅字修改自己剛剛開的專案名稱

2.執行下面指令
gcloud config set project ${PROJECT_NAME}

3.建立bucket-name,這是Google專門存放資料的技術,我取的跟ID一樣好了
gsutil mb -p ${PROJECT_NAME} -c standard -l europe-west4 -b on gs://jerry-project87630-tpu
一樣請在紅字修改自己剛剛開的專案名稱


接著就正式開啟TPU囉
請輸入下面指令,這邊我的TPU名稱設定jerry,大家照貼即可。
ctpu up --tpu-size=v3-8 --name=jerry --machine-type=n1-standard-8 --zone=europe-west4-a --tf-version=2.2
這邊採用的是最新TensorFlow2.2版本
看到下面畫面,打 y 即可


接著會看到下面畫面,這是TPU建立過程。

接著進入我們剛剛設定好的TPU機器,執行下面指令
gcloud compute ssh jerry --zone=europe-west4-a
中間如果看到以下畫面,看到這幾行直接按Enter即可。

接著設定環境參數,執行下面指令
export TPU_NAME=jerry

設定BUCKET位置,這個跟前面設定一樣

export STORAGE_BUCKET=gs://jerry-project87630-tpu
一樣請在紅字修改自己剛剛開的專案名稱


然後安裝執行這次實作的套件
sudo pip3 install -r /usr/share/models/official/requirements.txt

最後就剩兩個步驟,設定以下環境參數

export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
(vm)$ export BERT_BASE_DIR=gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/bert-output(vm)$ export GLUE_DIR=gs://cloud-tpu-checkpoints/bert/classification(vm)$ export TASK=mnli

接著跑模型,執行下面指令

python3 /usr/share/models/official/nlp/bert/run_classifier.py \
  --mode='train_and_eval' \
  --input_meta_data_path=${GLUE_DIR}/${TASK}_meta_data \
  --train_data_path=${GLUE_DIR}/${TASK}_train.tf_record \
  --eval_data_path=${GLUE_DIR}/${TASK}_eval.tf_record \
  --bert_config_file=${BERT_BASE_DIR}/bert_config.json \
  --init_checkpoint=${BERT_BASE_DIR}/bert_model.ckpt \
  --train_batch_size=32 \
  --eval_batch_size=32 \
  --learning_rate=2e-5 \
  --num_train_epochs=3 \
  --model_dir=${MODEL_DIR} \
  --distribution_strategy=tpu \
  --tpu=${TPU_NAME}

看到下面畫面,表示跑成功囉,大約一小時之後會有結果,中途如果要中斷,就按Control+z

因為TPU非常貴,所以下面就是關閉的程序

首先離開VM
exit

接著確認目前的TPU有哪些還在執行
ctpu list

接著刪除指定的TPU,剛剛我設定的TPU名字是jerry,在下面畫面按 y 就可以刪除TPU囉!

ctpu delete jerry



目前的Google TPU費用,不同區域與等級都有不同價格
平均一個小時1塊到9塊美金不等

目前如果採用標準TPU-V2 約5塊美金,約156元台幣,跑一天差不多3800左右。
跑一個月就是11萬多,如果用好一點TPU-V3 約8塊美金,跑一個月17萬。
感謝文章的TPU費用是由Google雲端贊助的費用(GCP credit supported activity)。


以上是這篇文章跟大家分享透過TPU如何跑BERT模型,以及費用成本估算,感謝收看。



2017年5月8日 星期一

透過雲端工具快速實作情緒分析(Sentiment Analysis)

最近實在是太忙,終於有一點時間可以發文,情緒分析一直是筆者的研究之一。自從兩年前「情緒分析(Sentiment Analysis)的作法與商業價值」獲得高度迴響之後,就一直要找時間分享相關的研究。而剛好這兩年Google推出的自然語言技術越來越成熟,筆者就把使用心得給記錄在這邊。

因此本次實作主要使用Google自然語言API (Cloud Natural Language API)來進行情緒辨識,目前支援簡體中文、繁體中文、英文、法文、德文、義大利文、日文、韓文、葡萄牙文、西班牙文。


如果您只是是玩玩,想看一下Demo,Google提供兩個地方給大家玩,第一個到官網
可以自行輸入文字進行辨識情緒。

第二個
或是進到Google API進行API測試,網址請點這裡
透過上方的輸入之後,可以獲得情緒分數的回傳



第三個就是今天要說的,透過雲端工具來取得情緒分數,做之後的系統運用。

在基本教學前,我們自己的電腦必須準備的環境如下:

  1. Google Cloud Platform帳號
  2. Python 3以上的版本
  3. Virtualenv (pip install virtualenv)
  4. gcloud(依據自己的電腦做安裝,本次範例採用Mac OS X)
  5. 務必完成gcloud上面的登入設定
首先建立一個虛擬環境,筆者用gNLP為名稱,接著進入虛擬環境,指令如下圖所示:

接著我們要裝一下gcloud的Python套件,我們可以只裝Language的相關套件就行。
pip3 install --upgrade google-cloud-language


接著測試一下google cloud的套件是否正常,進入Python之後打以下指令:
from google.cloud import language

接著可以下載筆者從 範例加工過的程式碼,請點網址

這時候直接執行英文句子沒問題,但是輸入中文句子,就會出現問題,像是下面這張圖所示
大意是說他抓不到回傳的資訊,不過事實是目前中文正在測試,他不回傳您資料,但是有其他撇步可以使用。

接著我們要到套件本身做一下修改,從上面我們可以看到他是呼叫document這個函式,所以我們要到"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/google/cloud/language/document.py" 去修改 「document.py」這一個檔案。

打開之後 搜尋「null」看到下面的畫面

將裡面的null改成en,讓google自動偵測語言的機制有了預設值,改完之後存檔案。

再回來執行程式,就大功告成。
範例如下


Score是指情緒分數,Magnitude是指情緒的強度。

記錄一下Google自然語言API (Cloud Natural Language API)的API在一定的呼叫次數下是免費的,計費方式是採用每月1,000個字來做單位,以情緒分析為例,大概超過5,000個字之後就是1元美金,但是文字量越多越便宜,實際的計價方式可參考官方網址

總結一下

優點:
  1. 透過Google CNL API來實作辨識情緒,方便又快速,可以讓大部分的工程師、分析師比較不會太忙(ㄅㄠˋ ㄍ ㄢ  )。
  2. 不用理基礎設施問題,過往透過辨識情緒要耗費的運算資源,這部分都不用考慮進去,直接以Serverless的概念運作。
  3. 可以在五分鐘之內,完成情緒辨識功能,並且在一小時之內上線相關的系統,不用再訓練模型、驗證模型。
缺點:
  1. 有些複雜的句子目前還不能有效地辨識,像是筆者輸入「這台車真好,可是我從來都不開」情緒辨識的結果居然是正面的,所以中文句子還是有辨識問題。
  2. 一些具有領域知識的名詞 或是特殊名詞 ,混雜在句子裡面的時候,辨識也不會太準,像是「這台車真的是瞎爆了」這樣的句子也無法正常辨識。
  3. 透過Google CNL API實作,超過一定的呼叫次數後,就要錢(廢話)。
所以結論還是要請資料科學家幫忙做調整跟修正囉:)








2016年3月23日 星期三

雲端機器學習上手篇-以非監督式學習演算法為例

由於筆者對於數據分析都非常有興趣,也因為工作關係需要接觸到各種不同的雲端數據分析工具,繼上次筆者分享過「透過Python與Spark做氣象大數據分析」是屬於IBM Bluemix的服務,這次筆者要分享的是關於2015年2月微軟推出的Azure Machine Learning工具,有興趣的朋友可以從這裡選擇「Guest Access」快速進行試用。或是申請一個帳號,依照筆者的步驟執行,進行Microsoft Azure Machine Learning(MAML)的體驗。

過去在實務上經常發現要做一個數學模型與系統整合一起應用,是非常困難的一件事情,通常作法是需要先請統計學家設計好數學模型並驗證後,再交由軟體工程師進行系統整合,然後再依照市場需求做調整,再這樣反覆的過程中,統計學家改模型,軟體工程師調整系統,人力物力都消耗非常多。



在微軟這套Azure Machine Learning有幾個讓筆者覺得很方便的地方,筆者條列如下

  1. 應用模型即刻上線
  2. 多種現成應用選擇
  3. 採用拖拉互動介面
第一「應用模型即可上線」就是機器學習後的模型可反覆利用之外,還可快速佈署到雲端上,以筆者為例,要預測汽車價格,可在二十分鐘內完成模型佈署。第二「多種現成應用選擇」在Azure上有許多使用者分享了數學模型可以馬上使用,像是預測汽車價格電影推薦更多......等。第三是「採用拖拉互動介面」介面使用容易,類似SPSS、SAS的概念,都是採用資料探勘的流程來進行資料分析。


接下來在本次的體驗中,我們採用最經典的安德森鳶尾花卉數據集(Anderson's Iris data set)為例,並使用非監督式學習(Unsupervised Learning)方法中的K-means演算法來進行實作,以快速體驗雲端機器學習的便利性。

首先大家須先登入Microsoft Azure的介面,目前Azure新版的介面只要使用到Azure Machine Learning都會跳轉到舊的介面,因此就參考筆者以下的畫面,照著操作即可。

首先選擇機器學習服務。



選擇「新增」,並點選「快速建立」,我們可以在工作區名稱上,建立自己的工作區名稱,像是ML這樣的名稱。



接著進入工作區之後,點選下方的「在Studio中開啟」的選項,進入MAML的使用介面。


接著我們必須點選「DATASETS」去上傳資料集,將資料做上船的動作,我們採用這裡的資料,這是一份相當經典的示範資料集,只要到Google搜尋iris csv就有許多參考資料,資料中有150筆資料與5種資料欄位,下載之後我們點選「NEW」如下圖所示。


接著點選「FROM LOCAL FILE」將資料進行上傳的動作。


接著在介面上面直接「選擇檔案」,將檔案選好之後,點選右下角的勾勾,就可以進行上傳。


接著點選「EXPERIMENTS」,再點選下方的「NEW」。


接著我們會看到許多Machine Learning Samples,不過我們今天要自己做一個,所以點選「Blank Experiment」可以產生新的實驗環境。


接著看到工作區後我們可以在下圖紅色框中輸入這個專案的名稱像是筆者輸入「My First Azure Machine Learning Case,接著就可以開始實作囉!


首先我們從「Saved Datasets」裡面的「My Datasets」將剛剛上傳的資料集「iris.csv」整個拖曳到右邊的工作區。


接下來我們可以很快的對這個資料集做資料視覺化(Visualization),這是筆者覺得滿方便的地方,使用者只要一個右鍵,就可以對資料集做初步的了解。


這個簡易的資料視覺化目前可以透過盒鬚圖(Box-plot)、長條圖(Bar Chart)、平均數(Mean)、中位數(Median)、最小值(Min)、最大值(Max)、標準差(Standard Deviation)......等統計資訊去觀察資料的狀況。


接著原始iris資料集裡面包含萼片長(Sepal length)、萼片寬(Sepal width)、花瓣長(Petal length)、花瓣寬(Petal width)、種類(Species)共五個欄位,我們先拿掉種類(Species)的欄位,這個欄位並不適合放在這個學習模型中,因此我們在下圖左邊紅框中搜尋「Project Columns」將他拖曳到工作區。


接著點選iris資料集的圓點,拖曳到「Project Columns」的圓點,讓兩個功能做一個連線,如下圖所示

接著點選「Project Columns」,並點選右邊紅框的「Launch column selector」按鈕。


接著選擇「WITH RULES」→「ALL COLUMNS」→「Exclude」將「Class」欄位做排除的動作,如下圖示意。

因為一般來說,我們必須將資料分割成訓練集、測試集才能進行實驗,因此我們必須進行資料切割,這邊使用「Split Data 」,我們找到他之後,將他拖曳到右邊工作區。


接著一樣與Project Columns做連線。


接著我們點選「Split Data」的功能,輸入分割的比例,如下圖紅框所示,輸入0.7表示分割成訓練集70%,測試集30%,如果要分6/4就要輸入0.6,以此類推。


接著我們要有一個控制模型輸出的地方,找到「Train Clustering Model」之後一樣拖曳到右邊工作區。


接著我們將「Split Data」左下的訓練集(70%)拉到「Train Clustering Model」的右上角的圓點上,表示將訓練集放進去。


接著我們在Machine Learning裡面找到「K-mean Clustering」這就是今天我們提到的非監督式學習(Unsupervised Learning)演算法的一種,我們將他拖曳到工作區。


將「K-mean Clustering」的圓點連線到「Train Clustering Model」的左上角圓點,表示我們要使用該演算法建立模型。


因為集群計算之後,都需要設定集群結果給資料集,所以我們要使用「Assign to clusters」這個功能配置模型預測結果。


接著將「Train Clustering Model」左下角的圓點,與「Assign to Clusters」上方的圓點進行相連。


最後我們要再使用「Project Columns」將運算結果輸出,所以一樣找到「Project Columns」然後拖曳到工作區。


接著我們會看到很多個元件上都有紅色驚嘆號,因為我們都還沒幫他設定資料的輸入或輸出。


不過沒關係,我們繼續將「Project Columns」再拖一個出來,將「Train Clustering Model」的右下角圓點與它做連線,這個動作主要是將原始的資料做輸出,不做也能完成實驗。


接著如上面所述,我們將「Train Clustering Model」與它做一個連線,如下圖所示


接著我們要開始針對這些放上去的元件做參數設定,我們先從「K-mean Clustering」開始,我們將他的中心數(K)設定為3個,也就是要分成3群。

接著我們點選「Train Clustering Model」的「Launch column selector」按鈕。


將他的輸入設定成包含萼片長(Sepal length)、萼片寬(Sepal width)、花瓣長(Petal length)、花瓣寬(Petal width)四個欄位,如下圖所示。

接著我們將「Assign to Clusters」右上角的圓點與「Split Data」右下角的圓點,也就是測試資料集做連接,如下圖指標所示。


接著我們選擇「Assign to Clusters」的「Launch column selector」按鈕,設定要使用的欄位。


一樣包含萼片長(Sepal length)、萼片寬(Sepal width)、花瓣長(Petal length)、花瓣寬(Petal width)四個欄位,如下圖所示。


接著我們對最後一個「Project Columns」做個設定。


注意這邊除了選擇包含萼片長(Sepal length)、萼片寬(Sepal width)、花瓣長(Petal length)、花瓣寬(Petal width)四個欄位之外,還要再選擇「Assignment」,如下圖所示。

接著點選「SAVE」,再點選「RUN」。


接著會看到運行時間,因為資料不多,所以在幾秒內即可完成。


接著到這裡會出現下面錯誤,就是「Project Columns」找不到「Assignment」的問題,如下圖所示。


不過沒關係,我們只要到「Project Columns」裡面,再點選「Launch column selector」。



然後把剛剛選的「Assignment」刪掉再選一次即可,筆者推敲問題的原因是,模型還沒計算,所以第一次不會有「Assignment」的結果,所以要再設定一次。


接著再「SAVE」與「RUN」一次


接著我們就可以點選「Project Columns」裡面的「Visualize」就可以看到分群的結果。



我們可以發現測試集的45筆資料,多了一個「Assignments」並且裡面分了0、1、2共三個群。
這就是我們初步的成果,不過還沒結束,接下來我們想把模型應用到系統上。


我們將要進行機器學習與系統整合這塊實作,在「Web Service」裡面,我們拖曳出「Input」。


接著將「Web service input」 與「Project Columns」做連接,表示新的資料有一部分會從這裡輸入。


接著我們將「Output」也拖曳到工作區,並將「Assign to Clusters」的下方圓點與「Web Service Output」做連接。


接著我們點選「SAVE」、「RUN」。


運算完之後,我們點選「SET UP WEB SERVICE」裡面的「Predictive Web Service」進行系統佈署前的設定。


接著可以看到Azure自動將我們的模型與系統做流程調整。


設定完之後,再做一次「SAVE」、「RUN」,將系統模型做儲存。


接著我們再點選一次「SET UP WEB SERVICE」就可以讓我們的演算法轉成API給系統使用,API全名為應用程式介面(Application Programming Interface),通常就是系統與系統間做傳輸共通標準,有了這個標準後,工程師不管寫甚麼系統,都可以直接透過API跟模型做連接,這個就是筆者覺得很方便的地方,因為這樣資料科學家就可以專注做模型即可。


獲得API之後我們可以做一個簡單測試,點選「Test」。


我們嘗試在框框中輸入萼片長(Sepal length)、萼片寬(Sepal width)、花瓣長(Petal length)、花瓣寬(Petal width)四個欄位的新數字,也就是我們想要透過我們的模型去預測它的分群。

點選確認之後,我們就會在下方看到預測結果,筆者依次輸入1.2、1.5、1.7、1.9,他就被分到第1群(我們共有0,1,2三群)。


接著我們想要佈署到系統上,Azure很貼心的準備了C#、R、Python樣本程式碼,我們點選下圖左邊紅框的選項。


除了一些API使用說明之外,這裡就附上了三種語言的樣本檔案。


在每個程式碼當中,都需要加入api_key才能使用。


API KEY的內容可以參考筆者下方紅框中的資料,每個模型都有屬於自己的API KEY,所以不用拷貝筆者的。


接著做了替換之後,如果您是像筆者是寫Python 3,那就必須再做一些程式碼調整,如下圖紅框所示。


接著我們可以在Values裡面輸入我們想要預測的數字,執行之後就可以看到相同的結果。


下圖中,上面是用Test的結果1.2,1.5,1.7,1.8被分到第1群,下面使用Azure樣本python程式碼,一樣也是被分到第1群。


之後就可以把這段程式碼修改並佈署到相關的系統當中。

以上就是雲端機器學習的上手教學,希望能協助讀者做初步雲端機器學習體驗。