Big Data Analytics · บทที่ 12 จาก 13

Scalable Machine Learning

การเพิ่มเครื่องไม่ได้ทำให้ Machine Learning ขยายขนาดได้เอง เราต้องถามก่อนว่าปัญหาใหญ่ตรงข้อมูล โมเดล การค้นหา Hyperparameter หรือเวลาที่ใช้ฝึก แล้วจึงเลือกว่าจะกระจายข้อมูล กระจายพารามิเตอร์ หรือกระจายการทดลอง บทนี้เชื่อม Summation Form ของ Classical ML เข้ากับ Distributed Optimization และการฝึกโมเดลขนาดใหญ่ โดยไม่หลงคิดว่า GPU จำนวนมากเท่ากับคำตอบที่ดีกว่าเสมอ

📚
ความตั้งใจของบทนี้: แยก Scalability ทางระบบออกจาก Scalability ทางสถิติ เชื่อม MapReduce, Functional Programming, Gradient Aggregation และ Communication Cost เข้าด้วยกัน แล้ววางกรอบเลือก Data, Model, Pipeline และ Experiment Parallelism ให้เหมาะกับคอขวดจริง

คำว่า “โมเดลใหญ่เกินไป” อาจหมายถึงสี่ปัญหาคนละชนิด

สิ่งที่ใหญ่อาการแนวทางหลัก
ข้อมูลใหญ่ข้อมูลไม่พอดีเครื่องเดียว แต่โมเดลยังพอดีData Parallelism, Distributed Data Processing
โมเดลใหญ่Parameter, Activation หรือ Optimizer State ไม่พอดีอุปกรณ์เดียวModel/Tensor/Pipeline Parallelism, Sharding
การทดลองใหญ่ต้องลองหลาย Model/Hyperparameter/FoldTask Parallelism และ Experiment Scheduling
การให้บริการใหญ่โมเดลหนึ่งตัวรับ Request ไม่ทันหรือ Latency สูงBatching, Replication, Caching, Model Compression
อุปมาเรื่องห้องสมุด
หนังสือเยอะเกินห้องคือปัญหา Data Size หนังสือหนึ่งเล่มใหญ่จนยกคนเดียวไม่ไหวคือ Model Size ผู้อ่านต่อคิวยาวคือ Serving Throughput ส่วนการต้องลองอ่านหนังสือพันเล่มเพื่อเลือกสิบเล่มคือ Search Cost ทั้งหมดเรียกว่า “ใหญ่” ได้ แต่แก้ด้วยการเพิ่มชั้นหนังสือแบบเดียวกันไม่ได้

1Statistical Query Model และ Summation Form

ข้อสังเกตสำคัญ
ขั้นตอนสำคัญของอัลกอริทึม ML จำนวนมากเขียนเป็นการรวมสถิติจากตัวอย่าง เช่นผลรวม Gradient, Count, Mean, Covariance หรือ Sufficient Statistics เมื่อสถิติเหล่านี้รวมแบบ Associative ได้ เราสามารถแบ่งข้อมูล คำนวณ Partial Result แล้วรวมกลับ โดยไม่ส่งตัวอย่างทั้งหมดมาที่เครื่องกลาง
ตัวอย่าง: Linear Regression
θ* = min_θ Σ (θᵀxᵢ − yᵢ)² สำหรับ i = 1..m

สังเกตว่านี่คือผลรวม (Σ) เหนือ record ทั้งหมด — ถ้าแบ่งข้อมูลเป็น N ส่วนเท่า ๆ กัน แต่ละส่วนคำนวณผลรวมย่อยของตัวเอง (partial sum) แบบอิสระโดยไม่ต้องคุยกับส่วนอื่นเลย แล้วค่อยรวมผลรวมย่อยทั้งหมดในตอนท้าย — นี่คือ "summation form" ที่แปลงเป็น MapReduce ได้โดยตรง (map = คำนวณ partial sum ของแต่ละส่วน, reduce = รวม partial sum ทั้งหมดเข้าด้วยกัน)

Sum ไม่ได้สำคัญเพราะบวกง่าย แต่เพราะรวมเป็นต้นไม้ได้

ถ้าฟังก์ชันรวมเป็น Associative เราสามารถรวมภายใน Core, เครื่อง, Rack และคลัสเตอร์เป็นลำดับ ลดข้อมูลก่อนข้าม Network รูปแบบนี้คือ Monoidification ที่พบตั้งแต่ MapReduce, Smart Window, Graph Message Aggregation จนถึง Gradient All-Reduce

// แนวคิด Distributed Gradient
localGradient_p = Σ gradient(model, x_i, y_i)  for data in partition p
globalGradient  = reduce(localGradient_1 ... localGradient_P)
model           = model - learningRate * globalGradient

แต่ละ Worker ยังต้องเห็น Model Version ที่สอดคล้องกันตาม Synchronization Scheme และต้องส่ง Gradient หรือ Parameter Update ซึ่งอาจมีขนาดเท่ากับโมเดลทุก Iteration การคำนวณแยกได้จึงไม่แปลว่าการสื่อสารหายไป

ตัวอย่าง Sufficient Statistics

อัลกอริทึมสิ่งที่คำนวณต่อ Partitionสิ่งที่รวม
Naive Bayesจำนวนตัวอย่างต่อ Class และ FeatureCount
Linear/Logistic RegressionLoss และ Gradient ต่อ Mini-batchVector Sum/Average
k-meansผลรวม Vector และจำนวนจุดต่อ ClusterSum กับ Count
PCAMean/Covariance หรือ Matrix Product ตามวิธีMatrix Sum
EMExpected Sufficient Statisticsสถิติที่ใช้ใน M-step

k-means: ขนานได้ภายในรอบ แต่ยังต้องทำหลายรอบ

Worker แต่ละตัว Assign จุดไปยัง Centroid ที่ใกล้ที่สุด แล้วส่งผลรวมกับ Count ต่อ Cluster กลับมาเพื่อคำนวณ Centroid ใหม่ ขั้น Assignment ขนานได้ดี แต่ทุก Worker ต้องรับ Centroid ชุดล่าสุดและรอการรวมก่อนเริ่มรอบใหม่ จำนวนรอบกับ Communication จึงยังเป็น Serial Dependency ระหว่าง Iteration

อย่าเหมารวมว่า Algorithm ทั้งตัวเป็น MapReduce ครั้งเดียว
หลาย Algorithm มี Summation Form ภายในหนึ่ง Iteration แต่ต้องทำซ้ำหลาย Iteration และมี State ระหว่างรอบ Logistic Regression ไม่ได้จบจากการรวม Gradient ครั้งเดียว ส่วน SVM, PCA หรือ Neural Network มีหลาย Formulation และ Solver ที่ต้นทุนต่างกัน ควรระบุขั้นตอนที่กระจายได้ ไม่ใช่ประกาศชื่อ Algorithm ทั้งก้อน
ข้อจำกัดของแนวทางนี้
ไม่ใช่ทุกอัลกอริทึมจะเขียนในรูป summation form ได้ — ตัวอย่างที่ไม่เข้าเงื่อนไขคือการเรียนรู้ฟังก์ชัน XOR บน subset ของ bit เพราะไม่สามารถแยกคำนวณเป็นผลรวมอิสระของแต่ละ record ได้ งานวิจัยนี้ยังระบุชัดว่าไม่ได้อ้างว่าเทคนิคนี้จะเร็วกว่าวิธีเฉพาะทาง (specialized solution) ที่ออกแบบมาสำหรับอัลกอริทึมตัวใดตัวหนึ่งโดยเฉพาะ — จุดเด่นคือเป็นกรอบทั่วไปที่ใช้ได้กับอัลกอริทึมหลายสิบตัว ไม่ใช่ทางออกที่เร็วที่สุดสำหรับทุกกรณี
ผลการทดลองจากเอกสารต้นฉบับ
เมื่อทดสอบกับอัลกอริทึม 10 ตัวบน multicore processor พบว่าได้ speedup ใกล้เคียง linear ตามจำนวน core ที่เพิ่มขึ้น — สอดคล้องกับหลักการ "Divide and Conquer" ที่ปูพื้นไว้ตั้งแต่บทที่ 2

2Scalability สองแบบ: ระบบเร็วขึ้น กับโมเดลเรียนรู้ดีขึ้น

ใน Parallel Computing เรามักวัด Speedup จากเวลารัน แต่ Machine Learning มีอีกแกนคือจำนวนตัวอย่างหรือ Update ที่ต้องใช้เพื่อให้ถึงคุณภาพเป้าหมาย การเพิ่ม Worker อาจทำให้ Step หนึ่งเร็วขึ้น แต่ถ้า Large Batch ทำให้ต้องใช้ Epoch มากขึ้นหรือคุณภาพลดลง เวลาถึงคำตอบที่ใช้ได้อาจไม่ดีขึ้นตามจำนวนเครื่อง

ประสิทธิภาพคำถามMetric
Hardware/System Efficiencyใช้ทรัพยากรคุ้มเพียงใดSamples/s, FLOPS utilization, scaling efficiency
Statistical Efficiencyต้องเห็นข้อมูล/ทำ Update กี่ครั้งจึงถึงคุณภาพSteps/Epochs to target loss/metric
Time-to-Qualityจากเริ่มฝึกถึง Metric เป้าหมายใช้เวลาจริงเท่าไรWall-clock to target
Cost-to-Qualityใช้เงินและพลังงานเท่าไรต่อคุณภาพเป้าหมายGPU-hours, cost, energy to target
รถสิบคันไม่ได้ทำให้เดินทางถึงสิบเท่า
ถ้าเราส่งคนสิบกลุ่มไปคนละรถเพื่อสำรวจเส้นทาง แต่ทุกกลุ่มต้องกลับมาประชุมทุกแยก เวลาเดินทางลดได้เฉพาะช่วงที่ขับพร้อมกัน ส่วนเวลาประชุมเพิ่มขึ้น ถ้าการแบ่งกลุ่มยังทำให้ข้อมูลแต่ละกลุ่มไม่พอสำหรับตัดสินใจ อาจต้องย้อนสำรวจมากกว่าเดิมด้วย

Strong Scaling กับ Weak Scaling ใน ML

Strong Scaling ตรึง Data/Model เดิมแล้วเพิ่มทรัพยากรเพื่อให้จบเร็วขึ้น ส่วน Weak Scaling เพิ่ม Data หรือ Model ตามทรัพยากรแล้วหวังว่าเวลายังใกล้เดิม งาน ML สมัยใหม่มักใช้เครื่องเพิ่มเพื่อฝึกโมเดลใหญ่ขึ้น ไม่ใช่ทำงานเดิมให้เร็วขึ้นเพียงอย่างเดียว จึงต้องระบุให้ชัดว่ากำลังเคลม Scaling แบบใด

Time-to-Train ยังไม่พอถ้าคุณภาพไม่เท่ากัน

การเปรียบเทียบระบบ A กับ B ต้องใช้ Dataset, Model, Target Metric และ Training Recipe ที่เทียบกันได้ ถ้า A จบเร็วเพราะหยุดที่ Accuracy ต่ำกว่า การเรียกว่า Speedup เป็น Overclaim เราควรรายงานทั้ง Throughput และ Time-to-Quality

3Deep Learning: Computational Graph และหน่วยความจำ

ความต่างจาก classical ML
Neural network สมัยใหม่ไม่ใช่แค่ "รวมผลรวม" ธรรมดา — มันคือ computational graph ที่ประกอบด้วย score function, activation function, และ regularization function ต่อกันเป็นชั้น ๆ การ train ต้องทำ backpropagation (ไล่ derivative ย้อนกลับจาก loss function ไปยังทุก weight ในเครือข่าย) ซึ่งแต่ละ layer ขึ้นกับผลลัพธ์ของ layer ก่อนหน้าโดยตรง — ทำให้ขนานได้ยากกว่า summation form แบบตรงไปตรงมา
ความท้าทายรายละเอียด
Model Sizeโมเดลใหญ่ขึ้นเรื่อย ๆ ทำให้ต้องเข้าถึงหน่วยความจำมากขึ้น (memory reference ยิ่งมาก ยิ่งใช้พลังงานมาก — เชื่อมโยงกับ storage hierarchy ในบทที่ 3)
Energy EfficiencyTraining บนอุปกรณ์พกพา (เช่น มือถือ) ต้องคำนึงถึงพลังงานเป็นข้อจำกัดหลัก ไม่ใช่แค่ความเร็ว
Training Speedโมเดลขนาดใหญ่ใช้เวลา train นานเป็นวันหรือสัปดาห์บนฮาร์ดแวร์เดี่ยว จำเป็นต้องขนาน

