Tag Archives: Architecture

What is Well-Architected structure ?

เดือนที่แล้วไม่ได้มาเขียนอ่ะ เพราะงานยุ่งกว่าจะนึกได้ก็เดือนใหม่ซะแล้ว ฮ่าๆ รอบนี้ก็หนีไม่พ้นไปแปลงานภาษาอังกฤษมาให้ฟังอีกแหละ เข้าเรื่องเลยดีกว่าเนาะในหลายโพสที่ผ่านมาได้มีการแนะนำ Google App Engine ซึ่งเป็นแบบเอาโค้ดเราขึ้นไป Deploy บนคลาวด์ของ Google ได้นั่นเอง รอบนี้มีของอีกเจ้าหนึ่งที่ก็ดังไม่แพ้กัน นั่นคือ AWS ซึ่งอยู่ในเครือ Amazon โดยอันนี้มีให้เลือกเยอะกว่า GAE หน่อย มีทั้งสามารถสร้าง Infrastructure ได้เอง และแบบคล้ายคลึงกับ GAE คือส่งแค่โค้ดขึ้นไป Deploy บนระบบของ AWS บอกเลยว่าผู้เขียนไม่ได้รับค่าโฆษณาใดๆ ทั้งสิ้นนะ

ผู้เขียนได้ไปอ่านบทความของ AWS ซึ่งนับว่าเป็นบทความที่ดีมากเลย เกี่ยวกับว่าทำไมเราต้องนำระบบไปทำงานบนคลาวด์ จนถึงว่าวางระบบบนคลาวด์ยังไงให้ได้ประโยชน์มากที่สุด โดยแปลมาจาก Whitepaper ของ AWS ชื่อว่า AWS Well-Architected Framework หากเราคิดว่ามันเป็นการโฆษณาเพื่อให้ขายของตัวเองได้ดีขึ้นผู้อ่านก็คิดถูกแล้วแหละ แต่ในโฆษณาก็มีประเด็นที่น่าเก็บเอามาคิดดี เช่น

