Model Deployment: Từ PyTorch đến Production
Đóng gói model cùng preprocessing, kiểm tra runtime parity và triển khai với monitoring, version và rollback.
Deployment chuyển một artifact đã đánh giá thành thành phần của ứng dụng. Trọng số đúng chưa đủ: preprocessing, input contract, numerical behavior và vận hành quyết định đầu ra người dùng nhận được.
Mục tiêu học tập
- Phân biệt checkpoint, inference artifact và endpoint.
- Thiết kế parity test giữa môi trường train và runtime đích.
- Nêu tiêu chí rollout, monitoring và rollback.
Đóng gói nhiều hơn một file trọng số
Một công thức cần cả nguyên liệu và cách chuẩn bị. Tương tự, model cần đúng thứ tự feature, resize, normalization và class mapping. Gửi ảnh khác chuẩn có thể làm prediction sai dù file weights không đổi.
Lưu architecture/config tương thích checkpoint, preprocessing version, label mapping và schema đầu vào/đầu ra. Chuyển model sang inference/eval behavior đúng; tắt gradient khi không cần. Endpoint là lớp giao tiếp bên ngoài artifact, không phải chính mô hình.
Với PyTorch, chọn đường chạy hoặc export phù hợp runtime đích theo tài liệu phiên bản. ONNX là một lựa chọn trao đổi graph, không phải bước bắt buộc cho mọi deployment và không bảo đảm mọi operator đều tương thích.
Export có thể ghi nhận shape constraints hoặc phụ thuộc control flow. Kiểm tra dynamic dimensions, unsupported operators và dtype trước khi phát hành. Model chạy được với một input mẫu không chứng minh mọi input hợp lệ đều được hỗ trợ.
Pin runtime, model và environment theo release. Không nạp artifact không rõ nguồn như file dữ liệu vô hại; packaging format và deserialization có thuộc tính riêng cần review.
Kiểm tra cùng input ở hai runtime
Lấy cùng một bộ ví dụ, chạy ở môi trường ban đầu và nơi sẽ triển khai, rồi so đầu ra. Nếu khác nhau, tìm nguyên nhân trước khi cho người dùng sử dụng. Một phép thử “không lỗi” chưa đủ nếu kết quả đã đổi.
Golden inputs nên bao gồm các shape được hỗ trợ và trường hợp biên. So intermediate preprocessing khi có thể. Với số thực, dùng absolute/relative tolerance phù hợp dtype và tác vụ; với class decision, kiểm tra cả khoảng cách đến threshold.
Mã chỉ minh họa đối chiếu vector output có tolerance. Nó không export PyTorch hay gọi runtime thực; cần bổ sung parity bằng artifact thật trước khi release.
Một tiêu chí số học là . Chọn atol/rtol từ precision và độ nhạy tác vụ; đạt tolerance ở tensor không tự chứng minh metric nghiệp vụ giữ nguyên.
Benchmark phải warm up, đồng bộ thiết bị khi cần và ghi batch/shape/threading. Đo p50/p95 cùng end-to-end latency; thời gian kernel thấp không bao gồm queue và network.
Release có thể quan sát và khôi phục
Đưa phiên bản mới cho phạm vi nhỏ, theo dõi lỗi và giữ cách quay lại bản trước. Cần biết prediction đến từ phiên bản nào khi có báo cáo sai.
Gắn model version vào log an toàn cho dữ liệu; theo dõi schema failures, latency, resource use và quality khi có label. Canary hoặc shadow evaluation cần kế hoạch so sánh và điều kiện dừng rõ.
Fallback có thể là model đã kiểm tra trước hoặc chuyển tác vụ cho người phụ trách. Không im lặng trả giá trị rỗng như prediction thành công nếu model timeout.
Rollback phải bao gồm preprocessing và schema tương thích, không chỉ weights. Kiểm tra backward compatibility giữa client và server trước release. Drift là tín hiệu điều tra, không tự chứng minh model cần retrain hay cho phép phát hành model mới.
Workflow & kiến trúc
Ứng dụng & giới hạn
- Đưa classifier hoặc perception model vào ứng dụng.
- Thiết kế release checklist dựa trên contract và chất lượng.
Điểm mạnh
Version và parity giúp truy nguyên lỗi và khôi phục có kiểm soát.
Giới hạn cần nhớ
Một bộ golden inputs hữu hạn không bao phủ mọi input; cần quality evaluation và quan sát vận hành.
Thử trong một project nhỏ
Viết contract cho ảnh RGB: shape, dtype, range, resize và class mapping. Liệt kê năm golden inputs và một điều kiện tự dừng rollout có thể kiểm tra.
from math import isclose, isfinite
reference = [0.2, 0.8]
candidate = [0.2000001, 0.7999999]
assert len(reference) == len(candidate)
assert all(isfinite(x) for x in candidate)
assert all(isclose(a, b, rel_tol=1e-5, abs_tol=1e-6)
for a, b in zip(candidate, reference))
print("Illustrative parity check passed")Hai vector tự chọn để minh họa tolerance; đây không phải parity test của một model đã export hoặc số đo production.
