AI
น้องๆ หลายคนคงได้ยินคำว่า Fine-tuning กันมาบ้างแล้วใช่มั้ย? สมัยก่อนเนี่ย เวลาเราอยากให้ AI มันเก่งเรื่องอะไรเฉพาะทางมากๆ เราต้อง Fine-tuning โมเดลทั้งก้อน ซึ่งใช้ GPU มหาศาล แถมยังเสียเวลาเป็นวันๆ กว่าจะเทรนเสร็จ
แต่ยุคนี้มันเปลี่ยนไปแล้วครับ ด้วยเทคนิคที่เรียกว่า LoRA (Low-Rank Adaptation) เราสามารถ Fine-tuning โมเดลขนาดใหญ่ได้ โดยใช้ GPU น้อยลงมากๆ แถมยังเทรนเสร็จไวขึ้นอีกด้วย เจ๋งใช่มั้ยล่ะ?
LoRA เนี่ย มันเป็นเทคนิคที่ช่วยลดจำนวนพารามิเตอร์ที่เราต้องเทรน ตอน Fine-tuning โมเดลขนาดใหญ่ๆ ยกตัวอย่างเช่น โมเดลภาษาอย่าง GPT-3 หรือโมเดลรูปภาพอย่าง Stable Diffusion พวกนี้มันมีพารามิเตอร์เป็นพันล้านตัว ถ้าเราจะ Fine-tuning ทั้งหมด มันก็ต้องใช้ GPU แรงๆ หลายตัวเลย
LoRA จะเพิ่ม "Adapter Modules" เล็กๆ เข้าไปในโมเดลเดิม Adapter Modules พวกนี้จะมีพารามิเตอร์น้อยกว่าโมเดลหลักมากๆ ทำให้เราสามารถ Fine-tuning แค่ Adapter Modules เหล่านี้ได้ โดยที่โมเดลหลักยังคงเดิม วิธีนี้จะช่วยลดการใช้ GPU และเวลาในการเทรนลงไปได้เยอะเลย
สมัยผมทำร้านเน็ตฯ เมื่อก่อน (นานมากแล้วนะ!) การประหยัดทรัพยากรเป็นเรื่องสำคัญสุดๆ เพราะค่าไฟแพงมาก เทคนิค LoRA นี่ก็เหมือนกัน ช่วยให้เราใช้ทรัพยากรได้อย่างคุ้มค่า เหมาะกับยุคที่ AI กำลังบูมมากๆ
เอาล่ะ มาดูวิธีทำ LoRA Fine-tuning กันแบบ step-by-step เลยนะครับ
transformers, accelerate, และ diffusers (ถ้าใช้ Stable Diffusion)Code snippet ตัวอย่าง (ใช้ transformers library):
from transformers import AutoModelForCausalLM, LoraConfig, get_peft_model
# โหลดโมเดล
model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")
# กำหนดค่า LoRA
config = LoraConfig(
r=8, # Rank ของ LoRA adapter
lora_alpha=32, # Scaling factor
lora_dropout=0.05, # Dropout probability
bias="none",
task_type="CAUSAL_LM"
)
# สร้าง LoRA model
model = get_peft_model(model, config)
model.print_trainable_parameters()
จาก code snippet ข้างบน r คือ rank ของ LoRA adapter ยิ่งค่านี้สูง adapter ก็จะมีความสามารถในการเรียนรู้มากขึ้น แต่ก็ใช้ memory มากขึ้นด้วย ส่วน lora_alpha เป็น scaling factor ที่ใช้ปรับขนาดของ LoRA adapter
LoRA เป็นที่นิยมมากในการ Fine-tuning Stable Diffusion เพื่อสร้างรูปภาพตามที่เราต้องการ เช่น สร้างรูปตัวละครที่เราชอบ หรือสร้างรูปสไตล์เฉพาะที่เราต้องการ สมัยผมเล่นเกมออนไลน์ใหม่ๆ ถ้ามี AI สร้างตัวละครได้แบบนี้คงสนุกน่าดู
การทำ LoRA กับ Stable Diffusion ก็คล้ายๆ กับขั้นตอนที่กล่าวมาข้างต้น แต่เราจะต้องใช้ Library diffusers เพิ่มเติม และต้องเตรียมข้อมูลที่เป็นรูปภาพที่เราต้องการ
ตัวอย่าง code snippet สำหรับ Fine-tuning Stable Diffusion ด้วย LoRA:
from diffusers import StableDiffusionPipeline, LoraLoaderMixin, UNet2DConditionModel
# โหลดโมเดล Stable Diffusion
pipeline = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
# โหลด LoRA adapter
pipeline.unet.load_attn_procs("path/to/your/lora/adapter")
# สร้างรูป
image = pipeline("Your prompt here").images[0]
ใน code snippet นี้ เราใช้ LoraLoaderMixin เพื่อโหลด LoRA adapter เข้าไปในโมเดล Stable Diffusion หลังจากนั้นเราก็สามารถใช้ pipeline สร้างรูปได้ตามปกติ
ทุกเทคนิคก็มีข้อดีข้อเสีย LoRA ก็เช่นกัน มาดูกันว่ามีอะไรบ้าง
| ข้อดี | ข้อเสีย |
|---|---|
| ประหยัด GPU และเวลาในการเทรน | คุณภาพอาจจะไม่ดีเท่า Fine-tuning โมเดลทั้งก้อน |
| สามารถ Fine-tuning โมเดลขนาดใหญ่ได้ด้วย GPU ที่มีสเปคไม่สูงมาก | ต้องใช้ความเข้าใจในการปรับแต่ง hyperparameters เช่น rank และ alpha |
| สร้างโมเดลเฉพาะทางได้ง่าย | ต้องเตรียมข้อมูลให้ดี เพื่อให้ได้ผลลัพธ์ที่ดี |
โดยรวมแล้ว LoRA เป็นเทคนิคที่คุ้มค่ามากๆ ถ้าเราต้องการ Fine-tuning โมเดลขนาดใหญ่ แต่ถ้าเราต้องการคุณภาพที่ดีที่สุด อาจจะต้องลอง Fine-tuning โมเดลทั้งก้อนดู แต่ต้องเตรียม GPU แรงๆ ไว้ด้วยนะ!
LoRA จะ Fine-tuning แค่ Adapter Modules เล็กๆ ในขณะที่ Fine-tuning แบบปกติ จะ Fine-tuning โมเดลทั้งก้อน ทำให้ LoRA ประหยัด GPU และเวลาในการเทรนมากกว่า
GPU ที่มี VRAM 8GB ขึ้นไปก็สามารถทำ LoRA Fine-tuning ได้สบายๆ แต่ถ้าโมเดลใหญ่มากๆ อาจจะต้องใช้ GPU ที่มี VRAM มากกว่านี้
LoRA เหมาะกับงานที่ต้องการสร้างโมเดลเฉพาะทาง เช่น สร้างโมเดลสำหรับสร้างรูปภาพสไตล์เฉพาะ หรือสร้างโมเดลสำหรับแปลภาษาเฉพาะทาง
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ ที่สนใจเรื่อง AI นะครับ ถ้าใครอยากอ่านบทความเกี่ยวกับ AI และเทคโนโลยีอื่นๆ อีก สามารถเข้าไปดูได้ที่ SiamCafe Blog นะครับ
ปกติแล้ว LoRA adapter จะถูกเก็บไว้ในรูปแบบไฟล์ .pt หรือ .safetensors ซึ่งเราสามารถโหลดและใช้งานได้ง่าย
ถ้าใครอยากรู้เรื่องการทำ Server ร้านเน็ตฯ สมัยใหม่ ก็ลองแวะไปดูที่ SiamCafe Blog ได้นะ ผมเขียนไว้เยอะเลย
ดูวิดีโอเพิ่มเติมเกี่ยวกับLoRA Fine-tuning ประหยัด GPU:
สมัยผมทำร้านเน็ตฯ เคยเจอเด็กมันเอาแต่รูปโป๊มาเซฟเต็มเครื่อง กว่าจะล้างเครื่องได้แทบแย่! Data ก็เหมือนกัน ต้องสะอาด ต้องดี ไม่งั้น Train ไปก็พัง LoRA ก็เหมือนกัน เตรียมข้อมูลให้พร้อม อย่าให้มีขยะเยอะเกินไป เลือกข้อมูลที่ตรงกับสิ่งที่เราอยากให้โมเดลมันเก่งขึ้นจริงๆ
พวก learning rate, batch size, rank (LoRA dimension) นี่สำคัญหมดนะ ลองปรับๆ ดูหลายๆ ค่า อย่าขี้เกียจ! สมัยก่อนตอนหัดเล่น Linux ใหม่ๆ ก็ต้องนั่งแก้ config file จนหน้ามืด กว่าจะรัน Apache ได้สักที LoRA ก็เหมือนกัน ต้องลองผิดลองถูก
ดู loss curve, validation metrics อะไรพวกนี้ด้วยนะ อย่า train ไปเรื่อยๆ โดยไม่รู้ว่ามันดีขึ้นหรือแย่ลง เคยเจอเคสลูกค้าบอกว่า "พี่ลง Windows ให้ใหม่ แต่ทำไมมันช้ากว่าเดิม?" ก็ต้องมานั่งไล่ดูว่าลงอะไรไปบ้าง LoRA ก็เหมือนกัน ต้องคอย monitor ผลลัพธ์
พวก weight decay, dropout นี่ช่วยได้เยอะนะ ลองใช้ดู Overfitting นี่ตัวร้ายเลย Train บนข้อมูลเราดี๊ดี แต่พอไปเจอข้อมูลใหม่ๆ ดันเจ๊ง สมัยก่อนตอนเขียนเว็บ PHP ใหม่ๆ ก็ชอบเขียนโค้ดแบบ "ขอให้มันทำงานได้ก่อน" สุดท้ายเละเทะหมด LoRA ก็เหมือนกัน ต้องคุมไม่ให้มัน Overfit
iCafeForexข้อดีหลักๆ เลยคือประหยัด GPU memory แล้วก็เร็วกว่าเยอะ! โมเดลมันเล็กลงเยอะมาก ทำให้ train ได้บนเครื่องที่ GPU ไม่แรงมากได้ แถมยังเอาไปใช้กับโมเดลอื่นๆ ได้ง่ายกว่าด้วย
อันนี้ตอบยาก ขึ้นอยู่กับหลายอย่างเลย แต่โดยทั่วไปยิ่งเยอะยิ่งดี แต่ก็ต้องดูคุณภาพของข้อมูลด้วยนะ ถ้าข้อมูลขยะเยอะ ต่อให้เยอะแค่ไหนก็ไม่ช่วยอะไร
ไม่ใช่ทุกโมเดลนะ ส่วนใหญ่จะใช้ได้กับพวก Transformer-based models เช่น พวก Language Models (LLMs) หรือ Vision Transformers (ViTs)
ลองหา tutorial ในเน็ตดู มีเยอะแยะเลย เดี๋ยวนี้มี library ที่ช่วยให้ทำ LoRA ได้ง่ายขึ้นเยอะ เช่น Hugging Face Transformers, PEFT ลองศึกษาดู
LoRA Fine-tuning นี่เป็นเทคนิคที่น่าสนใจมากๆ สำหรับคนที่อยากปรับแต่งโมเดลโดยที่ไม่ต้องใช้ GPU แรงๆ หรือมีข้อมูลเยอะๆ ลองเอาไปประยุกต์ใช้กับงานของตัวเองดู อาจจะเจออะไรที่น่าสนใจก็ได้
อย่าลืมแวะไปอ่านบทความอื่นๆ ได้ที่ SiamCafe Blog นะครับ