# Kernodeck Reprise v1 — một checkpoint thực sự được khởi động lại

Bài tập gốc này học một quan hệ số nhỏ trên 24 dòng tổng hợp. Mục tiêu của nó là **kiểm tra việc khởi động lại một quá trình huấn luyện**, không phải để đạt được mô hình tốt nhất hay đo lường một GPU. Phép tính được ép buộc rõ ràng trên **CPU**, ở `float64`, với một thread PyTorch.

Phép kiểm tra so sánh 10 bước liên tục với 5 bước, một checkpoint, rồi 5 bước mới trong **một tiến trình Python khác**. Một tiến trình thứ tư cố tình bỏ qua việc khôi phục các bộ sinh số ngẫu nhiên: độ lệch của nó phải được phát hiện. Không có tài nguyên từ xa, dữ liệu khách hàng hay trọng số đã huấn luyện trước nào được tải xuống.

## Điều kiện tiên quyết

- Một môi trường Python với PyTorch và NumPy đã được cài đặt sẵn. Bằng chứng được cung cấp đã được chạy với **Python 3.14.6, PyTorch 2.11.0+cu128 và NumPy 2.4.4**.
- Khoảng 1 MB dung lượng trống cho bốn thư mục đầu ra nhỏ. Các phụ thuộc Python chiếm không gian riêng của chúng.
- Chạy các lệnh từ thư mục đã giải nén `kernodeck-reprise-v1`.

Hậu tố `+cu128` mô tả gói hiện diện tại thời điểm kiểm thử; nó không có nghĩa là bài tập này đã dùng CUDA. **Không có phép tính CUDA, ROCm, AMP, đa card hay phân tán nào được tài nguyên này xác nhận.** Nó không dùng worker DataLoader. Một môi trường khác phải tạo ra bằng chứng riêng của nó; sự bằng nhau không được hứa hẹn giữa các phiên bản hay nền tảng.

## Lệnh kiểm tra

```console
python -B verify_resume.py --output runs/preuve-cpu
```

`-B` tránh các bộ nhớ đệm bytecode trong thư mục dự án. Thư mục đầu ra phải mới: không có lần chạy hiện có nào bị ghi đè. Để bắt đầu lại, hãy dùng ví dụ `runs/preuve-cpu-2`.

Chương trình chạy bốn lệnh với cùng một trình thông dịch Python, rồi ghi `runs/preuve-cpu/verification.json`. Một lần chạy hoàn chỉnh mong đợi:

```json
{"device":"cpu","all_checks_passed":true,"positive":true,"negative_divergence_detected":true,"report":"verification.json"}
```

Mã thoát bằng **0** nếu giao thức thành công, **1** nếu phép so sánh thất bại, **2** nếu việc kiểm tra không thể hoàn tất. Thành công đòi hỏi cả việc khởi động lại tích cực lẫn sự thất bại quan sát được của phép kiểm tra tiêu cực. Một tệp checkpoint chỉ đơn thuần hiện diện là không đủ.

## Thực hiện ba bước bằng tay

```console
python -B train.py --steps 10 --output runs/continu
python -B train.py --steps 5 --output runs/coupure
python -B train.py --steps 5 --resume runs/coupure/checkpoint.pt --output runs/reprise
```

Mỗi dòng khởi chạy một tiến trình riêng biệt. `--steps` nghĩa là **các bước bổ sung**, nên lệnh thứ ba kết thúc ở bước 10. Mỗi thư mục chứa `checkpoint.pt`, dấu vân tay của nó `checkpoint.pt.sha256` và một bản tóm tắt dễ đọc `summary.json`. Các checkpoint được bài tập tạo ra khi chạy; chúng không được phân phối trong gói lưu trữ.

Để quan sát trường hợp không đầy đủ, hãy dùng một thư mục mới:

```console
python -B train.py --steps 5 --resume runs/coupure/checkpoint.pt --omit-rng-restore --output runs/reprise-incomplete
```

Lệnh cuối này có thể kết thúc mà không có lỗi Python. **Điều đó không chứng minh một sự khởi động lại đúng đắn.** Lệnh `verify_resume.py` so sánh các kết quả và nhận thấy sự khác biệt.

## Những gì mô hình thực sự làm

`data.csv` chứa một lưới gồm hai biến và một mục tiêu tổng hợp: `target = 0.7*x1 - 0.4*x2 + 0.15*x1*x2 + 0.1`. Nó không mô phỏng bất kỳ số liệu khách hàng nào. Mạng gồm hai đầu vào, một lớp tám neuron, `Tanh`, một dropout 0,25 và một đầu ra, tổng cộng 33 tham số.

Quá trình huấn luyện dùng Adam với tốc độ ban đầu 0,03. StepLR chia đôi tốc độ này sau mỗi ba bước. Mỗi batch gồm bốn dòng: 10 bước tiêu thụ 40 quan sát, duyệt lại một số dòng sau epoch đầu tiên. Hoán vị, epoch, con trỏ và số lượng quan sát đã tiêu thụ đều được lưu giữ. Tại điểm cắt sau năm bước, con trỏ bằng 20 trên 24: việc khởi động lại diễn ra **bên trong hành trình của dữ liệu**.

Ba nguồn ngẫu nhiên ảnh hưởng đến công việc: Python đặt một độ lợi nhẹ trên các đầu vào, một bộ sinh NumPy PCG64 tạo ra nhiễu và các hoán vị, PyTorch tạo ra dropout. Việc đặt lại seed ban đầu không tái tạo được các trạng thái đạt được tại điểm cắt.

## Những gì checkpoint lưu giữ và theo thứ tự nào nó được đọc lại

Từ điển chứa trọng số, trạng thái Adam, trạng thái StepLR, tiến độ dữ liệu, ba RNG, lịch sử loss và learning rate, cùng với dấu vân tay của mã nguồn và CSV. Chế độ `train()` được khôi phục để tiếp tục; phép đo MSE cuối cùng dùng `eval()` và không tiêu thụ dropout.

Khi tiếp tục, mã nguồn trước tiên dựng model, optimizer và **scheduler**, sau đó nạp trọng số, trạng thái scheduler và trạng thái optimizer. Các RNG được khôi phục sau cùng, sau các bước dựng có tiêu thụ yếu tố ngẫu nhiên. Lựa chọn này tuân theo cảnh báo trong tài liệu [Optimizer.load_state_dict](https://docs.pytorch.org/docs/2.11/generated/torch.optim.Optimizer.load_state_dict.html).

Trạng thái Python là một cấu trúc gồm các kiểu nguyên thủy. PCG64 cung cấp một dictionary gồm số nguyên và chuỗi; không có đối tượng `ndarray` NumPy nào được tuần tự hóa làm trạng thái RNG. Trạng thái PyTorch CPU là một tensor byte. Các lần rút tiếp theo được kiểm soát mà không sửa đổi trạng thái đã lưu.

## Đọc bằng chứng và dung sai

`verification-cpu.json` là bằng chứng công khai từ một lần chạy thực tế của phiên bản này. `source` chứa SHA-256 của các script và CSV. `protocol` mô tả bốn tiến trình, độ chính xác và dung sai. `resume_boundary` kiểm tra lần rút tiếp theo của từng RNG và learning rate tiếp theo được dùng sau khi ngắt.

Việc so sánh đòi hỏi cùng thứ tự dòng, cùng tiến độ và cùng trạng thái scheduler. Độ lệch tuyệt đối tối đa được chấp nhận cho trọng số, trạng thái optimizer, loss, MSE và learning rate là **1e-12**, không có dung sai tương đối (`rtol=0`). Báo cáo giữ lại các độ lệch đo được, kể cả khi chúng bằng không. Nó cũng kiểm tra lần rút tiếp theo của các RNG ở cuối cả hai hành trình.

Phép kiểm tra âm phải cho thấy rằng việc bỏ quên các RNG làm thay đổi kết quả. MSE của nó có thể thấp hơn hoặc cao hơn: phép kiểm tra này xác minh một quỹ đạo tiếp tục, không phải xếp hạng chất lượng. Do đó một sai lệch được mong đợi sẽ cho `passed: false` trong phép kiểm tra con này và `divergence_detected: true`; khi đó giao thức tổng thể vẫn có thể thành công.

## Chỉ nạp checkpoint của chính bạn

Trình nạp sử dụng tường minh `torch.load(..., map_location="cpu", weights_only=True)` và không cung cấp fallback nào về `weights_only=False`. Nó trước tiên kiểm tra dấu vân tay liên quan, giới hạn kích thước và kiểm tra schema, phiên bản, mã nguồn và dữ liệu. Nó từ chối một trạng thái không đầy đủ thay vì âm thầm khởi tạo lại một phần của quá trình huấn luyện.

Bạn chỉ nên dùng những checkpoint mà **bạn đã tạo bằng bài tập này và giữ dưới sự kiểm soát của mình**. Dấu vân tay dùng để phát hiện thay đổi; nó không xác thực người gửi. Việc nạp hạn chế không làm cho một tệp không rõ nguồn gốc trở nên đáng tin. Xem [torch.load](https://docs.pytorch.org/docs/2.11/generated/torch.load.html) và [tuần tự hóa PyTorch](https://docs.pytorch.org/docs/2.11/notes/serialization.html).

## Điều chỉnh bài tập cho dự án của bạn

Hãy xác định những trạng thái mà quá trình huấn luyện của chính bạn thực sự tiêu thụ: sampler, augmentation, optimizer, scheduler và các generator riêng. Nếu bạn dùng AMP, hãy thêm trạng thái của scaler vào một ranh giới nhất quán; bài tập này không làm vậy. Huấn luyện phân tán cũng đòi hỏi phải xử lý các tiến trình và cách phân chia dữ liệu của chúng.

Đừng suy ra từ bằng chứng nhỏ này một thời lượng thuê, thông lượng, dung lượng VRAM hay bảo đảm tiếp tục cho một model khác. Hãy lặp lại phương pháp: một bộ dữ liệu ngắn mang tính đại diện, ngắt giữa công việc, một tiến trình khác, so sánh tường minh và phép kiểm tra âm.

## Nội dung và giấy phép

- `train.py`, `verify_resume.py`, tài liệu này và manifest: giấy phép MIT, xem `LICENSE-MIT.txt`.
- `data.csv`: dữ liệu tổng hợp nguyên bản được cung cấp theo CC0 1.0, xem `DATA-LICENSE-CC0.txt`.
- `verification-cpu.json`: các phép đo của bài tập này, không có dữ liệu cá nhân, môi trường đầy đủ, đường dẫn trên máy, token hay mã định danh phiên.
- `manifest.json`: danh sách chính xác các tệp được phân phối và SHA-256 của chúng. Manifest không tự tham chiếu chính nó.
- `SOURCES.md`: các liên kết chính thức và giới hạn tài liệu.

Các phụ thuộc PyTorch, NumPy và Python giữ giấy phép riêng của chúng. Chúng không được phân phối lại trong ZIP.


## Giới thiệu Kernodeck và khả năng tương thích của dự án

Cette réédition du 25 septembre 2026 actualise le nom de l’archive, la documentation et la marque. Les scripts `train.py` et `verify_resume.py`, le CSV et `verification-cpu.json` restent identiques à la livraison exécutée le 24 septembre 2026. Le champ technique `project` conserve son identifiant pour les lecteurs de rapports existants. Aucun calcul ni contrôle CPU/GPU n’a été relancé pour cette réédition.
