ทดสอบ Code Highlight

ทดสอบ

import time
for i in range(10):
    print('Hello World')
    time.sleep(1)

Ubuntu 16.04 Mate Desktop Disable F12 drop-down terminal

Ubuntu 16.04 Mate Desktop Disable F12 drop-down terminal

killall tilda
- Remove tilda via apt

sudo apt-get remove tilda

F12 drop-downterminal

รีวิว KingSpec SSD 256GB mSATA Half size 256GB

ห่างหายจากการเขียน Blog ไปนาน วันนี้ผมจะมารีวิว SSD ยี่ห้อ KingSpec ขนาด 256GB แบบ Half size mSATA

เนื่องจาก Harddisk SSD (24GB) ใน Notebook  ที่ผมใช้งานมันกำลังจะเต็มจึงอยากจะเปลี่ยนให้มีขนาดที่ใหญ่ขึ้น ตอนแรกคิดว่า Notebook ใช้แบบ M2 แต่เพื่อความชัวจึงได้แกะเครื่อง (แกะยากมากต้องเอาการ์ดคอยกรีดคอยแงะ) ออกมาเผื่อดูว่าเป็นแบบไหน สรุปแล้วคือใช้แบบ mSATA Half size



ซึ่งพอไปหาดูราคา SSD ชนิดนี้ก็ค่อนข้างสูง จึงได้ลองไปค้นใน Aliexpress แล้วก็เจอยี่ห้อ KingSpec ซึ่งราคานั้นถูกมากเมื่อเทียบกับยี่ห้ออื่นจึงได้ลองจัดซื้อมาลองดู สำหรับเจ้าตัว 256GB แบบ mSATA Half size นั้นผมได้มาในราคา 50 USD หรือประมาณ 1,650 บาทเท่านั้น


ทำการเปลี่ยนจากของเดิม 24GB เป็น 256GB




ความเร็วในการเขียนข้อมูล

โดยผมลองสั่งให้เขียนไฟล์ขนาดประมาณ 10GB  ความเร็วในการเขียนไฟล์จะอยู่ที่ 560 MB/s



ความเร็วในการอ่านข้อมูล

หลังจากได้ทดสอบความเร็วในการเขียนข้อมูลไปแล้วก็มาถึงตาของการอ่านไฟล์ข้อมูลบ้าง ซึ่งผลทดสอบความเร็วในการอ่านก็จะอยู่ที่ 614 MB/s



ทดสอบด้วย hdparm



สรุป

โดยรวมความเร็วในการอ่าน-เขียนไฟล์ถือว่าเร็วมาก ประกอบกับราคาที่ถูกกว่าชาวบ้านแบบครึ่งต่อครึ่งก็ถือว่าคุ้มค่ามาก ส่วนระยะเวลาการใช้งานก็ต้องรอดูกันยาวๆว่าจะทนขนาดไหนตามสเปคในเวปของ Kingspec บอกว่าความอึดในการเขียนนั้นอยู่ที่ 8 ปี หากเขียนไฟล์ 100GB ต่อวัน

Ref:
https://www.aliexpress.com/item/KingSpec-SSD-256GB-Msata-Half-size-256GB-mSATA-Mini-SATAIII-SSD-Hard-Drive-for-ASUS-DELL/32827636951.html

http://www.kingspec.com/products_detail/productId=86.html


Python matplotlib Invalid DISPLAY variable

Fixed by

matplotlib.pyplot as plt
plt.switch_backend('agg') 
Ref:
https://github.com/matplotlib/matplotlib/issues/3466/#issuecomment-195899517

[Google Colab] ติดตั้ง Python Package เพิ่มแบบแฮกหน่อยๆ

หลังจากที่ได้ทดลองใช้งาน Google Colab (Jupyter Notebook ฟรีจาก Google) ตั้งแต่วันที่ 27 ตุลาคม เป็นต้นมา ก็ได้พบวิธีที่จะติดตั้ง Python Package เพิ่มแบบแฮกหน่อยๆ

หลักการ
1. Reverse Shell
2. pip install PACKAGE

สิ่งที่ต้องการ
1. Public Server ของเราเองเอาไว้ reverse shell

วิธีการ
1. Remote ไปยัง Public Server ของเรา
2. รันคำสั่ง netcat

nc -lv 13337
3. สร้าง Google Colab ใหม่มา 1 อัน นำคำสั่ง reverse shell ไปรัน (อย่าลืมแก้ IP Address กับ Port ให้ตรงกับ Server เรา และที่ netcat กำลัง listen อยู่)


