TROISINH
FoundationsTraining at Scale

Gradient Checkpointing — Đánh đổi compute lấy memory

Kỹ thuật cho phép train model AI khổng lồ trên GPU bình dân bằng cách tính toán lại thay vì lưu trữ: chi phí 20% thời gian để tiết kiệm 80% memory.

Khi training GPT-4 hay Llama 3 tốn hàng chục triệu USD, phần lớn chi phí không phải điện năng cho GPU, mà là số lượng GPU cần thiết để chứa đủ memory. Gradient Checkpointing là chiến lược "thông minh" để huấn luyện model lớn hơn 10 lần mà không cần mua thêm VRAM — bằng cách chấp nhận tính toán lại những gì đã tính trước đó.

Định nghĩa

Gradient Checkpointing là kỹ thuật tối ưu memory trong quá trình backpropagation: thay vì lưu trữ toàn bộ activations từ forward pass để tính gradient sau này, ta chỉ lưu một vài "mốc" (checkpoint) và tính lại các activations trung gian khi cần trong backward pass — đánh đổi thêm công sức tính toán để giảm drastič sử dụng bộ nhớ GPU.

Giải thích chi tiết

Vấn đề: Bức tường memory trong training sâu

Khi training neural network, bạn cần chạy forward pass (tính output từ input) rồi backward pass (tính gradient để cập nhật weights). Vấn đề là backpropagation đòi hỏi lưu lại toàn bộ "kết quả trung gian" (activations) từ forward pass — tương tự như khi giải toán, bạn cần giữ lại từng bước tính để lấy đạo hàm ngược.

Với model như GPT-4 hay Llama 3 có hàng trăm layer, memory tăng tuyến tính theo độ sâu. Một model 70B parameters cần:

  • ~140GB cho weights (FP16)
  • ~280GB cho optimizer states (Adam)
  • 400-800GB cho activations (tùy batch size)

Đây là lý do training LLM cần cluster GPU đắt đỏ. Khi memory đầy, bạn phải giảm batch size hoặc độ dài sequence, làm chậm training đáng kể.

Ý tưởng cốt lõi: Chiến lược "cứu lửa" tái tính toán

Thay vì lưu toàn bộ activations của L layer, Gradient Checkpointing chỉ lưu các layer tại vị trí được chọn (checkpoint nodes), còn lại bị "quên" ngay sau khi forward pass qua.

Khi backward pass đến một layer chưa được lưu, hệ thống sẽ:

  1. Tái tính forward từ checkpoint gần nhất đến layer hiện tại
  2. Tính gradient cho layer đó
  3. Xóa ngay activations vừa tái tính để giải phóng memory

Ví dụ trực quan: Hãy tưởng tượng bạn leo núi và cần quay lại chân núi. Thay vì chụp ảnh mọi bước chân (tốn memory), bạn chỉ chụp ở các trạm nghỉ (checkpoint). Khi cần biết bước thứ 47, bạn quay lại trạm nghỉ gần nhất (layer 40), đi lại đến bước 47, xem xong rồi xóa khỏi đầu.

The "aha" moment: Backpropagation không cần tất cả activations cùng lúc — nó chỉ cần từng phần một theo thứ tự ngược. Do đó, bạn có thể tái tính "just-in-time" thay vì lưu "just-in-case".

Tại sao hiệu quả? Toán học đằng sau

Chi phí memory giảm từ O(L) (tuyến tính với số layer) xuống O(√L) hoặc O(1) (hằng số) tùy cách chọn checkpoint.

Cụ thể:

  • Naive: Lưu tất cả L activations → Memory ∝ L
  • Checkpointing tối ưu: Chia làm √L segments, lưu đầu mỗi segment → Memory ∝ √L, Compute tăng ~50%
  • Checkpointing full: Chỉ lưu input → Memory O(1), nhưng compute tăng gấp đôi (phải forward pass hai lần)

Trong thực tế, người ta chọn checkpoint ở mỗi transformer block (mỗi 2-4 layer), đạt được giảm 60-80% memory với chi phí 20-30% thời gian tính toán thêm. Đây là trade-off "rẻ" vì GPU rẻ hơn nhiều so với việc mua thêm GPU chỉ để tăng VRAM.

