เครื่อง GB10 ของเราปิดตัวเองอยู่เรื่อย ๆ บันทึกเหตุการณ์โทษว่ามาจากหน่วยความจำ แต่สาเหตุจริงคือความร้อน
ปฏิบัติการ
หนึ่งในเครื่อง NVIDIA GB10 สามเครื่องของเราดับไปสามครั้งภายในสี่วันในเดือนกันยายน: เมื่อวันที่ 10 กันยายน, วันที่ 12 กันยายน (เครื่องดับนาน 17 ชั่วโมง) และวันที่ 13 กันยายน โดยดับลงหลังจากเปิดเครื่องกลับมาได้เพียง 12 นาที แต่ละครั้งต้องมีคนมากดปุ่มเปิดเครื่อง
ลักษณะของการดับจากความร้อน
ระบบบันทึกเหตุการณ์ (system journal) หยุดทำงานกลางคันโดยไม่มีบันทึกการปิดระบบ: การตัดไฟอย่างกะทันหันไม่เปิดโอกาสให้ journald เขียนข้อมูลในบัฟเฟอร์ลงดิสก์ ในเดือนกรกฎาคม หลังการดับลักษณะเดียวกัน นาฬิกากลับมาพร้อมวันที่เก่า และตัวตรวจสอบระบบ (hardware watchdog) ที่ควรรีสตาร์ทเครื่องเมื่อค้าง กลับไม่ทำงาน เพราะเครื่องไม่ได้ค้าง แต่ไฟฟ้าถูกตัดไป
เบาะแสที่ผิด
บรรทัดสุดท้ายของ kernel ก่อนเครื่องดับทุกครั้งคือข้อผิดพลาดหน่วยความจำ GPU หมด (NV_ERR_NO_MEMORY) ทำให้ดูเหมือนหน่วยความจำคือตัวการ แต่ไม่ใช่ บรรทัดเหล่านั้นเป็นเพียงข้อความที่ kernel เขียนบ่อยที่สุด: มีถึง 440,580 บรรทัดในการบูตหนึ่งครั้งซึ่งรันมานาน 19 วันก่อนจะจบลง เมื่อข้อความปรากฏบ่อยขนาดนั้น มันย่อมเป็นบรรทัดสุดท้ายก่อนเกิดเหตุใด ๆ ก่อนโทษบรรทัดบันทึกเหตุการณ์ ให้ตรวจสอบก่อนว่าบรรทัดนั้นปรากฏบ่อยแค่ไหนในช่วงที่ระบบทำงานปกติ
เบาะแสที่ถูกต้อง
เนื่องจากบันทึกเหตุการณ์จะสูญหายในช่วงนาทีสุดท้ายก่อนการตัดไฟ เราจึงเพิ่มตัวเก็บตัวอย่างข้อมูลขนาดเล็กที่เขียนค่าอุณหภูมิ โหลด และหน่วยความจำลงไฟล์ทุกนาที พร้อมบังคับเขียนลงดิสก์ทันที ตัวนี้จับการดับทั้งห้าครั้งตั้งแต่เดือนกรกฎาคมได้ครบถ้วน ทุกครั้งเกิดขึ้นขณะ GPU ทำงานเต็มกำลัง (96%) โดย CPU มีอุณหภูมิ 85 ถึง 97 °C
จังหวะเวลาอธิบายส่วนที่เหลือ ประมาณต้นเดือนกันยายน เราได้ย้ายงานเรนเดอร์วิดีโอมาไว้บนเครื่องนี้ กำลังไฟของ GPU ขณะทำงานเต็มกำลังเพิ่มขึ้นจากประมาณ 24 W เป็น 46 W อุณหภูมิเฉลี่ยของ GPU เพิ่มขึ้นจาก 68 เป็น 86 °C และจำนวนนาทีต่อสัปดาห์ที่ CPU ร้อนถึง 95 °C ขึ้นไป เพิ่มขึ้นจากไม่มีเลยเป็น 4,283 นาที เครื่อง GB10 อีกสองเครื่องของเราซึ่งรันโมเดลภาษาที่โหลด 96% เท่ากัน ยังคงมีอุณหภูมิ 65 ถึง 81 °C เครื่องนี้เพียงระบายความร้อนได้แย่กว่า
การแก้ไขครั้งแรก: จำกัดสัญญาณนาฬิกา GPU
บน GB10, nvidia-smi ตั้งค่าจำกัดกำลังไฟไม่ได้ แต่จำกัดสัญญาณนาฬิกา GPU ได้: nvidia-smi -lgc 0,2000 ในเดือนกรกฎาคม วิธีนี้ลดอุณหภูมิของจุดที่ร้อนที่สุดจาก 91 °C เหลือ 77 ถึง 83 °C ภายในไม่กี่วินาที มีสองรายละเอียดสำคัญ:
- ใช้ค่าจำกัดนี้ก่อนเริ่มบริการหนัก บริการจำกัดค่าของเราเคยเริ่มทำงานประมาณ 15 วินาทีหลังบูต ซึ่งตอนนั้นเซิร์ฟเวอร์โมเดลเริ่มโหลดข้อมูลเต็มกำลังไปแล้ว นั่นคือช่วงเวลาที่เคยทำให้เครื่องล่ม ตอนนี้มันเริ่มทำงานก่อนที่ Docker จะเริ่ม
- ตรวจสอบภายใต้ภาระงาน เมื่อเปิดใช้ขีดจำกัด นาฬิกา GPU ที่รายงานจะอยู่ที่ประมาณ 2,400 MHz เมื่อ GPU ว่าง แต่ภายใต้ภาระงานจะคงอยู่ที่ 1,976 MHz
การแก้ไขครั้งที่สอง: ตัวจำกัดความปลอดภัยจากความร้อนแบบเป็นขั้น
ขีดจำกัดอย่างเดียวไม่เพียงพอเมื่อเริ่มมีการเรนเดอร์ ดังนั้นตัวจำกัดความปลอดภัยจึงอ่านทุกเซนเซอร์ทุกวินาทีและทำงานเป็นขั้น: ลดนาฬิกา GPU เมื่อถึง 89 °C และลดอีกครั้งเมื่อถึง 92 °C; เมื่อถึง 94 °C จะหยุดตัวเรนเดอร์ชั่วคราว (SIGSTOP) และลดความเร็ว CPU; เมื่อถึง 96 °C จะหยุดงาน GPU ทุกงานชั่วคราวจนกว่าจะเย็นลง มันจะกลับสู่สภาวะปกติก็ต่อเมื่อเครื่องเย็นลงแล้วสักพักหนึ่ง ที่ 97 °C เป็นเวลา 20 วินาที เบรกฉุกเฉินจะหยุดบริการวิดีโอทั้งหมด
ในช่วง 9 นาทีแรกภายใต้การเรนเดอร์ โซนที่ร้อนที่สุดสูงสุดที่ 94 °C โดยมีค่ามัธยฐาน 89 °C เทียบกับที่เคยคงที่ที่ 97 °C ก่อนหน้านี้ มีต้นทุนที่ต้องจ่าย: ในวันที่หนึ่งกลางเดือนกันยายน ตัวเรนเดอร์ถูกหยุดชั่วคราว 17% ของเวลา และ GPU ทำงานที่ 900 MHz หรือน้อยกว่าตลอดทั้งวัน และมันไม่ใช่การรักษาที่หายขาด: เครื่องดับตัวเองอีกครั้งหนึ่งเมื่อวันที่ 11 ตุลาคม ที่อุณหภูมิ 97 ถึง 98 °C นับจากนั้นมันทำงานต่อเนื่องมา 20 วัน ณ เวลาที่เราเขียนข้อความนี้
4 ข้อผิดพลาดที่เราทำระหว่างทาง
- การหยุดงานหนึ่งงานไม่ได้ทำให้เครื่องเย็นลง เบรกทำงานขณะที่ตัวเรนเดอร์ถูกหยุดอยู่แล้ว เนื่องจากโมเดลภาพยังทำงานอยู่และตัวจับเวลาหลายสิบตัวเริ่มทำงานในนาทีเดียวกัน ขั้นสูงสุดตอนนี้หยุดงาน GPU หนักทุกงาน ไม่ใช่แค่ตัวเรนเดอร์
- ตัวจำกัดความปลอดภัยหยุดงานตามชื่อ และชื่อเหล่านั้นเปลี่ยนไป สองครั้งที่เอนจินใหม่จะหลุดจากการถูกหยุด: โมเดลภาพที่มีชื่อโปรเซสใหม่ในเดือนกันยายน และในเดือนตุลาคม ตัวเรนเดอร์ที่ทำงานในคอนเทนเนอร์แทนที่จะเป็นโปรเซสย่อยของบริการเรนเดอร์ การเปลี่ยนเอนจินทุกครั้งตอนนี้ต้องตรวจสอบรายการของตัวจำกัดความปลอดภัยด้วย
- สถานะล็อกของเบรกไม่เคยถูกปลด มันหยุดบริการวิดีโอและทิ้งไฟล์ล็อกไว้เพื่อไม่ให้สิ่งใดเริ่มใหม่ ไม่มีสิ่งใดแจ้งเตือนใคร และผลลัพธ์หยุดไป 3 วันก่อนที่เราจะสังเกตเห็น ตอนนี้สถานะล็อกจะปลดตัวเอง: 5 นาทีหลังจากเบรกครั้งสุดท้าย โดยไม่มีเบรกใหม่ มีหน่วยความจำว่างอย่างน้อย 30 GB และค่าเฉลี่ย 10 นาทีของอุณหภูมิ 93 °C หรือน้อยกว่า การรอให้เครื่องเย็นลงไม่เคยได้ผล: มันมีค่าเฉลี่ย 88 °C ทั้งตอนเรนเดอร์และไม่เรนเดอร์
- สัญญาณเตือนดังขึ้นที่อุณหภูมิปกติของเครื่อง ค่าเกณฑ์การแจ้งเตือนอยู่ที่ 88 °C ซึ่งเป็นค่าเฉลี่ยของเครื่องนี้ ตลอดหนึ่งวัน เครื่องทำงานที่อุณหภูมิ 90 °C ขึ้นไปคิดเป็น 32% ของเวลา, 93 °C ขึ้นไปคิดเป็น 8% และ 95 °C ขึ้นไปคิดเป็น 3% โดยไม่เคยถึง 97 °C เราปรับสัญญาณเตือนเป็น 97 °C ซึ่งเป็นจุดคงที่ที่เครื่องดับจริง และอีเมลแจ้งเตือนก็หยุดลง
บทสรุป
ซอฟต์แวร์ช่วยให้เครื่องนี้ทำงานต่อได้ แต่สาเหตุเป็นเชิงกายภาพ: ระบบระบายความร้อนของมันแย่กว่าเครื่องรุ่นเดียวกันสองถึงสามเท่า หากเครื่อง GB10 ดับเองขณะรับโหลด ให้ตรวจสอบการไหลของอากาศก่อน จากนั้นจำกัดสัญญาณนาฬิกา GPU ก่อนที่บริการของคุณจะเริ่ม หยุดงานหนักก่อนที่เครื่องจะถึงขีดจำกัด และตั้งค่าสัญญาณเตือนจากอุณหภูมิที่เครื่องทำงานจริง
Factory Floor มีตัวจำกัดความปลอดภัยด้านความร้อนแบบนี้: มันอ่านค่าอุณหภูมิสูงสุดจากเซ็นเซอร์ GPU และโซนความร้อน, หยุดงานหนักที่คุณระบุไว้ที่อุณหภูมิที่กำหนด (ค่าเริ่มต้น 92 °C) และเริ่มงานต่อเฉพาะเมื่ออุณหภูมิต่ำกว่าค่าที่กำหนดไว้ต่ำกว่า (84 °C) โดยมีตัวจำกัดความปลอดภัยสำหรับหน่วยความจำและดิสก์อยู่ข้างเคียง