GPU cho dự án của bạn · thanh toán crypto không cần KYC Cách thuê
Tiếng Việt
Mở console
Hướng dẫn thực hành / KERNODECK

Một tiến trình kết thúc chưa phải là một kết quả được chấp nhận.

Trước một tác vụ dài, hãy xác định đầu vào, đích đến, các sự kiện tiến độ và tiêu chí thành công. Nếu bạn có một shell từ xa, hãy tách phiên kết nối khỏi tiến trình tính toán. Khi kết thúc, hãy xem mã trả về rồi đến chính các kết quả: một lệnh không báo lỗi không chứng minh rằng mọi dữ liệu đã được xử lý hay các đầu ra dùng được.

11 phút đọc · Hướng dẫn cho nhà phát triển

1. Phân biệt bốn trạng thái mà màn hình trộn lẫn

Một kết nối đang mở chỉ chứng tỏ bạn vẫn có thể trao đổi với máy. Một cửa sổ terminal hiện ra có thể chứa một shell mà tiến trình tính toán đã kết thúc. Ngược lại, mất kết nối không cho phép kết luận rằng tiến trình đã dừng. Vậy hãy bắt đầu bằng việc đặt tên cho lần chạy và nơi tìm lại dấu vết của nó.

Hãy theo dõi riêng biệt sự tồn tại của tiến trình, tiến độ nghiệp vụ và việc nghiệm thu kết quả. Số dòng trong nhật ký không phải là bộ đếm dữ liệu thành công: một chương trình có thể lặp lại cùng một cảnh báo. Một đầu ra một phần có thể đọc được nhưng vẫn chưa đầy đủ.

Phương pháp này giả định rằng bạn đã nhận và kiểm tra các phương tiện truy cập cần thiết. Nó không hứa hẹn một giao thức truy cập cụ thể hay việc tự động lưu giữ tệp. Các công cụ và đích đến khả dụng phải được kiểm tra trong môi trường thực tế được cung cấp.

Cuộn bảng để xem tất cả các cột.
Mỗi quan sát trả lời một câu hỏi khác nhau.
Quan sátĐiều nó cho biếtĐiều nó không chứng minh
Kết nối đang hoạt độngKênh còn phản hồi.Tính toán đang tiến triển.
Tiến trình hiện diệnMột lần chạy vẫn còn tồn tại.Nó đang xử lý đúng các phần tử.
Bộ đếm được xác thực tăng lênMột số đơn vị dự kiến đã hoàn thành.Toàn bộ tập dữ liệu đã hoàn thành.
Mã trả về bằng khôngChương trình báo kết thúc bình thường.Kết quả tuân thủ hợp đồng của bạn.
Đầu ra đã được kiểm soát và thu thậpCác tiêu chí đã chọn đã được kiểm tra.Chất lượng vượt trên các tiêu chí đó.

2. Chuẩn bị một lần chạy có thể nhận diện trước khi tách nó ra

Hãy kiểm soát dữ liệu, cấu hình thực tế và một lượt chạy ngắn đầu tiên của ứng dụng. Chẩn đoán GPU trả lời một câu hỏi khác: backend có biết thực hiện tính toán không? Nó không xác nhận việc nạp toàn bộ tập dữ liệu hay logic của chương trình bạn. Hãy thực hiện các kiểm tra này trước khi khởi chạy trong thời gian dài.

Chọn một mã định danh lần chạy và một thư mục mới. Lưu lại lệnh không chứa bí mật, phiên bản mã, danh tính các đầu vào và kết quả mong đợi. Dự trù nơi ghi nhật ký và nơi thu thập các tệp. Hai lần khởi chạy không được ghi đồng thời vào cùng một thư mục.

Với một công việc chia thành các phân vùng độc lập, hãy quyết định khi nào một phân vùng được coi là hoàn thành: tính toán xong, tệp đã đóng, nội dung đã kiểm tra và trạng thái đã được ghi lại. Một tệp đang được ghi không được mang cùng ý nghĩa như một kết quả đã được nghiệm thu. Đồng thời kiểm tra dung lượng thực sự khả dụng trước khi bắt đầu.

3. Giữ một terminal có thể tìm lại khi bối cảnh cho phép

Nếu môi trường cung cấp shell Unix và tmux, trình đa hợp này cho phép tách một terminal và tìm lại nó sau khi kết nối lại. Nó bảo vệ hành trình này khỏi việc mất client kết nối; đây không phải là cơ chế phục hồi sau khi máy khởi động lại hoặc tiến trình bị hủy.

Các lệnh dưới đây mang tính minh họa và không được thực thi. Chúng giả định có Bash, tmux và chương trình traitement.py của riêng bạn, với các tùy chọn như hiển thị; tệp này không phải là tài nguyên được cung cấp. Trước tiên hãy kiểm tra lệnh ngắn của nó và dùng một tên phiên riêng biệt để không nhầm lẫn hai phép tính.

Tạo phiên, rồi chạy khối thứ hai bên trong. Việc tạo thư mục sẽ thất bại nếu nó đã tồn tại, điều này tránh việc âm thầm tái sử dụng nhật ký của nó. Mã trả về được giữ lại nếu shell đạt đến bước ghi; một lần dừng đột ngột có thể ngăn việc tạo tệp này. Do đó, việc thiếu mã không phải là một thành công ngầm định.

Với các phím tắt mặc định, hãy tách bằng Ctrl-b rồi d. Sau khi kết nối lại, liệt kê các phiên rồi gắn lại đúng phiên. Shell có thể vẫn hiển thị trong khi chương trình đã kết thúc: hãy xem nhật ký và mã đã ghi. Đừng khởi động ngay một bản sao thứ hai chỉ vì terminal cũ của bạn đã biến mất.

Tạo một phiên — các lệnh minh họa
tmux new -s campagne-a
Trong phiên — ví dụ cần điều chỉnh, không được thực thi
mkdir -p runs
mkdir runs/campagne-a && (
  code_retour=0
  python -u traitement.py --config config.toml --output runs/campagne-a \
    > runs/campagne-a/execution.log 2>&1 || code_retour=$?
  printf '%s\n' "$code_retour" > runs/campagne-a/exit-code.txt
  exit "$code_retour"
)
Sau khi kết nối lại — tìm lại phiên
tmux ls
tmux attach -t campagne-a

4. Đếm công việc được chấp nhận, không chỉ hoạt động

Tùy chọn Python -u loại bỏ đệm của đầu ra chuẩn và đầu ra lỗi. Nó giúp thấy các thông báo được phát ra, nhưng không tạo ra các sự kiện tiến độ trong ứng dụng. Một thư viện hoặc một bước im lặng vẫn có thể cần được quan sát riêng.

Hãy định nghĩa các giai đoạn dễ hiểu: đọc, chuẩn bị, tính toán, ghi, kiểm tra. Thêm một bộ đếm có đơn vị ổn định, cùng với tổng số khi đã biết. Nếu bạn đếm các phân vùng được chấp nhận, đừng chuyển sang bộ đếm số dòng đã đọc ở giữa nhật ký mà không đổi tên nó.

Ví dụ minh họa sau đây liên quan đến tám phân vùng gồm năm trăm phần tử, tức bốn nghìn phần tử. Tại thời điểm được minh họa, chỉ năm phân vùng được chấp nhận. Phân vùng thứ sáu là một phần và không được làm phồng tổng số. Các con số thể hiện một quy tắc đếm; chúng không mô tả bất kỳ lần thực thi Kernodeck nào.

Cuộn bảng để xem tất cả các cột.
Ảnh chụp minh họa không được thực thi: năm phân vùng được chấp nhận trên tám.
Phân vùngTrạng tháiPhần tử được tính là đã chấp nhậnQuyết định
1 đến 5Đã kiểm tra2 500Giữ nguyên danh tính và kết quả của chúng.
6Ghi một phần0Không thông báo phân vùng này đã hoàn tất.
7 và 8Cần xử lý0Vẫn nằm trong danh sách công việc.
Toàn bộChưa đầy đủ2.500 trên 4.000Không chấp nhận thư mục cuối cùng.

5. Xem xét một khoảng lặng hoặc gián đoạn mà không tạo bản trùng lặp

Khi không có bộ đếm nào nhích lên, hãy xác định giai đoạn cuối cùng đã biết và đơn vị cuối cùng đã hoàn tất. Kiểm tra xem tiến trình có tồn tại không, liệu một thông báo lỗi có xuất hiện không và đích đến còn dùng được không. Việc mô hình khởi động chậm và một vòng lặp bị kẹt có thể tạo ra cùng một màn hình bất động; ngữ cảnh quyết định bước kiểm tra tiếp theo.

Hãy chuẩn bị việc dừng chủ động trong ứng dụng của bạn: yêu cầu dừng, kết thúc một đơn vị an toàn, lưu trạng thái, rồi thoát. Các tín hiệu và gián đoạn phụ thuộc vào hệ thống. Python không thể bắt SIGKILL, và một trình xử lý Python có thể chờ kết thúc một lời gọi native dài trước khi thực thi. Do đó, một bản sao lưu khi dừng không thay thế được các bản sao lưu định kỳ.

