Notifications
Clear all

Deploy โมเดลเป็น Web App ง่ายๆ by Streamlit, Huggingface & WandB

10 ข้อความ
1 Users
0 Likes
6,162 Views
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 6 years ago
ข้อความ: 400
Topic starter  
update 2023 : รวมบทความเกี่ยวกับ WandB (เลื่อนดูด้านล่าง)
 
---
Deploy โมเดลเป็น Web App ง่ายแบบปลอกกล้วย ด้วย Streamlit
ThaiKeras and Kaggle - 21 เมษายน 2021
 
สวัสดีคร้าบ วันนี้จะแชร์หนึ่งในวิธี Deploy โมเดลของเราบน web app ที่ง่ายและเร็วที่สุดในจักรวาลด้วย Python library ที่ชื่อว่า streamlit ครับ (รูปที่ 1)
 
ถ้าจะสรุปการ Deployment โมเดลด้วย streamlit ใน 1 วรรค ก็คือ เราเขียน Python ปกติคล้ายเขียนบน Jupyter เลย เพียงแต่การเขียน output แทนที่เราจะใช้ print() เราใช้ streamlit.write() แทน และรับ input ด้วย streamlit.text_input() และเซพไว้ในไฟล์สมมติชื่อ app.py
 
จากนั้นบน server ของเรา เราเพียงสั่ง
streamlit run app.py
 
แค่นี้จบเลยครับ เราจะได้ web app มาใช้งานทันที ง่ายไหมครับ 😀
Streamlit สามารถ deploy Machine learning โมเดลได้หลากหลาย โดยดู show cases มากมายได้ที่ streamlit.io (รูปที่ 2)
 
 
ถ้าสนใจลองมาดูรายละเอียดเพิ่มเติมกันในบทความนี้กันครับ
 
.
 
3 หัวใจสำคัญของ Streamlit
--------------------------
 
Streamlit ถูกออกแบบมาโดย 3 หลักการนี้ครับ
 
1. Simple API
การใช้ library streamlit นั้นเข้าใจง่ายมากๆ เช่น streamlit.text_input() ก็จะสร้าง text input widget ขึ้นมาให้ user กรอกข้อมูล
 
หรือ streamlit.sidebar.text_input() ก็จะสร้าง input widget แบบเดียวกัน แต่ไปอยู่บน sidebar แทน
 
streamlit.checkbox('Check this') ก็จะสร้าง checkbox ทันที โดย return ค่าเป็น True/False
เป็นต้น โดยดู API ทั้งหมดง่ายๆ ได้ที่ Cheat sheet https://share.streamlit.io/daniellewisdl/streamlit-cheat-sheet/app.py
 
โดย streamlit จะจัดเรียง layout ให้สวยงามตามขนาดหน้าจอของผู้ใช้อย่างอัตโนมัติ
 
2. Widget is variable
ทุกๆ widget ไม่ว่าจะเป็น input, checkbox, slide, หรือ file_upload widgets จะ return ค่าเป็นตัวแปร Python ซึ่งค่าของตัวแปรก็คือค่าที่ user ใส่ค่าเข้ามา เช่น
 
txt = streamlit.input_text('Input here:')
 
เมื่อ user กรอกข้อความใน text เข้ามา ตัวแปร txt ก็จะอัพเดตเป็น string variable ที่ user กรอกมาโดยอัตโนมัติครับ เราไม่ต้องยุ่งกับ html, css, java script, backend, frontend ใดๆ เลยครับ
 
3. Deploy Instantly with Auto update
เราสามารถ deploy ได้บน server เพียงสั่งคำสั่งเดียว streamlit run app.py
นอกจากนี้ ทุกครั้งที่เราแก้ source file ที่เกี่ยวข้อง, streamlit จะ detect เองอัตโนมัติและอัพเดต application ของเราทันที โดยที่เราไม่ต้องทำอะไรเลย!!
 
