Recap งาน TensorFlow Dev Summit 2018

Sirinart Tangruamsub
Skooldio
Published in
5 min readMay 23, 2018

เนื่องจากได้มีโอกาสไปงาน TensorFlow Dev Summit 2018 ที่จัดที่ Computer History Museum มา เลยอยากจะขอแชร์ในสิ่งที่ได้ไปฟังมาแบบสรุปย่อๆ

ในงาน TensorFlow Dev Summit 2018 นี้ ได้มี features ใหม่ๆออกมามากมายให้ได้ฮือฮาและตื่นเต้นอยู่ ครอบคลุมตั้งแต่สำหรับผู้ทำ machine learning ทั่วไปที่เน้นไปที่พัฒนาและทดลองโมเดล ไปจนถึงนักพัฒนาที่อยากจะนำ machine learning สู่ product จริง และยังได้พัฒนาสำหรับภาษาใหม่ platform ใหม่ รวมทั้งพัฒนา performance ให้ดีขึ้น เดี๋ยวเรามาว่ากันทีละหัวข้อเลยดีกว่า

TensorFlow ในรูปแบบที่ใช้ง่ายขึ้น

ง่ายขึ้นสำหรับการเขียนโค้ด

หลายคนที่เคยใช้ TensorFlow ประสบปัญหากับการใช้งานยากของ TensorFlow เหตุผลใหญ่ๆก็เพราะตัว TensorFlow นั้นจะแทนตัวโมเดลหรือการคำนวณต่างๆด้วยการสร้างกราฟ (Computational Graph) โดยจะสร้างกราฟให้เสร็จเรียบร้อยก่อน แล้วถึงรัน ทำให้ค่อนข้างยุ่งยากต่อการเขียนโค้ดและการ debug (แต่การใช้กราฟก็มีข้อดีในเรื่องของ performance และเป็น representation ที่เป็น platform independence ทำให้สามารถรันผ่านหลายๆอุปกรณ์ได้ แม้ว่าจะใช้อุปกรณ์คำนวณคนละอย่างกัน) มาดูกันว่า TensorFlow เค้าได้ลดความยุ่งยากในส่วนนี้ยังไงบ้าง

สิ่งแรกก็คือ Eager Execution หากใครได้ตามข่าวมา ก็อาจจะได้ยินเรื่องโหมด Eager Execution ของ TensorFlow ซึ่งเป้าหมายหลักๆคือ ทำให้ตัว TensorFlow มีความเป็น Pythonic คือ เราสามารถเขียนโค้ด TensorFlow แบบเขียนไปรันไปได้เลยทีละคำสั่ง ไม่ต้องสร้างกราฟให้เสร็จก่อนแล้วค่อยรัน ทำให้เราสามารถทำอะไรต่างๆได้มากขึ้น เช่น สามารถ print ดูค่าตัวแปรต่างๆได้เลยในระหว่างการสร้างโมเดล (ไม่ต้องมาสร้างกราฟให้เสร็จก่อนหรือสร้าง session เพื่อจะรันดูค่า), สามารถส่ง data เข้าโมเดลได้แบบใช้วิธีวนลูปของ Python, สามารถทำ control flow หรือใส่ condition อะไรในระหว่างการรันโมเดลได้เลย และที่สำคัญสามารถใช้กับ debugger หรือ profiler ใดๆของ Python ได้ด้วย นอกจากนี้ Eager Execution ยังได้เพิ่มความเป็น object-oriented มากขึ้น โดยเฉพาะในเรื่องของ variable จากเดิมที่เคยต้องมานั่งปวดหัวกับความงงๆของ variable ของ TensorFlow มาคราวนี้ variable ที่สร้างขึ้นจะเสมือนเป็น object ใน Python เลย

นอกจากนี้ TensorFlow ยังได้มีตัว High-level API หรือก็คือ Estimator มาช่วยจัดการกราฟและ session ให้เรา ทำให้เราไม่ต้องมาวุ่นวายกับกราฟหรือ session ในการ train, eval, predict หรือ export โมเดลของเรา จะรันโมเดลอะไรก็สร้าง model_fn ส่งให้กับ Estimator เอา และสำหรับโมเดลพื้นฐาน (เช่น DNN) เค้าก็มี pre-made Estimator ให้ (เช่น DNNEstimator) เราก็ไม่ต้องมาเสียเวลาเขียน model_fn สำหรับโมเดลเหล่านี้เอง ดังรูปข้างล่าง