4. เมื่อได้ Shell ก็สั่งติดตั้ง Package ที่ต้องการ

pip install PACKAGE

Proof of concept

1. ทดลอง import keras แต่ว่าไม่พบ module


2. เมื่อรันคำสั่ง Reverse Shell เพื่อที่ให้ Google Colab connect กลับมายัง Server ของเราที่ตั้ง netcat รอไว้ก็จะได้ Shell



3. สั่งติดตั้ง package keras ผ่าน pip เมื่อลองรันคำสั่ง import keras ใน  Colab อีกครั้งก็จะสามารถ import ได้


4. ทดลองใช้งาน keras package โดยการ Train MNIST CNN


Video



ตัว Google Colab นั้นจะสร้าง Docker container ขึ้นมาเพื่อให้แต่ละคนใช้งานโดยจะได้สเปคคือ RAM 12 GB และ CPU Xeon 2.2 GHz 2 core เมื่อเราไม่ได้ใช้งานตัว Container ก็จะถูกทำลายทิ้ง พอเรากลับมาใช้งานใหม่อีกครั้งก็จะสร้าง Container ใหม่ขึ้นมา

ปล. เราสามารถติดตั้งโปรแกรมอื่นๆใน Container ได้ด้วยนะ อิอิ
ปล2. ไม่ใช่ Google Security Bug

Follow me on Github: https://github.com/kittinan

Circle CI กับ Python

วันนี้จะเป็นบันทึกการทดลองเล่น Circle CI โดยจะให้เจ้า Circle CI นั้นเชื่อมต่อกับ Gtihub ในการรัน Test ซึ่ง Circle CI ก็จะมี Plan ต่างๆดังนี้ https://circleci.com/pricing/ ในที่นี้เราก็จะใช้ Free Plan

สิ่งที่ต้องการ
- Github Public Repo ที่มี Test อยู่แล้ว (ถ้าไม่มีก็เริ่มเขียน Test ซะตั้งแต่วันนี้)
- Circle CI (แค่ Login ด้วย Github User)

ทำการ Setup Project กับ Circle CI

- ทำการเพิ่ม Project ในเวป Circle CI จากเมนู Add Project ทางด้านซ้าย



- เลือก Operating System และ Platform ในที่นี้จะใช้เป็น Linux และ Platform version 2.0  (version 2.0 เราสามารถใช้ Docker image ในการรันได้)



- เลือก ภาษา ที่ใช้ ในที่นี้ผมลองใช้ Python ในการรัน

- เมื่อเลื่อนลงมาด้านล่างจะมีคำแนะนำให้สร้าง Folder .circleci และ ไฟล์ config.yml โดยจะมี Config เบื้องต้นให้เรานำไปใส่ในไฟล์ config.yml ได้เลย

- โดยผมมีการปรับแก้เล็กน้อยตรงคำสั่งในการรัน Test โดยผมแก้เป็น


python -m unittest discover ./tests/

ตัวอย่างไฟล์ .circleci/config.yaml

- ทำการ commit และ Push

- กดปุ่ม Start Building ใน Circle CI



- ระบบ  Circle CI ก็จะทำการ Setup Envoriment และตั้งค่าต่างๆตาม config.yaml ของเรา เมื่อมาดู Result ในการ run test ก็จะเห็นว่าสำเร็จเรียบร้อยดี





- เมื่อเรามีการแก้ไข code ของเราและ Push code เข้าไปใน github ระบบก็จะทำ Build และ Test ให้อัตโนมัติ พร้อมมี Email แจ้งเตือนอย่างสวยงาม



เป็นอันเสร็จสิ้นการทดลองเล่น Circle CI ในเบื้องต้น 

เราสามารถนำ Badge การ Build & Test มาแปะในหน้าเวปของเราได้โดยเข้าไปที่ Setting ของ Project ใน Circle CI และเลือก Status Badges



สรุป
จากความรู้สึกในการเล่น Circle CI ครั้งแรก มีความรู้สึกว่าระบบของ Circle CI build ได้รวดเร็วกว่าของทาง Travis CI สามารถดู Code ตัวอย่างได้ที่ https://github.com/kittinan/my-learn-circleci

Ref:

Train Model บน Cloud ด้วย Google Cloud Machine Learning Engine