ในบทความกล่าวถึง การวางระบบบนคลาวด์ AWS พื้นฐานควรทำอย่างไรบ้าง

  • เลิกเดาว่าจะมีคนใช้ระบบกี่คน ในระบบแบบที่เราเป็นคนตั้งเองจำเป็นต้องคำนึงถึงผู้ใช้เพราะไม่งั้นระบบจะล่มเอาได้ง่ายๆ หากเรามัวแต่คิดว่าต้องตั้ง Server กี่ตัว ตั้งมาแล้วไม่ได้ใช้ ตั้งมาแล้วใช้ไม่พอ แบบนี้คงเหนื่อย แต่บน AWS เราไม่จำเป็นต้องเดาอะไรให้มากมายเพราะทุกอย่างเป็นคลาวด์สามารถเพิ่มลดได้ตามความต้องการ
  • สามารถเทสได้บนระบบจริง การเทสถ้าไปเทสกับของจริงเกิดมันล่ม จะทำให้เกิดหายนะ แต่จะสร้างระบบจำลองที่เหมือนของจริงก็ใช้เงินมากทีเดียว เช่น จะต้องนำระบบไป Deploy บนเครื่อง Mainframe ของบริษัท จะให้ทดลองโดยการซื้อ Mainframe อีกเครื่องมาตั้งไว้แค่เทสก็ไม่ไหว แต่บนคลาวด์ทุกอย่างเป็นการแชร์กับคนอื่นอยู่แล้ว สามารถสร้างระบบจำลองอีกทั้งระบบเพื่อใช้แค่วันเดียวในการเทสก็ทำได้
  • ลดความเสี่ยงที่เกิดจาก infrastructure บอกเลยว่าการนำระบบไป Deploy ให้ลูกค้า เครื่องที่ลูกค้านำมาให้ใช้ในการ Deploy เนี่ยไม่รู้ว่าเวอร์ชันตรงกับที่เราพัฒนามารึเปล่าก็ไม่ทราบ แต่การที่ทุกอย่างอยู่บนคลาวด์เราสามารถสร้าง Infrastructure แบบที่เราต้องการได้ ไม่ต้องเสี่ยงกับ infrastructure ที่ไม่พร้อมให้เราทำการ Deploy (ข้อนี้จริงๆ ระบบสามารถอยู่บนแค่ Virtual System ไม่จำเป็นต้องคลาวด์ก็ได้นะ)
  • สามารถทำเวอร์ชันของ infrastructure ได้ ในชีวิตจริงแล้วเนี่ย หากเราต้องเทสระบบแล้วต้องไปลงโปรแกรมบนเครื่องเทสเนี่ย ส่วนมากจะเกิดอาการงงว่าเราลงอะไรไปแล้วบ้างพอระบบมีปัญหาก็ Format แล้วลงโปรแกรมใหม่ แต่นั่นคือถ้ามีเครื่องเพียงเครื่องเดียวชีวิตก็สวยงามดีแหละ หากถ้าเครื่องคำนวณแยกเครื่องกับ Database และแยกกับ Firewall เนี่ยการไปไล่ Format ทั้งหมดคงลำบากมากนะบอกเลย จะดีกว่ามั้ยถ้าเรามีระบบเวอร์ชันให้กับทุกเครื่องที่เกี่ยวข้องกับการเทสของเรา บน AWS สามารถทำเวอร์ชันให้กับเครื่องของเราได้และสามารถเปรียบเทียบความแตกต่างของเวอร์ชันต่างๆได้อีกด้วย (ข้อนี้ผู้เขียนก็คิดเหมือนข้อที่แล้วนะ ถ้าอยู่บน Virtual System อะไรก็ทำเวอร์ชันได้แหละแต่เหนื่อยหน่อยเท่านั้นเอง เพราะ AWS มีระบบเวอร์ชันให้อยู่แล้วเนี่ยแหละเลยง่ายกว่า)
  • รองรับการเปลี่ยนแปลงแบบพลิกฝ่ามือได้ ผู้เขียนแปลออกมาซะยิ่งใหญ่เชียว เพราะคิดว่าอันนี้เป็นข้อดีของระบบ AWS ที่สุดละ อันอื่นอาจจะมีทางแก้ในแนวทางอื่นๆได้ แต่ข้อนี้อาจจะทำไม่ได้ในระบบแบบเก่า โดยในข้อนี้พูดถึงการอยากจะเปลี่ยนแปลงระบบทั้งหมดเช่น เมื่อก่อนเป็น Centralize อยากเปลี่ยนเป็นแบบ Distribution โหไหนจะซื้อเครื่องมาเพิ่มใหม่ ไหนจะเอาเครื่องเก่าไปทำอย่างอื่นอีก โหเหนื่อย แต่ถ้าเป็นคลาวด์ทุกอย่างสามารถหายวับไปกับตาแล้วแทนที่ด้วยสิ่งใหม่เพียงไม่กี่คลิกได้นับว่าเป็นข้อดีอย่างที่สุดของ AWS แล้วสามารถเพิ่มลดทุกอย่างได้ดั่งใจ

นอกจากการออกแบบ infrastructure จะคิดถึงปัจจัยข้างบนแล้ว เวลาออกแบบระบบใดๆก็ตามควรจะคิดถึง 4 ปัจจัยนี้เป็นหลัก คือ ความปลอดภัย (Security) , ความน่าไว้วางใจ (Reliability) , ประสิทธิภาพการใช้งาน (Performance Efficiency) และ การลดค่าใช้จ่าย (Cost Optimization)

Security ในระบบทุกระบบจำเป็นที่เราจะต้องมีการคำนึงถึงความปลอดภัย ซึ่งประกอบด้วย 4 หัวข้อใหญ่ คือ การป้องกันดาต้า (Data protection) , การควบคุมการเข้าถึง (Privilege management) , การป้องกันโครงสร้าง (Infrastructure protection) เช่น การป้องกันการเข้าถึง router และ ระบบควบคุมการตรวจสอบ (Detective controls) เช่น ตั้งให้ระบบมีการตรวจจับการโจมตีอัตโนมัติ

Reliability ระบบจะมีความน่าไว้วางใจเมื่อระบบมีการรองรับความผิดพลาดที่ดี เช่นระบบไม่มี Downtime ในการขึ้นระบบใหม่ ระบบมีการทำ Change management เมื่อระบบที่ขึ้นใหม่มีการเปลี่ยนแปลงจากระบบเก่า และสุดท้ายเมื่อระบบพบกับความผิดพลาดสามารถซ่อมแซมได้ง่ายไม่ใช่ต้องใช้เวลานานในการซ่อมแซม

Performance Efficiency ระบบที่ดีควรมีการจัดสรรทรัพยากรที่ดี เช่นเครื่องที่ทำงานต้องไม่ว่างจนเกินไป นอกจากนั้นทั้งเนื้อที่ความจุและ Database ก็ควรมีประสิทธิภาพเช่นกัน เช่นเราควรเลือก Database และ Storage ให้เหมาะสมกับระบบที่เราจะทำงานด้วย นอกนั้นยังมีเรื่องที่น่าสนใจอีกเรื่องคือการทำแคชเพราะการทำแคชจะเป็นการทำ Space-time trade-off หรือหากเราต้องการความเร็วเพิ่มขึ้นเราสามารถเพิ่มพื้นที่ให้ระบบเร็วขึ้นได้ แต่เราจะสามารถทำแคชได้ง่ายหรือไม่ขึ้นอยู่กับการออกแบบนี่แหละ

Cost Optimization ระบบคลาวด์สามารถคำนวณงบประมาณที่ใช้ได้ง่าย และนอกจากนั้นใน AWS ยังมีระบบที่คิดเงินเป็น API call อีกด้วยหากเรายังไม่ต้องการที่จะสร้าง Server ขึ้นมาใช้จริงๆ นอกจากนั้นทุกอย่างบนโลกนี้เป็นเงินหมดครับ การที่เราไปฝากเครื่องไว้ที่ Datacenter การจะแบ็คอัพทีนี่คิดเงินเยอะประมาณหนึ่งเลยทีเดียวแต่บนคลาวด์ทุกอย่างสามารถลดค่าใช้จ่ายลงได้ครับ

โพสนี้ยาวหน่อยแต่ก็หวังว่าจะเป็นความรู้ให้ผู้อ่านแหละใครสนใจก็ไปอ่านเพิ่มเติมได้ครับ ถ้ายังไม่สนใจยังไง AWS มีโปรฟรีหนึ่งปีสำหรับผู้เข้าไปใช้ใหม่ได้นะครับ นอกจากนั้นเดี๋ยวนี้ AWS พัฒนาหลายระบบขึ้นมาตอบสนองผู้ใช้อีกมากมายลองไปดูกันครับ นอกจากนั้น AWS ยังมี guideline สำหรับระบบต่างๆว่าควรจะวางอย่างไรโดยเข้าไปดูได้ที่ link นี้ครับ

Fermi Architecture

สำหรับวันนี้เราจะมาพูดถึง Fermi Architecture กันซึ่งเป็นหนึ่งในการออกแบบ GPU Architecture ของบริษัท NVIDIA ต้องบอกว่า ณเวลานี้อุปกรณ์ที่มีการออกแบบแบบนี้หายไปจากท้องตลาดแล้วแต่อาจจะมีใช้กันอยู่

สำหรับประวัติของ graphics processing unit (GPU) นั้น เริ่มคิดค้นจากบริษัท NVIDIA ในปี 1999 จากนั้นต่อมาจึงมีการประยุกต์นำ GPU ไปประมวลผลงานที่ไม่เกี่ยวข้องกับกราฟิคและพัฒนาจนได้ผลิตภัณฑ์ general purpose graphics processing unit (GPGPU) ต่อมาในปี 2007 ทาง NVIDIA ได้เสนอ CUDA SDK ขึ้น ทำให้การเขียนโปรแกรมเพื่อให้ไปประมวลผลใน GPU นั้นทำได้ง่ายขึ้น โดยสถาปัตยกรรมที่รองรับ CUDA รุ่นแรกคือ G80 (GeForce 8800, Quadro FX 5600 และ Tesla C870) จากนั้นในปี 2008 จึงนำเอาข้อแนะนำจากผู้ใช้ที่นำ GPU ไปประมวลผลงานต่างๆและนำมาพัฒนาในสถาปัตยกรรม GT200 ให้มีประสิทธิภาพสูงขึ้น และพัฒนาเป็น Fermi Architecture ในปี 2009 ซึ่งเป็นสถาปัตยกรรมที่เหมาะกับการประมวลผลแบบ GPU มากที่สุดในยุคนั้น

Year Event
1999 First invention of GPU
2001 GPGPU is born
2006 Invent of G80 Architecture
2007 CUDA was introduced
2008 GT200, the improvement of G80
2009 Fermi, the successor of GT200