ที่มา https://www.youtube.com/watch?v=4oNdaQk0Qv4&t=201s

ในงาน TensorFlow Summit นี้ เค้าก็ได้ประกาศลูกเล่นใหม่ๆให้กับตัว Estimator เพิ่มความใช้ง่ายและยืดหยุ่นมากขึ้น เช่น

  • การสร้าง Head API เพื่อให้เราสามารถปรับเปลี่ยนส่วน head (เช่น metrics, loss function, prediction) ของ Estimator หรือ Pre-made estimator ทำให้เราสามารถปรับเปลี่ยนตัวโมเดลของเราได้อย่างรวดเร็วและง่ายขึ้น
โครงสร้างของ model_fn (ที่มา ที่มา https://www.youtube.com/watch?v=4oNdaQk0Qv4&t=201s)
ตัวอย่างการใช้ Head API ใน Esimator (ที่มา https://www.youtube.com/watch?v=4oNdaQk0Qv4&t=201s)
  • เพิ่มความง่ายในการทำ Transfer learning โดยสามารถบอกตัวโมเดลที่เราจะต้องการเอามา transfer ผ่านตัว Estimator ได้เลย (รวมไปถึงการเอา output จากโมเดลอื่นมาใช้เป็นเสมือน input data ได้โดยเอามาใส่เป็น feature column ใน Estimator ได้ด้วย) ช่วยลดจำนวนการเขียนโค้ดได้มาก
  • เพิ่มช่องทางให้ในการจัดการเรื่องการรันบน multi-GPUs หรือแบบ distribution ผ่านการตั้งค่าพวก configuration ผ่าน Estimator โดยที่เราไม่ต้องมาแก้ตัว model_fn อะไรของเราทั้งสิ้น

ง่ายขึ้นสำหรับการทำ Transfer Learning

นอกเหนือจาก Eager Execution และ High-level API แล้ว … สิ่งที่เป็นสวรรค์แห่งนักพัฒนาโมเดลอีกอย่างก็คือ ….​การเปิดตัวของ TensorFlow Hub !!! ซึ่งเป็นเสมือนแหล่งรวมส่วนของโมเดลทาง machine learning ที่สามารถเอามาใช้ต่อได้ (reusable) ทำให้เราสามารถทำ transfer learning ได้อย่างง่ายดายมากขึ้น โดยสิ่งที่ TensorFlow Hub มีให้ใช้ คือ module ของโมเดลต่างๆ (module ก็คือ กราฟ + weights ที่เทรนมาแล้วอย่างดี) ทั้งแบบที่มี classification layer สำหรับในกรณีที่เราอยากเอาไปทำ classifier และแบบที่ไม่มี classification layer ในกรณีที่เราอยากจะเอามาทำในแนว feature extraction โดยที่เราสามารถดาวน์โหลด module ของโมเดลที่เราอยากจะใช้มาได้มาได้เลยง่ายๆในโค้ดของ TensorFlow และตัวอย่างของ modules ที่มีให้ใช้แล้วก็เช่น

  • Image : NASNet (Mobile และแบบตัวเต็ม), ResNet, Inception, MobileNet
  • Text : Word2Vec, ELMo, NNLM embedding, Universal Sentence Encoder

จริงๆตัว Universal Sentence Encoder นี่น่าสนใจมาก เป็นตัว embedding ของข้อความในระดับประโยคที่ได้เทรนมาให้เรียบร้อยแล้วบนตัวข้อมูลที่มาจากหลายๆที่มาและหลายๆโดเมน (เลยเรียกว่า universal) ทำให้เราสามารถนำเอาสิ่งนี้มาเทรนต่อในโดเมนของเราได้เลย ช่วยประหยัดเวลาและข้อมูลได้มากๆ

ง่ายขึ้นสำหรับการทำ Distribution

ในงานสเกลใหญ่ๆที่ต้องอาศัย multi-GPU หรือว่าต้องเทรนในแบบ multi-node ในกรณีนี้จะมีความยุ่งยากหน่อย เราจะต้องจัดการและเลือกวิธีการในการทำ distribution ที่เหมาะสม เช่น จะทำ distribution ในรูปแบบไหน, จะอัพเดทตัว parameters ที่กระจายๆกันตาม devices ต่างๆยังไง, จะ replicate ตัวโมเดลอย่างไร เป็นต้น ซึ่งถ้าเราต้องมาเขียนเองทำเองแล้วล่ะก็ คงได้เข้าถึงความยุ่งยากวุ่นวายมหาศาลที่ตามมาอย่างแน่นอน

และเพื่อช่วยลดความยุ่งยากนี้ ทาง TensorFlow ได้สร้าง DistributionStrategy API ให้เราสามารถกำหนดวิธีการในการ distribution ได้ผ่านทาง API ตัวนี้ ในงานนี้ก็ได้ยกตัวอย่าง implementation ของ API ตัวนี้ คือ MirrorStrategy ซึ่งเป็นการทำ distribution แบบ replicate ตัวโมเดลไปยัง device ต่างๆ และใช้ all-reduce สำหรับการ communication กันระหว่าง GPUs (เช่น อัพเดทพารามิเตอร์ของโมเดล) เพื่อให้การเทรนโมเดลผ่านหลายๆ device มีความ sync กัน ทั้งหมดทั้งมวลนี้หากต้องมาทำเองก็คงไม่ง่ายและใช้เวลา แต่เราสามารถทำทุกอย่างที่พูดมาทั้งหมดผ่านทาง Estimator ได้เลย เพียงแค่เพิ่มโค้ดไปแค่บรรทัดเดียว แต่ทั้งนี้ทั้งนั้นเค้าก็ได้กล่าวว่า ถึงตอนนี้จะมีให้ใช้ไม่เยอะมาก อาจจะยังมีแค่ multi-GPUs แต่ก็ยังพัฒนาต่อไปเรื่อยๆเพื่อให้ support กับการทำ distribution มากขึ้น (เช่น การทำ multi-nodes, model parallelism, asynchronous และอื่นๆ)

ตัวอย่างการใช้ MirroredStrategy (ที่มา https://www.youtube.com/watch?v=-h0cWBiQ8s8&t=622s)

ง่ายสำหรับการ Debug ด้วย TensorBoard

และแล้วเราก็สามารถ debug บน TensorBoard ได้แล้ว !! สำหรับคนที่ใช้ TensorFlow กันอยู่น่าจะคุ้นเคยกับ TensorBoard อย่างดี แต่สำหรับคนที่ไม่คุ้น TensorBoard เป็นเครื่องมือในการทำ visualization ในรูปแบบของ web application เพื่อช่วยให้เราทำการวิเคราะห์โมเดลของเราได้ มาคราวนี้ตัว TensorBoard ได้รับการอัพเกรดอีกขั้นด้วยการมี plugin ตัวใหม่ คือ debugger plugin ซึ่งหากใครคุ้นเคยกับ debugger ของ TensorFlow ที่ชื่อ tfdbg แล้วละก็ ตัว debugger plugin ตัวนี้ก็คือ GUI ของ tfdbg นั่นเอง

มาดูตัวอย่างความสามารถของ debugger plugin ตัวนี้กัน อย่างแรกเลยเราสามารถดูการไหลไปมาของ Tensor ในกราฟในระหว่างรันแบบ real-time ได้เลย และจะสั่งให้หยุดให้ continue ตรงไหนก็ได้ ระหว่างหยุดก็ให้แสดงค่าออกมาดูได้ หรือจะนั่งดูค่าเปลี่ยนไปแบบ real-time ก็ย่อมได้ หรือถ้าไม่อยากจะมาคอยกดหยุดกด continue ก็ตั้งเงื่อนไขให้รันไปเรื่อยๆจนถึงเงื่อนไขที่ตั้งไว้แล้วค่อยหยุดเพื่อดูว่าเกิดอะไรขึ้นบ้างตรงนั้นก็ย่อมได้ นับว่าเป็นการอำนวยความสะดวกอย่างมากสำหรับนักพัฒนาโมเดลโดยเฉพาะเวลาที่ได้ผลของโมเดลออกมาแปลกๆและอยากจะรู้ว่ามันเกิดอะไรขึ้นกับโมเดลของเรา หรือต้องการตรวจสอบว่าการทำงานตรงกับที่เราตั้งใจไว้หรือไม่ (สามารถดูตัวอย่างวิธีการใช้งานได้ที่นี่)

TensorFlow สำหรับงาน Production

เพราะการทำ product ที่ใช้ machine learning ไม่ได้มีแค่การเทรนโมเดลเพียงอย่างเดียว ตัวอย่างเช่น การทำ recommendation ในเวปไซต์ เราก็ต้องมีการคัดเลือกและ ส่งข้อมูลใหม่จาก logging ที่เราได้มาจากหน้าเวปมาอัพเดทตัวโมเดลของเราใหม่ ต้องมีการประเมินผลโมเดลตัวใหม่เป็นอย่างไรบ้าง เป็นต้น โดยในงานนี้ได้แนะนำ TensorFlow Extended (TFX) ซึ่งก็คือ platform ที่ช่วยในการเอาโมเดล machine learning ของเรามาใช้ในระดับ production ในลักษณะ end-to-end ครอบคลุมตั้งแต่ขั้นตอนของ data ยันไปจนถึง serve ตัวโมเดลของเราเลย เช่น ตั้งแต่ตัวรับข้อมูลเข้ามา มีการจัดการข้อมูลพวกนี้ มีการวัดคุณภาพของข้อมูลและโมเดล การ serve โมเดลที่ได้มาใหม่อีกรอบ เป็นต้น

ที่มา https://www.youtube.com/watch?v=vdG7uKQ2eKk

อันที่จริงเค้ามีแสดงแผนการในการสร้างและพัฒนา components ต่างๆมากมาย และ roadmap ที่เยอะแยะมาก แต่ในงานนี้ได้เริ่มจากตัว TensorFlow Transform (tf.transform) ซึ่งเป็น open-source library สำหรับทำ data processing โดยที่ตัว library จะ export กราฟของการทำ data transformation สำหรับเอามาใช้กับ production ของเราได้เลยโดยที่กราฟตัวนี้จะมีความ consistent กันกับการทำ data transformation ในขั้นตอนการเทรนของเราด้วย (ทั้งนี้เพราะในขั้นตอนการเทรนนั้นเราจะเทรนในลักษณะของ batch แต่ว่าใน product นั้นจะเป็นลักษณะ online ทำให้เราใช้บาง operation ของการทำ data transformation ในขั้นตอนเทรนและใน production แตกต่างกัน เช่น การทำ normalization กับตัวข้อมูล)

ที่มา https://www.youtube.com/watch?v=vdG7uKQ2eKk

อีกตัวที่เค้าเปิดตัวก็คือ TensorFlow Model Analysis (TFMA) ซึ่งจะเป็น library ที่เป็นการรวมพลังของ TensorFlow และ Apache Beamในการ visualize ตัว metrics ต่างๆ โดยที่เราสามารถใช้ library ตัวนี้ในการประเมินดูว่าคุณภาพของโมเดล และนอกจากว่าตัว model analysis ตัวนี้จะดู metrics ได้จากก้อนข้อมูลใหญ่ๆทั้งหมดได้อย่างเดียว แต่ยังสามารถแยกดูเป็น slice ของข้อมูลได้ด้วย ทั้งนี้ก็เพื่อช่วยในการวิเคราะห์ความ fairness ของโมเดลได้

TensorFlow บนภาษาใหม่

TensorFlow with JavaScript

สิ่งที่สร้างความฮือฮาได้ไม่น้อย คือ TensorFlow.js ซึ่งประกอบไปด้วย libraries และ tools ต่างๆเพื่อให้เราสามารถใช้ machine learning ผ่าน JavaScript และนั่นหมายถึง …. เราสามารถใช้โมเดลของเรา(จาก TensorFlow หรือ keras) สร้างโมเดลของเรา หรือแม้แต่ retrain โมเดลของเราบน web browser ได้แล้ว ไม่ต้องคอยส่งข้อมูลเราออกไปข้างนอกเพื่อให้โมเดลที่ไหนสักแห่งมาทำการประมวลผล สามารถใช้ออฟไลน์ได้เลย ซึ่งการประมวลผลบน accelerator ทั้งหลาย จะทำผ่านตัว WebGL

ทั้งนี้ทั้งนั้นในอนาคตอันใกล้เค้าก็มีแผนจะขยายไปสู่ Node.js ด้วยเช่นกันไว้สำหรับสเกลที่ใหญ่ขึ้นที่ต้องอาศัย server ในการรันโมเดล

ที่มา https://www.youtube.com/watch?v=YB-kfeNIPCE&t=322s

Swift for TensorFlow

หลายคนอาจจะอุทานไปแล้วว่า ห๊ะ … Swift เนี่ยนะ ทำไมล่ะ(ตัวเองก็คิดแบบนั้นตอนเห็นชื่อหัวข้อนี้ในงานละ) แต่ใช่แล้ว TensorFlow ได้เปิดช่องทางในการใช้งานผ่านทางภาษา Swift เหตุผลหลักๆก็ด้วยว่า Swift ได้เปิดโอกาสให้ TensorFlow ได้ทำในสิ่งที่ใฝ่ฝัน (หรือจริงๆเค้าอาจจะไม่ได้ใฝ่ฝัน แต่เราพูดให้เว่อร์เอง ฮา) คือ การที่สามารถเขียนโค้ดในรูปแบบของ eager execution ได้ แต่ยังคง concept และข้อดีต่างๆของในโหมดสร้างกราฟไว้อยู่

Geek Alert → ข้อจำกัดอย่างหนึ่งของการใช้ Python ในโหมด Eager Execution ก็คือว่า เมื่อเวลาจะ compile ตัวโค้ดที่มีคำสั่งของ TensorFlow อยู่จะต้องผ่านตัว interpreter ของ Python ก่อน ซึ่งตัว interpreter นี้ก็จะค่อยๆส่งคำสั่งของ TensorFlow มาให้รันทีละคำสั่งๆไป (ตามสไตล์ของ Python) แต่เนื่องมาจาก Swift มีสิ่งที่เรียกว่า Swift Evolution คือการมี environment เพื่อเปิดโอกาสให้เราได้พัฒนาหรือเพิ่ม features ต่างๆบน Swift ได้ ซึ่งก็เป็นการเปิดโอกาสให้ทาง TensorFlow เพิ่มความสามารถให้ Swiftในเรื่องของการสร้างกราฟจากโค้ดในลักษณะของ eager หรือ เพิ่ม Graph Program Extraction transformation เข้าไป (กลายเป็น first-class compiler ไม่ใช่แค่การ binding อีกต่อไป) ซึ่งหน้าที่หลักๆของมันก็คือมันจะรวบรวม TensorFlow operations ต่างๆเพื่อสร้างมาเป็นกราฟให้เรียบร้อยก่อนที่จะส่งให้ TensorFlow ไปรันตัวกราฟเต็มตัวต่อ ทำให้ยังคงข้อดีต่างๆของในโหมดสร้างกราฟได้อยู่ ดังรูป

ที่มา https://www.youtube.com/watch?v=Yze693W4MaU&t=105s

นอกจากนี้เค้ายังได้บอกอีกว่า Swift ยังมีข้อดีอื่นๆอีก ไม่ว่าจะเป็น community ที่ใหญ่พอดี การมี syntax ที่ใช้ง่าย รวมทั้งการใช้งานในลักษณะของ notebook ได้ ทำให้ TensorFlow ได้เลือกเอา Swift มาช่วยตอบโจทย์ของตัวเองในหลายๆเรื่องได้เลยทีเดียว

TensorFlow แบบ lightweight สำหรับ mobile devices

ในงานนี้ได้อัพเดทเรื่องราวของ TensorFlow Lite ซึ่งเป็น libraries และ tools ต่างๆในการช่วยนำเอาโมเดลทาง machine learning ของเราไปใช้ได้ใน platform ขนาดเล็กอย่าง mobile devices หรือ edge devices ที่มีข้อจำกัดทางด้าน memory, ตัวประมวลผล และพลังงาน (หรือแบตเตอรี่) โดยที่ตัว TensorFlow Lite นั้นเป็น cross-platform สามารถใช้ได้ทั้งใน Android, IOS หรือ device ที่รัน Linux ได้อย่าง Raspberry Pi

ที่มา https://www.youtube.com/watch?v=FAMfy7izB6A

Geek Alert → เบื้องหลังการทำงานคร่าวๆก็ประมาณว่า เมื่อเรามีตัวโมเดลที่เทรนและเซฟแล้ว (ตอนนี้ support แค่ SavedModel กับ frozen graph) ก็จะส่งโมเดลของเราผ่านตัว converter เพื่อแปลงกราฟให้อยู่ในรูปของกราฟของ TensorFlow Lite format และหากเป็น iOS จะมีทางเลือกเพิ่มมาอีกทาง คือ แปลงเป็น CoreML format ได้ด้วย จากนั้นก็จะส่งตัวกราฟ TensorFlow Lite ที่ได้ไปให้กับ interpreter (ซึ่งเค้าได้ optimized แล้วสำหรับ mobile)และเราก็สามารถเลือกได้ว่าจะใส่ operation อะไรบ้างใน interpreter (selective registration) หรือถ้า operations ที่มียังไม่ตรงใจก็จะสร้างเองก็ได้เป็นแบบ custom ส่วนการใช้งานกับ accelerator จะผ่าน interface อย่าง Android Neural Network API หรือผ่านทาง GPU โดยตรงตรงทาง OpenGL บน Android หรือ Metal บน iOS ก็ได้

แม้ว่า TensorFlow Lite ยังจำกัดได้แค่บาง operations ใน TensorFlow แต่ก็มี operations ที่มากพอที่จะรองรับกับโมเดลยอดนิยมหลายตัวอย่าง MobileNet, ResNet50, InceptionV3/V4, DenseNet และอื่นๆ

สรุปความรู้สึกโดยรวม

ดูเหมือนว่า TensorFlow จะได้ขยายตัวเองไปสู่ platform หรือภาษาอื่นๆให้ครอบคลุมกว้างขวางในหลายๆส่วนมากขึ้น ซึ่งทำให้ต่อไปเราอาจจะเห็นผลงานของโมเดลทาง machine learning ในแบบต่างๆและใกล้ตัวมากขึ้น แต่ถึง TensorFlow จะขยายตัวเองให้ครอบคลุมมากเพียงใด ก็ยังไม่ลืมในการแก้ pain points ต่างๆที่ผู้ใช้ได้รับ โดยเฉพาะการทำให้ TensorFlow ใช้ง่ายขึ้น สิ่งที่ได้ยินบ่อยๆในงาน TensorFlow Summit นี้ คือประโยคประมาณว่า “ทั้งหมดนี้ เราย่อให้เหลือเพียงบรรทัดเดียว” แล้วก็กดเปิดสไลด์ถัดไปเพื่อโชว์บรรทัดเดียวของเค้า

นอกจากจะเรื่องใช้ง่ายแล้ว สิ่งที่เค้าเน้นเสมอๆ (เป็นสิ่งที่เค้าพูดถึงแทบจะตลอดเวลา) คือ เรื่องของ performance ไม่ว่าจะ session ไหนๆในงานนี้แทบจะขาดไม่ได้เลยคือการแสดง perfermance ให้ดู ซึ่งเค้าได้ใช้เทคนิคมากมาย (มากมายจริงๆ) ที่ไม่ได้กล่าวในบล็อคนี้​ (ไม่เช่นนั้นคงมีความยาวไม่จบไม่สิ้น) เพื่อจะพัฒนา performance ของตัว TensorFlow และยังมีทีท่าว่า performance นี้ยังจะพัฒนาต่อไปอีกเพราะเป็นสิ่งสำคัญอย่างหนึ่งที่เค้าให้ความสนใจจริงๆ

และสุดท้ายขอจบด้วยภาพสไลด์ใน session ของ tf.data ที่น่าจะสรุปทุกสิ่งทุกอย่างที่ทางทีม TensorFlow ต้องการจะทำ คือ Fast, Flexible และ Easy-to-Use (แต่ในรูปนี้เค้าพูดแต่ในมุมของ tf.data นะ แต่ยืม mission หลักๆเค้ามาใช้ก่อนละกัน ฮาๆ)

ที่มา https://www.youtube.com/watch?v=uIcqeP7MFH0

--

--