ที่เจ๋งมากๆ ก็คือจริงๆ แล้วเราไม่ต้องเช่าและจัดการ server เองด้วยซ้ำเนื่องจาก Streamlit มีบริการจัดการ server ให้ github users ทุกคน "ฟรีๆ" คนละ 3 apps เพียงแค่ยื่นเจตจำนงที่ https://streamlit.io/sharing-sign-up ซึ่งโดยปกติใช้เวลาไม่ถึงหนึ่งสัปดาห์ก็จะได้รับการอนุมัติครับ
 
ถ้าได้สิทธิแล้วเรา deploy ผ่าน github และ streamlit.io ได้เลย โดยไม่ต้องยุ่งกับฝั่ง server ใดๆ
รายละเอียดเพิ่มเติมของ free streamlit server ดูหัวข้อข้างล่างครับ
 
.
 
Control flow และการจัด layout ของ streamlit
---------------------------
 
ไอเดีย control flow ของ streamlit นั้นง่ายมากครับ นั่นคือ "ทุกครั้งที่มีการอัพเดตข้อมูลใดๆ" (อาทิกรอกข้อความ เลื่อนสไลด์ อัพโหลดไฟล์ หรือติ้ก checkbox) เจ้า streamlit web app จะรันโปรแกรมใหม่หมดตั้งแต่บรรทัดแรกจนถึงบรรทัดสุดท้าย ด้วยข้อมูลล่าสุดที่มีการอัพเดต
 
ส่วนเรื่องการจัดเรียง layout, Streamlit จะสามารถทำ layout โดยแบ่งเป็นหลาย columns และทำ sidebar ได้อย่างง่ายดายตามตัวอย่างนี้
 
 
การทำ sidebar เรียกว่าง่ายอย่างไม่น่าเชื่อ เราสามารถทำ widget ทุกอย่างบน sidebar ได้เหมือน widget บนหน้าหลักเพียงแค่เติมคำว่า sidebar ลงไปในฟังก์ชันก่อนเรียกใช้งาน เช่น
 
streamlit.checkbox() สร้าง widget บนหน้าหลัก
streamlit.sidebar.checkbox() สร้าง widget บนหน้า sidebar
 
ง่ายจนเหลือเชื่อ
 
นอกจากนี้ web app ของ streamlit จะเป็น Auto-reponsive (ปรับตามขนาดจอ PC, tablet, mobile อัตโนมัติ) โดยที่เราไม่ต้องทำอะไรเลย!!
 
 
 
.
 
มาดูตัวอย่างการใช้งาน streamlit ผ่าน Colab Playground
-----------------------------------------------
 
เพื่อให้เพื่อนๆ ได้เห็นภาพความเจ๋งของ streamlit โดยที่ไม่ต้องรอ streamlit free server ซึ่งใช้เวลาอนุมัติ 2-3 วัน
ผมเลยใช้ Colab มาสร้างเป็น streamlit playground ให้เพื่อนๆ ได้ลองใช้กันครับ ที่นี่ http://bit.ly/colab-streamlit-playground
 
ในการเล่น playground ก่อนอื่นทำความรู้จักฟังก์ชันทั้งหมดของ streamlit คร่าวๆ ผ่านทาง cheatsheet นี้ครับ
 
ใน api cheat sheet จะแสดงวิธีการสร้าง text, charts, audio, video, dataframe, interactive widgets
หรือจะใช้ Streamlit.write() ซึ่งเป็น magic function ที่จะแสดงผลแทบจะทุก object ได้ในคำสั่งเดียวก็ได้ครับ
 
ใน Colab เราเรียกใช้ ngrok ซึ่งทำหน้าที่สร้าง external URL ให้ Colab server ซึ่งเราจะกดเข้าไปดู streamlit โปรแกรมของเราได้ที่ xxxxx.ngrok.io ครับ
 
ถ้าเราจะลองแก้ไขโค้ด steramlit ให้ stop cell streamlit แล้วรัน ngrok ใหม่โดยชื่อ URL ตัวหน้าสุดจะเปลี่ยนทุกครั้งที่มีการ stop streamlit/restart ngrok ครับ
 
(รูปที่ 4)
 
 
.
 
 
 
Free streamlit server
----------------------
 
