๐Ÿ—๏ธ ๅคงๆจกๅž‹ๆžถๆž„ใ€่ฎญ็ปƒไธŽ้ƒจ็ฝฒ

1. ๅคงๆจกๅž‹ๆžถๆž„ไธŽ่ฎญ็ปƒ

1.1 Transformer ๆžถๆž„่ฏฆ่งฃ

Transformer ๆ˜ฏ็Žฐไปฃๅคง่ฏญ่จ€ๆจกๅž‹็š„ๅŸบ็ก€ๆžถๆž„๏ผŒ็”ฑ Google ๅœจ 2017 ๅนด็š„่ฎบๆ–‡ใ€ŠAttention Is All You Needใ€‹ไธญๆๅ‡บใ€‚

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  Transformer ๆžถๆž„                       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”          โ”‚
โ”‚  โ”‚    Encoder      โ”‚      โ”‚    Decoder      โ”‚          โ”‚
โ”‚  โ”‚  (็†่งฃ่พ“ๅ…ฅ)      โ”‚  โ†’   โ”‚  (็”Ÿๆˆ่พ“ๅ‡บ)      โ”‚          โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚
โ”‚                                                         โ”‚
โ”‚  ๆฏไธช Block ๅŒ…ๅซ๏ผš                                       โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”‚
โ”‚  โ”‚  Multi-Head Self-Attention          โ”‚ โ† ๆ•ๆ‰ไพ่ต–ๅ…ณ็ณป โ”‚
โ”‚  โ”‚           โ†“                         โ”‚               โ”‚
โ”‚  โ”‚  Add & Norm (ๆฎ‹ๅทฎ่ฟžๆŽฅ + ๅฑ‚ๅฝ’ไธ€ๅŒ–)     โ”‚               โ”‚
โ”‚  โ”‚           โ†“                         โ”‚               โ”‚
โ”‚  โ”‚  Feed Forward Network               โ”‚ โ† ็‰นๅพๅ˜ๆข    โ”‚
โ”‚  โ”‚           โ†“                         โ”‚               โ”‚
โ”‚  โ”‚  Add & Norm                         โ”‚               โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ”‚
โ”‚                                                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

1.2 ไธ‰็งไธปๆตๆžถๆž„

ๆžถๆž„็ฑปๅž‹ ไปฃ่กจๆจกๅž‹ ็‰น็‚น ้€‚็”จไปปๅŠก
Encoder-Only BERT, RoBERTa ๅŒๅ‘ๆณจๆ„ๅŠ›๏ผŒ็†่งฃ่ƒฝๅŠ›ๅผบ ๆ–‡ๆœฌๅˆ†็ฑปใ€NERใ€้—ฎ็ญ”
Decoder-Only GPT, LLaMA, Qwen ่‡ชๅ›žๅฝ’็”Ÿๆˆ๏ผŒๅ•ๅ‘ๆณจๆ„ๅŠ› ๆ–‡ๆœฌ็”Ÿๆˆใ€ๅฏน่ฏ
Encoder-Decoder T5, BART ็ผ–็ ็†่งฃ + ่งฃ็ ็”Ÿๆˆ ็ฟป่ฏ‘ใ€ๆ‘˜่ฆ
ๆžถๆž„ๅฏนๆฏ”๏ผš

Encoder-Only (BERT):
  ่พ“ๅ…ฅ: [CLS] ๆˆ‘ ็ˆฑ ๅŒ—ไบฌ [SEP]
        โ†โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’  (ๅŒๅ‘ๆณจๆ„ๅŠ›)
  
Decoder-Only (GPT):
  ่พ“ๅ…ฅ: ๆˆ‘ ็ˆฑ ๅŒ—ไบฌ
        โ†’โ†’โ†’โ†’โ†’โ†’โ†’โ†’โ†’โ†’  (ๅ•ๅ‘ๆณจๆ„ๅŠ›๏ผŒๅช็œ‹ๅทฆ่พน)
        
Encoder-Decoder (T5):
  Encoder: [็†่งฃ่พ“ๅ…ฅ] โ”€โ”€โ†’ Decoder: [็”Ÿๆˆ่พ“ๅ‡บ]

1.3 ๅคงๆจกๅž‹่ฎญ็ปƒๆต็จ‹

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                ๅคงๆจกๅž‹่ฎญ็ปƒไธ‰้˜ถๆฎต                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                         โ”‚
โ”‚  ้˜ถๆฎตไธ€๏ผš้ข„่ฎญ็ปƒ (Pre-training)                          โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  ๆ•ฐๆฎ๏ผšTB็บงไบ’่”็ฝ‘ๆ–‡ๆœฌ๏ผˆ็ฝ‘้กตใ€ไนฆ็ฑใ€ไปฃ็ ...๏ผ‰         โ”‚   โ”‚
โ”‚  โ”‚  ็›ฎๆ ‡๏ผšNext Token Prediction๏ผˆ้ข„ๆต‹ไธ‹ไธ€ไธช่ฏ๏ผ‰        โ”‚   โ”‚
โ”‚  โ”‚  ่ง„ๆจก๏ผšๆ•ฐๅƒGPU๏ผŒ่ฎญ็ปƒๆ•ฐๅ‘จๅˆฐๆ•ฐๆœˆ                       โ”‚   โ”‚
โ”‚  โ”‚  ไบงๅ‡บ๏ผšBase Model๏ผˆๅŸบๅบงๆจกๅž‹๏ผ‰                       โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                          โ†“                              โ”‚
โ”‚  ้˜ถๆฎตไบŒ๏ผš็›‘็ฃๅพฎ่ฐƒ (Supervised Fine-Tuning, SFT)         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  ๆ•ฐๆฎ๏ผš้ซ˜่ดจ้‡ๆŒ‡ไปค-ๅ›ž็ญ”ๅฏน๏ผˆ10ไธ‡~100ไธ‡ๆก๏ผ‰            โ”‚   โ”‚
โ”‚  โ”‚  ็›ฎๆ ‡๏ผšๅญฆไน ้ตๅพชๆŒ‡ไปคใ€็”Ÿๆˆๆœ‰ๅธฎๅŠฉ็š„ๅ›ž็ญ”              โ”‚   โ”‚
โ”‚  โ”‚  ไบงๅ‡บ๏ผšSFT Model                                   โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                          โ†“                              โ”‚
โ”‚  ้˜ถๆฎตไธ‰๏ผšๅฏน้ฝ่ฎญ็ปƒ (Alignment)                           โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  ๆ–นๆณ•๏ผšRLHF / DPO / RLAIF                          โ”‚   โ”‚
โ”‚  โ”‚  ็›ฎๆ ‡๏ผšไธŽไบบ็ฑปๅๅฅฝๅฏน้ฝ๏ผŒๅฎ‰ๅ…จใ€ๆœ‰ๅธฎๅŠฉใ€่ฏšๅฎž           โ”‚   โ”‚
โ”‚  โ”‚  ไบงๅ‡บ๏ผšChat Model๏ผˆๅฏๅฏน่ฏ็š„ๆจกๅž‹๏ผ‰                   โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                                                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

1.4 ้ข„่ฎญ็ปƒๅ…ณ้”ฎๆŠ€ๆœฏ

1.4.1 ๆณจๆ„ๅŠ›ๆœบๅˆถไผ˜ๅŒ–

ๆŠ€ๆœฏ ๅŽŸ็† ไผ˜ๅŠฟ
Multi-Head Attention ๅคšไธชๆณจๆ„ๅŠ›ๅคดๅนถ่กŒ่ฎก็ฎ— ๆ•ๆ‰ไธๅŒๅญ็ฉบ้—ด็š„ไฟกๆฏ
Flash Attention IO-aware ็ฒพ็กฎๆณจๆ„ๅŠ›็ฎ—ๆณ• ๆ˜พๅญ˜ๅ‡ๅฐ‘๏ผŒ้€Ÿๅบฆๆๅ‡ 2-4x
GQA (Grouped Query) KV Cache ๅˆ†็ป„ๅ…ฑไบซ ๆŽจ็†ๆ•ˆ็އๆๅ‡
MQA (Multi-Query) ๆ‰€ๆœ‰ๅคดๅ…ฑไบซ KV ๆž่‡ดๆŽจ็†ๆ•ˆ็އ
Sliding Window ๅฑ€้ƒจๆณจๆ„ๅŠ›็ช—ๅฃ ๆ”ฏๆŒๆ›ด้•ฟไธŠไธ‹ๆ–‡

1.4.2 ไฝ็ฝฎ็ผ–็ 

# ไธปๆตไฝ็ฝฎ็ผ–็ ๆ–นๆกˆ

ไฝ็ฝฎ็ผ–็ ๆ–นๆกˆๅฏนๆฏ”๏ผš
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๆ–นๆกˆ           โ”‚ ็‰น็‚น                                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ็ปๅฏนไฝ็ฝฎ็ผ–็     โ”‚ ็ฎ€ๅ•๏ผŒไฝ†ๅค–ๆŽจ่ƒฝๅŠ›ๅทฎ                   โ”‚
โ”‚ (Sinusoidal)   โ”‚ ็”จไบŽๅŽŸๅง‹ Transformer                โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๅฏๅญฆไน ไฝ็ฝฎ็ผ–็   โ”‚ GPT ็ณปๅˆ—้‡‡็”จ                        โ”‚
โ”‚ (Learned)      โ”‚ ็ตๆดปไฝ†ๆณ›ๅŒ–ๅ—้™ไบŽ่ฎญ็ปƒ้•ฟๅบฆ             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ RoPE           โ”‚ LLaMA/Qwen ้‡‡็”จ                     โ”‚
โ”‚ (ๆ—‹่ฝฌไฝ็ฝฎ็ผ–็ )  โ”‚ ๅค–ๆŽจ่ƒฝๅŠ›ๅผบ๏ผŒๆ”ฏๆŒ้•ฟๆ–‡ๆœฌ               โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ALiBi          โ”‚ BLOOM ้‡‡็”จ                          โ”‚
โ”‚ (็บฟๆ€งๅ็ฝฎ)      โ”‚ ๆ— ้œ€่ฎญ็ปƒ๏ผŒๅค–ๆŽจ่ƒฝๅŠ›ๅฅฝ                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

1.4.3 ่ฎญ็ปƒไผ˜ๅŒ–ๆŠ€ๆœฏ

ๆŠ€ๆœฏ ไฝœ็”จ ่ฏดๆ˜Ž
ๆททๅˆ็ฒพๅบฆ่ฎญ็ปƒ (FP16/BF16) ๅ‡ๅฐ‘ๆ˜พๅญ˜๏ผŒๅŠ ้€Ÿ่ฎก็ฎ— BF16 ๆ•ฐๅ€ผ็จณๅฎšๆ€งๆ›ดๅฅฝ
ๆขฏๅบฆ็ดฏ็งฏ ๆจกๆ‹Ÿๆ›ดๅคง batch size ๆ˜พๅญ˜ๅ—้™ๆ—ถไฝฟ็”จ
ๆขฏๅบฆๆฃ€ๆŸฅ็‚น ็”จ่ฎก็ฎ—ๆขๆ˜พๅญ˜ ้‡่ฎก็ฎ—้ƒจๅˆ†ๆฟ€ๆดปๅ€ผ
ZeRO ไผ˜ๅŒ– ๅˆ†ๅธƒๅผๆ˜พๅญ˜ไผ˜ๅŒ– DeepSpeed ไธ‰้˜ถๆฎต
ๅผ ้‡ๅนถ่กŒ (TP) ๅˆ‡ๅˆ†ๆจกๅž‹ๅฑ‚ ๅ•ๆœบๅคšๅก
ๆตๆฐด็บฟๅนถ่กŒ (PP) ๅˆ‡ๅˆ†ๆจกๅž‹ๅฑ‚ๅบๅˆ— ๅคšๆœบ่ฎญ็ปƒ
ๆ•ฐๆฎๅนถ่กŒ (DP) ๆ•ฐๆฎๅˆ†็‰‡ ๆœ€ๅŸบ็ก€็š„ๅนถ่กŒ

1.5 ้ข„่ฎญ็ปƒไปฃ็ ็คบไพ‹

# ไฝฟ็”จ Hugging Face Transformers ้ข„่ฎญ็ปƒ็คบไพ‹
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    TrainingArguments,
    Trainer,
    DataCollatorForLanguageModeling
)
from datasets import load_dataset

# 1. ๅŠ ่ฝฝๆจกๅž‹ๅ’Œๅˆ†่ฏๅ™จ
model_name = "gpt2"  # ๆˆ–่‡ชๅฎšไน‰ๆžถๆž„
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# 2. ๅŠ ่ฝฝๆ•ฐๆฎ้›†
dataset = load_dataset("wikitext", "wikitext-2-raw-v1")

# 3. ๆ•ฐๆฎ้ข„ๅค„็†
def tokenize_function(examples):
    return tokenizer(examples["text"], truncation=True, max_length=512)

tokenized_dataset = dataset.map(tokenize_function, batched=True)

# 4. ่ฎญ็ปƒ้…็ฝฎ
training_args = TrainingArguments(
    output_dir="./results",
    num_train_epochs=3,
    per_device_train_batch_size=8,
    gradient_accumulation_steps=4,
    learning_rate=5e-5,
    warmup_steps=500,
    weight_decay=0.01,
    fp16=True,  # ๆททๅˆ็ฒพๅบฆ
    logging_steps=100,
    save_steps=1000,
)

# 5. ๆ•ฐๆฎๆ•ด็†ๅ™จ
data_collator = DataCollatorForLanguageModeling(
    tokenizer=tokenizer, mlm=False  # CLM ไปปๅŠก
)

# 6. ่ฎญ็ปƒ
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_dataset["train"],
    data_collator=data_collator,
)

trainer.train()

2. ๅคงๆจกๅž‹ๅฏน้ฝไธŽไผ˜ๅŒ–ๆŠ€ๆœฏ

2.1 ไป€ไนˆๆ˜ฏๅฏน้ฝ๏ผˆAlignment๏ผ‰๏ผŸ

ๅฏน้ฝๆ˜ฏๆŒ‡่ฎฉๆจกๅž‹็š„่พ“ๅ‡บ็ฌฆๅˆไบบ็ฑป็š„ๆœŸๆœ›ๅ’Œไปทๅ€ผ่ง‚๏ผŒๅŒ…ๆ‹ฌ๏ผš - ๆœ‰ๅธฎๅŠฉ๏ผˆHelpful๏ผ‰๏ผšๆไพ›ๆœ‰็”จใ€ๅ‡†็กฎ็š„ไฟกๆฏ - ่ฏšๅฎž๏ผˆHonest๏ผ‰๏ผšไธ็ผ–้€ ไฟกๆฏ๏ผŒๆ‰ฟ่ฎคไธ็กฎๅฎšๆ€ง - ๆ— ๅฎณ๏ผˆHarmless๏ผ‰๏ผšไธไบง็”Ÿๆœ‰ๅฎณใ€ๅ่งๅ†…ๅฎน

2.2 RLHF๏ผˆๅŸบไบŽไบบ็ฑปๅ้ฆˆ็š„ๅผบๅŒ–ๅญฆไน ๏ผ‰

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    RLHF ๆต็จ‹                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                         โ”‚
โ”‚  Step 1: ๆ”ถ้›†ไบบ็ฑปๅๅฅฝๆ•ฐๆฎ                               โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  Prompt โ†’ ๆจกๅž‹็”Ÿๆˆๅคšไธชๅ›ž็ญ” โ†’ ไบบ็ฑปๆ ‡ๆณจๆŽ’ๅบ        โ”‚   โ”‚
โ”‚  โ”‚  ไพ‹๏ผšๅ›ž็ญ”A > ๅ›ž็ญ”B > ๅ›ž็ญ”C                       โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                          โ†“                              โ”‚
โ”‚  Step 2: ่ฎญ็ปƒๅฅ–ๅŠฑๆจกๅž‹ (Reward Model)                    โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  ่พ“ๅ…ฅ๏ผš(prompt, response) โ†’ ่พ“ๅ‡บ๏ผšๅฅ–ๅŠฑๅˆ†ๆ•ฐ        โ”‚   โ”‚
โ”‚  โ”‚  ๅญฆไน ้ข„ๆต‹ไบบ็ฑปๅๅฅฝ                                 โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                          โ†“                              โ”‚
โ”‚  Step 3: PPO ๅผบๅŒ–ๅญฆไน ไผ˜ๅŒ–                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  ็ญ–็•ฅๆจกๅž‹็”Ÿๆˆๅ›ž็ญ” โ†’ ๅฅ–ๅŠฑๆจกๅž‹ๆ‰“ๅˆ† โ†’ ๆ›ดๆ–ฐ็ญ–็•ฅ       โ”‚   โ”‚
โ”‚  โ”‚  + KL ๆ•ฃๅบฆ็บฆๆŸ๏ผˆ้˜ฒๆญขๅ็ฆปๅŽŸๆจกๅž‹ๅคช่ฟœ๏ผ‰              โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                                                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.3 DPO๏ผˆ็›ดๆŽฅๅๅฅฝไผ˜ๅŒ–๏ผ‰

DPO ๆ˜ฏ RLHF ็š„็ฎ€ๅŒ–ๆ›ฟไปฃๆ–นๆกˆ๏ผŒๆ— ้œ€ๅ•็‹ฌ่ฎญ็ปƒๅฅ–ๅŠฑๆจกๅž‹ใ€‚

# DPO ๆ ธๅฟƒๆ€ๆƒณ
"""
RLHF: SFT Model โ†’ Reward Model โ†’ PPO โ†’ Aligned Model
DPO:  SFT Model โ†’ ็›ดๆŽฅไผ˜ๅŒ– โ†’ Aligned Model

DPO ๆŸๅคฑๅ‡ฝๆ•ฐ๏ผš
L_DPO = -log ฯƒ(ฮฒ * (log ฯ€(y_w|x) - log ฯ€(y_l|x) 
                    - log ฯ€_ref(y_w|x) + log ฯ€_ref(y_l|x)))

ๅ…ถไธญ๏ผš
- y_w: ๅๅฅฝ็š„ๅ›ž็ญ” (winner)
- y_l: ไธๅๅฅฝ็š„ๅ›ž็ญ” (loser)
- ฯ€: ๅฝ“ๅ‰็ญ–็•ฅ
- ฯ€_ref: ๅ‚่€ƒ็ญ–็•ฅ๏ผˆSFTๆจกๅž‹๏ผ‰
- ฮฒ: ๆธฉๅบฆๅ‚ๆ•ฐ
"""
ๆ–นๆณ• ไผ˜ๅŠฟ ๅŠฃๅŠฟ
RLHF ๆ•ˆๆžœๅฅฝ๏ผŒไธš็•Œ้ชŒ่ฏๅ……ๅˆ† ๅคๆ‚๏ผŒ้œ€่ฆ่ฎญ็ปƒๅฅ–ๅŠฑๆจกๅž‹
DPO ็ฎ€ๅ•๏ผŒๆ— ้œ€ๅฅ–ๅŠฑๆจกๅž‹ ๅฏนๆ•ฐๆฎ่ดจ้‡่ฆๆฑ‚้ซ˜
RLAIF ็”จAIไปฃๆ›ฟไบบ็ฑปๆ ‡ๆณจ ไพ่ต–่พ…ๅŠฉๆจกๅž‹่ดจ้‡

2.4 ๆ็คบๅทฅ็จ‹๏ผˆPrompt Engineering๏ผ‰

ๆ็คบๅทฅ็จ‹ๆ˜ฏไธ€็งๆ— ้œ€่ฎญ็ปƒๅณๅฏไผ˜ๅŒ–ๆจกๅž‹่พ“ๅ‡บ็š„ๆŠ€ๆœฏใ€‚

2.4.1 ๆ ธๅฟƒๆŠ€ๅทง

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                ๆ็คบๅทฅ็จ‹ๆŠ€ๅทงๅคงๅ…จ                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                         โ”‚
โ”‚  ๐ŸŽญ ่ง’่‰ฒ่ฎพๅฎš (Role Prompting)                           โ”‚
โ”‚  "ไฝ ๆ˜ฏไธ€ไฝ่ต„ๆทฑ็š„Pythonๅผ€ๅ‘ไธ“ๅฎถ๏ผŒๆ“…้•ฟไปฃ็ ไผ˜ๅŒ–..."          โ”‚
โ”‚                                                         โ”‚
โ”‚  ๐Ÿ“ ๆŒ‡ไปคๆธ…ๆ™ฐๅŒ–                                          โ”‚
โ”‚  "่ฏท็”จไธญๆ–‡ๅ›ž็ญ”๏ผŒๅˆ†็‚นๅˆ—ๅ‡บ๏ผŒๆฏ็‚นไธ่ถ…่ฟ‡50ๅญ—"                โ”‚
โ”‚                                                         โ”‚
โ”‚  ๐Ÿ“‹ ๆ ผๅผ็บฆๆŸ                                            โ”‚
โ”‚  "่ฏทไปฅJSONๆ ผๅผ่ฟ”ๅ›ž็ป“ๆžœ๏ผŒๅŒ…ๅซnameใ€ageใ€cityๅญ—ๆฎต"         โ”‚
โ”‚                                                         โ”‚
โ”‚  ๐Ÿ’ก ๆ€็ปด้“พ (Chain of Thought, CoT)                      โ”‚
โ”‚  "่ฎฉๆˆ‘ไปฌไธ€ๆญฅไธ€ๆญฅๆ€่€ƒ่ฟ™ไธช้—ฎ้ข˜..."                         โ”‚
โ”‚                                                         โ”‚
โ”‚  ๐Ÿ“š ๅฐ‘ๆ ทๆœฌๅญฆไน  (Few-shot Learning)                      โ”‚
โ”‚  "็คบไพ‹1๏ผš่พ“ๅ…ฅXX โ†’ ่พ“ๅ‡บYY                                โ”‚
โ”‚   ็คบไพ‹2๏ผš่พ“ๅ…ฅAA โ†’ ่พ“ๅ‡บBB                                โ”‚
โ”‚   ็Žฐๅœจ่ฏทๅค„็†๏ผš่พ“ๅ…ฅCC โ†’ ?"                               โ”‚
โ”‚                                                         โ”‚
โ”‚  ๐Ÿ”„ ่‡ชๆˆ‘ไธ€่‡ดๆ€ง (Self-Consistency)                       โ”‚
โ”‚  ๅคšๆฌก้‡‡ๆ ท๏ผŒๆŠ•็ฅจ้€‰ๆ‹ฉๆœ€ไธ€่‡ด็š„็ญ”ๆกˆ                          โ”‚
โ”‚                                                         โ”‚
โ”‚  ๐ŸŒณ ๆ€็ปดๆ ‘ (Tree of Thoughts)                           โ”‚
โ”‚  ๆŽข็ดขๅคšๆกๆŽจ็†่ทฏๅพ„๏ผŒ่ฏ„ไผฐ้€‰ๆ‹ฉๆœ€ไผ˜                          โ”‚
โ”‚                                                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.4.2 Prompt ๆจกๆฟ็คบไพ‹

# ็ณป็ปŸ็บง Prompt ๆจกๆฟ
SYSTEM_PROMPT = """
ไฝ ๆ˜ฏไธ€ไธชไธ“ไธš็š„{role}๏ผŒๅ…ทๆœ‰ไปฅไธ‹็‰น็‚น๏ผš
1. {characteristic_1}
2. {characteristic_2}
3. {characteristic_3}

ๅœจๅ›ž็ญ”้—ฎ้ข˜ๆ—ถ๏ผŒ่ฏท้ตๅพชไปฅไธ‹ๅŽŸๅˆ™๏ผš
- {principle_1}
- {principle_2}
- {principle_3}

่พ“ๅ‡บๆ ผๅผ่ฆๆฑ‚๏ผš
{output_format}
"""

# Chain of Thought ๆจกๆฟ
COT_PROMPT = """
้—ฎ้ข˜๏ผš{question}

่ฏทๆŒ‰ไปฅไธ‹ๆญฅ้ชคๆ€่€ƒ๏ผš
1. ้ฆ–ๅ…ˆ๏ผŒ็†่งฃ้—ฎ้ข˜็š„ๆ ธๅฟƒๆ˜ฏไป€ไนˆ
2. ็„ถๅŽ๏ผŒๅˆ†ๆžๅทฒ็Ÿฅๆกไปถ
3. ๆŽฅ็€๏ผŒๅˆถๅฎš่งฃๅ†ณๆ–นๆกˆ
4. ๆœ€ๅŽ๏ผŒ็ป™ๅ‡บ็ญ”ๆกˆ

่ฎฉๆˆ‘ไปฌๅผ€ๅง‹๏ผš
"""

# Few-shot ๆจกๆฟ
FEW_SHOT_PROMPT = """
ไปปๅŠก๏ผš{task_description}

็คบไพ‹1๏ผš
่พ“ๅ…ฅ๏ผš{example_1_input}
่พ“ๅ‡บ๏ผš{example_1_output}

็คบไพ‹2๏ผš
่พ“ๅ…ฅ๏ผš{example_2_input}
่พ“ๅ‡บ๏ผš{example_2_output}

็Žฐๅœจ่ฏทๅค„็†๏ผš
่พ“ๅ…ฅ๏ผš{actual_input}
่พ“ๅ‡บ๏ผš
"""

2.4.3 ้ซ˜็บง Prompt ๆŠ€ๆœฏ

ๆŠ€ๆœฏ ่ฏดๆ˜Ž ้€‚็”จๅœบๆ™ฏ
ReAct ๆŽจ็†+่กŒๅŠจไบคๆ›ฟ Agent ไปปๅŠก
Reflexion ่‡ชๆˆ‘ๅๆ€ๆ”น่ฟ› ๅคๆ‚ๆŽจ็†
Plan-and-Solve ๅ…ˆ่ง„ๅˆ’ๅŽๆ‰ง่กŒ ๅคšๆญฅ้ชคไปปๅŠก
Least-to-Most ไปŽ็ฎ€ๅˆฐ็นๅˆ†่งฃ ๅคๆ‚้—ฎ้ข˜
Skeleton-of-Thought ๅ…ˆ้ชจๆžถๅŽๅกซๅ…… ้•ฟๆ–‡ๆœฌ็”Ÿๆˆ

3. ๅคงๆจกๅž‹ๅพฎ่ฐƒ

3.1 ๅพฎ่ฐƒๆ–นๆณ•ๆฆ‚่งˆ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  ๅพฎ่ฐƒๆ–นๆณ•่ฐฑ็ณป                           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                         โ”‚
โ”‚  ๆŒ‰ๅ‚ๆ•ฐๆ›ดๆ–ฐ่Œƒๅ›ด๏ผš                                        โ”‚
โ”‚                                                         โ”‚
โ”‚  ๅ…จๅ‚ๆ•ฐๅพฎ่ฐƒ (Full Fine-tuning)                          โ”‚
โ”‚  โ”œโ”€โ”€ ๆ›ดๆ–ฐๆ‰€ๆœ‰ๅ‚ๆ•ฐ                                       โ”‚
โ”‚  โ”œโ”€โ”€ ๆ•ˆๆžœๆœ€ๅฅฝ๏ผŒไฝ†ๆˆๆœฌๆœ€้ซ˜                               โ”‚
โ”‚  โ””โ”€โ”€ ้œ€่ฆๅคง้‡ๆ˜พๅญ˜ๅ’Œ่ฎก็ฎ—่ต„ๆบ                              โ”‚
โ”‚                                                         โ”‚
โ”‚  ๅ‚ๆ•ฐ้ซ˜ๆ•ˆๅพฎ่ฐƒ (PEFT)                                    โ”‚
โ”‚  โ”œโ”€โ”€ LoRA๏ผšไฝŽ็งฉ้€‚้…                                     โ”‚
โ”‚  โ”œโ”€โ”€ QLoRA๏ผš้‡ๅŒ– + LoRA                                 โ”‚
โ”‚  โ”œโ”€โ”€ Prefix Tuning๏ผšๅ‰็ผ€่ฐƒไผ˜                            โ”‚
โ”‚  โ”œโ”€โ”€ P-Tuning v2๏ผšๆทฑๅบฆๆ็คบ่ฐƒไผ˜                          โ”‚
โ”‚  โ”œโ”€โ”€ Adapter๏ผš้€‚้…ๅ™จๅฑ‚                                  โ”‚
โ”‚  โ””โ”€โ”€ IA3๏ผšๆŠ‘ๅˆถๅ’Œๆ”พๅคงๅ†…้ƒจๆฟ€ๆดป                            โ”‚
โ”‚                                                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

3.2 LoRA ่ฏฆ่งฃ

LoRA (Low-Rank Adaptation) ๆ˜ฏๆœ€ๆต่กŒ็š„ๅ‚ๆ•ฐ้ซ˜ๆ•ˆๅพฎ่ฐƒๆ–นๆณ•ใ€‚

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    LoRA ๅŽŸ็†                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                         โ”‚
โ”‚  ๅŽŸๅง‹ๆƒ้‡็Ÿฉ้˜ต W (d ร— k)                                  โ”‚
โ”‚                                                         โ”‚
โ”‚       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                โ”‚
โ”‚  x โ”€โ”€โ†’โ”‚   W (ๅ†ป็ป“)     โ”‚โ”€โ”€โ†’ y                           โ”‚
โ”‚       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                โ”‚
โ”‚              +                                          โ”‚
โ”‚       โ”Œโ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”                                โ”‚
โ”‚  x โ”€โ”€โ†’โ”‚  A  โ”‚โ”€โ”€โ†’โ”‚  B  โ”‚โ”€โ”€โ†’ ฮ”y                          โ”‚
โ”‚       โ””โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”˜                                โ”‚
โ”‚       (d ร— r)   (r ร— k)                                โ”‚
โ”‚                                                         โ”‚
โ”‚  ๆœ€็ปˆ่พ“ๅ‡บ๏ผšy' = Wx + BAx                                โ”‚
โ”‚                                                         โ”‚
โ”‚  ๆ ธๅฟƒๆ€ๆƒณ๏ผš                                              โ”‚
โ”‚  - ๅ†ป็ป“ๅŽŸๅง‹ๆƒ้‡ W                                        โ”‚
โ”‚  - ๆ–ฐๅขžไฝŽ็งฉ็Ÿฉ้˜ต Aใ€B (r << d, k)                         โ”‚
โ”‚  - ๅช่ฎญ็ปƒ Aใ€B๏ผŒๅ‚ๆ•ฐ้‡ๅคงๅน…ๅ‡ๅฐ‘                           โ”‚
โ”‚  - ไพ‹๏ผšr=8 ๆ—ถ๏ผŒๅ‚ๆ•ฐ้‡ๅ‡ๅฐ‘ ~10000 ๅ€                      โ”‚
โ”‚                                                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

3.3 ๅพฎ่ฐƒๅฎž่ทตไปฃ็ 

3.3.1 ไฝฟ็”จ PEFT + LoRA ๅพฎ่ฐƒ

from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from peft import LoraConfig, get_peft_model, TaskType
from trl import SFTTrainer
from datasets import load_dataset

# 1. ๅŠ ่ฝฝๅŸบๅบงๆจกๅž‹
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token

# 2. ้…็ฝฎ LoRA
lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=8,                      # ไฝŽ็งฉ็ปดๅบฆ
    lora_alpha=32,            # ็ผฉๆ”พๅ› ๅญ
    lora_dropout=0.1,         # Dropout
    target_modules=[          # ่ฆ้€‚้…็š„ๆจกๅ—
        "q_proj", "k_proj", "v_proj", "o_proj",
        "gate_proj", "up_proj", "down_proj"
    ],
)

# 3. ๅบ”็”จ LoRA
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# ่พ“ๅ‡บ๏ผštrainable params: 4,194,304 || all params: 6,742,609,920 || trainable%: 0.0622

# 4. ๅ‡†ๅค‡ๆ•ฐๆฎ้›†
dataset = load_dataset("json", data_files="train_data.json")

def format_instruction(example):
    return f"""### ๆŒ‡ไปค๏ผš
{example['instruction']}

### ๅ›ž็ญ”๏ผš
{example['output']}"""

# 5. ่ฎญ็ปƒ้…็ฝฎ
training_args = TrainingArguments(
    output_dir="./lora_output",
    num_train_epochs=3,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
    learning_rate=2e-4,
    fp16=True,
    logging_steps=10,
    save_strategy="epoch",
    warmup_ratio=0.03,
)

# 6. ่ฎญ็ปƒ
trainer = SFTTrainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
    formatting_func=format_instruction,
    max_seq_length=512,
)

trainer.train()

# 7. ไฟๅญ˜ LoRA ๆƒ้‡
model.save_pretrained("./lora_weights")

3.3.2 ไฝฟ็”จ QLoRA ๅพฎ่ฐƒ๏ผˆๆ˜พๅญ˜ๆ›ด็œ๏ผ‰

from transformers import BitsAndBytesConfig
import torch

# 4-bit ้‡ๅŒ–้…็ฝฎ
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True,
)

# ๅŠ ่ฝฝ้‡ๅŒ–ๆจกๅž‹
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto"
)

# ๅŽ็ปญไธŽ LoRA ็›ธๅŒ...

3.4 ๅพฎ่ฐƒๆ–นๆณ•ๅฏนๆฏ”

ๆ–นๆณ• ๅฏ่ฎญ็ปƒๅ‚ๆ•ฐ ๆ˜พๅญ˜้œ€ๆฑ‚ ๆ•ˆๆžœ ๆŽจ่ๅœบๆ™ฏ
Full Fine-tuning 100% ๆž้ซ˜ ๆœ€ๅฅฝ ๅ……่ถณ่ต„ๆบ
LoRA ~0.1% ไธญ็ญ‰ ๅพˆๅฅฝ ้€š็”จๅœบๆ™ฏ
QLoRA ~0.1% ไฝŽ ่พƒๅฅฝ ๆ˜พๅญ˜ๅ—้™
Prefix Tuning ~0.01% ไฝŽ ไธ€่ˆฌ ็ฎ€ๅ•ไปปๅŠก
Adapter ~1% ไธญไฝŽ ่พƒๅฅฝ ๅคšไปปๅŠก

3.5 ๅพฎ่ฐƒๆ•ฐๆฎๆ ผๅผ

# Alpaca ๆ ผๅผ๏ผˆๆœ€ๅธธ็”จ๏ผ‰
{
    "instruction": "ๅฐ†ไปฅไธ‹ๅฅๅญ็ฟป่ฏ‘ๆˆ่‹ฑๆ–‡",
    "input": "ไปŠๅคฉๅคฉๆฐ”ๅพˆๅฅฝ",
    "output": "The weather is nice today."
}

# ShareGPT ๆ ผๅผ๏ผˆๅคš่ฝฎๅฏน่ฏ๏ผ‰
{
    "conversations": [
        {"from": "human", "value": "ไฝ ๅฅฝ"},
        {"from": "gpt", "value": "ไฝ ๅฅฝ๏ผๆœ‰ไป€ไนˆๆˆ‘ๅฏไปฅๅธฎๅŠฉไฝ ็š„ๅ—๏ผŸ"},
        {"from": "human", "value": "ไป‹็ปไธ€ไธ‹ๅŒ—ไบฌ"},
        {"from": "gpt", "value": "ๅŒ—ไบฌๆ˜ฏไธญๅ›ฝ็š„้ฆ–้ƒฝ..."}
    ]
}

# OpenAI ๆ ผๅผ
{
    "messages": [
        {"role": "system", "content": "ไฝ ๆ˜ฏไธ€ไธชๆœ‰ๅธฎๅŠฉ็š„ๅŠฉๆ‰‹"},
        {"role": "user", "content": "ไฝ ๅฅฝ"},
        {"role": "assistant", "content": "ไฝ ๅฅฝ๏ผๆœ‰ไป€ไนˆๅฏไปฅๅธฎไฝ ็š„๏ผŸ"}
    ]
}

4. ๅคงๆจกๅž‹ๆŽจ็†ไธŽ้ƒจ็ฝฒ

4.1 ๆŽจ็†ไผ˜ๅŒ–ๆŠ€ๆœฏ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                 ๆŽจ็†ไผ˜ๅŒ–ๆŠ€ๆœฏๆ ˆ                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                         โ”‚
โ”‚  ๐Ÿ”ข ๆจกๅž‹ๅŽ‹็ผฉ                                            โ”‚
โ”‚  โ”œโ”€โ”€ ้‡ๅŒ– (Quantization)                               โ”‚
โ”‚  โ”‚   โ”œโ”€โ”€ INT8๏ผš็ฒพๅบฆๆŸๅคฑๅฐ๏ผŒๆŽจ็†ๅฟซ 2x                    โ”‚
โ”‚  โ”‚   โ”œโ”€โ”€ INT4๏ผš็ฒพๅบฆๆœ‰ๆŸ๏ผŒๆ˜พๅญ˜็œ 4x                      โ”‚
โ”‚  โ”‚   โ””โ”€โ”€ GPTQ/AWQ/GGUF๏ผšไธๅŒ้‡ๅŒ–ๆ–นๆกˆ                   โ”‚
โ”‚  โ”œโ”€โ”€ ๅ‰ชๆž (Pruning)                                    โ”‚
โ”‚  โ”‚   โ””โ”€โ”€ ็งป้™คไธ้‡่ฆ็š„ๅ‚ๆ•ฐ                               โ”‚
โ”‚  โ””โ”€โ”€ ่’ธ้ฆ (Distillation)                               โ”‚
โ”‚      โ””โ”€โ”€ ๅคงๆจกๅž‹็Ÿฅ่ฏ†่ฟ็งปๅˆฐๅฐๆจกๅž‹                          โ”‚
โ”‚                                                         โ”‚
โ”‚  โšก ๆŽจ็†ๅŠ ้€Ÿ                                            โ”‚
โ”‚  โ”œโ”€โ”€ KV Cache๏ผš็ผ“ๅญ˜ๆณจๆ„ๅŠ›้”ฎๅ€ผๅฏน                         โ”‚
โ”‚  โ”œโ”€โ”€ Flash Attention๏ผš้ซ˜ๆ•ˆๆณจๆ„ๅŠ›่ฎก็ฎ—                   โ”‚
โ”‚  โ”œโ”€โ”€ Continuous Batching๏ผšๅŠจๆ€ๆ‰นๅค„็†                   โ”‚
โ”‚  โ”œโ”€โ”€ Speculative Decoding๏ผšๆŽจๆต‹่งฃ็                     โ”‚
โ”‚  โ””โ”€โ”€ PagedAttention๏ผšๅˆ†้กตๆณจๆ„ๅŠ› (vLLM)                 โ”‚
โ”‚                                                         โ”‚
โ”‚  ๐Ÿ–ฅ๏ธ ็กฌไปถไผ˜ๅŒ–                                           โ”‚
โ”‚  โ”œโ”€โ”€ TensorRT๏ผšNVIDIA GPU ไผ˜ๅŒ–                         โ”‚
โ”‚  โ”œโ”€โ”€ ONNX Runtime๏ผš่ทจๅนณๅฐๅŠ ้€Ÿ                          โ”‚
โ”‚  โ””โ”€โ”€ ็ฎ—ๅญ่žๅˆ๏ผšๅ‡ๅฐ‘ๅ†…ๅญ˜่ฎฟ้—ฎ                             โ”‚
โ”‚                                                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

4.2 ้‡ๅŒ–่ฏฆ่งฃ

้‡ๅŒ–ๆ ผๅผ ไฝๆ•ฐ ๆ˜พๅญ˜่Š‚็œ ็ฒพๅบฆๆŸๅคฑ ้€‚็”จๅœบๆ™ฏ
FP16 16-bit 2x ๅ‡ ไนŽๆ—  ่ฎญ็ปƒ/ๆŽจ็†
BF16 16-bit 2x ๅ‡ ไนŽๆ—  ่ฎญ็ปƒ/ๆŽจ็†
INT8 8-bit 4x ๅพˆๅฐ ๆŽจ็†
INT4 4-bit 8x ่พƒๅฐ ๆŽจ็†
GPTQ 4-bit 8x ๅฐ GPU ๆŽจ็†
AWQ 4-bit 8x ๆ›ดๅฐ GPU ๆŽจ็†
GGUF 2-8bit ๅฏๅ˜ ๅฏๅ˜ CPU/ๆททๅˆๆŽจ็†
# ไฝฟ็”จ bitsandbytes ้‡ๅŒ–ๅŠ ่ฝฝ
from transformers import AutoModelForCausalLM, BitsAndBytesConfig

# INT8 ้‡ๅŒ–
model_8bit = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    load_in_8bit=True,
    device_map="auto"
)

# INT4 ้‡ๅŒ–
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
)
model_4bit = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    quantization_config=bnb_config,
    device_map="auto"
)

4.3 ้ƒจ็ฝฒๆ–นๆกˆ

4.3.1 ้ƒจ็ฝฒๆก†ๆžถๅฏนๆฏ”

ๆก†ๆžถ ็‰น็‚น ้€‚็”จๅœบๆ™ฏ
vLLM PagedAttention๏ผŒๅžๅ้‡้ซ˜ ้ซ˜ๅนถๅ‘ๅœจ็บฟๆœๅŠก
TGI HuggingFace ๅฎ˜ๆ–น๏ผŒๅŠŸ่ƒฝๅ…จ้ข ็”Ÿไบง็Žฏๅขƒ
Ollama ็ฎ€ๅ•ๆ˜“็”จ๏ผŒๆœฌๅœฐ้ƒจ็ฝฒ ไธชไบบ/ๅผ€ๅ‘
llama.cpp ็บฏ CPU ๆŽจ็†๏ผŒ่ทจๅนณๅฐ ่พน็ผ˜่ฎพๅค‡
TensorRT-LLM NVIDIA ไผ˜ๅŒ–๏ผŒๆž่‡ดๆ€ง่ƒฝ ้ซ˜ๆ€ง่ƒฝ GPU
OpenLLM ็ตๆดป๏ผŒๆ”ฏๆŒๅคšๆจกๅž‹ ๆจกๅž‹ๆœๅŠกๅŒ–

4.3.2 vLLM ้ƒจ็ฝฒ็คบไพ‹

# ๅฎ‰่ฃ…๏ผšpip install vllm

from vllm import LLM, SamplingParams

# 1. ๅŠ ่ฝฝๆจกๅž‹
llm = LLM(
    model="meta-llama/Llama-2-7b-chat-hf",
    tensor_parallel_size=1,  # GPU ๆ•ฐ้‡
    dtype="float16",
    max_model_len=4096,
)

# 2. ่ฎพ็ฝฎ้‡‡ๆ ทๅ‚ๆ•ฐ
sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.9,
    max_tokens=512,
)

# 3. ๆŽจ็†
prompts = ["่ฏทไป‹็ปไธ€ไธ‹ไบบๅทฅๆ™บ่ƒฝ", "Pythonๆœ‰ไป€ไนˆไผ˜็‚น๏ผŸ"]
outputs = llm.generate(prompts, sampling_params)

for output in outputs:
    print(output.outputs[0].text)
# vLLM ๅฏๅŠจ API ๆœๅŠก
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-7b-chat-hf \
    --port 8000 \
    --tensor-parallel-size 1

4.3.3 Ollama ๆœฌๅœฐ้ƒจ็ฝฒ

# ๅฎ‰่ฃ… Ollama
curl -fsSL https://ollama.com/install.sh | sh

# ไธ‹่ฝฝๅนถ่ฟ่กŒๆจกๅž‹
ollama pull llama3
ollama run llama3

# ไฝฟ็”จ API
curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "ไป€ไนˆๆ˜ฏๅคง่ฏญ่จ€ๆจกๅž‹๏ผŸ"
}'
# Python ่ฐƒ็”จ Ollama
import ollama

response = ollama.chat(
    model='llama3',
    messages=[{'role': 'user', 'content': 'ไฝ ๅฅฝ'}]
)
print(response['message']['content'])