หน่วยความจำไม่ได้มีเพียง Parameter

ส่วนเกิดจากโตตาม
ParametersWeight ของโมเดลจำนวน Parameter
GradientsDerivative ต่อ Parameterจำนวน Parameter
Optimizer StateMomentum/Variance เช่น Adamจำนวน Parameter และชนิด Optimizer
Activationsค่ากลางที่ต้องเก็บเพื่อ BackpropagationBatch, Sequence Length, Hidden Size, จำนวนชั้น
Temporary BufferKernel, Communication และ Framework WorkspaceOperation/Implementation

โมเดลที่ Weight พอดี GPU อาจฝึกไม่ได้เพราะ Activation หรือ Optimizer State กินพื้นที่มากกว่า Weight การแก้จึงมี Gradient Checkpointing, Mixed Precision, Sharding, Offloading และลด Batch/Sequence แต่แต่ละวิธีแลก Compute, Communication หรือ Accuracy

Compute-bound กับ Memory-bound

Operation บางชนิดใช้ Matrix Multiplication หนาแน่นและได้ประโยชน์จาก GPU มาก ส่วน Embedding Lookup หรือ Small Kernel อาจติด Memory Bandwidth/Latency การเพิ่ม FLOPS ไม่ช่วยถ้าข้อมูลป้อนหน่วยคำนวณไม่ทัน Roofline Thinking จึงยังใช้กับ Deep Learning ได้

เทคนิคลดขนาดโมเดล (Compression)

เทคนิคหลักการ
Pruningตัด connection ที่มีน้ำหนักน้อย/ไม่สำคัญออกจากเครือข่าย (ได้แรงบันดาลใจจากการที่สมองมนุษย์ก็ "pruning" synapse ที่ไม่ได้ใช้เช่นกัน)
Trained Quantizationลดจำนวน bit ที่ใช้แทนแต่ละ weight (เช่น จาก 32-bit float เป็น 8-bit integer) — เปลี่ยนจาก continuous weight distribution เป็น discrete
Huffman Codingเข้ารหัสค่า weight ที่ซ้ำกันบ่อยด้วยรหัสสั้นกว่า ต่อยอดจาก quantization

Compression มีเป้าหมาย Training หรือ Serving

Pruning และ Quantization อาจลด Model Size/Latency ตอน Inference แต่ไม่จำเป็นต้องลดต้นทุน Training ตั้งแต่ต้น Quantization-aware Training ยังเพิ่มขั้นตอนฝึก ส่วน Huffman Coding ช่วยขนาดจัดเก็บมากกว่าการคำนวณโดยตรง ถ้าฮาร์ดแวร์ไม่รองรับ Sparse/Low-precision Kernel โมเดลเล็กบนดิสก์อาจไม่ได้เร็วขึ้นตามสัดส่วน

เทคนิคประโยชน์หลักข้อแลกเปลี่ยน
Mixed Precisionลด Memory/เพิ่ม Throughput ระหว่างฝึกต้องจัดการ Numerical Stability และ Loss Scaling
Gradient Checkpointingลด Activation Memoryคำนวณ Forward บางส่วนซ้ำตอน Backward
Pruningลด Weight/Operation ถ้า Kernel ใช้ Sparsity ได้Fine-tune และ Hardware Support
Quantizationลด Storage, Bandwidth และอาจเร่ง InferenceAccuracy, Calibration และ Kernel Support
Distillationถ่ายทอดพฤติกรรม Teacher ไป Student ที่เล็กกว่าเพิ่ม Training Stage และ Student มีขีดจำกัด

4รูปแบบการขนานสำหรับ Deep Learning

Data Parallelism
รัน training example หลายตัวพร้อมกันบนสำเนาโมเดลเดียวกันในหลาย GPU/เครื่อง แล้วรวม gradient เข้าด้วยกัน — ถูกจำกัดด้วยขนาด batch size ที่ยังให้ผลการเรียนรู้ที่ดี
Model Parallelism
แบ่งตัวโมเดลเองออกเป็นส่วน ๆ กระจายไปยังหลายอุปกรณ์ (แบ่งตาม layer หรือแบ่ง convolution ตาม output region) — จำเป็นเมื่อโมเดลใหญ่เกินกว่าจะใส่ในอุปกรณ์เดียวได้ทั้งหมด
Hyper-parameter Search Parallelism
train โมเดลหลายชุดพร้อมกันด้วย hyper-parameter ต่างกัน (เช่น learning rate, จำนวน layer) — ขนานได้ง่ายที่สุดเพราะแต่ละ run เป็นอิสระจากกันโดยสมบูรณ์
Multi-GPU ในเครื่องเดียว
ใช้การเชื่อมต่อความเร็วสูงระหว่าง GPU โดยตรง (เช่น NVLink ที่เร็วกว่า Ethernet ทั่วไปหลายสิบเท่า) ลดคอขวดจากการส่ง gradient ข้าม GPU
Amdahl's Law ยังใช้ได้กับ Deep Learning
แม้ neural network จะมีการคำนวณแบบขนานได้มหาศาลในทางทฤษฎี (เช่น fully-connected layer หนึ่งอาจมีการคูณที่เป็นอิสระกันนับล้านครั้ง) แต่ความเร็วที่ได้จริงถูกจำกัดด้วย overhead ในการประสานงาน (synchronization, communication) เสมอ — หลักการเดียวกับ Amdahl's Law ที่เรียนในวิชา Parallel Systems ยังคงใช้อธิบายขีดจำกัดของการขนานได้ แม้จะเป็นบริบทที่ต่างจาก CPU/cluster แบบดั้งเดิม

