การสร้าง RESTful API สำหรับใช้งานจริง ง่าย ๆ ด้วย Flask และ Waitress

จาก From LAB to Production – จาก Machine Learning Model สู่ Flask RESTful ซึ่งได้นำ Machine Learning แบบ Statistical Approach อย่าง Logistic Regression ที่สร้างโมเดล และ Train กับข้อมูลเรียบร้อยแล้ว (บนเครื่อง Development) จากนั้น ได้นำโมเดลออกมาใช้งาน โดยใช้ วิธีการ Serialization ด้วย joblib ในภาษา Python ได้เป็นไฟล์ออกมา แล้วจึงนำไปใช้เพื่อใช้ในการทำนาย (predict) ชนิดของดอก Iris บนเครื่อง Production โดยรับ Input จากผู้ใช้ผ่าน HTTP Protocol ทั้ง GET/POST ที่ TCP/5000 ตัวอย่างดังกล่าว ยังเป็นเพียงการ “ทดสอบ” แต่ในบทความนี้ จะเป็นวิธีการ ซึ่งนำไปสู่การใช้งานจริง ๆ ซึ่ง Flask แนะนำให้ใช้งานกับ “waitress” (น่าจะเลียนแบบจาก Server) ซึ่งเป็น WSGI (Web Server Gateway Interface) อีกตัวหนึ่ง ใช้งานง่าย เพราะไม่ต้องติดตั้ง Apache/Nginx เลย ติดตั้ง waitress predict.py from flask import Flask, request, jsonify from flask_restful import Resource, Api, reqparse from flask_cors import CORS app = Flask(__name__) # Enable CORS CORS(app) @app.route(“/predict”, methods=[“POST”]) def predict(): result = 0 if request.method == “POST”: input_value = request.form[“input_value”] # ประมวลผล # … # ตัวอย่างเช่น รับค่ามา แล้ว คูณ 2 result=input_value * 2 # ### return jsonify( prediction=result ),201 ไฟล์ predict.py เป็นตัวอย่าง python ซึ่งรับค่า input_value จาก HTML form ผ่าน POST method เข้ามา ที่ /predict ซึ่งเขียนด้วย Flask ที่จะไปเรียกใช้ฟังก์ชั่น prediction() แล้วก็ทำการคำนวณที่ต้องการ จากนั้น ตอบค่ากลับไปเป็น JSON ด้วยฟังก์ชั่น jsonify โดยสามารถกำหนด key ชื่อ prediction และ value เป็น result ที่คำนวณได้ และแจ้ง Response Code เป็น 201 waitress_server.py from waitress import serve import predict serve(predict.app, host=’0.0.0.0′, port=8080) ไฟล์ waitress_server.py ก็เพียงแค่ import serve จาก waitress ที่ติดตั้งไป และ import predict ซึ่งก็คือไฟล์ predict.py ข้างต้น (อยู่ในไดเรคทอรีเดียวกัน)

Read More »

Protect Windows Computer LAB using Toolwiz Time Freeze and Cygwin

Toolwiz Time Freeze เป็น open source software freeware ติดตั้งเพิ่มใน Windows 10 สำหรับจัดการเครื่องคอมพิวเตอร์ในห้องบริการ ซึ่งจะทำให้เมื่อ restart เครื่อง จะกลับคืนสู่สภาพเหมือนครั้งที่ติดตั้งเสร็จไว้ให้บริการในตอนแรก Toolwiz Time Freeze ไม่ได้ให้ซอฟต์แวร์ควบคุมรวมศูนย์กลางแบบโปรแกรมอื่นประเภทเดียวกันนี้ เราจะต้องทำการเดินไปปลด Lock ที่หน้าเครื่อง Windows ทีละเครื่องเอง แต่อย่างไรก็ตาม Toolwiz Time Freeze ก็ให้คำสั่งรันแบบ command line มาด้วย ผมจึงลองเสนอไอเดีย วิธีใช้ linux ubuntu ในการควบคุมไม่ต้องเดินไปทำหน้าเครื่อง นั่นคือ ใช้คำสั่ง ssh ในการรัน ToolwizTimeFreeze.exe ด้วย option /freeze หรือ /freezealways หรือ unfreeze หลักการคร่าว ๆซอฟต์แวร์ที่เครื่องคอมพิวเตอร์ที่จะให้บริการ1.ติดตั้ง Windows 102.login เข้าใช้งานด้วยบัญชีผู้ใช้ (user) สิทธิเทียบเท่า Administrator3.ติดตั้ง Cygwin for Windows จะได้ Linux emulator โดยเลือกติดตั้ง service sshd ทำงานอัตโนมัติเมื่อเปิดเครื่อง Windows 4.ติดตั้ง Toolwiz Time Freeze ตั้ง Lock พร้อมตั้งค่า password ป้องกันการเปิดเข้าโปรแกรม ซอฟต์แวร์ที่เครื่องของ admin ผู้ดูแล1.ติดตั้ง Ubuntu server หรือ Desktop เพิ่ม 1 เครื่อง เพื่อที่จะสร้าง ssh key ด้วยคำสั่ง sshkeygen จะได้ key file ชื่อ id_rsa.pub และ id_rsa.key อยู่ในไดเรกทอรี .ssh 2.ทำขั้นตอนส่ง id_rsa.pub ไปใส่เพิ่มต่อท้ายไฟล์ authorized_keys ของ user ที่ติดตั้ง Cygwin for Windows 103.ตอนนี้ เราจะสามารถ ssh user@ip (IP ของ Windows 10) ได้แล้วโดยไม่มีการถาม password ทดสอบดู เมื่อต้องการปลด Lock (Unfreeze) Windows 10 ก็ใช้คำสั่งนี้ได้ คำสั่งเขียนต่อกันเป็นบรรทัดเดียว ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $user@$ip “/cygdrive/c/Program\ Files/Toolwiz\ Time\ Freeze\ 2017/ToolwizTimeFreeze.exe /unfreeze /usepass=$password” > /dev/null 2>&1 & โดยให้แทนที่ $user ด้วย ชื่อบัญชีผู้ใช้ที่ติดตั้ง Cygwin ให้แทนที่ $ip ด้วยไอพีแอดเดรสของ Windows 10 และให้แทนที่ $password ด้วย password ของโปรแกรม Toolwiz Time Freeze เมื่อรันคำสั่งนี้แล้ว Windows 10 จะ restart เมื่อตรวจสอบดูจะพบว่า Toolwiz Time Freeze อยู่ในสถานะ unprotect เมื่อต้องการ Protect Windows 10 (Freeze) ก็ใช้คำสั่ง 3 คำสั่งนี้ ต้องทำตามลำดับ คำสั่งเขียนต่อกันเป็นบรรทัดเดียว คำสั่งที่ 1/3 ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $user@$ip “/cygdrive/c/Program\ Files/Toolwiz\ Time\ Freeze\ 2017/ToolwizTimeFreeze.exe /freeze /usepass=$password”

Read More »

วิธีตรวจสอบรุ่นของ CPU ว่าสามารถใช้งาน Tensorflow ได้หรือไม่

ปัญหา สร้างเครื่องบน VMWare ESXi รุ่นล่าสุดก็แล้ว ลงเป็น Windows Server 2016 DataCenter ก็แล้ว ตาม Spec ของ Tensorflow (Version ล่าสุด 1.12) บอกว่า ใช้ Python 3.6 ก็ลงแล้ว (ยังใช้กับตัวล่าสุด 3.7 ไม่ได้)  ติดตั้ง Tensorflow ก็ลงตามปรกติ ก็สำเร็จเรียบร้อยดี แต่พอลอง import ปรากฏว่าเกิด Error “Failed to load the native TensorFlow runtime.” ทั้ง ๆ ที่ลงบน Physical Server ที่ไม่ใช่ VMWare ก็ใช้งานได้ปรกติ ทำไม ??? ตั้งสมมุติฐาน Hardware มีความแตกต่างอะไร ระหว่าง VMWare กับ Physical Server ? รวบรวมข้อมูล ไปดู Hardware Requirements พบว่า ตั้งแต่ Tensorflow 1.6 เป็นต้นมา ต้องใช้งานบน CPU ที่มี AVX Instruction และจาก  https://en.wikipedia.org/wiki/Advanced_Vector_Extensions#CPUs_with_AVX บอกว่า CPU ที่มี AVX Instruction คือ เก่าสุด ชื่อรุ่น Sandy Bridge แล้ว … เครื่อง Windows Server 2016 DataCenter ที่สร้างบน VMWare นั้น ได้ CPU อะไร ?? ค้นหาข้อมูล พบว่า Microsoft ให้ใช้เครื่องมือฟรี ที่ชื่อว่า coreinfo (ซึ่งบน Linux ใช้ cpuinfo) สามารถ Download ได้ที่ https://docs.microsoft.com/en-us/sysinternals/downloads/coreinfo เมื่อลอง Download มาติดตั้ง และ ใช้คำสั่ง coreinfo ได้ผลว่า เป็นรุ่น Intel Xeon รุ่น E7  – 4870 ลองไปค้นหาดู ว่า รุ่น E7 – 4870 มี Code Name ว่าอะไร  จาก Intel ได้ความว่า ชื่อรุ่น Westmere ซึ่ง ไม่มี AVX !!!!! ไปดูลำดับ Codename จาก  https://en.wikipedia.org/wiki/List_of_Intel_CPU_microarchitectures พบว่า Westmere เป็นรุ่นสุดท้าย ก่อนจะมีการใส่ AVX นั่นเอง (Sandy Bridge, Ivy Bridge, Haswell … เป็นต้นมา มี AVX หมด) สรุปผล เครื่องบน VMWare ปัจจุบัน นั้นจะได้ Spec ตาม CPU ตัวต่ำสุดใน Cluster ดังนั้น …. เจ้าจึงได้ Westmere ที่ไม่มี AVX ไปใช้ และ ใช้งาน Tensorflow รุ่นตั้งแต่ 1.6 เป็นต้นมาไม่ได้ จบข่าว

Read More »

Stencil : Styling

Shadow DOM Shadow DOM เป็น API ที่อยู่ใน browser ที่ให้ความสามารถในทำ DOM encapsulation และ style encapsulation โดย Shadow DOM จะแยก component ออกจากภายนอก ทำให้ไม่ต้องกังวลกับ scope ของ css หรือผลกระทบกับ component ภายนอก หรือ component ภายนอกจะกระทบกับ component ภายใน ใน Stencil ค่า default การใช้งาน Shadow DOM ใน web component ที่สร้างด้วย Stencil จะถูกปิดอยู่  หากต้องการเปิดใช้งาน Shadow DOM ใน web component ต้องกำหนดค่า shadow param ใน component decorator ดังตัวอย่างด้านล่างนี้ @Component({ tag: ‘shadow-component’, styleUrl: ‘shadow-component.scss’, shadow: true }) export class ShadowComponent { } สิ่งจำเป็นเมื่อเปิดใช้งาน Shadow DOM QuerySelector เมื่อต้องการ query element ที่อยู่ภายใน web component จะต้องใช้ this.el.shadowRoot.querySelector() เนื่องจาก DOM ภายใน web component อยู่ภายใน shadowRoot Global Styles จะต้องใช้ CSS custom properties css selector สำหรับ web component element คือ “:host”  selector โดยทั่วไป จะเก็บ styles ไว้ภายไต้ ชื่อ tag ของ component นั้น my-element { div { background: blue; } } ในกรณีของ Shadow DOM  อยู่ภายใต้ tag :host :host { div { background: blue; } } Scoped CSS สำหรับ browser ที่ไม่สนับสนุน Shadow DOM, web component ที่สร้างโดย Stencil จะกลับไปใช้ scoped CSS แทนที่จะ load Shadow DOM polyfill ที่มีขนาดใหญ่  Scoped CSS จะทำการกำหนดขอบเขต CSS ให้กับ element โดยอัตโนมัตตอน runtime CSS Variables CSS Variables เหมือนกับ Sass Variables แต่ต่างกันตรงที่ CSS Variables รวมอยู่ใน browser โดยที่ CSS Variables ให้ความสามารถในการกำหนด CSS properties ที่ใช้ได้ภายใน app  ตัวอย่างการใช้งานที่พบบ่อยคือ การกำหนดสี (color) ถ้ามีสีหลักที่ต้องการใช้ร่วมกันทั้ง app แทนที่จะกำหนดสีนั้นๆในแต่ละที่ที่ใช้งาน ก็จะสร้าง variable ขึ้นมาและใช้ variable นั้นในทุกๆที่ที่ต้องการ ซึ่งถ้าต้องการเปลี่ยนสี ก็สามารถเปลี่ยนที่ variable ที่เดียว การใช้งาน CSS Variables ใน Stencil สร้าง

