ماشین GB10 ما خودش خاموش میشد. لاگ، حافظه را مقصر میدانست؛ اما مشکل حرارت بود
عملیات
یکی از سه ماشین NVIDIA GB10 ما در چهار روز ماه سپتامبر سه بار خاموش شد: در 10 سپتامبر، در 12 سپتامبر (17 ساعت خاموش ماند) و در 13 سپتامبر، دوازده دقیقه پس از روشن شدن مجدد. هر بار برای روشن کردن آن نیاز به حضور یک نفر برای فشردن دکمه پاور بود.
خاموشی ناشی از حرارت چگونه به نظر میرسد
ژورنال سیستم دقیقاً در میانه فعالیت متوقف شد و هیچ رکورد خاموشی در آن وجود نداشت: قطع ناگهانی برق به journald فرصت نوشتن بافر خود را نمیدهد. در ماه ژوئیه، پس از یک خاموشی مشابه، ساعت حتی با تاریخ قدیمی بازگشت. و واچداگ سختافزاری که ماشینهای هنگکرده را ریستارت میکند، کاری نکرد؛ زیرا ماشین هنگ نکرده بود: برق قطع شده بود.
سرنخ اشتباه
آخرین خطوط کرنل پیش از هر خاموشی، خطاهای کمبود حافظه GPU (NV_ERR_NO_MEMORY) بودند، بنابراین حافظه مقصر به نظر میرسید. اما چنین نبود. آن خطوط صرفاً رایجترین چیزی بودند که کرنل مینوشت: 440,580 مورد از آنها در یک بوت که 19 روز قبل از پایان کارش اجرا شده بود. وقتی خطی به این فراوانی ظاهر میشود، همیشه آخرین خط پیش از هر اتفاقی خواهد بود. پیش از سرزنش یک خط لاگ، بشمارید که چه بسا دفعات در حالت عادی و بدون بروز مشکل ظاهر میشود.
سرنخ درست
چون ژورنال در زمان قطع برق، دقایق پایانی خود را از دست میدهد، ما یک نمونهبردار کوچک اضافه کرده بودیم که دما، بار و حافظه را هر دقیقه در یک فایل مینویسد و روی دیسک ذخیره میکند. این ابزار هر پنج خاموشی از ماه ژوئیه به بعد را ثبت کرد. همه آنها در بار کامل GPU (96٪) رخ دادند، در حالی که دمای CPU بین 85 تا 97 درجه سانتیگراد بود.
زمانبندی، بقیه ماجرا را توضیح داد. حدود اوایل سپتامبر، رندر ویدیو را به این ماشین منتقل کرده بودیم. توان GPU آن در بار کامل از حدود 24 وات به 46 وات رسید، دمای میانی GPU از 68 به 86 درجه سانتیگراد افزایش یافت و دقایق در هفته با دمای CPU 95 درجه سانتیگراد یا بیشتر از صفر به 4,283 رسید. دو ماشین GB10 دیگر ما که مدل زبانی را با همان بار 96٪ اجرا میکنند، در دمای 65 تا 81 درجه سانتیگراد باقی ماندند. این ماشین صرفاً خنککنندگی ضعیفتری داشت.
راهحل اول: سقفگذاری کلاک GPU
در GB10، ابزار nvidia-smi نمیتواند محدودیت توان تنظیم کند، اما میتواند کلاک GPU را سقفگذاری کند: nvidia-smi -lgc 0,2000. در ماه ژوئیه، این کار دمای داغترین ناحیه را در عرض چند ثانیه از 91 درجه سانتیگراد به 77 تا 83 درجه سانتیگراد کاهش داد. دو نکته مهم است:
- آن را پیش از راهاندازی سرویسهای سنگین اعمال کنید. سرویس سقفگذاری ما ابتدا حدود 15 ثانیه پس از بوت اجرا میشد، زمانی که سرور مدل از پیش با توان کامل شروع به بارگذاری کرده بود؛ همان لحظهای که باعث کرش ماشین شده بود. اکنون این سرویس پیش از راهاندازی Docker اجرا میشود.
- آن را زیر بار آزمایش کنید. با فعال بودن سقف، کلاک گزارششده GPU همچنان حدود 2,400 مگاهرتز را نشان میدهد وقتی GPU بیکار است. زیر بار، روی 1,976 مگاهرتز ثابت میماند.
رفع دوم: یک محافظ حرارتی بهصورت مرحلهای
سقف کافی نبود، بهمحض اینکه رندرینگ اضافه شد، بنابراین اکنون یک محافظ هر سنسور را یک بار در ثانیه میخواند و بهصورت مرحلهای عمل میکند: کاهش کلاک GPU از 89 درجه سانتیگراد و کاهش مجدد از 92 درجه سانتیگراد؛ از 94 درجه سانتیگراد، رندرر متوقف میشود (SIGSTOP) و سرعت CPU کم میشود؛ از 96 درجه سانتیگراد، هر کار GPU برای مدتی که لازم است تا خنک شود، متوقف میشود. تنها پس از آنکه دستگاه مدتی خنک بماند، مراحل به عقب برمیگردند. در 97 درجه سانتیگراد به مدت 20 ثانیه، یک ترمز آخرینتلاش، سرویس ویدیو را بهطور کامل متوقف میکند.
در نه دقیقه اول زیر بار رندرینگ، گرمترین ناحیه به اوج 94 درجه سانتیگراد با میانه 89 درجه سانتیگراد رسید، در مقابل فلاتهای 97 درجه سانتیگراد در گذشته. این کار هزینهای دارد: در یک روز از اواسط سپتامبر، رندرر برای 17٪ از زمان متوقف بود و GPU بیشتر روز با 900 مگاهرتز یا کمتر کار کرد. و این درمان قطعی نیست: دستگاه یک بار دیگر، در 11 اکتبر، در دمای 97 تا 98 درجه سانتیگراد خودش را خاموش کرد. از آن زمان تا لحظه نگارش این متن، 20 روز بدون وقفه کار کرده است.
چهار اشتباهی که در مسیر مرتکب شدیم
- توقف یک کار، دستگاه را خنک نکرد. ترمز فعال شد در حالی که رندرر از قبل متوقف بود، زیرا یک مدل تصویر هنوز در حال ترسیم بود و دهها تایمر در همان دقیقه شروع به کار کردند. مرحله بالا اکنون هر کار سنگین GPU را متوقف میکند، نه فقط رندرر را.
- محافظ، کارها را بر اساس نام متوقف میکند و نامها تغییر کرده بودند. دو بار پیش آمد که یک موتور جدید از توقف فرار میکرد: یک مدل تصویر با نام پروسه جدید در سپتامبر، و در اکتبر یک رندرر که بهجای فرزند سرویس رندر، در یک کانتینر اجرا میشد. اکنون هر تغییر موتور شامل بررسی لیست محافظ است.
- نگهداری ترمز هرگز برداشته نشد. سرویس ویدیو را متوقف کرد و یک فایل نگهدارنده (hold) باقی گذاشت تا هیچچیز آن را دوباره راهاندازی نکند. هیچکس نیز هشدار دریافت نکرد و خروجی برای سه روز متوقف شد تا اینکه متوجه شدیم. اکنون نگهدارنده بهطور خودکار برداشته میشود: پنج دقیقه پس از آخرین ترمز، بدون ترمز جدید، حداقل 30 گیگابایت حافظه آزاد و میانگین دهدقیقهای 93 درجه سانتیگراد یا کمتر. صبر کردن برای خنک شدن دستگاه هرگز جواب نمیداد: با و بدون رندرینگ، میانگین 88 درجه سانتیگراد داشت.
- آلارم در دمای عادی دستگاه به صدا درآمد. آستانه هشدار 88 درجه سانتیگراد بود که میانگین دمای همین دستگاه است. در طول یک روز، 32٪ زمان را در دمای 90 درجه سانتیگراد یا بالاتر، 8٪ در 93 درجه سانتیگراد یا بالاتر و 3٪ در 95 درجه سانتیگراد یا بالاتر سپری کرد و هرگز به 97 درجه سانتیگراد نرسید. ما آلارم را به 97 درجه سانتیگراد، همان نقطهای که واقعاً از کار افتاد، منتقل کردیم و ایمیلهای هشدار متوقف شدند.
نکته کلیدی
نرمافزار این دستگاه را زنده نگه داشت، اما علت فیزیکی بود: سیستم خنککننده آن دو تا سه برابر ضعیفتر از دستگاههای همخانوادهاش بود. اگر یک دستگاه GB10 تحت بار خودبهخود خاموش میشود، ابتدا جریان هوا را بررسی کنید. سپس کلاک GPU را قبل از شروع سرویسهایتان محدود کنید، کارهای سنگین را قبل از رسیدن دستگاه به حد مجاز متوقف کنید و آلارمها را بر اساس دماهایی که دستگاه واقعاً در آنها کار میکند تنظیم کنید.
Factory Floor شامل یک محافظ حرارتی از این نوع است: گرمترین سنسور از میان سنسورهای GPU و ناحیه حرارتی را میخواند، کارهای سنگینی که شما نام میبرید را در یک دمای مشخص (بهطور پیشفرض 92 درجه سانتیگراد) متوقف میکند و آنها را تنها در دمایی پایینتر (84 درجه سانتیگراد) از سر میگیرد، در کنار محافظهای حافظه و دیسک.