4.4 ้ƒจ็ฝฒๆžถๆž„่ฎพ่ฎก

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              ็”Ÿไบง็บง LLM ้ƒจ็ฝฒๆžถๆž„                         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                         โ”‚
โ”‚  ็”จๆˆท่ฏทๆฑ‚                                               โ”‚
โ”‚      โ†“                                                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                       โ”‚
โ”‚  โ”‚   API ็ฝ‘ๅ…ณ   โ”‚  โ† ่ฎค่ฏใ€้™ๆตใ€่ทฏ็”ฑ                    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                       โ”‚
โ”‚         โ”‚                                              โ”‚
โ”‚         โ†“                                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                       โ”‚
โ”‚  โ”‚  ่ดŸ่ฝฝๅ‡่กก   โ”‚  โ† ๅˆ†ๅ‘่ฏทๆฑ‚ๅˆฐไธๅŒๅฎžไพ‹                   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                       โ”‚
โ”‚         โ”‚                                              โ”‚
โ”‚    โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”                                         โ”‚
โ”‚    โ†“         โ†“                                         โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”                                     โ”‚
โ”‚ โ”‚ๆŽจ็†1 โ”‚ โ”‚ๆŽจ็†2 โ”‚  โ† vLLM/TGI ๅฎžไพ‹                     โ”‚
โ”‚ โ”‚(GPU) โ”‚ โ”‚(GPU) โ”‚                                     โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                     โ”‚
โ”‚    โ†‘         โ†‘                                         โ”‚
โ”‚    โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜                                         โ”‚
โ”‚         โ”‚                                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                       โ”‚
โ”‚  โ”‚  ๆจกๅž‹ๅญ˜ๅ‚จ   โ”‚  โ† S3/ๆœฌๅœฐ/ๆจกๅž‹ไป“ๅบ“                    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                       โ”‚
โ”‚                                                         โ”‚
โ”‚  ็›‘ๆŽง็ป„ไปถ๏ผšPrometheus + Grafana                         โ”‚
โ”‚  ๆ—ฅๅฟ—็ป„ไปถ๏ผšELK Stack                                    โ”‚
โ”‚                                                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

5. ๅ…ถไป–่ฎญ็ปƒไธŽไผ˜ๅŒ–็›ธๅ…ณ็Ÿฅ่ฏ†

5.1 ๆ•ฐๆฎๅทฅ็จ‹

5.1.1 ๆ•ฐๆฎ่ดจ้‡็š„้‡่ฆๆ€ง

ๆ•ฐๆฎ่ดจ้‡้‡‘ๅญ—ๅก”๏ผš

        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ”‚ ้ซ˜่ดจ้‡  โ”‚  โ† ไบบๅทฅๆ ‡ๆณจใ€ไธ“ๅฎถๆ ก้ชŒ
        โ”‚  ๆ•ฐๆฎ   โ”‚     ๆ•ˆๆžœๆœ€ๅฅฝ๏ผŒๆˆๆœฌๆœ€้ซ˜
        โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
        โ”‚ ๅˆๆˆๆ•ฐๆฎ โ”‚  โ† GPT-4 ็”Ÿๆˆใ€่‡ชๆˆ‘ๆŒ‡ไปค
        โ”‚         โ”‚     ๅนณ่กกๆ•ˆๆžœไธŽๆˆๆœฌ
        โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
        โ”‚ ็ฝ‘็ปœๆ•ฐๆฎ โ”‚  โ† CommonCrawlใ€็ฝ‘้กต็ˆฌๅ–
        โ”‚         โ”‚     ้‡ๅคง่ดจไฝŽ๏ผŒ้œ€่ฆๆธ…ๆด—
        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

5.1.2 ๆ•ฐๆฎๅค„็†ๆต็จ‹

# ๆ•ฐๆฎๅค„็† Pipeline
data_pipeline = {
    "1. ๆ•ฐๆฎๆ”ถ้›†": [
        "็ˆฌๅ–็ฝ‘้กตๆ•ฐๆฎ",
        "ๆ”ถ้›†ๅผ€ๆบๆ•ฐๆฎ้›†",
        "็”Ÿๆˆๅˆๆˆๆ•ฐๆฎ"
    ],
    "2. ๆ•ฐๆฎๆธ…ๆด—": [
        "ๅŽป้‡๏ผˆMinHashใ€SimHash๏ผ‰",
        "่ฟ‡ๆปคไฝŽ่ดจ้‡ๅ†…ๅฎน",
        "็งป้™คๆœ‰ๅฎณ/ๆ•ๆ„Ÿไฟกๆฏ",
        "่ฏญ่จ€ๆฃ€ๆต‹ไธŽๅˆ†็ฑป"
    ],
    "3. ๆ•ฐๆฎๅค„็†": [
        "ๅˆ†่ฏ Tokenization",
        "ๆ ผๅผๆ ‡ๅ‡†ๅŒ–",
        "้•ฟๅบฆ่ฃๅ‰ช/ๅกซๅ……"
    ],
    "4. ๆ•ฐๆฎๅขžๅผบ": [
        "ๅ›ž่ฏ‘ๅขžๅผบ",
        "ๅŒไน‰่ฏๆ›ฟๆข",
        "ๆจกๅž‹ๆ”นๅ†™"
    ],
    "5. ่ดจ้‡่ฏ„ไผฐ": [
        "ๅ›ฐๆƒ‘ๅบฆ่ฏ„ไผฐ",
        "ไบบๅทฅๆŠฝๆ ทๆฃ€ๆŸฅ",
        "ๅคšๆ ทๆ€งๅˆ†ๆž"
    ]
}

5.2 ่ฏ„ไผฐไธŽๆต‹่ฏ•

5.2.1 ๅธธ็”จ่ฏ„ไผฐๅŸบๅ‡†

ๅŸบๅ‡† ่ฏ„ไผฐ่ƒฝๅŠ› ่ฏดๆ˜Ž
MMLU ๅคšไปปๅŠก็Ÿฅ่ฏ† 57ไธชๅญฆ็ง‘็š„้€‰ๆ‹ฉ้ข˜
HellaSwag ๅธธ่ฏ†ๆŽจ็† ๅฅๅญ่กฅๅ…จ
GSM8K ๆ•ฐๅญฆๆŽจ็† ๅฐๅญฆๆ•ฐๅญฆๅบ”็”จ้ข˜
HumanEval ไปฃ็ ็”Ÿๆˆ Python ๅ‡ฝๆ•ฐ่กฅๅ…จ
TruthfulQA ็œŸๅฎžๆ€ง ๆฃ€ๆต‹ๅนป่ง‰
MT-Bench ๅฏน่ฏ่ƒฝๅŠ› ๅคš่ฝฎๅฏน่ฏ่ฏ„ๅˆ†
C-Eval ไธญๆ–‡็Ÿฅ่ฏ† ไธญๆ–‡ๅคšไปปๅŠก
CMMLU ไธญๆ–‡ MMLU ไธญๆ–‡็‰ˆ MMLU

5.2.2 ่ฏ„ไผฐไปฃ็ ็คบไพ‹

# ไฝฟ็”จ lm-evaluation-harness ่ฏ„ไผฐ
# pip install lm-eval

from lm_eval import evaluator
from lm_eval.models.huggingface import HFLM

# ๅŠ ่ฝฝๆจกๅž‹
model = HFLM(
    pretrained="meta-llama/Llama-2-7b-hf",
    device="cuda"
)

# ่ฟ่กŒ่ฏ„ไผฐ
results = evaluator.simple_evaluate(
    model=model,
    tasks=["hellaswag", "mmlu", "gsm8k"],
    num_fewshot=5,
    batch_size=8
)

print(results["results"])

5.3 ๅธธ่ง้—ฎ้ข˜ไธŽ่งฃๅ†ณๆ–นๆกˆ

