ใช้ 製紙機ทำ 自動化กับ ノートブック


背景


ในยุคนี้เวลาที่ชาว データ科学者อยากจะสื่อสารผลที่ได้จากการวิเคราะห์ข้อมูลกับฝั่ง ビジネスหรืออยากที่จะสร้างโมเดลทำนายผลทางธุรกิจสักอย่างหนึ่ง Jupyter Notebooks จะเป็นอาวุธหรือเครื่องมือสำคัญที่ส่วนใหญ่เราจะหยิบเอามาใช้กัน ซึ่งข้อดีของเครื่องมือตัวนี้ก็คือมันสามารถเป็นทั้ง 書類เป็น ライブコードรวมไปถึง 可視化ภายในตัว

挑戦


แต่อย่างไรก็ดี เครื่องมือตัวนี้ยังมีข้อจำกัดอยู่ที่ว่าเวลาที่เรา
  • อยากจะเปลี่ยนแปลงค่า 入力บางค่า หรือว่ามีส่วนของโค้ดที่เราอยากไปดึงข้อมูลหลังจากจบเดือนนี้ หรือดึงโค้ดในวันสิ้นปี เราต้องเปิด ノートนั้นๆ ขึ้นมาในวันนั้นๆ แล้วสั่ง 実行するแต่ละ 細胞เอง
  • อยากจะใช้ค่าจากผลการทดลองที่อยู่ใน ノートของเพื่อนร่วมทีม สิ่งที่เราต้องทำก็คือไปเปิด ノートของเพื่อน นั่งไล่ 実行するแต่ละ 細胞แล้วก็อปปี้ผลที่ได้มาแปะใน ノートของเราเพื่อนำค่านั้นๆ ไปใช้งานต่อ
  • ทำแค่ครั้งสองครั้งน่าจะยังสบายๆ อยู่ แต่เมื่อไหร่ก็ตามที่เราต้องทำแบบนี้ไปเรื่อยๆ ทุกๆ อาทิตย์ หรือบ่อยกว่านั้น คงจะไม่สนุกแน่ เราควรเอาเวลาไปใช้กับสิ่งที่มีคุณค่ามากกว่านี้ดีกว่า

    製紙機の紹介


    บทความนี้เลยอยากจะมาแนะนำเครื่องมือ オープンソースตัวหนึ่งที่ชื่อ Papermill ครับ เค้าว่ามาแบบนี้

    Papermill is a tool for parameterizing and executing Jupyter Notebooks.


    หมายความว่าเราสามารถที่จะ
  • กำหนด パラメータและส่งเข้า ノートของเราได้
  • สั่ง 実行するตัว ノートของเราได้
  • แน่นอนครับ เมื่อเรามีความสามารถแบบนี้ เราจึงสามารถทำ 自動化หรือจับเอา ノートของเราเข้าไปรวมอยู่ใน 自動ワークフローได้แล้วน่ะสิ! ปัญหาที่เอ่ยถึงด้านบนก็ถูกแก้ไขไปเรียบร้อยแล้วด้วยเครื่องมือตัวนี้ครับ
    สิ่งที่ 製紙機ทำมีอยู่ 3ขั้นตอนสั้นๆ คือ
  • รับ ノートมาพร้อมกับ パラメータที่เรากำหนด
  • ทำ 実行するตัว ノートนั้นๆ ให้
  • บันทึกผลลัพธ์ไว้ใน ノートไฟล์ใหม่
  • อยากลองเล่น? ไปดูหัวข้อถัดไปกันเลย~

    製紙工場を始める


    ติดตั้ง 製紙機กับ Jupyterノートブックก่อนครับ
    pip install papermill jupyter
    
    เสร็จแล้วก็ให้เปิด サーバของ Jupyterノートブックขึ้นมา
    jupyter notebook
    
    เสร็จแล้วก็เขียนโค้ดตามปกติประมาณนี้

    ต่อไปให้เรากำหนด タグให้กับ 細胞ที่เราอยากให้เป็น パラメータครับ วิธีกำหนดก็ตามรูปด้านล่างนี้เลย กดที่ 細胞นั้นๆ ก่อน

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

    เสร็จแล้วให้เราไปที่ 端末แล้วสั่ง
    papermill -p name 'Kan' -p x 9 -p y 8 main.ipynb output.ipynb
    
    คำสั่งด้านบนนี้แปลว่าเรากำหนด パラメータตามนี้
  • name ให้มีค่าเป็น 文字列มีค่า 'Kan'
  • x ให้เป็น 整数มีค่า 9
  • y ให้เป็น 整数มีค่า 8
  • พอรันเสร็จให้เราเปิดไฟล์ ノートที่เราได้ออกมาใหม่ที่ชื่อ output.ipynb ดูครับ จะเป็นประมาณนี้

    เห็นได้ว่า 製紙機มาแทรก 細胞ที่มี タグชื่อ injected-parameters ไว้ข้างใต้ 細胞ของเราที่ タグไว้ก่อนหน้านี้ ซึ่งทำให้ 細胞ถัดๆ ไปได้ใช้ค่า パラメータที่โดน 注入するเข้าไปแทนที่จะใช้ パラメータที่เรากำหนดไว้ตอนแรก
    ดูเป็นวิธีที่ シンプルมากๆ แต่แก้ปัญหาได้เยอะเลยนะ งดงามมาก
    ใครอยากเห็นโค้ดที่ใช้ในบทความนี้ ตามไปดูกันได้ที่ hello-papermill
    ใครที่ใช้ 製紙機กันอยู่ อยากรู้จังว่าเอาไปใช้ใน ユースケースไหนกันบ้าง แชร์กันมาได้นะครับ ^^
    ปล. ถ้าเราไม่ タグคำว่า parameters ที่ 細胞ของเราไว้ 製紙機จะใส่ injected-parameters ไว้ที่ 細胞ด้านบนสุดให้