Data Parallelism: Model ซ้ำ แต่ Data ต่าง

Worker ทุกตัวถือ Model Copy เดียวกันเชิงตรรกะ รับ Mini-batch คนละส่วน คำนวณ Gradient แล้วรวมก่อน Update เหมาะเมื่อโมเดลพอดีแต่ข้อมูล/Compute ต่อ Step มาก Data Parallelism เรียบง่ายที่สุด แต่เมื่อ Worker เพิ่ม Local Batch มักทำให้ Global Batch โต และปริมาณ Gradient Communication ไม่ลดตาม Worker

Global Batch
B_global = B_per_worker × จำนวน Data-parallel Workers × Accumulation Steps

ถ้าต้องตรึง Global Batch เราต้องลด Batch ต่อ Worker จนอุปกรณ์ใช้ไม่เต็ม หรือใช้จำนวน Worker มากเกินประโยชน์ ถ้าปล่อย Global Batch โต Training Recipe อาจต้องปรับ Learning Rate, Warmup และ Regularization

Tensor Parallelism: แบ่ง Operation ภายใน Layer

Matrix ใหญ่หนึ่งก้อนถูกแบ่งแถวหรือคอลัมน์ไปหลายอุปกรณ์ แต่ละอุปกรณ์คำนวณ Partial Output แล้วใช้ Collective Communication เช่น All-Reduce หรือ All-Gather เหมาะเมื่อ Layer เดียวใหญ่เกินอุปกรณ์ แต่ต้องการ Interconnect เร็วเพราะสื่อสารแทบทุก Layer

Pipeline Parallelism: แบ่งโมเดลตามช่วงชั้น

อุปกรณ์ชุดหนึ่งถือชั้นต้น อีกชุดถือชั้นกลางและปลาย แล้วแบ่ง Mini-batch เป็น Micro-batch ไหลผ่าน Pipeline คล้ายสายการผลิต ช่วงเริ่มและท้ายมี Pipeline Bubble ที่บาง Stage ว่าง การจัด Stage ให้ Compute สมดุลและจำนวน Micro-batch มากพอช่วยลด Bubble แต่ Activation ต้องส่งข้าม Stage

Sequence/Context Parallelism

เมื่อ Sequence ยาว Activation และ Attention โตมาก เราอาจแบ่งตามมิติ Sequence/Context ให้อุปกรณ์แต่ละตัวถือ Token คนละช่วง แล้วประสานข้อมูลที่จำเป็น วิธีนี้ตอบ Model Workload อีกแบบ ไม่ควรรวมทุกอย่างไว้ใต้คำว่า Model Parallelism จนมองไม่เห็น Communication Pattern

Expert Parallelism

Mixture-of-Experts เปิดใช้ Expert เพียงบางส่วนต่อ Token แล้วกระจาย Expert ไปหลายอุปกรณ์ ช่วยเพิ่ม Parameter Capacity โดย Compute ต่อ Token ไม่โตเท่ากัน แต่เกิด All-to-All Communication และ Load Imbalance ถ้า Router ส่ง Token ไป Expert บางตัวมากเกินไป

Parallelismแบ่งอะไรCommunication เด่นคอขวด
Dataตัวอย่าง/Mini-batchGradient All-ReduceGlobal Batch และ Network
TensorTensor/Matrix ภายใน LayerAll-Reduce/All-Gather ถี่Interconnect Latency/Bandwidth
Pipelineกลุ่ม LayerActivation ระหว่าง StageBubble และ Stage Imbalance
ExpertExpert ModulesAll-to-All Token RoutingExpert Imbalance
ExperimentTraining Runแทบเป็นอิสระScheduler, Budget และ Early Stopping

5Collective Communication: ต้นทุนที่ซ่อนในคำว่า Distributed

Data Parallel Training ต้องรวม Gradient จากทุก Worker วิธีตรง ๆ คือส่งไป Parameter Server กลาง แต่เครื่องกลางอาจเป็นคอขวด Collective เช่น Ring All-Reduce กระจายงานสื่อสารไปทุก Worker โดยแบ่ง Gradient เป็น Chunk แล้ว Reduce-Scatter ตามด้วย All-Gather

All-Reduce ทำอะไร

หลัง Backward Worker แต่ละตัวมี Gradient Vector ของตน เป้าหมายคือให้ทุก Worker ได้ผลรวม/ค่าเฉลี่ยเดียวกันเพื่อ Update Model ตรงกัน การ All-Reduce รวม Reduce กับ Broadcast เป็น Collective เดียวเชิงตรรกะ Implementation ใช้ Topology และขนาด Message เลือก Algorithm ต่างกัน

ประชุมแบบ Ring
แทนให้ทุกแผนกส่งแฟ้มทั้งหมดเข้าหัวหน้าโต๊ะเดียว เราแบ่งแฟ้มเป็นส่วนแล้วส่งวนรอบโต๊ะ ทุกคนช่วยรวมส่วนที่รับผิดชอบ จากนั้นส่งผลรวมวนอีกรอบให้ทุกคนมีสำเนาครบ งานกระจายกว่า แต่ถ้าคนหนึ่งช้าหรือทางเชื่อมช่วงหนึ่งติด ทุกคนยังรอ

Latency-bound กับ Bandwidth-bound

Gradient เล็กแต่ Collective ถี่อาจติด Latency ของการเริ่ม Message ส่วน Gradient ใหญ่ติด Bandwidth การรวม Tensor เล็กเป็น Bucket ลดจำนวน Collective แต่ถ้ารอ Bucket เต็มนานจะลด Overlap ระหว่าง Backward กับ Communication Framework จึงพยายามเริ่มส่ง Bucket ที่ Gradient พร้อมแล้ว ขณะ Layer ก่อนหน้ายังคำนวณ Backward

Communication-to-Computation Ratio

เพิ่ม Worker ทำให้ Compute ต่อ Worker ลด แต่ Gradient Size มักเท่าเดิม จุดหนึ่ง Communication จึงครองเวลา การ Scaling ที่ดีต้องเพิ่ม Arithmetic Intensity, ใช้ Local Batch เหมาะสม, Overlap Communication หรือใช้ Parallelism ที่ตรงกับ Topology ไม่ใช่เพิ่ม Worker อย่างเดียว

Topology-aware Placement

GPU ในเครื่องเดียวอาจเชื่อมกันเร็วกว่าข้ามเครื่องหลายเท่า Tensor Parallelism ที่สื่อสารถี่จึงควรอยู่ในกลุ่ม Interconnect เร็ว ส่วน Data Parallel Group อาจกระจายข้าม Node Placement ต้องสอดคล้องกับ Communication Pattern ไม่ใช่จัด GPU แบบสุ่มจาก Pool

6Synchronous, Asynchronous และ Parameter Server

Synchronous Training รอ Gradient จาก Worker ตามกลุ่มก่อน Update ทำให้ Model Version ตรงกันแต่ติด Straggler Asynchronous Training ให้ Worker ส่ง Update เมื่อพร้อม ลดการรอแต่ Gradient อาจคำนวณจาก Parameter เก่า เรียกว่า Staleness

แบบข้อดีข้อแลกเปลี่ยน
SynchronousReasoning และ Reproducibility ง่ายกว่า ใกล้ Single-worker Large Batchรอ Worker ช้าที่สุดทุก Step
AsynchronousWorker เดินต่อได้และทนความเร็วต่างกันStale Gradient อาจทำให้ Convergence แย่หรือไม่เสถียร
Bounded Stalenessยอมให้ Worker นำหน้าได้จำกัดระบบและ Analysis ซับซ้อนขึ้น

Parameter Server

Parameter ถูก Shard ไว้บน Server หลายตัว Worker ดึง Parameter และผลัก Gradient/Update เหมาะกับ Sparse Model หรือ Embedding ขนาดใหญ่ที่แต่ละ Mini-batch แตะเพียงบาง Row แต่ Server ต้องรับ Request สูงและจัด Consistency/Staleness

Straggler และ Backup Worker

Worker อาจช้าจาก Data Skew, Hardware, Network หรือ Background Load วิธีรับมือมี Speculative/Backup Task, Gradient Coding, ตัด Worker ช้า หรือ Elastic Training แต่ทุกวิธีเปลี่ยน Cost และ Statistical Semantics ถ้าข้อมูลของ Worker ที่ถูกตัดมี Distribution ต่างจากกลุ่ม

7Large Batch: Throughput ดีขึ้น แต่การเรียนรู้อาจเปลี่ยน

Batch ใหญ่เพิ่ม Matrix Utilization และลดจำนวน Synchronization ต่อ Sample แต่ Gradient มี Noise น้อยลงและจำนวน Update ต่อ Epoch ลดลง Recipe ที่ใช้กับ Batch เล็กจึงอาจไม่ให้คุณภาพเท่าเดิมเมื่อขยาย Batch หลายร้อยเท่า

Gradient Accumulation

ถ้า Memory ไม่พอ Global Batch ที่ต้องการ เราคำนวณหลาย Micro-batch สะสม Gradient แล้ว Update ครั้งเดียว วิธีนี้เลียนแบบ Batch ใหญ่เชิง Gradient ภายใต้เงื่อนไขบางอย่าง แต่ไม่ได้ลดจำนวน Forward/Backward และ Interaction กับ Batch-dependent Layer/Randomness ต้องพิจารณา

Learning Rate Scaling และ Warmup

กฎ Linear/Square-root Scaling เป็น Heuristic ที่ใช้ในบางบริบท ไม่ใช่ทฤษฎีรับประกันทุก Model การ Warmup ช่วยลดความรุนแรงช่วงต้นเมื่อ Parameter และ Optimizer State ยังไม่เสถียร แต่ต้องทดลองและประเมิน Time-to-Quality จริง

Critical Batch Size

โดยแนวคิด เมื่อ Batch โตเกินจุดหนึ่ง การเพิ่ม Batch ลด Gradient Noise น้อยลงและไม่ลดจำนวน Step ที่ต้องใช้ตามสัดส่วน เราจึงได้ Throughput ต่อ Step ดีขึ้นแต่ Scaling ทางสถิติอิ่มตัว จุดนี้ขึ้นกับ Model, Data และ Training Stage

Samples/second สูงสุดไม่ใช่เป้าหมายสุดท้าย
ระบบที่ประมวลผลได้สองเท่าแต่ต้องฝึกสามเท่าจึงถึง Accuracy เดิม แพงกว่าใน Wall-clock และ Cost การ Benchmark Distributed Training ต้องรายงาน Learning Curve เทียบเวลา ไม่ใช่เพียง Throughput ของช่วงสั้น

8Fault Tolerance และ Checkpoint ในการฝึกระยะยาว

งานฝึกที่ใช้เวลาหลายวันมีโอกาสพบ GPU, Node, Network หรือ Storage Failure สูงขึ้น Checkpoint จึงเป็นส่วนของ Expected Runtime ถ้าบันทึกถี่เกินไป Training เสีย I/O มาก ถ้าห่างเกินไป Failure หนึ่งครั้งทำให้สูญงานหลายชั่วโมง

Checkpoint ต้องเก็บอะไร

Distributed Checkpoint

เมื่อ State ถูก Shard หลายอุปกรณ์ การรวม Checkpoint ทั้งหมดไป Rank เดียวอาจใช้ Memory/Network สูง ระบบจึงบันทึก Shard แบบกระจายแล้วมี Metadata ประกอบ การ Restore ด้วยจำนวน Worker ต่างจากเดิมต้อง Reshard ซึ่งไม่ฟรี

Elastic Training

การเพิ่มลด Worker ระหว่างงานช่วยรับมือ Preemption หรือทรัพยากรเปลี่ยน แต่ Global Batch, Learning Rate และ Data Assignment อาจเปลี่ยนตาม World Size Training Semantics จึงต้องออกแบบ ไม่ใช่เพียงให้ Scheduler เพิ่ม Pod แล้วหวังว่าผลเหมือนเดิม

9Scalable Inference: Training ใหญ่ไม่เท่ากับ Serving ใหญ่