สำหรับสถาปัตยกรรม CUDA นั้นประกอบด้วยส่วนสำคัญดังนี้

  • Kernel คือส่วนของโปรแกรมหรือฟังก์ชันที่ต้องการนำไปรัน GPU โดยปกติจะอยู่ในรูปแบบของฟังก์ชัน
  • Thread คือส่วนการทำงานย่อยสุดของ GPU มีรีจิสเตอร์และเมมโมรี่เป็นของตัวเองแต่ก็ไม่ได้เยอะมาก
  • Thread Block (Warp) คือกลุ่มรวมของ Thread ในที่นี้คือ 32 Thread คือ 1 warp ซึ่งสามารถติดต่อสื่อสารแต่ละ Thread ผ่านทาง shared memory โดยปกติ 1 warp จะทำงานภายใต้ 1 CUDA core นอกจากนั้นแต่ละ block ยังติดต่อสื่อสารผ่านทาง shared-memory
  • Grid คือกลุ่มของ Thread block โดยสามารถติดต่อแต่ละ grid ผ่านทาง DRAM ของ GPU
CUDA Architecture

CUDA Architecture

เมื่อรู้จักแล้วว่า CUDA คืออะไรแล้ว มาทำความรู้จักกับสถาปัตยกรรม Fermi โดยในสถาปัตยกรรม Fermi ได้มีการนำเสนอเทคโนโลยีใหม่ ดังนี้

  • Third Generation Streaming Multiprocessor (SM) ใน generation นี้ ได้มีการเพิ่มจำนวน CUDA core มากขึ้นเป็น 32 core ต่อ 1 SM (ซึ่งจำนวน SM นั้นขึ้นอยู่กับรุ่นของ GPU) และแต่ละ core นั้นยังมีการเพิ่มหน่วยการประมวลผล double precision ทำให้สามารถประมวลผลได้ละเอียดขึ้นอีกด้วย นอกจากนั้นยังมีการเพิ่มส่วนของ warp scheduler เพื่อให้สามารถประมวลผล warp แบบขนานพร้อมกันได้มากขึ้น และภายใน SM ได้มีการปรับเพิ่มส่วนของ shared memory ให้มากขึ้น โดยสามารถเลือกได้ว่า จะเอาเป็น shared memory หรือ cache L1
  • Second Generation Parallel Thread Execution ISA สำหรับสถาปัตยกรรม Fermi นั้นได้มีการนำเสนอ instruction set ใหม่ คือ Parallel Thread eXecution (PTX) 2.0 ซึ่งมีการพัฒนาในส่วนของการเข้าถึงเมมโมรี่ให้สามารถแยกเป็นส่วน local, shared และ global และยังมีการพัฒนาส่วนของคำสั่งที่เกี่ยวกับจำนวนทศนิยมโดยถ้าเราใช้คำสั่งเช่นการคูณตามด้วยบวก โดยปกติส่วนประมวลผลมักจะปัดค่าก่อนนำไปทำการบวก แต่ด้วยการพัฒนาระบบคำสั่งใหม่ Fused Multiply-Add (FMA) ทำให้สามารถเก็บทศนิยมจากนั้นบวกก่อนจึงค่อยปัดทีหลัง เพื่อความถูกต้องที่มากขึ้น
  • New Memory Subsystem สำหรับ Fermi ได้มีการเพิ่มส่วนของ cache L1 และ L2 เข้าไป โดย L1 สามารถเลือกได้เป็น 2 แบบดังนี้ คือ 1. 48 KB shared memory และ 16 KB cache L1 หรือ 2. 16 KB shared memory และ 48 KB cache L1 นอกจากนั้นยังมีการนำ ECC (Error Checking & Correction) มาประยุกต์ใช้เพื่อเพิ่มความถูกต้องสำหรับเมมโมรี่อีกด้วย นอกจากนั้นยังเพิ่มความเร็วของ atomic instruction เพื่อให้สามารถทำงานพวก read-modify-write ได้อย่างมีประสิทธิภาพมากยิ่งขึ้น
  • NVIDIA GigaThread Engine ซึ่งระบบนี้สามารถทำให้ GPU สามารถทำ context switching ได้เร็วมากขึ้น ทั้งยังสามารถประมวลผลหลายๆ kernel ได้พร้อมๆกัน

นอกจากนั้น NVIDIA ยังพัฒนาระบบ debug เพื่อให้สามารถติดตามการทำงานของ GPU ได้ นั่นคือสามารถติดตามการทำงานของแต่ละ warp ใน GPU ได้ว่าประมวลผลคำสั่งอะไรอยู่ ทำให้สามารถหาความผิดพลาดได้ว่ามาจาก thread ใด ซึ่งได้ชื่อเรียกว่า Nexus โดย Nexus เป็น Add-on บน Visual Studio เพราะงั้นใครโปรแกรมบน Linux ก็อดไปนะครับ