Sau khi mất kết nối, trước tiên hãy tìm lại phiên và tiến trình thực thi hiện có. Sau khi xác nhận đã dừng, hãy xác định phần nào hoàn tất và phần nào còn dở. Đối với huấn luyện, việc tiếp tục đòi hỏi các trạng thái chi tiết của mô hình và tối ưu hóa; hướng dẫn riêng kiểm tra trường hợp này trong một tiến trình mới.

6. Chỉ tiếp tục những gì hợp đồng cho phép

Trong ví dụ của chúng ta, việc khôi phục theo phân vùng giả định rằng mỗi phân vùng là độc lập và đầu vào, mã lệnh cùng cấu hình vẫn giữ nguyên. Nó có thể giữ lại năm kết quả đã xác thực và tính lại phân vùng thứ sáu hoàn toàn trước khi tiếp tục hai phân vùng còn lại. Nếu các giả định này không còn đúng, thì cách rút gọn này không có cơ sở để biện minh.

Đừng chỉ đơn thuần thêm các dòng mới vào tệp tạm dở. Bạn có thể tạo ra các bản trùng lặp hoặc trộn lẫn hai cấu hình. Hãy dùng các định danh mong đợi để phân biệt hoàn chỉnh, chưa hoàn chỉnh và vắng mặt. Giữ lại trạng thái cũ như một yếu tố giải thích, với một đích riêng cho lần thử mới.

Hãy kiểm tra chiến lược của bạn trên một lần ngắt có kiểm soát trước khi phụ thuộc vào nó cho một tác vụ lớn. Tiêu chí là sự tương đương của các kết quả hữu ích theo thỏa thuận của bạn, chứ không phải sự trùng khớp của các thông báo tiến trình. Việc huấn luyện, các tính toán có tác động ra bên ngoài và xử lý phân tán đòi hỏi những đảm bảo khác so với ví dụ về các phân vùng độc lập này.

7. Chấp nhận và truy xuất kết quả trước khi kết thúc công việc

Hãy bắt đầu bằng mã trả về, sau đó đối chiếu các đầu ra với bảng kê đầu vào. Với ví dụ của chúng ta, hãy chờ đủ tám phân vùng và bốn nghìn định danh như dự kiến, không thiếu cũng không trùng lặp. Kiểm tra định dạng, kích thước và các giá trị liên quan; việc đọc một tệp không chứng minh rằng nó chứa kết quả đúng.

Hãy truy xuất các đầu ra đã được chấp nhận, cấu hình được phép, các phiên bản và báo cáo kiểm soát. So sánh kích thước và, nếu cần, cả mã băm giữa bản gốc và bản sao. Mã băm trùng khớp giúp xác minh việc truyền các byte; nó không chứng minh chất lượng của mô hình cũng như nguồn gốc hợp pháp của tệp.

Cuối cùng, hãy mở một kết quả từ đích lưu trữ của nó, bằng công cụ sẽ sử dụng nó. Hãy dự trù bước này trước khi quyền truy cập vào tài nguyên tính toán của bạn kết thúc. Công việc chỉ hoàn tất khi kết quả đã kiểm tra có thể truy xuất và diễn giải được, chứ không phải khi phần trăm cuối cùng đạt đến một trăm.

Câu hỏi của bạn

Đóng một kết nối từ xa có luôn dừng quá trình tính toán không?

Không: điều đó phụ thuộc vào cách tiến trình được khởi chạy. Một phiên tmux cho phép tách nó khỏi terminal của máy khách, nếu công cụ đó có sẵn. Sau khi kết nối lại, trước tiên hãy tìm tiến trình đang chạy hiện có trước khi khởi chạy một tiến trình khác.

Mã trả về bằng không có đủ để xác nhận kết quả của tôi không?

Không. Nó cho biết chương trình báo cáo đã kết thúc bình thường. Hãy kiểm tra thêm tính đầy đủ của các định danh, định dạng và các tiêu chí nghiệp vụ đã dự kiến. Một chương trình có thể kết thúc bình thường sau khi đã xử lý một tập hợp con sai.

Một nhật ký bất động có nghĩa là GPU bị treo không?

Không nhất thiết. Chương trình có thể đang chuẩn bị dữ liệu, chờ một thao tác ghi hoặc không phát ra tiến trình. Hãy xác định giai đoạn và trạng thái của tiến trình trước khi quyết định dừng. Một bộ đếm nghiệp vụ rõ ràng hữu ích hơn là chỉ dựa vào sự hiện diện của các thông báo.