Update ล่าสุดจาก Streamlit เพิ่ม session state ได้
Streamlit สามารถใช้งาน Firestore ซึ่งเป็นระบบ Database แบบ NoSQL ของ Google ผ่าน Google Cloud ได้อย่างง่ายดาย
ดูรายละเอียดได้ที่นี่ 2 blogs นี้ครับ
Gradio เป็นอีกแอพทางเลือกคล้าย streamlit และเป็นบ.ลูกของ Huggingface ครับ
เราสามารถเอา streamlit app ของเรามา host ที่ huggingface hub ได้ฟรี รายละเอียดที่นี่ครับ
WandB เครื่องมือสำคัญสำหรับการทำงาน Data Science ที่จะช่วยเราวิเคราะห์และบันทึกทุกผลการทดลองได้ฟรี ThaiKeras and Kaggle - 8 พค. 2565
สวัสดีครับ WandB เป็น free tool ชั้นยอดที่จะช่วยเติมเต็มการทำงาน data science และ machine learning อย่างมืออาชีพ โดยเมื่อเรารวม free tools ที่ data scientists ทุกคนควรใช้แล้วแทบจะครอบคลุมทุกกระบวนการทำงาน กล่าวคือ
- เขียนโปรแกรมและใช้ GPU / TPU สะดวกและฟรีบนเว็บบราว์เซอร์ ด้วย Kaggle / Colab
- สร้างและเก็บ Dataset ขนาดใหญ่ฟรีบน cloud เรียกใช้งานได้จากทุกที่ด้วย Kaggle Datasets (ไม่จำกัดกรณี public dataset / จำกัดโควตา 100GB กรณี private)
- เมื่อตกผลึกทางความคิดเรื่องการออกแบบการเขียนโปรแกรม ก็จัดเก็บ source code อย่างเป็นระบบระเบียบ รวมทั้งออกแบบระบบทดสอบด้วย Github / Github Actions
- Deploy โปรแกรมตัวอย่าง (pilot program / show case / MVP - minimum viable product) เพื่อโชว์ผลงานให้คนทั่วไปใช้งานง่ายๆ โดยเพิ่มโค้ดไม่กี่บรรทัด รวมทั้งไม่ต้องจดโดเมนและเช่า server ใดๆ ด้วย free hosting ที่ Streamlit หรือ Huggingface Space
- ** (ที่จะเล่าวันนี้) แทร็คผลการทดลองในการพัฒนาโมเดลอย่างเป็นระบบ (เช่น เปรียบเทียบ loss curves ของแต่ละ parameter settings เพื่อหาโมเดลที่ดีที่สุด) รวมทั้งสร้าง reports ของการพัฒนาโมเดลนั้นๆ เพื่อ communicate กับเพื่อนร่วมทีม ด้วย WandB.ai (Weight and Bias) ซึ่งฟรี สำหรับการใช้งานส่วนตัว (เก็บเงินสำหรับการทำงานระดับทีมในบริษัท)
สำหรับการใช้งาน 3 ทหารเสือ Kaggle + Colab + Github ดูบทความเก่าที่นี่ครับ https://bit.ly/thaikeras-kaggle-github-colab
โค้ด colab ตัวอย่างที่แสดงการเชื่อม Kaggle และ Github https://bit.ly/colab-kaggle-github
แนะนำการใช้งาน Streamlit ง่ายๆ พร้อมตัวอย่างบน Colab https://thaikeras.com/community/main-forum/streamlit/
.
WandB ทำอะไรได้บ้าง?
WandB.ai (Weights and Biases) เป็นอีก 1 startup มาแรงในวงการ AI / Data Science ที่มี features ต่างๆ ดังต่อไปนี้
1) บันทึก log ผลการทดลองของโมเดลมาเก็บไว้เพื่อเปรียบเทียบอย่างเป็นระบบบน Cloud (รูปที่ 1)
มี features มากมายในรูปที่ 1 ที่ช่วยให้เราวิเคราะห์การทดลองของเราได้อย่างยอดเยี่ยม อาทิเช่น - แทร็คได้หลาย loss metrics พร้อมๆ กัน รวมทั้งได้ทั้ง train, validation และ test datasets - เลือกการทดลองเฉพาะที่สนใจมาวิเคราะห์ (ในรูปเลือกมา 3 จาก 14) - Interactive smoothing curve นั่นคือเปลี่ยน loss curve จริงที่แกว่งขึ้นลงมาก (สังเกตในภาพบนเส้นจาง) ทำ moving average โดยอัตโนมัติ ทำให้เปรียบเทียบภาพรวมได้ง่าย - Interactive zoom เข้าไปดูเฉพาะช่วง epochs ที่เราสนใจได้ - ใช้ได้กับทุก platforms / APIs / libraries ชื่อดัง เช่น TensorFlow, Keras, Pytorch, Lightning (แทร็คผสมกันข้าม platforms ได้ สำหรับการเปรียบเทียบโมเดลจากหลาย platforms)
ทั้งหมดนี้ทำให้เราเข้าใจผลกระทบของ parameters ต่างๆ ที่เราเซ็ตในแต่ละการทดลองของโมเดล ซึ่งที่เป็นประโยชน์สูงสุดคือจะช่วยให้เราเข้าใจว่าพารามิเตอร์แต่ละตัวควรจะกำหนดอยู่ในช่วงไหนถึงจะเหมาะสมที่สุดโดยรวม นอกจากนี้ยังเปรียบเทียบ metrics เหล่านี้ของโมเดลที่ต่างกันบน resources เดียวกันได้ง่ายอีกด้วยครับ
2) เก็บ Dataset ส่วนตัวได้ฟรี 100GB ภายใตัชื่อ "WandB Artifacts" ซึ่งจะช่วยทำ Dataset Versioning ให้ด้วย ใช้ควบคู่กับ Kaggle Datasets ได้ (เมื่อใช้ร่วมกันทำให้เราสามารถได้พื้นที่ส่วนตัวฟรีๆ ถึง 200GB)
3) สร้าง report เพื่อใช้สื่อสารกับเพื่อนร่วมทีม หรือเป็น blog ส่วนตัวให้ผู้อ่านทั่วไป ดูตัวอย่าง blog เจ๋งๆ ที่สร้างบน WandB ที่รวม experiments ต่างๆ ที่นี่ https://docs.wandb.ai/guides/reports
แม้แต่ทีม OpenAI ก็ใช้ WandB report ในการสื่อสารผลการทดลองและแนวทางการพัฒนาต่อเนื่องครับ : https://wandb.ai/openai/published-work/Learning-Dexterity-End-to-End--VmlldzoxMTUyMDQ
นอกจากนั้น WandB ยังมีฟีเจอร์เด็ดๆ อย่างอื่น ซึ่งผมเองก็ยังไม่ได้ใช้จริงจัง คือ 4) Hyperparameters optimization 5) Data Visualization ซึ่งสามารถทำได้บน cloud และบันทึกใน WandB report ได้อีกด้วย (เช่นรูปที่ 2 และดูตัวอย่างการใช้งานคู่กับ colab ที่นี่ https://colab.research.google.com/github/wandb/examples/blob/master/colabs/datasets-predictions/Image_Classification_with_Tables.ipynb)
ดูเพิ่มเติมได้ที่ https://docs.wandb.ai/ ครับ
.
วิธีการใช้งาน WandB อย่างปลอดภัยบน Kaggle Public Notebook
ก่อนอื่นสมัคร free account ที่ wandb.ai จากนั้นเข้าไปดู API key ประจำตัวใน account ของเรา
ในการใช้งาน WandB บน Colab หรือ Kaggle เราต้องใช้ WandB API key ส่วนตัว ซึ่งอาจทำให้แชร์เป็น public notebook ไม่สะดวก อย่างไรก็ดี บน Kaggle notebook มีเมนูที่ชื่อว่า Kaggle Secrets ที่ทำให้เราเซพ API Keys ต่างๆ ไว้ในระบบ kaggle notebook server ได้ โดยกดที่แทบเมนูด้านบนดังนี้
Add-ons --> Secrets --> "Add a new secret"
จากนั้นเราเพียงพิมพ์ชื่อ secrets และ API keys ส่วนตัวของเราเก็บไว้ (ใช้เก็บได้ทั้ง Github / Kaggle / WandB private API keys) - ดูรูปที่ 3
และสามารถเรียกใช้ keys ต่างๆ ได้ง่ายๆ บน Kaggle notebook ด้วยคำสั่งต่อไปนี้import os from kaggle_secrets import UserSecretsClient user_secrets = UserSecretsClient() secret_value_0 = user_secrets.get_secret("wandb") os.environ["WANDB_API_KEY"] = secret_value_0ตัว key ของเราก็จะมาอยู่ในตัวแปร secret_value_0 โดยที่ไม่ต้องโชว์ key ตัวจริงให้ public readers . ตัวอย่างการใช้ WandB บน Keras และ Pytorch Lightning สามารถใช้งานง่ายๆ โดยเพิ่มโค้ดไม่กี่บรรทัดครับ ก่อนอื่นก็ import wandb ก่อนแล้วก็ ** Keras **from wandb.keras import WandbCallback wandb.init(project=PROJ_NAME, name=WANDB_NAME) wandb_callback = WandbCallback() model.fit(…, callbacks=[other_callbacks, …, wandb_callback])** Pytorch-lightning **from pytorch_lightning.loggers import WandbLogger wandb_logger = WandbLogger(name=experiment_name,project=project_name) trainer = Trainer( …, logger=wandb_logger)เพียงเท่านี้ experimental log ก็จะไปปรากฏใน wandb page ส่วนตัวของเรา วิธีการใช้งานก็ง่ายๆ เช่นนี้ หวังว่า wandb จะช่วยให้เพื่อนๆ พัฒนาโมเดลได้ง่ายและดียิ่งขึ้นนะครับ 🙂
รันโมเดลยักษ์ใหญ่ บน Colab (หรือที่ไหนก็ได้) ด้วย BitsandBytes และ Huggingface Transformers & Accelerate
(บทความนี้สรุปเนื้อหาหลักมาจาก https://huggingface.co/blog/hf-bitsandbytes-integration )
Colab เวอร์ชั่นฟรีมักจะให้เราใช้ GPU K80 ซึ่งมีหน่วยความจำ 12GB หรือ T4 ซึ่งมีหน่วยความจำ 16GB ซึ่ง 16GB ย่อมาจาก 16พันล้านไบต์ (หรือ 1.6หมื่นล้านไบต์) ซึ่งก็เป็นหน่วยความจำมาตรฐานสำหรับ GPU ทั่วไปที่ราคาซื้อหรือเช่าจับต้องได้
เพื่อนๆ เคยสงสัยไหมว่าทำไมหลายๆ โมเดลเจ๋งๆ ที่มีพารามิเตอร์ราวๆ 11 พันล้าน เช่น (T5-11B) เราดันไม่สามารถใช้งานบน GPU ที่มีหน่วยความจำขนาด 16 พันล้านได้? (โหลดไม่ได้ อดใช้งาน)
คำตอบง่ายๆ ก็คือ 1 พารามิเตอร์หรือ 1 ตัวแปรของโมเดลมักเก็บในเลขจำนวนจริง 4 ไบต์ (ที่มักเรียกว่าตัวแปรขนาด FP32) ดังนั้นโมเดลอย่าง T5-11B จึงต้องการหน่วยความจำใน FP32 ถึง 44 พันล้านไบต์ (44GB) และไม่สามารถโหลดได้ใน 16GB-GPU
ที่ผ่านมา NVIDIA, Tensorflow และ Pytorch ได้ร่วมกันพัฒนาให้โมเดลสามารถเก็บข้อมูลพารามิเตอร์ต่างๆ ไว้ในเลขจำนวนจริง 2 ไบต์ได้ (เรียกว่าระบบ FP16) โดยไม่ทำให้ประสิทธิภาพของโมเดลเปลี่ยนแปลงมากนัก แต่ก็ยังทำให้โมเดล T5-11B ไม่สามารถโหลดมาใช้งานใน 16-GB GPU ได้อยู่ดี เพราะในระบบ FP16 ยังต้องการหน่วยความจำถึง 22GB
วิธีที่เหมือนจะง่ายก็คือ ลดขนาดของตัวแปรลงไปอีกให้เหลือเพียง 1 ไบต์ ซึ่งถ้าทำได้ พวกเราทุกคนก็จะสามารถโหลดโมเดลเจ๋งๆ อย่าง T5-11B มาใช้กับ GPU บ้านๆ ฟรีๆ ที่ Colab ได้ เพราะโมเดลอย่าง T5-11B ก็จะเหลือขนาดเพียง 11GB เท่านั้น
อย่างไรก็ดี เพื่อนๆ ที่เรียนคอมพิวเตอร์จะทราบดีว่า 1 ไบต์ = 8 บิต หรือแทนที่เลข 0/1 เพียง 8 ตัวเลขเท่านั้น ซึ่งข้อมูลเพียง 1 ไบต์เก็บข้อมูลได้น้อยมากเพียงแค่ 256 ค่าเท่านั้น เช่น 0 ถึง 255 หรือ -127 ถึง 128
เดิมที่เราต้องเก็บพารามิเตอร์ของโมเดลไว้ในเลขจำนวนจริง 2 ไบต์ (FP16) หรือ 4 ไบต์ (FP32) นั้นก็เป็นเพราะว่าพารามิเตอร์บางตัวก็มีค่าน้อยมาก เช่น 0.0001 บางตัวก็มีค่ามากเช่น 10,000 การพยายามลดรูปพารามิเตอร์เหล่านี้มาเก็บในตัวแปรขนาด 1 ไบต์ที่เก็บตัวเลขได้เพียง 256 ค่าจึงดูเป็นไม่ได้ในทางทฤษฎี
ทว่าสัปดาห์นี้ (18 สิงหา 2565) BitsandBytes และ Huggingface Transformers & Accelerate ได้เขียนบล็อกประกาศข่าวดีว่าทำได้สำเร็จ!! ทั้งสองทีมร่วมมือกันสามารถลดขนาดโมเดลของ Huggingface Transformers แทบทุกโมเดล (และจะ support ทุกโมเดลเร็วๆ นี้) ให้ใช้หน่วยความจำเพียง 1 ไบต์ต่อ 1 พารามิเตอร์ได้ โดยแทบไม่ทำให้ประสิทธิภาพลดลงเลย (zero performance degradation)!!
สองทีมนี้ทำได้อย่างไร? BitsandBytes (Bits and Bytes) ได้ตีพิมพ์งานวิจัยอธิบายการทดลองอย่างละเอียดก็คือ จริงๆ แล้วในทุกๆ โมเดลที่ได้ผ่านการ pretrained มาพารามิเตอร์ส่วนใหญ่สามารถเก็บในรูป 1 ไบต์ได้ แต่ประเด็นที่ทำให้ทั้งโมเดลไม่สามารถเก็บตัวแปรไว้ในขนาด 1 ไบต์ เป็นเพราะมันจะมีตัวแปร "ส่วนน้อย" บางกลุ่มที่มีค่าสูงมาก หรือน้อยมากเสมอ ซึ่งตัวแปร "ส่วนน้อย" พวกนี้คือตัวปัญหาเพราะเมื่อเราพยายามลดรูปพวกเค้าให้เหลือเพียง 1 ไบต์ การทำงานของโมเดลจะเพี้ยน และทำให้ประสิทธิภาพต่ำทันที
ดังนั้นเมื่อเราเข้าใจสาเหตุของปัญหาแล้ว ไอเดียหลักที่ที่ BitsandBytes เสนอก็คือไอเดียง่ายๆ เพียงแค่แยกเก็บตัวแปร "ส่วนน้อย" เหล่านี้ไว้ในรูป FP16 .. และตัวแปร "ส่วนใหญ่" อื่นๆ เก็บไว้ใน FP8 แล้วแยกกันคำนวณ (เช่นการคูณเมตริกซ์ในรูปที่่ 2 ดูรายละเอียดเพิ่มใน Huggingface blog) ก่อนนำค่ามารวมกัน
เนื่องจากตัวแปรที่ต้องเก็บไว้ในรูป FP16 เป็นเพียงส่วนน้อยเท่านั้น ทำให้ขนาดของหน่วยความจำที่เราต้องการจุโมเดลระดับ T5-11B แทบจะเก็บได้ด้วยหน่วยความจำไม่เกิน 12GB
และที่สำคัญที่สุดอีกเรื่องคือ Huggingface ได้นำเทคโนโลยีนี้ของ BitsandBytes มาปรับใช้กับโมเดล Transformers ทุกโมเดล ทำให้เราสามารถโหลดโมเดลเทพๆ เหล่านี้ผ่าน Huggingface Accelerate ได้โดยคำสั่งเพียงไม่กี่บรรทัด! (ดูตัวอย่างใน Colab ด้านล่าง)
ซึ่งก็เป็นอีกเวทย์มนต์ของวงการ Deep Learning ที่ทำให้พวกเราทั้งหมดสามารถใช้โมเดลคุณภาพสูงๆ บน GPU ราคาถูกหรือฟรีได้ครับ
เพื่อนๆ สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ https://huggingface.co/blog/hf-bitsandbytes-integration
โดยสามารถเล่น Colab เพื่อโหลด T5-11B มาใช้งานได้ที่นี่ https://colab.research.google.com/drive/1YORPWx4okIHXnjW7MSAidXN29mPVNT7F?usp=sharing
งานวิจัยอย่างละเอียดของทีม BitsandBytes & Huggingface https://arxiv.org/abs/2208.07339