้—ฎ้ข˜ ๅŽŸๅ›  ่งฃๅ†ณๆ–นๆกˆ
่ฎญ็ปƒไธๆ”ถๆ•› ๅญฆไน ็އไธๅฝ“ใ€ๆ•ฐๆฎ้—ฎ้ข˜ ่ฐƒๆ•ด LRใ€ๆฃ€ๆŸฅๆ•ฐๆฎ
่ฟ‡ๆ‹Ÿๅˆ ๆ•ฐๆฎ้‡ไธ่ถณใ€ๆจกๅž‹่ฟ‡ๅคง ๆ•ฐๆฎๅขžๅผบใ€ๆญฃๅˆ™ๅŒ–
็พ้šพๆ€ง้—ๅฟ˜ ๅพฎ่ฐƒ็ ดๅๅŽŸๆœ‰่ƒฝๅŠ› LoRAใ€่พƒๅฐๅญฆไน ็އ
ๅนป่ง‰ ่ฎญ็ปƒๆ•ฐๆฎๆœ‰ๅ™ชๅฃฐ RAG ๅขžๅผบใ€RLHF
ๆŽจ็†ๆ…ข ๆจกๅž‹ๅคงใ€็กฌไปถๅผฑ ้‡ๅŒ–ใ€่’ธ้ฆใ€ๅ‡็บง็กฌไปถ
ๆ˜พๅญ˜ไธ่ถณ ๆจกๅž‹/batch ๅคชๅคง ๆขฏๅบฆ็ดฏ็งฏใ€้‡ๅŒ–ใ€LoRA

5.4 ่ฎญ็ปƒ่ต„ๆบไผฐ็ฎ—

# ๆ˜พๅญ˜ไผฐ็ฎ—ๅ…ฌๅผ๏ผˆ่ฟ‘ไผผ๏ผ‰
def estimate_memory(params_billion, precision="fp16", training=True):
    """
    params_billion: ๅ‚ๆ•ฐ้‡๏ผˆๅไบฟ๏ผ‰
    precision: fp32/fp16/int8/int4
    training: ๆ˜ฏๅฆ่ฎญ็ปƒ
    """
    bytes_per_param = {
        "fp32": 4,
        "fp16": 2,
        "bf16": 2,
        "int8": 1,
        "int4": 0.5
    }
    
    # ๆจกๅž‹ๆƒ้‡
    model_memory = params_billion * bytes_per_param[precision]
    
    if training:
        # ่ฎญ็ปƒๆ—ถ้œ€่ฆ้ขๅค–็š„ไผ˜ๅŒ–ๅ™จ็Šถๆ€ๅ’Œๆขฏๅบฆ
        # AdamW: ๅ‚ๆ•ฐ + ๆขฏๅบฆ + ไธ€้˜ถๅŠจ้‡ + ไบŒ้˜ถๅŠจ้‡ โ‰ˆ 4x
        # ๅŠ ไธŠๆฟ€ๆดปๅ€ผ็ญ‰๏ผŒๆ€ป่ฎก็บฆ 6-8x
        total_memory = model_memory * 6
    else:
        # ๆŽจ็†ๆ—ถไธป่ฆๆ˜ฏๆจกๅž‹ๆƒ้‡ + KV Cache
        total_memory = model_memory * 1.2
    
    return f"{total_memory:.1f} GB"

# ็คบไพ‹
print(estimate_memory(7, "fp16", training=True))   # ็บฆ 84 GB
print(estimate_memory(7, "fp16", training=False))  # ็บฆ 16.8 GB
print(estimate_memory(7, "int4", training=False))  # ็บฆ 4.2 GB

5.5 ่ฎญ็ปƒๅทฅๅ…ท็”Ÿๆ€

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  ่ฎญ็ปƒๅทฅๅ…ท็”Ÿๆ€                           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                         โ”‚
โ”‚  ๐Ÿ”ง ่ฎญ็ปƒๆก†ๆžถ                                            โ”‚
โ”‚  โ”œโ”€โ”€ Hugging Face Transformers                         โ”‚
โ”‚  โ”œโ”€โ”€ DeepSpeed                                         โ”‚
โ”‚  โ”œโ”€โ”€ Megatron-LM                                       โ”‚
โ”‚  โ”œโ”€โ”€ ColossalAI                                        โ”‚
โ”‚  โ””โ”€โ”€ LLaMA-Factory                                     โ”‚
โ”‚                                                         โ”‚
โ”‚  ๐Ÿ“Š ๅฎž้ชŒ็ฎก็†                                            โ”‚
โ”‚  โ”œโ”€โ”€ Weights & Biases                                  โ”‚
โ”‚  โ”œโ”€โ”€ MLflow                                            โ”‚
โ”‚  โ””โ”€โ”€ TensorBoard                                       โ”‚
โ”‚                                                         โ”‚
โ”‚  ๐Ÿ—ƒ๏ธ ๆ•ฐๆฎๅค„็†                                           โ”‚
โ”‚  โ”œโ”€โ”€ Datasets (HuggingFace)                            โ”‚
โ”‚  โ”œโ”€โ”€ Apache Spark                                      โ”‚
โ”‚  โ””โ”€โ”€ Dask                                              โ”‚
โ”‚                                                         โ”‚
โ”‚  โ˜๏ธ ไบ‘ๅนณๅฐ                                              โ”‚
โ”‚  โ”œโ”€โ”€ AWS SageMaker                                     โ”‚
โ”‚  โ”œโ”€โ”€ Google Vertex AI                                  โ”‚
โ”‚  โ”œโ”€โ”€ Azure ML                                          โ”‚
โ”‚  โ””โ”€โ”€ AutoDL / ๆ’ๆบไบ‘๏ผˆๅ›ฝๅ†…๏ผ‰                            โ”‚
โ”‚                                                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

6. ๆ€ป็ป“

6.1 ๆ ธๅฟƒ่ฆ็‚น

ไธป้ข˜ ๅ…ณ้”ฎ็‚น
ๆžถๆž„ไธŽ่ฎญ็ปƒ Transformer ๆžถๆž„ใ€้ข„่ฎญ็ปƒไธ‰้˜ถๆฎตใ€ๅˆ†ๅธƒๅผ่ฎญ็ปƒ
ๅฏน้ฝไธŽไผ˜ๅŒ– RLHF/DPO ๅฏน้ฝใ€ๆ็คบๅทฅ็จ‹ๆŠ€ๅทง
ๅพฎ่ฐƒๆŠ€ๆœฏ LoRA/QLoRA ๅ‚ๆ•ฐ้ซ˜ๆ•ˆๅพฎ่ฐƒใ€ๆ•ฐๆฎๆ ผๅผ
ๆŽจ็†้ƒจ็ฝฒ ้‡ๅŒ–ๅŽ‹็ผฉใ€vLLM/Ollama ้ƒจ็ฝฒใ€ๆžถๆž„่ฎพ่ฎก

6.2 ๅญฆไน ่ทฏๅพ„

ๅŸบ็ก€ โ†’ ๅฎž่ทต โ†’ ๆทฑๅ…ฅ

1๏ธโƒฃ ๅŸบ็ก€็†่ฎบ
   โ€ข Transformer ๆžถๆž„ๅŽŸ็†
   โ€ข ๆณจๆ„ๅŠ›ๆœบๅˆถ
   โ€ข ้ข„่ฎญ็ปƒ็›ฎๆ ‡

2๏ธโƒฃ ๅŠจๆ‰‹ๅฎž่ทต
   โ€ข ไฝฟ็”จ HuggingFace ๅพฎ่ฐƒๆจกๅž‹
   โ€ข ๅฐ่ฏ• LoRA/QLoRA
   โ€ข ๆœฌๅœฐ้ƒจ็ฝฒ Ollama

3๏ธโƒฃ ๆทฑๅ…ฅไผ˜ๅŒ–
   โ€ข ๅˆ†ๅธƒๅผ่ฎญ็ปƒ
   โ€ข ๆŽจ็†ไผ˜ๅŒ–
   โ€ข ็”Ÿไบง้ƒจ็ฝฒ

6.3 ๅ‚่€ƒ่ต„ๆบ