Lưu ý quan trọng: Gradient Checkpointing không làm mất thông tin (lossless) — nó chỉ là tái tính toán, không phải approximation. Quality model hoàn toàn giống nhau, chỉ chậm hơn chút ít.

Ví dụ thực tế

1. Training Llama-3-70B trên 24GB GPU Một nhóm nghiên cứu nhỏ muốn fine-tune Llama-3-70B nhưng chỉ có 2 chiếc RTX 4090 (24GB mỗi cái). Không có Gradient Checkpointing, ngay cả batch size = 1 cũng OOM (Out Of Memory). Bật Gradient Checkpointing + Gradient Accumulation + QLoRA, họ có thể chạy batch size 4 trên cùng hardware — training cost giảm từ "cần thuê AWS A100 cluster" xuống "chạy trên máy cá nhân".

2. Training GPT-style model từ đầu (Pretraining) Khi OpenAI hoặc Meta training model foundation, họ dùng cluster hàng nghìn GPU. Gradient Checkpointing cho phép họ tăng batch size lớn hơn (giúp training ổn định hơn) mà không cần tăng số lượng GPU tuyến tính. Với GPT-4 scale, điều này tiết kiệm hàng triệu USD chi phí phần cứng.

3. Sinh viên training ResNet-152 cho thesis Sinh viên chỉ có 1 GPU 8GB muốn train ResNet-152 (sâu) với batch size đủ lớn để hội tụ. Gradient Checkpointing cho phép họ trade-off 25% thời gian training để giảm memory từ 12GB xuống 6GB — có thể chạy được trên laptop gaming.

Ứng dụng

Cho sinh viên và researcher: Là "cứu cánh" khi hardware hạn chế. Cho phép thử nghiệm model lớn hơn mà không cần Google Colab Pro hoặc cloud credit. Tích hợp sẵn trong PyTorch (torch.utils.checkpoint) và HuggingFace Trainer (gradient_checkpointing=True).

Cho kỹ sư ML trong doanh nghiệp: Giảm TCO (Total Cost of Ownership) khi training model nội bộ. Cho phép dùng instance rẻ hơn (spot instances) hoặc train model lớn hơn trên cùng infrastructure.

Cho training foundation models: Là bắt buộc (mandatory) khi training model >100B parameters. Không có kỹ thuật này, việc lưu activations cho batch size hợp lý là không thể về mặt vật lý (cần terabytes VRAM).

So sánh

Kỹ thuậtMemory SavingsCompute CostTrade-off chínhKhi nào dùng
Gradient Checkpointing60-80%+20-30%Thời gian ↔ MemoryKhi memory là bottleneck, compute còn dư
Gradient Accumulation0% (giả lập batch lớn)+0% (linear time)Thời gian wall-clock ↔ Batch sizeKhi cần batch lớn nhưng memory không đủ
Mixed Precision (FP16)50% weights±0-10%Precision ↔ Memory/SpeedGần như luôn bật (free lunch)
ZeRO (DeepSpeed)8x (shard optimizer)+communicationNetwork ↔ MemoryKhi có nhiều GPU

Kết luận: Gradient Checkpointing là "nút bấm thần kỳ" khi bạn thấy "CUDA Out of Memory" — nó cho phép bạn chọn lại: thay vì crash vì thiếu memory, bạn chấp nhận training chậm hơn một chút. Trong thế giới training LLM, đây là trade-off luôn đáng giá vì compute rẻ hơn memory (bạn có thể chờ thêm 20% thời gian, nhưng không thể mua thêm VRAM nếu đã maxed out).

Bài viết liên quan

Cùng cụm (Training at Scale):

Đọc tiếp (Level 1 — Efficiency):

  • ZeRO Optimizer — Shard optimizer states qua nhiều GPU để train model trillion-parameter
  • Pipeline Parallelism — Chia model theo chiều dọc (layer) cho nhiều GPU
  • QLoRA — Kết hợp quantization 4-bit với LoRA để fine-tune model khổng lồ trên GPU consumer

Tài liệu gốc:

On this page