การ deploy ที่สะดวกที่สุดสำหรับคนที่ไม่ต้องการ resource เยอะมากๆ ก็คือขอรับบริการฟรีจาก streamlit ผ่านทาง https://streamlit.io/sharing-sign-up โดยเราต้องใส่ Github URL ของเราให้ streamlit ทราบ เพราะ streamlit จะ deploy ผ่าน Github ของเราโดยตรงครับ!
 
Streamlit free server มี spec ดังนี้ครับ
1 CPU, 800 MB of RAM, and 800 MB Disk
 
โดยไม่มี GPU แต่ถ้าเรามี app ที่เป็นสาธารณะประโยชน์สามารถคุยกับทาง streamlit ได้เป็นกรณีพิเศษ
ถ้าเราใช้บริการ Cloud API เจ้าอื่นๆ เช่น Google Cloud API, Huggingface API, หรือ GPT-3 API เราก็ไม่จำเป็นต้องใช้ GPU ครับ
 
การ deploy ผ่าน streamlit เราเพียงเตรียมไฟล์หลักๆ 2 files คือ app.py ที่มีโค้ด streamlit app (เหมือนใน colab ข้างบน หรือจะเขียนเป็น modules แยกไฟล์สวยๆ ก็ย่อมได้) และ requirements.txt ที่ระบุ library packages ต่างๆ ที่ app.py เรียกใช้ (อาทิเช่น Tensorflow, Transformers, etc.)
 
โดยเมื่อเราได้รับ free server quota แล้วเราก็เพียงไประบุ Github project / branch ของเราที่
เท่านี้ app ของเราก็จะถูก deploy ง่ายๆ แบบมหัศจรรย์ครับ
 
(รูปที่ 5)
 
ดู simple demo ที่ deploy บน streamlit ได้ที่นี่ครับ (อันนี้เป็นตัวอย่าง image classification)
 
โดยไฟล์ requirements.txt จะอยู่ที่นี่ครับ
 
สำหรับ documents ฉบับเต็มเกี่ยวกับการ deployment บน streamlit free server ดูได้ที่
This topic was modified 3 years ago by The Neural Engineer
This topic was modified 1 year ago 2 times by The Neural Engineer

   
อ้างอิง
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 6 years ago
ข้อความ: 400
Topic starter  

Update ล่าสุดจาก Streamlit เพิ่ม session state ได้

https://blog.streamlit.io/session-state-for-streamlit/


   
ตอบกลับอ้างอิง
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 6 years ago
ข้อความ: 400
Topic starter  

Streamlit สามารถใช้งาน Firestore ซึ่งเป็นระบบ Database แบบ NoSQL ของ Google ผ่าน Google Cloud ได้อย่างง่ายดาย 

ดูรายละเอียดได้ที่นี่ 2 blogs นี้ครับ

https://blog.streamlit.io/streamlit-firestore/

https://blog.streamlit.io/streamlit-firestore-continued/


   
ตอบกลับอ้างอิง
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 6 years ago
ข้อความ: 400
Topic starter  

Gradio เป็นอีกแอพทางเลือกคล้าย streamlit และเป็นบ.ลูกของ Huggingface ครับ

https://gradio.app/


   
ตอบกลับอ้างอิง
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 6 years ago
ข้อความ: 400
Topic starter  

เราสามารถเอา streamlit app ของเรามา host ที่ huggingface hub ได้ฟรี รายละเอียดที่นี่ครับ

https://huggingface.co/docs/hub/spaces-sdks-streamlit


   
ตอบกลับอ้างอิง
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 6 years ago
ข้อความ: 400
Topic starter  

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 จะช่วยให้เพื่อนๆ พัฒนาโมเดลได้ง่ายและดียิ่งขึ้นนะครับ 🙂
This post was modified 1 year ago by The Neural Engineer

   
ตอบกลับอ้างอิง
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 6 years ago
ข้อความ: 400
Topic starter  

รันโมเดลยักษ์ใหญ่ บน 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

This post was modified 1 year ago by The Neural Engineer

   
ตอบกลับอ้างอิง
Page 1 / 2
Share: