۶ کیو· متوسطمتوسطPYTHON۴ ثانیه · ۲۵۶ مگابایت
نیمدقت و مقیاسدهی زیان
در آموزش با دقت مختلط (mixed precision) بخشی از محاسبه با float16 انجام میشود: دو برابر سریعتر و نصف حافظه، ولی بازهی عددهایش کوچک است. کوچکترین عدد مثبت float16 حدود است و بزرگترینش ۶۵۵۰۴. گرادیانی کوچکتر از نصف آن کوچکترین عدد، در float16 صفر میشود (underflow) و آن بهروزرسانی گم میشود.
چارهی torch.cuda.amp.GradScaler: زیان را پیش از backward در عدد بزرگی مثل ضرب کن، تا همهی گرادیانها برابر شوند و از ناحیهی صفر بیرون بیایند؛ پیش از گام بهینهساز تقسیم بر کن.
تابع fp16_report(g, scale) گرادیانهای g (همه غیرصفر) را میگیرد و سه نسبت برمیگرداند:
- نسبت گرادیانهایی که با تبدیل مستقیم به
np.float16صفر میشوند؛ - همان نسبت وقتی اول در
scaleضرب و بعد تبدیل میشوند؛ - نسبت گرادیانهایی که بعد از ضرب در
scaleو تبدیل، بینهایت میشوند (overflow) — دلیل اینکهGradScalerاگر بینهایت دید آن گام را رد میکند و را کوچک میکند.
نمونهها
ورودی نمونه ۱
[[-0.0491, 1.98e-06, 5.9e-05, 1.95e-10, -0.00816, -4.47e-05, 2.9e-07, 0.019, -1.53e-07, -5.78e-06, 2.56e-09, -1.71e-06], 1024.0]
خروجی نمونه ۱
[0.1667, 0.0, 0.0]
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود