English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

khách
1 / ?
trở lại bài học

Mười sáu Ngày Tính toán trên Một GPU

Một Quá trình Chạy Dài Duy nhất

ANDREA-120M mất khoảng 23 ngày trên RTX 4090 (FP16, 6 bước/phút, 200K bước). Điện tường, kernel panic, proxy sập, & thay đổi cấu hình cố ý đều xảy ra trong khoảng thời gian đó. Không có checkpoint, một sự cố nhỏ sẽ làm mất toàn bộ quá trình chạy.


v1 mất 27K bước vì một sai lầm (lr=0.001 quá mạnh) vì không có checkpoint nào gần hơn điểm khởi chạy. v2 tiếp thu bài học đó: nhịp độ checkpoint giảm xuống mỗi 100 bước, & trình xử lý tín hiệu CUDA đảm bảo ghi checkpoint khi nhận SIGTERM.


Ba Vai Trò

Một checkpoint đảm nhận ba công việc cùng lúc:


1. Điểm khôi phục. Quy trình chết, máy khởi động lại, kernel panic: tiếp tục từ file step_NNNNNN.bin mới nhất.

2. Điểm xoay mượt mà. Bước 112,619: thay đổi chương trình học mà không cần huấn luyện lại. SIGUSR1 buộc tạo checkpoint sạch, proxy dừng, caps & floors mới được gửi, CUDA tiếp tục từ điểm đã lưu dưới chính sách mới.

3. Nhánh kiểm toán. So sánh hai cấu hình tại cùng trọng số khởi đầu: sao chép một checkpoint, chạy hai nhánh phân kỳ tiến lên, quan sát nhánh nào hội tụ.


Mỗi 100 bước cho khoảng 17 phút huấn luyện giữa các lần ghi tại tốc độ 6 bước/phút. 100 bước cũng khớp với sample_every: mỗi checkpoint tương ứng với một lần kiểm tra mẫu mới, & mỗi lần kiểm tra mẫu tương ứng với một điểm có thể khôi phục.

Ba Vai Trò Cho Một Tệp

Nêu hai công việc riêng biệt mà tệp checkpoint thực hiện ngoài việc khôi phục sau sự cố. Đưa ra lý do một câu cho mỗi công việc.

Năm Vùng Trong Một Tệp

Định dạng

Mỗi step_NNNNNN.bin chứa năm vùng liên tiếp:


[int32 step] [int32 n_params] [n_params x float32 weights] [n_params x float32 m] [n_params x float32 v]

Định dạng Nhị phân Checkpoint ANDREA


Theo Từng Vùng


Phần đầu (tổng cộng 8 byte). Số bước 32-bit cho biết snapshot này nằm ở vị trí nào trong quá trình huấn luyện; số lượng tham số 32-bit cho biết kích thước của ba mảng theo sau.


Trọng số (n_params x 4 byte). Mọi tham số đã học, dạng phẳng. Thứ tự khớp với bộ lặp tham số của mô hình: nhúng token & vị trí, sau đó là trọng số attention & MLP từng tầng, rồi đầu ra.


Khoảnh khắc đầu tiên m của Adam (n_params x 4 byte). EMA của các gradient quá khứ (beta1 = 0.9). Cùng hình dạng với trọng số. Cần thiết để tiếp tục AdamW.


Khoảnh khắc thứ hai của Adam v (n_params x 4 bytes). EMA của các gradient bình phương trong quá khứ (beta2 = 0.999). Có cùng hình dạng với weights. Bắt buộc cho việc tiếp tục AdamW.


Tổng Kích Thước

Tổng bytes = 8 + 12 x n_params. ANDREA-12M (12.8M params): 154 MB trên đĩa (147 MB làm tròn). ANDREA-120M (~120M params) FP32: ~1.44 GB. Ba mảng có hình dạng giống nhau, xếp chồng liên tiếp, với một header nhỏ.


Tại Sao Lưu m & v

Adam thuần túy theo dõi learning rate từng tham số qua m & v. Bỏ chúng khi viết checkpoint & một lần chạy tiếp tục sẽ bắt đầu với momentum bằng không & ước lượng phương sai bằng không, tương đương learning rate 0 trong một bước rồi đột ngột tăng vọt. Loss tăng vọt; mô hình có thể rơi ra khỏi basin hiện tại. Lưu m & v làm cho việc tiếp tục bit-equivalent (ngoại trừ ngẫu nhiên dataloader) so với baseline không bao giờ dừng.

Kích thước Một Checkpoint

ANDREA-120M chứa khoảng 120.000.000 tham số được huấn luyện ở FP32 (4 byte mỗi float). Tính toán: (a) số byte dùng bởi header; (b) số byte dùng bởi ba mảng float32 kết hợp (weights + m + v); (c) kích thước checkpoint tổng cộng tính bằng MB. Hãy trình bày phép tính của bạn.

SIGTERM & SIGUSR1

Tại sao CUDA Xử lý Tín hiệu

Quá trình huấn luyện chạy như một tiến trình nền dài hạn. Khi proxy hoặc operator muốn GPU dừng, một tín hiệu được gửi đến engine CUDA. Không có handler, SIGTERM mặc định sẽ giết tiến trình ngay lập tức: tính toán gradient đang thực hiện bị loại bỏ, trọng số mới nhất kể từ checkpoint cuối cùng bị mất. Với handler, engine sẽ ghi checkpoint trước rồi thoát sạch sẽ.


SIGTERM: ghi & thoát

Được gửi bởi nút dừng, systemctl stop, hoặc kill từ proxy cha. CUDA hoàn thành bước hiện tại, ghi step_NNNNNN.bin ra đĩa, rồi thoát. Khôi phục từ trạng thái này chỉ cần file .bin mới nhất: không mất công việc nào ngoài bước đang thực hiện một phần.


SIGUSR1: ghi & tiếp tục

Được gửi theo yêu cầu bởi operator hoặc script proxy. CUDA hoàn thành bước hiện tại, ghi step_NNNNNN.bin, rồi tiếp tục huấn luyện như không có gì xảy ra. Hữu ích cho: kích hoạt điểm kiểm toán ngay trước thay đổi config; chụp trọng số tại khoảnh khắc tốt đã biết; đồng bộ checkpoint với chạy đánh giá chất lượng mẫu bên ngoài.


Trình Tự Quay Đầu Ba Lan (bước 112,619)

1. Nhà điều hành gửi SIGUSR1 đến CUDA. Checkpoint ghi tại ranh giới 100-bước tiếp theo (bước 112,700).

2. Nhà điều hành dừng proxy.

3. .samples.json & .state.json được lưu trữ (nhật ký mẫu & trạng thái bandit được bảo tồn như hồ sơ lịch sử).

4. .loss.json vẫn giữ nguyên tại chỗ. Lịch sử huấn luyện tích lũy; không bao giờ được lưu trữ.

5. Proxy khởi động lại với caps & floors mới.

6. CUDA tiếp tục từ step_112700.bin với bandit mới nhưng đầy đủ weights, m, & v.


Lịch sử loss tiếp tục không bị gián đoạn qua điểm pivot. Log mẫu được reset sạch sẽ. Bandit có khởi đầu mới dưới chính sách mới.

Chọn Signal

Hai tình huống. (a) Script proxy muốn chụp snapshot NGAY TRƯỚC khi chuyển từ v3-base sang v3-polish caps, mà không dừng training. Signal nào? Tại sao? (b) Lệnh `systemctl stop unhomeschool-train` của host được kích hoạt trong reboot có kế hoạch. Systemd gửi signal nào theo mặc định? Handler của CUDA làm gì?

Lịch Sử Training Tích Lũy

Ba Tệp Sidecar

Bên cạnh mỗi checkpoint, proxy duy trì ba tệp sidecar JSON trong thư mục chạy:


- .loss.json -- một mục nhập cho mỗi bước, mãi mãi. ~200.000 mục nhập vào cuối quá trình chạy. Lịch sử huấn luyện tích lũy.

- .samples.json -- các mẫu được tạo gần đây để kiểm toán. Đặt lại khi pivot đánh bóng.

- .state.json -- lượt kéo tay bandit, phần thưởng EMA, bộ đếm giai đoạn. Đặt lại khi pivot đánh bóng.


Cái Gì Được Đặt Lại, Cái Gì Được Giữ Lại

Các pivot đánh bóng là thay đổi chính sách, không phải reset chạy. Các trọng số của mô hình, m, v, & lịch sử loss đều tiếp tục không bị gián đoạn. Các phần thưởng tích lũy của bandit KHÔNG tiếp tục: các caps & floors mới định nghĩa một chính sách khác, & bandit phải học lại dưới chính sách mới từ trạng thái sạch.


Tại sao .loss.json Giữ nguyên