Inference ไม่มี Backpropagation จึงใช้ Memory น้อยกว่า Training แต่ต้องตอบ Request ภายใต้ Latency/Throughput/Cost SLO และอาจมี Sequence Length หรือ Output Length เปลี่ยนไปแต่ละ Request

Batching

รวม Request หลายรายการให้ Accelerator ทำพร้อมกันเพิ่ม Throughput แต่ Request แรกต้องรอ Batch Dynamic Batching จึงรอช่วงสั้นแล้วรวมงานที่เข้ามาใกล้กัน Trade-off คือ Throughput กับ Tail Latency

Model Replication กับ Model Sharding

ถ้าโมเดลพอดีอุปกรณ์ เราทำ Replica หลายชุดเพื่อรับ Request ขนาน แต่ถ้าโมเดลไม่พอดีต้อง Shard หนึ่ง Request ข้ามหลายอุปกรณ์ ทำให้ Communication อยู่ใน Critical Path การ Autoscale ยังต้องคิดเวลาที่ใช้โหลด Weight ขนาดใหญ่

Caching และ Speculative Decoding

งาน Generative Model ใช้ KV Cache ตาม Sequence และจำนวนผู้ใช้ Memory ของ Cache อาจเป็นคอขวดแม้ Weight พอดี เทคนิคอย่าง Quantized Cache, Paging หรือ Speculative Decoding แลก Memory/Compute/Complexity ต่างกัน ควรวัด End-to-end ไม่ใช่ดู FLOPS อย่างเดียว

Compression ต้องวัดบน Hardware จริง

โมเดล INT8 อาจเร็วบน Hardware ที่มี Kernel รองรับ แต่ไม่ช่วยบนเส้นทางที่แปลงกลับ FP32 บ่อย Sparse Model อาจเล็กแต่ช้ากว่า Dense ถ้า Access ไม่ต่อเนื่อง การอ้างลด Parameter 90% จึงไม่เท่ากับลด Latency 90%

10การทดลองที่ขยายขนาดได้โดยไม่เผาทรัพยากรทิ้ง

Hyperparameter Search ขนานได้ง่ายเพราะแต่ละ Trial อิสระ แต่การรัน Grid ใหญ่แบบไม่ใช้ข้อมูลระหว่างทางเป็นวิธีใช้คลัสเตอร์อย่างตรงไปตรงมาเกินไป เราควรหยุด Trial ที่ไม่มีแนวโน้มดี จัด Budget และใช้ Multi-fidelity Search

วิธีแนวคิดข้อสังเกต
Grid Searchลองทุก Combination ที่กำหนดง่ายแต่จำนวน Trial โตแบบคูณ
Random Searchสุ่มจาก Distributionมักครอบคลุม Dimension สำคัญดีกว่า Grid ภายใต้ Budget เดียวกัน
Bayesian Optimizationใช้ผลเดิมเลือกจุดถัดไปมี Sequential Dependency และ Overhead
Successive Halving/Hyperbandให้ Budget น้อยก่อน แล้วเพิ่มให้ Trial ที่ดีต้องมี Metric ต้นทางที่พอทำนายผลท้าย

Cross-validation คูณ Cost อย่างเงียบ ๆ

30 Parameter Sets × 5 Folds = 150 Training Runs ยังไม่รวม Retry และ Final Refit การ Parallelize ช่วย Wall-clock แต่ไม่ลด Compute Cost โดยอัตโนมัติ ควรเริ่มจาก Baseline, ลด Search Space ด้วยความรู้โดเมน และใช้ Validation Scheme ที่ตรงการใช้งาน

Reproducibility ของ Experiment

บันทึก Data Snapshot, Code, Environment, Seed, World Size, Batch, Optimizer, Metric และ Failure/Resume การเปลี่ยนจำนวน Worker อาจเปลี่ยนลำดับ Floating-point และ Data Shuffling จึงไม่ควรสัญญา Bitwise Reproducibility ถ้าระบบรับประกันได้เพียง Statistical Reproducibility

11เลือกวิธีกระจายตามชนิดของอัลกอริทึม

คำว่า Distributed ML มักถูกเล่าเหมือนทุกโมเดลมี Gradient แล้วทำ All-Reduce แต่ Algorithm แต่ละตระกูลมี State และ Communication ต่างกัน การเลือก Framework ก่อนเข้าใจรูปคำนวณทำให้เราใช้เครื่องมือหนักเกินจำเป็นหรือกระจายจุดที่ไม่ใช่คอขวด

Linear และ Logistic Regression

Gradient เป็นผลรวมต่อ Record จึงเหมาะกับ Data Parallelism แต่ถ้า Feature Dimension สูงมาก Gradient Vector ใหญ่และสื่อสารทุก Iteration อาจแพง Sparse Feature ช่วย Compute แต่ Dense All-Reduce อาจทำให้ประโยชน์หาย Parameter Server/Sparse Update จึงเหมาะในบาง Workload

Decision Tree และ Gradient-boosted Trees

การสร้าง Split ต้องรวม Histogram ของ Feature/Threshold จาก Worker State ที่สื่อสารคือ Histogram ไม่ใช่ Gradient แบบ Neural Network Data ถูก Partition ได้ แต่ Tree Node ที่กำลังขยายและ Feature Binning มีผลต่อ Load Balance เมื่อ Tree โต ตัวอย่างใน Leaf บางส่วนลดลงและ Parallelism เปลี่ยน

Random Forest

Tree หลายต้นมีความเป็นอิสระสูง จึงกระจายตาม Tree และ Data Sample ได้ง่ายกว่า Boosting ซึ่งต้นถัดไปพึ่ง Prediction/Error ของ Ensemble เดิม แต่ Tree แต่ละต้นอาจใช้เวลาไม่เท่ากันและต้องรวม Model ขนาดใหญ่ตอนท้าย

k-means และ EM

ทั้งสองมี Local Sufficient Statistics แล้วรวม Global State ต่อ Iteration k-means ส่ง Sum/Count ต่อ Cluster; EM ส่ง Expected Statistics แต่ถ้า Cluster/Component มาก State โตและ Data Skew ทำให้บาง Cluster หนัก การ Initialize ที่ดีลดจำนวน Iteration จึงอาจคุ้มกว่าการเพิ่ม Worker

kNN

kNN แทบไม่มี Training แต่ต้นทุนย้ายไป Query เพราะต้องค้นเพื่อนบ้านในข้อมูลใหญ่ การกระจาย brute-force ช่วย Throughput แต่ Latency/Network สูง ระบบจริงใช้ Approximate Nearest Neighbor Index, Vector Partitioning และ Replication การเรียกว่า “Training เร็ว” จึงปิดบังคอขวด Serving

Naive Bayes

Count ต่อ Class/Feature รวมได้ดีมากและรองรับ Incremental Update แต่ Vocabulary ใหญ่ทำให้ State ใหญ่ ต้องใช้ Sparse Representation และจัดการ Unknown Feature การฝึกกระจายง่ายไม่ได้แปลว่า Data Cleaning/Tokenization ง่าย

Embedding Table

Recommendation/Language Model อาจมี Embedding Parameter ใหญ่แต่ Mini-batch แตะเพียงบาง Row Parameter Server, Row-wise Sharding และ Sparse Optimizer จึงเหมาะกว่า All-Reduce Dense ทั้ง Table แต่ Hot Item/Token ทำให้ Shard บางส่วนรับ Request มาก

Algorithmสิ่งที่รวม/สื่อสารคอขวดเด่น
Linear ModelGradient VectorFeature Dimension × Iteration
Tree/GBDTHistogram/Split StatisticsFeature Bins, Node Imbalance
Random ForestTree Models/PredictionsScheduling และ Model Size
k-means/EMSufficient StatisticsIteration และ Initialization
kNNQuery/Neighbor CandidateIndex, Memory และ Serving
EmbeddingSparse Row UpdatesHot Key และ Shard Placement

Spark ML เหมาะตรงไหน

Spark ML เหมาะกับ Classical ML ที่ต่อกับ DataFrame Feature Pipeline และข้อมูลกระจายอยู่ใน Spark อยู่แล้ว จุดแข็งคือ ETL, Feature และ Model อยู่กระบวนการเดียวกัน ไม่ใช่ทุก Algorithm จะเร็วที่สุดเมื่อเทียบ Library เฉพาะทาง หากข้อมูลพอดีเครื่องและโมเดลเล็ก การดึง Feature ที่สรุปแล้วไป Library เครื่องเดียวอาจง่ายและเร็วกว่า

ย้าย Code ไปหา Data แต่ไม่จำเป็นต้องฝึกทุกอย่างตรงนั้น

หลัก Data Locality บอกให้ทำ Filter, Join และ Aggregate ใกล้ Data ขนาดใหญ่ แต่หลังลดข้อมูลเป็น Feature Matrix ขนาดพอดี เราอาจย้ายผลสรุปไป Training System เฉพาะทาง แนวคิดไม่ใช่ห้ามย้ายข้อมูลทุกกรณี แต่หลีกเลี่ยงการขน Raw Data มหาศาลโดยไม่จำเป็น

อย่ากระจาย Algorithm เพราะข้อมูลมีคำว่า Big
หลัง Aggregate ข้อมูล 10 TB อาจเหลือ Training Table 2 GB การฝึกบนเครื่องเดียวช่วย Debug, Reproduce และ Tune ง่ายกว่า Distributed Training หลายเท่า Scale-out ควรเป็นคำตอบหลังวัด ไม่ใช่พิธีกรรมประจำวิชา Big Data

12เมื่อยุคเปลี่ยน: จาก Multicore Summation สู่ Distributed Model Training

แล้ว · ~2006-2018
ตอนนี้ · 2026
MapReduce/Summation Form แสดงว่าขั้นตอนสำคัญของ Classical ML หลายแบบกระจายบน Multicore/Cluster ได้ด้วยกรอบร่วม
โมเดลขนาดใหญ่อาจผสม Data, Tensor, Pipeline, Sequence หรือ Expert Parallelism ตาม Model และ Hardware Topology ซึ่งไกลกว่าการอธิบายด้วย Summation Form เพียงชั้นเดียว
Framework ยุคแรกทำให้ Computational Graph และ Distributed Training เข้าถึงง่ายขึ้น
ปัจจุบันมี Framework และ Library หลายชุด เช่น PyTorch Distributed/FSDP, DeepSpeed, JAX ecosystem และระบบเฉพาะขององค์กร การเลือกขึ้นกับ Model, Compiler/Kernel, Hardware และทีม ไม่ควรสรุปจากความนิยมเพียงอย่างเดียว
Pruning/Quantization เป็นเทคนิคเสริมสำหรับ deploy บนมือถือ
Quantization ใช้กว้างขึ้นทั้ง Edge และ Server เพื่อแลก Accuracy กับ Memory/Bandwidth/Latency แต่ผลจริงขึ้นกับ Precision, Calibration, Kernel และ Hardware ไม่ควรรับประกันจากจำนวน Bit เพียงค่าเดียว

13กรณีศึกษา: จาก Single GPU ไปสู่ Distributed Training

สมมุติทีมมีโมเดล Classification ที่ฝึกบน GPU เดียว 20 ชั่วโมง เป้าหมายคือให้จบภายใน 4 ชั่วโมงโดยคุณภาพเท่าเดิม ขั้นแรกไม่ควรกระโดดไปใช้ Tensor Parallelism แต่ควร Profile ว่าเวลาอยู่ที่ Data Loading, Forward/Backward, Optimizer หรือ Evaluation

ขั้นที่ 1: สร้าง Baseline ที่เชื่อถือได้

ตรึง Data Version, Model, Batch, Seed, Target Metric และวัด GPU Utilization, Throughput, Memory, I/O ถ้า GPU ว่างรอ Data 60% การเพิ่ม GPU แปดตัวจะสร้างผู้รอเพิ่ม ไม่ได้แก้ Data Pipeline

ขั้นที่ 2: แก้คอขวดเครื่องเดียวก่อน

ปรับ Data Format, Prefetch, Mixed Precision, Kernel และ Batch ให้ GPU ทำงานคุ้ม หาก Baseline ไม่มีประสิทธิภาพ Distributed Version จะขยาย Overhead และทำให้ Debug ยากขึ้น

ขั้นที่ 3: ทดลอง Data Parallelism

ใช้ 4 GPU โดยตรึงหรือบันทึก Global Batch อย่างชัดเจน เปรียบเทียบ Learning Curve ต่อ Wall-clock ไม่ใช่ Throughput อย่างเดียว ถ้าเพิ่ม Batch 4 เท่าแล้ว Accuracy ลด ต้องปรับ Recipe หรือใช้ Gradient Accumulation/จำนวน Worker ที่น้อยกว่า

ขั้นที่ 4: วัด Scaling Efficiency

Scaling Efficiency
Efficiency(p) = Speedup(p) / p

ถ้า 4 GPU เร็วขึ้น 3.2 เท่า Efficiency = 80% แต่ต้องตรวจว่าใช้ Target Metric เดียวกัน ถ้าเวลาต่อ Epoch ลดแต่ Epoch ที่ต้องใช้เพิ่ม ค่า Time-to-Quality อาจต่ำกว่า 80%

ขั้นที่ 5: หา Communication Knee

เพิ่มเป็น 8 และ 16 GPU แล้วดู All-Reduce Time เมื่อ Compute ต่อ Worker เล็กลง จุดที่เพิ่ม GPU แล้ว Speedup น้อยกว่าค่าใช้จ่าย/ความซับซ้อนคือ Scaling Knee ระบบผลิตไม่จำเป็นต้องใช้ Worker สูงสุดที่มี ถ้า Cost per Training Run แย่ลง

ขั้นที่ 6: Model Parallelism เมื่อจำเป็นจริง

ถ้า Model ไม่พอดีอุปกรณ์ค่อยใช้ Sharding/Tensor/Pipeline Parallelism เลือก Parallel Group ตาม Network Topology และวัด Activation/Optimizer State ไม่ใช่ Weight อย่างเดียว

ขั้นที่ 7: Failure Test

ฆ่า Worker ระหว่างฝึก ตรวจ Checkpoint/Resume, Data Duplication และ Lost Progress วัด Restore Time เพราะงานหลายวันมี Failure เป็น Expected Event ไม่ใช่กรณีสมมุติที่ไม่เกิด

บทเรียนของกรณีศึกษา
Distributed Training ที่ดีไม่ได้เริ่มจากจำนวน GPU แต่เริ่มจากคำถามว่าเวลาและหน่วยความจำหายไปตรงไหน แล้วเลือก Parallelism ที่ลดคอขวดนั้นโดยไม่ทำลาย Statistical Efficiency

14สรุปและขั้นตอนถัดไป

Scalable ML เริ่มจากการมอง Algorithm เป็นสถิติที่แบ่งคำนวณและรวมได้ Summation Form อธิบายเหตุผลที่ Count, Gradient และ Sufficient Statistics กระจายได้ แต่ Iteration, Synchronization และ State ทำให้เราไม่ได้ Parallelize ฟรี เมื่อเข้าสู่ Deep Learning ปัญหาขยายจาก Data ไปยัง Parameter, Gradient, Optimizer State และ Activation

การเลือก Data, Tensor, Pipeline, Sequence หรือ Expert Parallelism ต้องสอดคล้องกับ Communication Pattern และ Hardware Topology พร้อมวัดทั้ง System Efficiency กับ Statistical Efficiency เป้าหมายสุดท้ายคือ Time/Cost-to-Quality ไม่ใช่ Samples/s ที่ดูสวยที่สุด

ถ้าจำได้เพียงแปดเรื่อง ให้จำเรื่องเหล่านี้

  1. แยกให้ได้ว่าใหญ่ตรง Data, Model, Experiment หรือ Serving
  2. Summation Form ช่วยกระจาย Partial Statistics แต่ Iteration ยังต้อง Synchronize
  3. หน่วยความจำ Training มี Parameter, Gradient, Optimizer State และ Activation
  4. Data Parallelism ติด Global Batch และ Gradient Communication
  5. Model Parallelism มีหลายแบบเพราะแต่ละแบบสร้าง Communication ต่างกัน
  6. Throughput สูงไม่รับประกัน Time-to-Quality ต่ำ
  7. Compression จะเร็วจริงต่อเมื่อ Hardware/Kernel ใช้รูปแบบนั้นได้
  8. เพิ่มเครื่องหลัง Profile ไม่ใช่ใช้จำนวนเครื่องแทนการวิเคราะห์

ขั้นตอนถัดไป คือบทกรณีศึกษาทางธุรกิจ ซึ่งจะนำ Data Architecture, Streaming, Graph และ Scalable ML มาประกอบเป็นระบบเดียว แล้วถามต่อว่าความแม่น ความเร็ว ต้นทุน ความเสี่ยง และผลลัพธ์ทางธุรกิจสมดุลกันหรือไม่

คำถามซ้อมสอบ
  1. อธิบาย Summation Form พร้อมแยกขั้นตอนที่ขนานได้กับ Synchronization ระหว่าง Iteration
  2. เปรียบเทียบ Hardware Efficiency, Statistical Efficiency และ Time-to-Quality
  3. หน่วยความจำ Training ประกอบด้วยอะไรบ้าง และ Gradient Checkpointing แลกอะไรกับอะไร
  4. เปรียบเทียบ Data, Tensor, Pipeline, Sequence และ Expert Parallelism
  5. All-Reduce ทำหน้าที่อะไร และเหตุใดการเพิ่ม Worker ทำให้ Communication ครองเวลามากขึ้น
  6. Synchronous กับ Asynchronous Training ต่างกันอย่างไร และ Staleness ส่งผลต่อ Convergence อย่างไร
  7. อธิบายปัญหา Large Batch และเหตุใด Samples/s จึงไม่ใช่ Metric สุดท้าย
  8. ออกแบบ Checkpoint สำหรับ Distributed Training และอธิบายปัญหา Reshard เมื่อ World Size เปลี่ยน
  9. เปรียบเทียบ Model Replication กับ Model Sharding สำหรับ Inference
  10. ออกแบบการทดลอง Scaling จาก 1 เป็น 16 GPU โดยระบุ Baseline, Metric, Failure Test และ Stop Condition