เช่าคอมแรม 68 กิ๊กบน EC2 มาทำวิจัย

ครั้งนี้ ผมกลับมาเขียนบล็อกแบบน้ำท่วมทุ่งอย่างที่ทำมาเป็นประจำ เพื่อแก้เครียดไปพลาง ในช่วงเวลาอันแสนร้อนระอุของประเทศสิงคโปร์

ช่วงนี้ผมวุ่นกับงานวิจัยชิ้นใหม่ เป็นงานที่เพิ่งเริ่มทำได้ไม่กี่สัปดาห์มานี้ ได้ผลคืบหน้าอย่างไรจะมาเล่าให้ฟัง แต่สิ่งที่อยากจะบล็อกในตอนนี้ก็คือ เรื่องที่ผมเพิ่งเจอมาเมื่อวันพฤหัสบดีที่ผ่านมา ก็เกี่ยวกับงานวิจัยชิ้นนี้นี่แหละ คือผมต้องทำการแก้ปัญหา linear programming optimization ปัญหาหนึ่ง เป็นปัญหาที่ซับซ้อนและต้องการหน่วยความจำหลักเยอะมาก อะ … ตอนแรกผมคาดคะเนว่า หน่วยความจำขั้นต่ำที่จะแก้ปัญหานี้ได้เร็วน่าจะอยู่ที่ 16 GB เพราะก่อนหน้านี้ผมลองแก้ปัญหานี้บน workstation ที่มีแรม 4 GB แล้วพบว่า มันเป็นอะไรที่เลวร้ายมากๆ เพราะทำเอาคอมเครื่องนั้นเดี้ยงไปเลย เช่น ลากเมาส์ก็ยังไม่ขยับ เป็นต้น ผมเลยต้องย้ายไปเครื่อง GPU Cluster ที่ผมเคยบล็อกไปเมื่อนานมาแล้ว ผมขอมาแค่ 1 เครื่องที่มีแรมแนบมา 16 GB ผลออกมาก็คือ รันผ่านไปไม่ต่ำกว่า 12 ชั่วโมง แรมถูกใช้ไป 100% ตลอดเวลาจนกระทั่งเครื่องไม่ตอบสนอง ผมต้องไปขอโทษแอดมินที่ดูแลเครื่องเป็นการใหญ่ว่าช่วย kill process ให้ด้วย

จากปัญหาดังกล่าว แน่นอนว่า แรม 16 GB ไม่สามารถสนองกิเลสของปัญหา optimization ของผมได้ เนื่องจาก algorithm ที่ใช้ในการแก้ปัญหาอย่าง simplex ต้องมีการสร้างกราฟที่มีขนาดใหญ่ตามความซับซ้อนของปัญหา ความซับซ้อนดังกล่าวเกิดจาก จำนวนตัวแปร+เซ็ต+พารามิเตอร์ จำนวนสมการ constraint รวมไปถึงชุดคำสั่งที่ใช้ใน constraint และ objective function เช่น ถ้ามีคำสั่งคูณกับหารเยอะๆ และติด summation หลายทอดก็เพิ่มความซับซ้อนยิ่งๆขึ้น

เมื่อต้องแก้ปัญหาดังกล่าวบนคอม แรมขนาดใหญ่จึงมีความจำเป็น (ส่วนโปรเซสเซอร์สมรรถนะสูงเป็นความต้องการขั้นพื้นฐานอยู่แล้ว) เพราะถ้าแรมขนาดน้อยกว่าปัญหา โอเอสต้องทำ paging ระหว่างแรมกับ virtual memory ซึ่งเป็น overhead ที่น่ากลัวมากๆเลยทีเดียว (เลยเป็นเหตุผลอีกเหตุผลหนึ่งที่ว่าฮาร์ดดิสก์ SSD หรือพวก flash memory ขนาดใหญ่ความเร็วสูงนั้นมีประโยชน์)

แก้ปัญหายังไง ถ้าแรมไม่พอ

คำถามมีอยู่ว่า ถ้าผมยังต้องการแก้ปัญหาดังกล่าวต่อไปให้ได้ ผมจะทำอย่างไร??? คำตอบอาจเป็นว่า

  1. ไปใช้เซิร์ฟเวอร์อีกชุดที่มีแรม 24 GB ที่ตั้งอยู่ข้างๆกัน … แต่มันเป็น Linux น่ะสิ  ลืมบอกไปว่า โปรแกรมที่ผมใช้ต้องรันบน Windows เพราะเป็น license ของซอฟต์แวร์สำหรับ Windows (ซอฟต์แวร์ตัวนี้ชื่อว่า GAMS/CPLEX ที่เคยบล็อก)
  2. หาคอมที่มีแรมเยอะกว่านั้นจากห้องวิจัยอื่น … มันมีแน่ๆ แต่จะได้ใช้เมื่อไหร่เนี่ยอีกเรื่อง และเขาจะยอมให้ผมติดตั้งโปรแกรมที่ผมต้องการหรือเปล่า และมี Windows หรือเปล่า
  3. ของบจากอาจารย์ของผมเพื่อจัดซื้อเครื่องใหม่หรือซื้อแรมใหม่มาเพิ่ม … มันก็เป็นไปได้นะ แต่คงไม่ได้ซื้อวันนี้ได้ในเร็ววัน และคอมที่ใส่แรมเยอะๆได้มันแพงมากๆ ถ้าซื้อมาแล้วเอามาแก้ปัญหาที่ต้องการแรมดังกล่าวแค่ไม่กี่ปัญหา หรือใช้แค่ไม่กี่วันก็คงไม่คุ้มค่ากับการลงทุนเท่าไหร่
  4. ลดความซับซ้อนของปัญหา … อันนี้เป็นตัวเลือกสุดท้าย เพราะผมไม่อยากทำให้ปัญหามันซับซ้อนน้อยกว่านี้ เนื่องจากผมกำลังนำเสนอ heuristic algorithm ที่พิสูจน์ได้ว่า ปัญหาที่ซับซ้อน ที่ต้องคำนวณเป็นวัน สามารถลดลงมาเหลือเพียงนาทีได้ แต่ให้ผลลัพธ์ที่ใกล้เคียงกับ optimal solution ดังนั้น ถ้าผมไม่สามารถได้คำตอบ optimal แล้วผมจะเทียบได้ไงว่า algorithm ผมมันดีพอ (เช่น ได้ผลที่เรียกว่า near-optimal)

High Memory ของ EC2 คือ คำตอบ (หรือเปล่า?)

และแล้ว ผมก็เจออีกคำตอบ  … ว่าไปแล้ว เหมือนโฆษณาพวก tv direct เลยนะ … ผมคิดได้ว่า Amazon EC2 เขามี instance (หรือ virtual machine) ที่ชื่อว่า High-Memory Instance ซึ่งให้แรมเยอะมาก โดย instance ในหมวดนี้มีอยู่ 3 รุ่นด้วยกันคือ

  1. High Memory Extra Large (หรือ m2.xlarge) ให้แรมมา 17.1 GB
  2. High Memory Double Extra Large (หรือ m2.2xlarge) ให้แรมมา 34.2 GB
  3. High Memory Quadruple Extra Large (หรือ m2.4xlarge) ให้แรมมา 68.4 GB

มันใช่เลยจ๊อด! ขั้นตอนต่อมา ผมต้องเลือกแล้วว่าผมจะใช้รุ่นไหนดี แน่นอนว่า รุ่นที่แรมเยอะยิ่งแพง แต่เรื่องราคาผมไม่เกี่ยง เพราะผมของบวิจัยจาก Amazon มาแล้ว (อ่านวิธีของบได้ที่นี่)  โอเค ผมไม่เลือก m2.xlarge ที่ให้แรม 17.1 GB แน่นอน เพราะ 16 GB ก็เดี้ยงมาแล้ว 17 GB ไม่มีนัยสำคัญมากสำหรับปัญหานี้

ป.ล. อยากทราบว่ามีอะไรใน EC2 ก็อ่านได้ที่นี่

เงินไม่ใช่ปัญหา แต่ผมไม่อยากจ่ายแพง (เอ๊ะ ยังไง)

ทีนี้จะเอา 34.2 GB หรือ 68.4 GB ดี แหม่ ตัดสินใจยาก แม้ผมไม่เกี่ยงราคา แต่ก็ไม่อยากซื้ออะไรมาแล้วใช้ไม่เต็มที่เพราะมันสิ้นเปลืองงบโดยใช่เหตุ แต่ถ้าซื้อมาแล้วไม่เพียงพอต่อความต้องการมันก็เสียเงินเปล่า อ่ะ มาดูเรื่องราคากันหน่อย  … แต่ราคาของ instance ใน EC2 มันแตกต่างกันไปในแต่ละภูมิภาค เราจะรัน instance ในภูมิภาคไหนดีหนอ (ตอนนี้มี 5 ภูมิภาค คือ US-west, US-East, EU-Ireland, APAC-Singapore และล่าสุดคือ APAC-Japan) อ่า ไม่ต้องคิดมาก ผมอยู่สิงคโปร์ ผมก็ต้องเลือก APAC-Singapore สิครับ ยิ่งถ้าต้อง remote desktop แล้วล่ะก็ เรื่องแบนด์วิธเป็นเรื่องสำคัญ ซึ่งราคาของ m2.2xlarge (34.2 GB) อยู่ที่ $1.24 ต่อชั่วโมง ส่วน m2.4xlarge (64.8 GB) อยู่ที่ $2.48 อีกครั้งว่านี่คือราคาของ Windows instance เพราะซอฟต์แวร์ที่ผมใช้มันรันบน Windows

ขอต่อราคาใน EC2 ได้เปล่า?

โอ่ว ราคาของ 64.8 GB มันแพงกว่า 34.2 GB ถึงสองเท่า แต่มันก็ได้แรมมาเยอะกว่า 2 เท่า … เคาะโต๊ะ ผมเลือก 64.8 GB เลยแล้วกัน เพราะยังกลัวๆว่า 34.2 GB มันไม่พอต่อกิเลสของปัญหาที่ผมจะแก้ แต่ แต่ … ผมไม่หยุดเท่านี้นะครับท่านผู้ชม ผมยังตะหงิดอยู่ว่าราคา $2.48 มันยังไม่โดนใจผม ผมขอลดราคาได้ไหม … แน่นอนว่าไม่ได้ (แล้วจะพูดทำไม) แต่ว่าผมสามารถเช่า 64.8 GB ในราคาที่ถูกกว่า $2.48 ได้ครับท่าน วิธีการคือ ผมต้องไปยื่นราคาประมูล Spot Instance

ผมขอแนะนำสั้นๆ (คิดว่าน่าจะสั้น) ว่า Spot Instance คือการที่ลูกค้าเสนอราคาไปที่ Amazon EC2 ว่าอยากรัน instance ในราคาเท่าไหร่ จากนั้น EC2 ก็จะรวบรวมการเสนอราคาของลูกค้าทั้งหมดมาเช็คว่า EC2 ควรตั้งราคาไว้ที่เท่าไหร่ดี เมื่อเทียบกับ supply (หรือทรัพยากรคอมใน EC2) ว่า supply อย่างนี้จะพบกับ demand หรือความต้องการของลูกค้าได้ด้วยราคาเท่าไหร่แล้วทำให้ EC2 ได้กำไร(สูงสุด) โดยราคาที่ Amazon กำหนดเราเรียกว่า spot price ส่วนราคาที่ลูกค้าเสนอเรียกว่า bid price … ความน่าสนใจของ Spot Instance คือ ลูกค้าที่ให้ bid price สูงกว่า spot price จะสามารถรัน Spot Instance ที่ต้องการได้ โดยทุกคนที่ประมูลชนะจะได้จ่ายในอัตราเดียวกัน นั่นคือ จ่ายเท่ากับ spot price แต่ถ้าลูกค้าเสนอ bid price ต่ำกว่า spot price ก็จะรัน instance ไม่ได้เลย   ส่วนข้อเสียของ Spot Instance คือ spot price เปลี่ยนแปลงถี่มาก เรียกว่าราคาเปลี่ยนหลายสิบครั้งต่อวัน ในหนึ่งชั่วโมงอาจเปลี่ยนได้ 2 ครั้ง ดังนั้น Spot Instance ที่กำลังรันอยู่ (คือ เคยมี bid price > spot price) หาก instance นี้มี bid price ที่น้อยกว่า spot price ที่เปลี่ยนแปลงล่าสุดแล้วละก็ Spot Instance จะถูกทำลาย (terminate) จาก Amazon โดยไม่มีการแจ้งล่วงหน้า (หมายเหตุ เมื่อกำหนด bid price ไปแล้ว ไม่สามารถเปลี่ยนแปลงราคา bid price ได้อีก แต่สามารถยกเลิก bid price เดิมแล้วเสนอ bid price ใหม่ได้)

ได้ราคาที่ถูกกว่า (แต่แลกด้วยความเสี่ยง)

อ่า … ก็แนะนำสั้นๆกันไปว่า Spot Instance มันเป็นไง … โดยปกติ spot price จะมีราคาต่ำกว่าราคาของ On-demand Instance (หรือ instance แบบราคาปกติ) ผมไม่ขอลงรายละเอียดว่าจะกำหนดราคา bid price ยังไงถึงจะชนะ (พวกที่เรียนการเงินและเศรษฐศาสตร์เขาถนัดเรื่องพวกนี้)  โอเค ราคา m2.4xlarge แบบ on-demand อยู่ที่ $2.48 ผมขอสู้ที่ $2 เลยอ่ะ ตอนนั้น ราคาล่าสุดอยู่ที่ประมาณ $1.4xx (จำเลขตรง xx ไม่ได้) ผลที่เกิดขึ้นก็คือ  ผมชนะประมูล และได้จ่ายในราคาเพียง $1.4xx ต่อชั่วโมงเท่านั้น! เห็นไหมครับจ๊อด! ประหยัดไปประมาณ $1 เลยนะ แต่อย่าเพิ่งดีใจเกินไป … เพราะสิ่งที่ผมต้องแลกมา คือ ความเสี่ยง เพราะ spot price ราคามันเปลี่ยนแปลงได้พอๆกับใจคน ดันนั้น ถ้า spot price มันเปลี่ยนแปลงจนสูงกว่า bid price ของผมล่ะก็ งานผมเดี้ยงแน่นอน ผมต้องเริ่มต้นนับหนึ่งใหม่ หรืออีกวิธีคือ ผมต้องมีวิธีทำ checkpoint เพื่อบันทึกผลลัพธ์ของปัญหาที่ผมรันเป็นระยะ (แต่ท้ายสุด ผมก็ไม่ได้ทำ checkpoint นะ)

ลุยงานวิจัยบนคอมแรม 68.4 กิ๊ก

นี่ไงครับ m2.4xlarge รันบน EC2 เป็นที่เรียบร้อย แต่ขอบอกนิดนึงว่าหลังแข่งราคา Spot Instance ทาง Amazon จะใช้เวลาประมาณนึงในการตัดสินใจว่า bid price ของเรามันโอเคหรือไม่ ของผมรอประมาณ 5 นาที และใช้เวลาในการติดตั้ง instance อีกประมาณ 10 นาที มีเรื่องน่าสนใจนิดนึงคือ Windows instance จะติดตั้งช้ากว่า Linux instance พอสมควร เพราะผมเคยติดตั้ง Linux instance ได้ในเวลาไม่ถึง 2 นาที ส่วนขั้นตอนที่ทำให้ Windows มันช้า ก็ตอนสร้าง admin password ของ Windows นี่แหละ  (นานมาก)

พอรันได้แล้ว ผมก็เข้าไปดูข้อมูลเครื่อง ก็ได้ผลตามภาพด้านบน คือ คอมเครื่องนี้มีแรม 68.4 GB ส่วนโปรเซสเซอร์เป็นรุ่นที่แรงใช้ได้คือ Xeon 2.67 GHz ทั้งหมด 8 คอร์ ผมเคยให้รุ่นน้อง (น้องบู้) ช่วย benchmark เจ้า m2.4xlarge ที่เป็น Linux แล้วผลมางามตามาก คือ 73.13 GFlops!! เทพมาก เพราะใกล้เคียงสมรรถนะทางทฤษฎีเลย นั่นคือ  85.44 GFlops … ที่มันเทพได้เช่นนี้ก็เพราะแรมมันเยอะนี่แหละ ก็เลยสามารถอัดปัญหา benchmark ขนาดใหญ่ๆเข้าไปได้ คะแนนเลยออกมาเจ๋งเช่นนี้

