Máy GB10 của chúng tôi tự động tắt nguồn. Nhật ký đổ lỗi cho bộ nhớ; nhưng nguyên nhân thực sự là nhiệt độ
Vận hành
Một trong ba máy NVIDIA GB10 của chúng tôi đã ngừng hoạt động ba lần trong bốn ngày vào tháng Chín: vào ngày 10 tháng Chín, ngày 12 tháng Chín (máy tắt trong 17 giờ) và ngày 13 tháng Chín, mười hai phút sau khi được bật lại. Mỗi lần như vậy đều cần có người nhấn nút nguồn.
Dấu hiệu của sự cố tắt máy do quá nhiệt
Nhật ký hệ thống đơn giản là dừng lại giữa chừng, không có dòng nào ghi nhận việc tắt máy: một lần mất điện đột ngột không cho journald đủ thời gian để ghi bộ đệm. Vào tháng Bảy, sau một sự cố tương tự, đồng hồ thậm chí còn hiển thị ngày cũ. Và bộ giám sát phần cứng, vốn khởi động lại máy khi bị treo, đã không làm gì, vì máy không bị treo: nguồn điện đã bị cắt.
Manh mối sai
Những dòng kernel cuối cùng trước mỗi lần máy chết đều là lỗi hết bộ nhớ GPU (NV_ERR_NO_MEMORY), nên bộ nhớ trông có vẻ là thủ phạm. Nhưng không phải vậy. Những dòng đó chỉ là thứ kernel ghi ra thường xuyên nhất: 440.580 dòng trong một lần khởi động chạy suốt 19 ngày trước khi kết thúc. Khi một dòng xuất hiện thường xuyên như vậy, nó sẽ là dòng cuối cùng trước bất kỳ sự cố nào. Trước khi đổ lỗi cho một dòng nhật ký, hãy đếm xem nó xuất hiện bao nhiêu lần khi mọi thứ vẫn hoạt động bình thường.
Manh mối đúng
Vì nhật ký mất những phút cuối cùng khi mất điện, chúng tôi đã thêm một bộ lấy mẫu nhỏ ghi nhiệt độ, tải và bộ nhớ vào một tệp mỗi phút và ghi ngay xuống đĩa. Nó đã bắt được cả năm lần máy chết kể từ tháng Bảy. Mỗi lần đều xảy ra khi GPU chạy hết tải (96%), với CPU ở mức 85 đến 97 °C.
Thời điểm đã giải thích phần còn lại. Khoảng đầu tháng Chín, chúng tôi đã chuyển việc kết xuất video sang máy này. Công suất GPU khi chạy hết tải tăng từ khoảng 24 W lên 46 W, nhiệt độ GPU trung vị tăng từ 68 lên 86 °C, và số phút mỗi tuần mà CPU đạt 95 °C trở lên tăng từ không có đến 4.283 phút. Hai máy GB10 còn lại của chúng tôi, vốn chạy mô hình ngôn ngữ ở cùng mức tải 96%, vẫn giữ ở mức 65 đến 81 °C. Máy này đơn giản là tản nhiệt kém hơn.
Giải pháp đầu tiên: giới hạn xung nhịp GPU
Trên GB10, nvidia-smi không thể đặt giới hạn công suất, nhưng có thể giới hạn xung nhịp GPU: nvidia-smi -lgc 0,2000. Vào tháng Bảy, điều này đã giảm nhiệt độ vùng nóng nhất từ 91 °C xuống còn 77 đến 83 °C chỉ trong vài giây. Hai chi tiết quan trọng:
- Áp dụng trước khi các dịch vụ nặng khởi động. Dịch vụ giới hạn của chúng tôi ban đầu chạy khoảng 15 giây sau khi khởi động, khi máy chủ mô hình đã bắt đầu tải ở công suất tối đa, chính là thời điểm khiến máy bị sập. Bây giờ nó chạy trước khi Docker khởi động.
- Kiểm tra khi tải cao. Khi bật giới hạn, xung GPU được báo cáo vẫn đọc khoảng 2.400 MHz khi GPU nhàn rỗi. Khi tải cao, nó duy trì ở mức 1.976 MHz.
Giải pháp thứ hai: một bộ bảo vệ nhiệt theo từng bước
Giới hạn không đủ khi chuyển sang giai đoạn render, vì vậy một bộ bảo vệ hiện đọc mọi cảm biến mỗi giây một lần và hành động theo từng bước: giảm xung GPU từ 89 °C và giảm thêm một lần nữa từ 92 °C; từ 94 °C, trình render bị tạm dừng (SIGSTOP) và CPU bị làm chậm; từ 96 °C, mọi tác vụ GPU bị tạm dừng trong vài giây để làm mát. Nó chỉ quay lại trạng thái cũ sau khi máy đã duy trì nhiệt độ thấp hơn trong một khoảng thời gian. Ở 97 °C trong 20 giây, một phanh khẩn cấp cuối cùng sẽ dừng hoàn toàn dịch vụ video.
Trong chín phút đầu tiên khi render, vùng nóng nhất đạt đỉnh 94 °C với mức trung vị 89 °C, so với các mức plateau 97 °C trước đây. Nó có cái giá: vào một ngày giữa tháng Chín, trình render bị tạm dừng 17% thời gian, và GPU chạy ở 900 MHz hoặc thấp hơn trong phần lớn thời gian trong ngày. Và nó không phải là một giải pháp triệt để: máy đã tự tắt một lần nữa, vào ngày 11 tháng Mười, ở 97 đến 98 °C. Nó đã chạy liên tục kể từ đó, 20 ngày tính đến thời điểm chúng tôi viết bài này.
Bốn sai lầm chúng tôi đã mắc phải trên đường đi
- Tạm dừng một tác vụ không làm mát được máy. Phanh đã kích hoạt khi trình render đã bị tạm dừng, vì một mô hình hình ảnh vẫn đang xử lý và hàng tá bộ hẹn giờ bắt đầu trong cùng một phút. Bước cao nhất hiện tạm dừng mọi tác vụ GPU nặng, không chỉ riêng trình render.
- Bộ bảo vệ tạm dừng các tác vụ theo tên, và các tên đã thay đổi. Hai lần một engine mới có thể đã thoát khỏi việc tạm dừng: một mô hình hình ảnh với tên tiến trình mới vào tháng Chín, và vào tháng Mười một trình render chạy trong một container thay vì là tiến trình con của dịch vụ render. Mọi thay đổi engine hiện đều bao gồm việc xem xét danh sách của bộ bảo vệ.
- Giữ phanh không bao giờ được giải phóng. Nó dừng dịch vụ video và để lại một tệp giữ để không gì khởi động lại nó. Cũng không có cảnh báo nào cho ai, và đầu ra đã dừng trong ba ngày trước khi chúng tôi nhận ra. Việc giữ hiện tự động giải phóng: năm phút sau lần phanh cuối cùng, không có phanh mới, ít nhất 30 GB bộ nhớ trống và mức trung bình 10 phút là 93 °C hoặc thấp hơn. Chờ máy hạ nhiệt sẽ không bao giờ hiệu quả: nó trung bình 88 °C khi có và không có render.
- Cảnh báo reo ở nhiệt độ bình thường của máy. Ngưỡng cảnh báo là 88 °C, vốn là mức trung bình của máy này. Trong một ngày, máy dành 32% thời gian ở mức 90 °C trở lên, 8% ở mức 93 °C trở lên và 3% ở mức 95 °C trở lên, và không bao giờ đạt tới 97 °C. Chúng tôi đã chuyển ngưỡng cảnh báo lên 97 °C, mức bình nguyên nơi máy thực sự ngừng hoạt động, và các email cảnh báo đã ngừng gửi.
Bài học rút ra
Phần mềm đã giữ cho máy này hoạt động, nhưng nguyên nhân là vật lý: hệ thống tản nhiệt của nó kém hơn hai đến ba lần so với các máy cùng dòng. Nếu một máy GB10 tự tắt khi chịu tải, hãy kiểm tra luồng khí trước. Sau đó, giới hạn xung nhịp GPU trước khi các dịch vụ của bạn khởi động, tạm dừng các tác vụ nặng trước khi máy đạt tới giới hạn, và đặt cảnh báo dựa trên các mức nhiệt độ mà máy thực sự vận hành.
Factory Floor bao gồm một bộ bảo vệ nhiệt kiểu này: nó đọc cảm biến nóng nhất trong số các cảm biến GPU và vùng nhiệt, tạm dừng các tác vụ nặng do bạn chỉ định ở một mức nhiệt độ nhất định (mặc định là 92 °C) và chỉ tiếp tục lại khi nhiệt độ thấp hơn một ngưỡng khác (84 °C), cùng với các bộ bảo vệ bộ nhớ và ổ đĩa đi kèm.