loading...
Data Eng Thailand

ใช้ Papermill ทำ Automation กับ Jupyter Notebooks

zkan profile image Kan Ouivirach ・1 min read

Background

ในยุคนี้เวลาที่ชาว Data Scientist อยากจะสื่อสารผลที่ได้จากการวิเคราะห์ข้อมูลกับฝั่ง Business หรืออยากที่จะสร้างโมเดลทำนายผลทางธุรกิจสักอย่างหนึ่ง Jupyter Notebooks จะเป็นอาวุธหรือเครื่องมือสำคัญที่ส่วนใหญ่เราจะหยิบเอามาใช้กัน ซึ่งข้อดีของเครื่องมือตัวนี้ก็คือมันสามารถเป็นทั้ง document เป็น live code รวมไปถึง visualization ภายในตัว

Challenges

แต่อย่างไรก็ดี เครื่องมือตัวนี้ยังมีข้อจำกัดอยู่ที่ว่าเวลาที่เรา

  • อยากจะเปลี่ยนแปลงค่า input บางค่า หรือว่ามีส่วนของโค้ดที่เราอยากไปดึงข้อมูลหลังจากจบเดือนนี้ หรือดึงโค้ดในวันสิ้นปี เราต้องเปิด notebook นั้นๆ ขึ้นมาในวันนั้นๆ แล้วสั่ง execute แต่ละ cell เอง
  • อยากจะใช้ค่าจากผลการทดลองที่อยู่ใน notebook ของเพื่อนร่วมทีม สิ่งที่เราต้องทำก็คือไปเปิด notebook ของเพื่อน นั่งไล่ execute แต่ละ cell แล้วก็อปปี้ผลที่ได้มาแปะใน notebook ของเราเพื่อนำค่านั้นๆ ไปใช้งานต่อ

ทำแค่ครั้งสองครั้งน่าจะยังสบายๆ อยู่ แต่เมื่อไหร่ก็ตามที่เราต้องทำแบบนี้ไปเรื่อยๆ ทุกๆ อาทิตย์ หรือบ่อยกว่านั้น คงจะไม่สนุกแน่ เราควรเอาเวลาไปใช้กับสิ่งที่มีคุณค่ามากกว่านี้ดีกว่า

Introducing Papermill

บทความนี้เลยอยากจะมาแนะนำเครื่องมือ open source ตัวหนึ่งที่ชื่อ Papermill ครับ เค้าว่ามาแบบนี้

Papermill is a tool for parameterizing and executing Jupyter Notebooks.

หมายความว่าเราสามารถที่จะ

  1. กำหนด parameters และส่งเข้า notebook ของเราได้
  2. สั่ง execute ตัว notebook ของเราได้

แน่นอนครับ เมื่อเรามีความสามารถแบบนี้ เราจึงสามารถทำ automation หรือจับเอา notebook ของเราเข้าไปรวมอยู่ใน automated workflow ได้แล้วน่ะสิ! ปัญหาที่เอ่ยถึงด้านบนก็ถูกแก้ไขไปเรียบร้อยแล้วด้วยเครื่องมือตัวนี้ครับ

สิ่งที่ Papermill ทำมีอยู่ 3 ขั้นตอนสั้นๆ คือ

  1. รับ notebook มาพร้อมกับ parameters ที่เรากำหนด
  2. ทำ execute ตัว notebook นั้นๆ ให้
  3. บันทึกผลลัพธ์ไว้ใน notebook ไฟล์ใหม่

อยากลองเล่น? ไปดูหัวข้อถัดไปกันเลย~

Getting Started with Papermill

ติดตั้ง Papermill กับ Jupyter Notebook ก่อนครับ

pip install papermill jupyter

เสร็จแล้วก็ให้เปิด server ของ Jupyter Notebook ขึ้นมา

jupyter notebook

เสร็จแล้วก็เขียนโค้ดตามปกติประมาณนี้

Write some code in a Jupyter notebook

ต่อไปให้เรากำหนด Tags ให้กับ cell ที่เราอยากให้เป็น parameters ครับ วิธีกำหนดก็ตามรูปด้านล่างนี้เลย กดที่ cell นั้นๆ ก่อน

Set up tags for a cell

ให้เราใส่ tag เป็นคำว่า parameters ครับ

Name the tag "parameters"

เสร็จแล้วให้เราไปที่ terminal แล้วสั่ง

papermill -p name 'Kan' -p x 9 -p y 8 main.ipynb output.ipynb

คำสั่งด้านบนนี้แปลว่าเรากำหนด parameters ตามนี้

  • name ให้มีค่าเป็น string มีค่า 'Kan'
  • x ให้เป็น integer มีค่า 9
  • y ให้เป็น integer มีค่า 8

พอรันเสร็จให้เราเปิดไฟล์ notebook ที่เราได้ออกมาใหม่ที่ชื่อ output.ipynb ดูครับ จะเป็นประมาณนี้

Output from the execution using Papermill

เห็นได้ว่า Papermill มาแทรก cell ที่มี tag ชื่อ injected-parameters ไว้ข้างใต้ cell ของเราที่ tag ไว้ก่อนหน้านี้ ซึ่งทำให้ cell ถัดๆ ไปได้ใช้ค่า parameters ที่โดน inject เข้าไปแทนที่จะใช้ parameters ที่เรากำหนดไว้ตอนแรก

ดูเป็นวิธีที่ simple มากๆ แต่แก้ปัญหาได้เยอะเลยนะ งดงามมาก

ใครอยากเห็นโค้ดที่ใช้ในบทความนี้ ตามไปดูกันได้ที่ hello-papermill

ใครที่ใช้ Papermill กันอยู่ อยากรู้จังว่าเอาไปใช้ใน use case ไหนกันบ้าง แชร์กันมาได้นะครับ ^^

ปล. ถ้าเราไม่ tag คำว่า parameters ที่ cell ของเราไว้ Papermill จะใส่ injected-parameters ไว้ที่ cell ด้านบนสุดให้

Discussion

pic
Editor guide