ขั้นตอนต่อไปที่ผมต้องทำ คือ ติดตั้งโปรแกรมที่จะใช้สำหรับแก้ปัญหางานวิจัยของผม ซึ่งมีแค่ตัวเดียวคือ GAMS/CPLEX จากนั้น ผมก็เริ่มรันโปรแกรมแก้ปัญหา และก็ลุ้นว่า ถ้าคอมมีแรมตั้ง 68.4 GB แล้ว เครื่องมันจะเดี้ยงอีกหรือเปล่า

ผมไม่มีภาพประกอบนะ (เพราะขี้เกียจ capture) คือ ปัญหา optimization ของผมมันกินแรมเร็วมาก 5 GB ถูกกินได้ภายใน 15 วินาที จากนั้นแรมก็โดนกินไปเรื่อยๆ ภายในเวลาไม่ถึง 1 นาที แรมหดไปกว่า 10 GB และแรมก็โดนกินอย่างรวดเร็วไปจนถึง 16 GB ในเวลาไม่ถึง 5 นาที จนแล้วจนรอดมันดันไปถึง 24 GB ในเวลาไม่ถึง 10 นาที โอ้ว! เกิน 24 GB ไปแล้วครับท่าน โดดผ่าน 30 GB ไปแล้ว ลุ้นมาก จะยังไงต่อล่ะเนี่ย จะผ่าน 32 GB หรือไม่ ดูภาพด้านล่างเลย

มันดันทะลุ 32 GB จนได้ครับท่าน และมันก็ไต่ระดับไปสูงเท่าที่สายตาของผมจับมาได้คือ 41 GB โชคดีนะเนี่ย ที่ผมเลือก m2.4xlarge ถ้าเป็นรุ่น m2.2xlarge อาจเดี้ยงไปแล้วก็ได้

สรุปผลการทดลอง … มันยอดมากเลยจ๊อด! จากที่เคยรันบนเครื่องที่เคยลอง ผ่านไป 12 ชั่วโมงมันยังรันไม่เสร็จแถมยังเดี้ยงอีกต่างหาก แต่เจ้า m2.4xlarge สามารถแก้ปัญหานี้ได้ในเวลาเพียง 35 นาที!!! ย้ำว่า 35 นาทีในราคา $1.4xx หรือประมาณ 43 บาท (ราคายังไม่รวมพวก network กับ storage ซึ่งน้อยกว่า $1)

สรุป (เพราะขี้เกียจพิมพ์แล้ว)

Cloud computing เป็นอีกโซลูชันหนึ่งที่เหมาะมากสำหรับโครงการระยะสั้น เช่น โครงการงานวิจัยหลายโครงการ เป็นต้น ยิ่งถ้างานวิจัยนั้นเน้นซีพียูที่ประมวลผลหนัก แรมเยอะๆแล้วล่ะก็ cloud ช่วยประหยัดงบวิจัยได้มากทีเดียว เราไม่ต้องไปของบประมาณเยอะๆไปซื้อเซิร์ฟเวอร์สเปคแรง ซึ่งพอซื้อมาใช้แล้ว เราอาจจะใช้ได้ไม่เต็มที่ หรือว่าสเปคยังไม่พออาจต้องซื้อเพิ่ม ยิ่งถ้าเมื่อโครงการวิจัยปิดตัวไปแล้ว เราต้องดูแลเซิร์ฟเวอร์ด้วยงบบำรุงรักษาอีกนาน อย่างไรก็ดี หากเป็นงานที่ต้องยุ่งกับ data ขนาดใหญ่มหึมาหลาย terabyte แล้ว cloud ถือว่ามีราึคาสูงพอควร (ไม่นับรวมถึงข้อมูลที่ต้องเก็บเป็นความลับ) อีกทั้งมีความหน่วงล่าช้าที่ต้องโอนข้อมูลขึ้นไปบน cloud ทำให้เวลาโอนข้อมูลอาจจะช้ากว่าเวลาประมวลผลด้วยซ้ำ อย่างไรก็ดี โซลูชันอย่างบริการขนส่งฮาร์ดดิสก์ไปยังผู้ให้บริการ cloud ก็ถือว่าช่วยได้ไม่มากก็น้อย (บริการขนส่งฮาีร์ดดิสก์ของ Amazon เพื่อโอนข้อมูลลง cloud ก็มีนะ ชื่อ AWS Import/Export)  โอเค ขอพิมพ์แค่นี้แล้วกัน (ขี้เกียจแล้ว) รอติดตามสาระ(น้ำท่วมทุ่ง)ในบล็อกแห่งนี้อีกครั้งได้เมื่อตอนผมไม่ขี้เกียจ