สวัสดีครับผมจะมาเล่าประสบการณ์ การทดลองใช้งาน Google Cloud Machine Learning Engine หรือเรียกสั้นๆ Cloud ML Engine โดยความสามารถของมันก็คือ การนำ Model Machine Learning ที่เราสร้างขึ้นมาโดย Tensorflow หรือ Keras (Tensorflow Backend) ไป Train บน Cloud ของ Google นั่นเอง ซึ่งการใช้งาน Cloud ML Engine นั้นมีค่าใช้จ่ายคร่าวๆดังนี้




วิธีการคำนวนราคาโดยละเอียดจะคิดเป็น ML training unit ซึ่งสามารถตรวจสอบได้ที่ https://cloud.google.com/ml-engine/pricing

สำหรับ Account Google Cloud ใหม่ Google จะให้ Credit 300 USD ใช้ได้ 12 เดือน ดูรายละเอียดได้ที่ https://cloud.google.com/free/ (ผมก็ใช้ไอตัว Free Credit เนี่ยแหละมาลองเล่น)

สิ่งที่ต้องการ

- Account Google Cloud ที่ผูกบัตรเครดิตเรียบร้อย
- เครื่องที่ติดตั้ง  Google Cloud SDK เสร็จเรียบร้อย (วิธีการติดตั้งดูที่ https://cloud.google.com/sdk/downloads)
- Code Model ที่ต้องการ Train (ในที่นี้ผมจะ Train โดยใช้ Keras ที่มี Tensorflow เป็น Backend โดยใช้โปรเจค thai-handwriting-number)

สร้างโปรเจค

- ทำการสร้างโปรเจคใหม่หรือจะใช้โปรเจคเดิมที่มีอยู่แล้วก็ได้

สร้างโปรจคใหม่โดยใช้ชื่อ test-cloud-ml

- รันคำสั่งในเครื่องเราเอง

gcloud projects list

ก็จะขึ้นโปรเจคใหม่ที่เราสร้างขึ้นมาดังภาพ



ตั้งให้โปรเจค test-cloud-ml เป็นโปรเจคหลัก (ใช้ PROJECT_ID)

gcloud config set project test-cloud-ml-176413

เปิดการใช้งาน Google Cloud Machine Learning Engine ให้กับโปรเจคของเรา โดยเข้าไปที่ APIs & services > Library

เลือก Machine Learning Engine API

กด Enable

สิ่งที่ควรรู้ก่อนการปรับปรุง Code เพื่อนำไป Train บน Cloud

-  Cloud ML Runtime นั้นใช้ Python 2.7 สามารถตรวจสอบ Package ต่างๆและ Version ของ Cloud ML Runtime ได้ที่ https://cloud.google.com/ml-engine/docs/concepts/runtime-version-list

- ข้อมูลที่เรา Read / Write ทั้งหมดนั้นต้องผ่าน Google Cloud Storage  (เราควรจัดการ Dataset ที่จะใช้ Train ให้สะดวกในการใช้งาน ในที่นี้จะจัดการ Dataset ให้อยู่ใน format ของ pickle ซึ่งต้องใช้ protocol version 2)

ปรับปรุง Code สำหรับ Train บน Cloud

1. จัดการอัพโหลด Dataset ที่ใช้ในการ Train อัพโหลดขึ้น Google Cloud Stroage เสียก่อน ในที่นี้ผม Serialize ข้อมูลด้วย pickle แล้วเซฟเป็นไฟล์ไว้ โดยต้องใช้ protolcol version 2

pickle.dump(DATASET_VARIABLE, open("dataset.pkl", "wb"), protocol = 2)

1.1 จัดการสร้าง bucket ของ Google Cloud Storage โดยในที่นี้จะตั้งชื่อ bucket ว่า kittinan (bucket เปรียบเสมือนตู้คอนเทนเนอร์อันนึงที่เอาไว้จัดเก็บข้อมูลของเรา https://cloud.google.com/storage/docs/key-terms#buckets)  โดยสร้าง bucket ด้วยคำสั่ง

 gsutil mb gs://kittinan/
หรือเราสามารถสร้างในหน้าเวปก็ได้



1.2 อัพโหลดไฟล์ Dataset เข้า Google Cloud Storage ด้วยคำสั่ง

gsutil cp SOURCE gs:://BUCKET_NAME/
ตัวอย่าง
gsutil cp src/thainumber_28.pkl gs://kittinan/
ภาพเมื่ออัพโหลดไฟล์เสร็จ

ลองเข้าไปดูในหน้าเวป Google Cloud Storage ก็จะเจอไฟล์ที่เราเพิ่งอัพโหลดเพิ่มขึ้นมา


2. สร้าง Folder ชื่ออะไรก็ได้ (ในที่นี้จะใช้ชื่อ Folder ว่า cloud-ml-engine) โดยมีโครงสร้างไฟล์ดังนี้



setup.py
ระบุข้อมูลต่างๆ และ require package ต่างๆ
https://cloud.google.com/ml-engine/docs/how-tos/packaging-trainer#recommended_project_structure


config.yml
ระบุค่า parameter ต่างๆของการ Train ครั้งนี้ ในที่นี้ระบุว่าให้ใช้ scaleTiear ที่เป็น BASIC_GPU
https://cloud.google.com/ml-engine/reference/rest/v1/projects.jobs#traininginput


trainer > __init__.py
ไฟล์เปล่าๆ ใช้สำหรับ setuptools ที่อยู่ในไฟล์ setup.py 

trainer > model.py
- ใช้ argparse module ในการ parse argument ต่างๆ โดยใน code นี้จะทำการ parse argument ของ training data และ job directory (Google Cloud Storage Path)

- Read / Write File ต่างๆ ด้วย tensorflow.python.lib.io.file_io แทน


ทดสอบรันบนเครื่องตัวเองก่อนด้วยคำสั่ง

gcloud ml-engine local train \
  --job-dir ./ \
  --module-name trainer.model \
  --package-path ./trainer \
  -- \
  --train-file ../thainumber_28.pkl
--job-dir : directory หรือ Google Cloud Storage ที่ใช้ในการ Package ไฟล์ (ML Engine จะส่ง argument job-dir ไปยัง script โปรแกรมเราด้วย)
--module-name : module ที่เราต้องการรัน
--package-path : path ของ module ที่เราจะรัน
option ที่อยู่หลัง -- \ : คือ argument สำหรับ script โปรแกรมเรา

ภาพการรันบนเครื่องตัวเอง

รันบน Cloud ML Engine
ผมสร้าง Shell Script ขึ้นมาชื่อไฟล์ start_train.sh เพื่อความสะดวกในการแก้ไขค่าต่างๆและการรัน โดยมีคำสั่งดังนี้


export environment variables ต่างๆดังนี้
BUCKET_NAME - ชื่อ Bucket Google Cloud Storage ที่เราใช้
JOB_NAME - ชื่อ job ของเรา
JOB_DIR - Path Bucket Google Cloud Storage
REGION - จะใช้ region ไหนในการรัน (ในที่นี้ใช้ US เพราะถูกกว่า)

Option ต่างๆของ command gcloud ก็จะคล้ายๆกับการรันแบบ Local โดยที่มีเพิ่มเติมขึ้นมาดังนี้

--runtime-version : จะใช้ runtime version ไหน (https://cloud.google.com/ml-engine/docs/concepts/runtime-version-list)
--region : จะใช้ region ไหน
--config : config yaml ไฟล์ ที่ระบุ training input ต่างๆ
--train-file : Argument ของ script ที่ระบุ Path Training Data ที่อยู่บน  Google Cloud Storage

ลองรัน ./start_train.sh กันเลย



เมื่อเรารันสำเร็จ gcloud command จะแนะนำคำสั่งในการ stream log ให้เรา เมื่อลองรันดูก็จะเห็น log ในการรันบน cloud ต่างๆดังภาพ


เราสามารถเข้าไปดู Log ในเวปได้ด้วยนะ

https://console.cloud.google.com/mlengine/jobs




หลังจากรันเสร็จลองเข้าไปดูใน  Bucket ของเราก็จะพบกับ folder ที่มีชื่อ job name ของเรา


เมื่อเข้าไปใน folder ก็จะพบ model_weight.h5 ที่เราสั่งเซฟไว้ใน Code ของเราหลัง Train เสร็จ

เป็นอันเสร็จสิ้นการทดลองเล่น Google Cloud Machine Learning Engine ครับผม

เพิ่มเติม

ทดลอง Download weight model มาลองรัน predict ดู


สามารถดู Code ทั้งหมดได้ที่
https://github.com/kittinan/thai-handwriting-number
https://github.com/kittinan/thai-handwriting-number/tree/master/src/cloud-ml-engine

อ้างอิง
https://cloud.google.com/ml-engine
https://github.com/clintonreece/keras-cloud-ml-engine