چرا خروجی هوش مصنوعی حتی با دمای صفر بازم فرق میکنه؟
خلاصهٔ کاملتر
پائولو پرونه از نشریه The AI Engineer میگه حتی وقتی دمای مدل رو صفر میذاری، یعنی مدل باید همیشه پراحتمالترین کلمه رو انتخاب کنه، جوابها بازم فرق میکنن. آزمایشگاه Thinking Machines هزار درخواست یکسان با دمای صفر فرستاد و ۸۰ تا جواب متفاوت گرفت؛ همهشون تا کلمهی ۱۰۲ام دقیقاً یکی بودن و درست سر کلمهی ۱۰۳ام از هم جدا شدن.
دو راهحل معمول جواب نمیده. تنظیم سید فقط وقتی اثر داره که مدل بین چند گزینه با تصادف انتخاب کنه؛ ولی تو دمای صفر اصلاً انتخاب تصادفی وجود نداره. فلگهای «قطعیت» پایتورچ هم فقط تضمین میکنن یه عملیات تو شرایط یکسان همون نتیجه رو بده، در حالی که دو اجرای شما تو شرایط متفاوت (یه سرور خلوت و یه سرور شلوغ) انجام شده. مشکل یه لایه پایینتره: تو خود جمع زدن اعداد.
کامپیوتر عدد رو با تعداد رقم محدود ذخیره میکنه، درست مثل یه ترازوی آشپزخونه که فقط سه رقم نشون میده. اگه دو کیلو آرد روش بذاری و بعد یه ذره نمک اضافه کنی، عدد همون ۲.۰۰ میمونه چون رقمی که نمک باید توش جا بشه اصلاً وجود نداره؛ ولی اگه اول نمک رو تنها وزن کنی و بعد آرد رو کم کنی، نمک باقی میمونه:
(0.1 + 1e20) - 1e20 # 0.0
0.1 + (1e20 - 1e20) # 0.1همین سه عدد، فقط با عوض شدن ترتیب جمع، دو جواب متفاوت میده.
یه GPU هیچوقت یه ستون عدد طولانی رو از بالا به پایین جمع نمیزنه؛ اون رو به چند تکه تقسیم میکنه، هر تکه رو به یه گروه از هستهها میده و آخر سر جمع تکهها رو با هم جمع میکنه. تعداد این تکهها به میزان کار همون لحظه سرور بستگی داره؛ یعنی وقتی درخواستهای بیشتری با هم میرسن، سرور دسته (batch) بزرگتری میسازه، تکهبندی عوض میشه، ترتیب جمع عوض میشه و نتیجهی نهایی هم فرق میکنه؛ گاهی همین اختلاف کوچیک کافیه که کلمهی برنده عوض بشه.
راهحلش کرنلهای «batch-invariant»ه، یعنی کرنلهایی که همیشه یه ستون رو به همون تعداد ثابت تکه تقسیم میکنن، فارغ از اینکه چند درخواست دیگه همزمان تو صف هستن. vLLM و SGLang این حالت رو دارن ولی پیشفرض خاموشه، چون گرون تموم میشه: Thinking Machines با روشنش کردن حدود ۳۸ درصد کمتر درخواست تو ساعت جواب داد، و SGLang بین ۲۴ تا ۵۵ درصد تأخیر اضافه اندازهگیری کرد. مدلهای Mixture-of-Experts هنوز پشتیبانی نمیشن، و TensorRT-LLM اصلاً همچین حالتی نداره.
توصیهی نویسنده اینه: این حالت رو فقط برای جاهایی روشن کن که «تکرارپذیر بودن» خود محصوله، مثل ارزیابی مدل (eval)، یادگیری تقویتی، ممیزی ایمنی و رفع باگ؛ برای چت و کدنویسی روزمره خاموشش بذار چون سرعت مهمتره. یه نکته مهم: این حالت رو کل دستهی درخواستها میگیره، پس اگه یه کاربر جواب تکرارپذیر بخواد، همهی کاربرای همدستهش هزینهی تأخیرش رو میدن؛ بهتره ترافیک تکرارپذیر یه اندپوینت جدا داشته باشه.
نکات کلیدی:
- تو آزمایش Thinking Machines، هزار درخواست یکسان با دمای صفر ۸۰ جواب متفاوت داد.
- علت اصلی، ترتیب متغیر جمع اعداد اعشاریه که به تکهبندی GPU و حجم ترافیک سرور بستگی داره.
- فعالکردن کرنلهای batch-invariant تو vLLM و SGLang تکرارپذیری میده ولی حدود ۳۸ درصد سرعت رو کم میکنه.
- مدلهای Mixture-of-Experts هنوز پشتیبانی نمیشن و TensorRT-LLM اصلاً این حالت رو نداره.
- توصیه: قطعیت فقط برای eval/RL/ممیزی روشن بشه، نه ترافیک عادی چت.