18 thoughts on “เช่าคอมแรม 68 กิ๊กบน EC2 มาทำวิจัย

  1. อยากให้หน่วยงานของรัฐหันมาใช้คลาวด์แบบจริงจังซะที ไม่ใช่ปล่อยให้ระบบล่มแล้วล่มอีก แล้วก็แก้ปัญหาด้วยการซื้อเซอร์ฟเวอร์ใหม่ไปเรื่อยๆ

    • ผมเคยได้ยินว่ามีบริษัทในไทยกำลังเริ่มทำคลาวด์ และทาง SIPA เองก็เหมือนว่ากำลังดำเนินการ จริงเท็จยังไงผมไม่ทราบครับ

  2. Sorawat Wongkaweepairot says:

    อ่านไปลุ้นไปจนเหนื่อยเลยครับคุณบูม สรุปแล้ว cloud computing นี่มันแจ๋วจริงอะไรจริง😉

    • ขอบคุณครับ ตอนที่ผมเขียน ผมรู้สึกตื่นเต้นไปด้วยน่ะครับ

  3. Audy says:

    เยี่ยมมากๆ ครับ
    ผมอ่านแล้ว ทำให้ผมรู้ว่า ที่ผมใช้ EC2, S3 ที่ผ่านมาเนี่ย
    เป็นเรื่องของเด็กอมมือไปเลย

    • ไม่ขนาดนั้นหรอกครับ ผมเองใช้ ec2 แค่ไม่กี่ครั้งเองครับ ผมอยากแชร์ประสบการณ์กับคุณ audy อยู่ครับถ้ามีโอกาส

  4. ฟังดูแล้วมันยอดเยี่ยมมากเลยครับ อ่านแล้วสนุกดีครับเหมือนกำลังมีความสุขกับแก้ปัญหา😀. ต้องขอบคุณที่แชร์มากๆครับ

    • ด้วยความยินดีครับ

      ใช่ครับ ผมสนุกครับ เหมือนเด็กที่วิ่งซุกซน มีล้มหัวเข่าถลอก ร้องไห้น้ำตาเล็ด แต่พอลุกขึ้นเล่นต่อก็สนุกต่อครับ … ก่อนหน้านี้ผมท้อหลายครั้งกับการวิจัย เพราะผมมองปัญหาว่าเป็นปัญหา จนผมได้บทเรียนจากอาจารย์ของผมที่นี่ ท่านบอกว่า there’re no problems in any problems but challenge

  5. naufal says:

    ขอถามนิดนึงครับ ผมจะรันซอฟต์แวร์ซิมมูเลชันเหมือนกัน มีคอมพ์อยู่หลายเครื่องมีวิธีให้มันทำงานร่วมกันรันซอฟต์แวร์ตัวเดียวไหมครับ

    • ผมขอโทษที่ลืมเข้ามาตอบครับ

      จะเขียนซิมมูเลชันให้รันแบบขนาน (หรือรันบนหลายเครื่อง) ก็ต้องศึกษาการเขียนโปรแกรมแบบขนานน่ะครับ เช่น MPI เป็นต้น

  6. Jiggko says:

    อ่านแล้ว เปิดกะลาผมได้อีกครับ

    อยาก Implement System แบบ Amazon EC2 บ้างจัง

    ขอบคุณครับที่มาเล่าสู่กันฟัง

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s