Read More »

Virtual data center with OpenNebula

OpenNebula เป็นชื่อของ open source software สำหรับทำ virtual data center เวอร์ชั่นล่าสุดคือ 5.6.1 (https://opennebula.org) ผมได้ทดลองในห้องปฏิบัติการ และเขียนเป็นขั้นตอนการติดตั้งจนกระทั่งได้ VM ขึ้นมา แต่ยังไม่ลงรายละเอียดถึงขั้นใช้งาน storage network ได้ ซึ่งจะได้ทดลองกันต่อไป ในตอนนี้ จะเรียกว่า basic set up ก็ได้นะ ในการ set up ระบบจริงตามคำแนะนำ แต่ละเครื่องควรมี network card 2 cards เพื่อแยกระหว่าง network ที่ให้บริการ กับ Management network การ set up จะต้องมีเครื่องที่เป็น Front-end เพื่อทำหน้าที่เป็น database และเว็บเพจสำหรับทำ configuration และสั่งการ และจะต้องมีเครื่องที่เป็น Hypervisor อย่างน้อย 1 เครื่อง โดยเลือกได้ว่าจะใช้ KVM หรือ vcenter สเปคเครื่อง hypervisor นี้ต้องรองรับ Virtualization extensions (Intel VT-x or AMD-V) เตรียมการทดลองโดยใช้ เครื่องคอมพิวเตอร์ที่ผมนำมาใช้มี 3 เครื่อง อายุเครื่องก็พอสมควร (ตามกำลังทรัพย์ที่มีในห้องปฏิบัติการ) แต่ทั้ง 3 เครื่องนี้ มีเพียง 1 network card ครับ เครื่อง Front-end 1 เครื่อง สเปค Pentium(R) Dual-Core CPU E5200 @ 2.50GHz มี RAM 4 GB อันนี้เป็นเครื่องทั่วไปที่รัน apache2 web server และ mariadb database ได้ ใช้เครื่อง KVM จำนวน 2 เครื่อง เพื่อจะให้เห็นว่าสามารถสร้าง VM ไปที่ KVM node ที่ต้องการได้ เครื่อง KVM node01 เป็น AMD Phenom(tm) II X4 945 Processor มี RAM 8 GB และ KVM node02 เป็น Intel(R) Core(TM) i5 CPU M 520 @ 2.40GHz มี RAM 4 GB นอกจากเครื่องคอมฯ แล้ว ผมก็มี network switch (L2-managed) เพื่อกำหนด port ให้รองรับ 802.1Q VLAN ผมออกแบบให้มี 2 VLAN คือ VLAN ID 6 (untagged) และ VLAN ID 7 (tagged) ซึ่ง VLAN 6 ก็คือ ครึ่งแรกของ network class C 192.168.6.0 เขียนแบบ CIDR 192.168.6.0/25 มี gateway คือ 192.168.6.1 และ VLAN 7 ก็คือ ครึ่งหลังของ network 192.168.6.128/25 มี gateway คือ 192.168.6.129 ผมเขียนขั้นตอนไว้ในเว็บไซต์

Read More »