Lịch sử loss đóng vai trò như sổ kiểm toán của lần chạy. Mọi tuyên bố đã công bố về ANDREA-120M (loss EMA tại bước 110K, phục hồi pivot-đánh bóng, hội tụ tại bước 112K) đều truy vết về các mục nhập trong file này. Lưu trữ .loss.json giữa các giai đoạn sẽ buộc người đọc phải ghép các mảnh lại để tái tạo lần chạy; giữ nó chỉ append & không chạm vào bảo toàn nguồn gốc.


Bài học Zombie Arm

Bước 112,619 tìm thấy một arm repo-docstrings trong .state.json mang trọng số 1.546 từ lần chạy trước. Trạng thái bandit đã được bảo toàn qua một lần khởi động lại trước đó nhưng nguồn dữ liệu không còn khả dụng, tạo ra các pull zombie làm méo mó kế toán khám phá. Bài học: trạng thái bandit CÓ được phép trôi dạt qua các lần khởi động lại theo cách bất ngờ. Lịch sử loss là file duy nhất phải giữ nguyên không chạm vào suốt toàn bộ thời gian sống của lần chạy.


Một Quy Tắc Để Thống Trị Tất Cả

Lưu trữ .samples.json & .state.json tự do giữa các giai đoạn. Không bao giờ lưu trữ .loss.json. File .loss.json mới nhất luôn là lịch sử huấn luyện chính thức.

Áp Dụng Quy Tắc

Ba hành động trong quá trình pivot đánh bóng tại bước 112,619. Đối với mỗi hành động, nêu **ARCHIVE**, **KEEP IN PLACE**, hoặc **RESET**, & đưa ra lý do một câu: (a) `.samples.json`; (b) `.loss.json`; (c) `.state.json` (bộ nhớ bandit).

Những Gì Đã Xây Dựng & Tại Sao

Năm Quyết Định

1. Nhịp độ: mỗi 100 bước. Độ chi tiết điểm khôi phục ~17 phút. Phù hợp với sample_every để mỗi checkpoint tương ứng với một mẫu kiểm toán mới.

2. Định dạng: tiêu đề + 3 mảng. Tối thiểu: tiêu đề 8-byte cho biết kích thước của mỗi mảng phía sau. Không phình to metadata. Tiếp tục bit-tương đương khi m & v được lưu.

3. Tín hiệu: SIGTERM & SIGUSR1. Hai vai trò, hai tín hiệu. Tắt systemd mặc định nhận checkpoint sạch qua SIGTERM; điểm kiểm toán theo yêu cầu nhận checkpoint sạch qua SIGUSR1 mà không dừng.

4. Tính liên tục loss: không bao giờ lưu trữ. Lịch sử huấn luyện tích lũy tồn tại qua các pivot đánh bóng, khởi động lại, & thay đổi chính sách. Một dấu vết kiểm toán cho toàn bộ quá trình chạy.

5. Trạng thái Bandit: cho phép reset. Chính sách Bandit sống dưới một config tại một thời điểm. Pivot đánh bóng reset; lịch sử loss tiếp tục. Hai thời gian sống khác nhau chia sẻ cùng thư mục chạy.


Những Gì Bài Học Này Kết Nối Đến


- Hoạt động 23 (grow_a_language_model_sample_audit). Chu kỳ sample_every khớp với chu kỳ checkpoint; cả hai kích hoạt mỗi 100 bước.

- Hoạt động 24 (grow_a_language_model_microgpt_to_andrea). Sự sụp đổ v1, bản vá v2.5, xoay sở đánh bóng v3 đều yêu cầu các checkpoint sạch để hoạt động.

- Hoạt động 10 (grow_a_language_model_adamw). Việc lưu m & v trong checkpoint rất quan trọng vì quy tắc cập nhật của AdamW phụ thuộc vào cả hai. Bỏ chúng & tiếp tục sẽ lệch hướng.


Một Sự Thật Kỹ Thuật Cuối Cùng

Mã tồn tại lâu hơn tác giả. Hạ tầng tồn tại lâu hơn người xây dựng. Một định dạng checkpoint đơn giản tồn tại lâu hơn mọi kế hoạch tiếp tục phức tạp hứa hẹn bỏ qua việc lưu trạng thái optimizer. Tiết kiệm byte; tiết kiệm lần chạy.

Bạn Sẽ Xây Dựng Gì?

Nếu bạn tự huấn luyện một mô hình nhỏ, trong năm quyết định này, bạn sẽ giữ nguyên quyết định nào và thay đổi quyết định nào? Chọn một để thảo luận trong 2-3 câu. Không có câu trả lời sai; câu hỏi là liệu bạn có thể suy luận về sự đánh đổi hay không.