تنسيق الفاصلة العائمة bfloat16
تنسيق bfloat16 ( الفاصلة العائمة للدماغ ) [ 1 ] [ 2 ] هو تنسيق عددي حاسوبي يشغل 16 بت في ذاكرة الحاسوب ؛ وهو يُمثل نطاقًا ديناميكيًا واسعًا من القيم العددية باستخدام نظام الفاصلة العائمة. هذا التنسيق هو نسخة مختصرة (16 بت) من تنسيق الفاصلة العائمة أحادي الدقة IEEE 754 ذي 32 بت (binary32)، وذلك بهدف تسريع التعلم الآلي والحوسبة القريبة من أجهزة الاستشعار . [ 3 ] يحافظ هذا التنسيق على النطاق الديناميكي التقريبي لأعداد الفاصلة العائمة ذات 32 بت من خلال الاحتفاظ بـ 8 بتات للأس ، ولكنه يدعم دقة 8 بتات فقط بدلًا من 24 بت للمعامل في تنسيق binary32. وبشكل أكبر من أعداد الفاصلة العائمة أحادية الدقة ذات 32 بت، فإن أعداد bfloat16 غير مناسبة لإجراء العمليات الحسابية الصحيحة، ولكن هذا ليس استخدامها المقصود. يُستخدم Bfloat16 لتقليل متطلبات التخزين وزيادة سرعة حساب خوارزميات التعلم الآلي. [ 4 ]
تم تطوير تنسيق bfloat16 بواسطة Google Brain ، وهو فريق بحث في مجال الذكاء الاصطناعي تابع لشركة Google، لاستخدامه في وحدة معالجة TPU v2 الخاصة بها ، والتي تم إصدارها في عام 2017. [ 1 ] ويتم استخدامه في العديد من وحدات المعالجة المركزية ووحدات معالجة الرسومات ومعالجات الذكاء الاصطناعي ، مثل معالجات Intel Xeon ( امتدادات AVX-512 BF16)، ووحدة معالجة الرسومات Intel Data Center، وIntel Nervana NNP-L1000، ووحدات FPGA من Intel ، [ 5 ] [ 6 ] [ 7 ] وAMD Zen و AMD Instinct ووحدات معالجة الرسومات NVIDIA ووحدات معالجة TPU من Google Cloud ، [ 8 ] [ 9 ] [ 10 ] و AWS Inferentia وAWS Trainium و ARMv8.6-A ، [ 11 ] و M2 من Apple [ 12 ] وبالتالي رقائق A15 وما بعدها. تدعم العديد من المكتبات نوع البيانات bfloat16، مثل CUDA ، [ 13 ] ومكتبة Intel oneAPI Math Kernel ، و AMD ROCm ، [ 14 ] ومكتبات AMD Optimizing CPU، و PyTorch ، و TensorFlow . [ 10 ] [ 15 ] على هذه المنصات، يمكن أيضًا استخدام bfloat16 في العمليات الحسابية المختلطة الدقة ، حيث يمكن إجراء عمليات على أعداد bfloat16 وتوسيعها لتشمل أنواع بيانات أوسع.
تنسيق الفاصلة العائمة bfloat16
يحتوي bfloat16 على التنسيق التالي:
- بت الإشارة : 1 بت
- عرض الأس : 8 بت
- دقة الجزء المهم : 8 بتات (7 بتات مخزنة صراحةً، مع بت بادئ ضمني )، مقابل 24 بتًا في تنسيق الفاصلة العائمة أحادي الدقة الكلاسيكي
يُتيح تنسيق bfloat16، وهو اختصار لتنسيق IEEE 754 أحادي الدقة ذي 32 بت، التحويل السريع من وإلى هذا التنسيق. عند التحويل إلى تنسيق bfloat16، تُحفظ بتات الأس، بينما يُمكن تقليص حقل المعامل عن طريق الاقتطاع (أي التقريب نحو الصفر ) أو آليات التقريب الأخرى ، مع تجاهل حالة NaN . ويُحافظ حفظ بتات الأس على نطاق العدد العشري ذي 32 بت، والذي يتراوح بين ≈ 10⁻³⁸ و ≈ 3 × 10³⁸ . [ 16 ]
تم ترتيب الأجزاء على النحو التالي:
| دقة نصفية IEEE 16 بت عائم | ||||||||||||||||||||||||||||||||||
| لافتة | الأس (5 بت) | كسر (10 بت) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||
| 15 | 14 | 10 | 9 | 0 | ||||||||||||||||||||||||||||||
| bfloat16 | ||||||||||||||||||||||||||||||||||
| لافتة | الأس (8 بت) | كسر (7 بت) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||
| 15 | 14 | 7 | 6 | 0 | ||||||||||||||||||||||||||||||
| TensorFloat-32 من Nvidia (19 بت) | ||||||||||||||||||||||||||||||||||
| لافتة | الأس (8 بت) | كسر (10 بت) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||||||||||||
| 18 | 17 | 10 | 9 | 0 | ||||||||||||||||||||||||||||||
| تنسيق fp24 الخاص بشركة ATI [ 17 ] | ||||||||||||||||||||||||||||||||||
| لافتة | الأس (7 بت) | كسر (16 بت) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||
| 23 | 22 | 16 | 15 | 0 | ||||||||||||||||||||||||||||||
| تنسيق PXR24 من بيكسار | ||||||||||||||||||||||||||||||||||
| لافتة | الأس (8 بت) | كسر (15 بت) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||
| 23 | 22 | 15 | 14 | 0 | ||||||||||||||||||||||||||||||
| معيار IEEE 754 أحادي الدقة 32 بت عائم | ||||||||||||||||||||||||||||||||||
| لافتة | الأس (8 بت) | كسر (23 بت) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||
| 31 | 30 | 23 | 22 | 0 | ||||||||||||||||||||||||||||||
ترميز الأس
يتم ترميز الأس الثنائي ذي الفاصلة العائمة bfloat16 باستخدام تمثيل ثنائي الإزاحة ، حيث تكون إزاحة الصفر 127؛ والمعروف أيضًا باسم انحياز الأس في معيار IEEE 754.
- E min = 01 H −7F H = −126
- E max = FE H −7F H = 127
- الانحياز الأسي = 7F H = 127
وبالتالي، من أجل الحصول على الأس الحقيقي كما هو محدد بواسطة التمثيل الثنائي للإزاحة، يجب طرح الإزاحة 127 من قيمة حقل الأس.
يتم تفسير القيم الدنيا والقصوى لحقل الأس (00 H و FF H ) بشكل خاص، كما هو الحال في تنسيقات معيار IEEE 754.
| الأس | القيمة المعنوية صفر | قيمة غير صفرية ذات دلالة إحصائية | معادلة |
|---|---|---|---|
| ٠٠ ساعة | صفر ، -0 | أعداد دون المستوى الطبيعي | (−1) رقم الإشارة × 2 −126 × 0.أرقام الإشارة |
| 01 H ، ...، FE H | القيمة المعيارية | (−1) بت الإشارة × 2 بتات الأس −127 × 1 بتات المعامل | |
| إف إف إتش | ± ما لا نهاية | NaN (هادئ، إشارة) | |
القيمة الطبيعية الموجبة الدنيا هي 2 −126 ≈ 1.18 × 10 −38 والقيمة الموجبة الدنيا (دون الطبيعية) هي 2 −126−7 = 2 −133 ≈ 9.2 × 10 −41 .
التقريب والتحويل
يُعدّ التحويل بين تنسيق IEEE 754 الثنائي ذي 32 بت وتنسيق bfloat16 الاستخدام الأكثر شيوعًا. يصف القسم التالي عملية التحويل وآلية التقريب المستخدمة فيها. تجدر الإشارة إلى وجود سيناريوهات أخرى محتملة لتحويل التنسيقات من وإلى bfloat16، مثل التحويل بين int16 و bfloat16.
- من binary32 إلى bfloat16. عند تقديم bfloat16 لأول مرة كصيغة تخزين، [ 15 ] كانت عملية التحويل من binary32 (الفاصلة العائمة 32 بت) وفقًا لمعيار IEEE 754 إلى bfloat16 تتم عن طريق التقريب ( التقريب نحو الصفر ). لاحقًا، عندما أصبح مدخلًا لوحدات ضرب المصفوفات، يمكن أن تتضمن عملية التحويل آليات تقريب مختلفة اعتمادًا على منصات الأجهزة. على سبيل المثال، في وحدة معالجة Tensor من جوجل (Google TPU)، تكون آلية التقريب في التحويل هي التقريب إلى أقرب عدد زوجي؛ [ 18 ] بينما تستخدم ARM وضع التقريب إلى عدد فردي غير متوافق مع معيار IEEE؛ [ 19 ] أما NVIDIA، فتدعم تحويل الأعداد العشرية إلى دقة bfloat16 في وضع التقريب إلى أقرب عدد زوجي. [ 20 ]
- من bfloat16 إلى binary32. بما أن binary32 يمكنه تمثيل جميع القيم الدقيقة في bfloat16، فإن التحويل ببساطة يضيف 16 صفرًا في بتات الجزء المهم. [ 18 ]
ترميز القيم الخاصة
اللانهاية الموجبة واللانهاية السالبة
كما هو الحال في معيار IEEE 754 ، يتم تمثيل اللانهاية الموجبة والسالبة باستخدام بتات الإشارة الخاصة بها ، مع ضبط جميع بتات الأس الثمانية (FF سداسي عشري ) وضبط جميع بتات الجزء الكسري على الصفر. وبالتحديد،
val s_exponent_signcnd +inf = 0_11111111_0000000 -inf = 1_11111111_0000000 ليس رقماً
كما هو الحال في معيار IEEE 754 ، تُمثَّل قيم NaN إما ببت الإشارة، أو بتعيين جميع بتات الأس الثمانية (FF سداسي عشري )، أو بعدم تعيين جميع بتات الجزء الكسري إلى الصفر. وبالتحديد،
val s_exponent_signcnd +NaN = 0_11111111_klmnopq -NaN = 1_11111111_klmnopq حيث يكون واحد على الأقل من k أو l أو m أو n أو o أو p أو q يساوي 1. وكما هو الحال مع IEEE 754، يمكن أن تكون قيم NaN صامتة أو إشارة، على الرغم من عدم وجود استخدامات معروفة لإشارة bfloat16 NaNs.
المدى والدقة
صُممت مكتبة bfloat16 للحفاظ على نطاق الأرقام من تنسيق الفاصلة العائمة أحادي الدقة IEEE 754 ذي 32 بت (binary32)، مع تقليل الدقة من 24 بت إلى 8 بت. هذا يعني أن الدقة تتراوح بين رقمين وثلاثة أرقام عشرية، ويمكن لـ bfloat16 تمثيل قيم محدودة تصل إلى حوالي 3.4 × 10³⁸ .
أمثلة
تُقدَّم هذه الأمثلة بتمثيل البتات ، بالنظام الست عشري والثنائي ، لقيمة الفاصلة العائمة. ويشمل ذلك الإشارة، والأس (المتحيز)، والجزء الكسري.
3f80 = 0 01111111 0000000 = 1 c000 = 1 10000000 0000000 = −2
7f7f = 0 11111110 1111111 = (2 8 − 1) × 2 −7 × 2 127 ≈ 3.38953139 × 10 38 (أقصى قيمة موجبة محدودة بدقة bfloat16) 0080 = 0 00000001 0000000 = 2 −126 ≈ 1.175494351 × 10 −38 (أصغر قيمة موجبة مُعَيَّرة بدقة bfloat16 ونقطة عائمة أحادية الدقة)
القيمة القصوى الموجبة المحدودة لعدد bfloat16 عادي هي 3.38953139 × 10 38 ، وهي أقل بقليل من (2 24 − 1) × 2 −23 × 2 127 = 3.402823466 × 10 38 ، وهي القيمة القصوى الموجبة المحدودة التي يمكن تمثيلها بدقة مفردة.
الأصفار واللانهاية
0000 = 0 00000000 0000000 = 0 ٨٠٠٠ = ١ ٠٠٠٠٠٠٠٠٠ ٠٠٠٠٠٠ = -٠
7f80 = 0 11111111 0000000 = ما لا نهاية ff80 = 1 11111111 0000000 = −∞
القيم الخاصة
4049 = 0 10000000 1001001 = 3.140625 ≈ π ( باي ) 3eab = 0 01111101 0101011 = 0.333984375 ≈ 1/3
NaNs
ffc1 = x 11111111 1000001 => qNaN ff81 = x 11111111 0000001 => sNaN
انظر أيضاً
- تنسيق الفاصلة العائمة بنصف الدقة : عدد عشري ذو 16 بت مع إشارة من بت واحد، وأس من 5 بت، ومعامل من 11 بت، كما هو محدد في معيار IEEE 754
- ISO/IEC 10967 ، الحساب المستقل عن اللغة
- نوع البيانات الأولية
- ميني فلوت
- جوجل برين
- دعوى قضائية ضد جوجل لاستخدامها bfloat16 في وحدة معالجة الموتر (TPU).
مراجع
- 1 2 تايخ، بول (10 مايو 2018). "تحليل معالج الذكاء الاصطناعي المساعد TPU 3.0 من جوجل" . المنصة التالية . تم الاسترجاع في 11 أغسطس 2020.
ابتكرت جوجل تنسيقها الداخلي الخاص للفاصلة العائمة المسمى "bfloat" اختصارًا لـ "الفاصلة العائمة للدماغ" (نسبةً إلى جوجل برين).
- ↑ وانغ، شيبو؛ كانوار، بانكاج (23 أغسطس 2019). "BFloat16: سر الأداء العالي على وحدات معالجة Tensor Processing Units السحابية" . جوجل كلاود . تم الاطلاع عليه بتاريخ 11 أغسطس 2020.
يُطلق على هذا التنسيق المخصص للأعداد العشرية اسم "تنسيق الفاصلة العائمة للدماغ"، أو "bfloat16" اختصارًا. ويستمد الاسم من "جوجل برين"، وهو فريق بحثي في مجال الذكاء الاصطناعي تابع لشركة جوجل، حيث طُرحت فكرة هذا التنسيق.
- ↑ تاجليافيني، جوزيبي؛ ماتش، ستيفان؛ روسي، دافيدي؛ مارونجيو، أندريا؛ بينيني، لوكا (2018). "منصة حسابية ذات دقة فائقة للفاصلة العائمة للحوسبة منخفضة الطاقة للغاية". مؤتمر ومعرض التصميم والأتمتة والاختبار في أوروبا 2018 (DATE) . الصفحات 1051-1056 . arXiv : 1711.10374 . doi : 10.23919/DATE.2018.8342167 . ISBN 978-3-9819263-0-9. S2CID 5067903 .
- ↑ د. إيان كوتريس (17 مارس 2020). "إنتل: خطط بحيرة كوبر: لماذا يُعدّ معيار bfloat16 مهمًا؟" . مؤرشف من الأصل في 18 مارس 2020. تم الاطلاع عليه في 12 مايو 2020.
معيار bfloat16 هو طريقة مُخصصة لتمثيل الأرقام، حيث يُعطي نطاق رقم كامل 32 بت، ولكن بحجم بيانات رقم 16 بت، مع الحفاظ على دقة قريبة من الصفر، ولكن مع هامش خطأ بسيط في الدقة بالقرب من حدود المعيار. يُستخدم معيار bfloat16 على نطاق واسع في خوارزميات التعلّم الآلي، حيث يُوفر دقة أفضل للقيم داخل الخوارزمية، مع توفير ضعف البيانات في أي مجموعة بيانات مُعطاة (أو مضاعفة السرعة في أقسام الحساب هذه).
- ↑ خاري جونسون (23 مايو 2018). "إنتل تكشف النقاب عن شبكة نيرفانا العصبية L-1000 لتسريع تدريب الذكاء الاصطناعي" . فينشر بيت . تم الاطلاع عليه بتاريخ 23 مايو 2018. ...
ستقوم إنتل بتوسيع دعم bfloat16 ليشمل جميع خطوط إنتاج الذكاء الاصطناعي، بما في ذلك معالجات إنتل زيون ووحدات FPGA من إنتل.
- ↑ مايكل فيلدمان (23 مايو 2018). "إنتل تضع خارطة طريق جديدة لمحفظة الذكاء الاصطناعي" . مواقع TOP500 للحوسبة الفائقة . تم الاطلاع عليه بتاريخ 23 مايو 2018.
تخطط إنتل لدعم هذا التنسيق في جميع منتجاتها الخاصة بالذكاء الاصطناعي، بما في ذلك معالجات Xeon وFPGA.
- ↑ لوسيان أرماسو (23 مايو 2018). "إنتل تُطلق معالج Spring Crest، أول معالج للشبكات العصبية، في عام 2019" . موقع Tom's Hardware . تاريخ الاسترجاع: 23 مايو 2018.
صرّحت إنتل بأن معالج NNP-L1000 سيدعم أيضًا تنسيق bfloat16، وهو تنسيق عددي مُعتمد من قِبل جميع الشركات العاملة في مجال التعلم الآلي للشبكات العصبية. كما ستدعم الشركة تنسيق bfloat16 في معالجات FPGA ومعالجات Xeon وغيرها من منتجات التعلم الآلي. من المقرر إطلاق معالج Nervana NNP-L1000 في عام 2019.
- ↑ "عمليات TensorFlow المتاحة | وحدة معالجة TensorFlow السحابية | Google Cloud" . Google Cloud . تم الاطلاع عليه بتاريخ 23 مايو 2018.
تُدرج هذه الصفحة واجهات برمجة تطبيقات TensorFlow Python وعوامل تشغيل الرسوم البيانية المتاحة على وحدة معالجة TensorFlow السحابية.
- ↑ إلمار هاوسمان (26 أبريل 2018). "مقارنة بين TPUv2 من جوجل وV100 من إنفيديا على ResNet-50" . مدونة RiseML . مؤرشف من الأصل في 26 أبريل 2018. تم الاطلاع عليه في 23 مايو 2018.
بالنسبة إلى Cloud TPU، أوصت جوجل باستخدام تطبيق bfloat16 من مستودع TPU الرسمي مع TensorFlow 1.7.0. يستخدم كل من تطبيقي TPU وGPU حسابات الدقة المختلطة على البنية الخاصة بكل منهما، ويخزنان معظم الموترات بنصف الدقة.
- 1 2 مؤلفو TensorFlow (23 يوليو 2018). "ResNet-50 باستخدام BFloat16 على TPU" . جوجل . تم الاسترجاع في 6 نوفمبر 2018 .
- ↑ "ملحقات BFloat16 لمعالجات Armv8-A" . community.arm.com . 29 أغسطس 2019. تاريخ الاسترجاع: 30 أغسطس 2019 .
- ↑ "AArch64: إضافة دعم لمعالجات Apple الأحدث · llvm/llvm-project@677da09" . GitHub . تم الاطلاع عليه بتاريخ 2023-05-08 .
- ↑ "CUDA Library bloat16 Intrinsics" .
- ↑ "سجل إصدارات ROCm" . github.com . تم الاطلاع عليه بتاريخ 23-10-2019 .
- 1 2 جوشوا ف. ديلون، إيان لانغمور، داستن تران، يوجين بريفدو، سرينيفاس فاسوديفان، ديف مور، برايان باتون، أليكس أليمي، مات هوفمان، ريف أ. ساوروس (28-11-2017). توزيعات TensorFlow (تقرير). arXiv : 1711.10604 . Bibcode : 2017arXiv171110604D . تاريخ الوصول: 23-05-2018.
جميع العمليات في توزيعات TensorFlow مستقرة عدديًا عبر دقة الفاصلة العائمة النصفية والمفردة والمزدوجة (كأنواع بيانات TensorFlow: tf.bfloat16 (فاصلة عائمة مختصرة)، tf.float16، tf.float32، tf.float64). تحتوي مُنشئات الفئات على علامة validate_args للتحقق من صحة العمليات العددية.
{{cite report}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط ) - ↑ "البث المباشر - اليوم الأول: المرحلة 8 (مؤتمر جوجل I/O 2018) - يوتيوب" . جوجل . 8 مايو 2018. تم الاطلاع عليه بتاريخ 23 مايو 2018.
في العديد من النماذج، يُعد هذا بديلاً مباشراً لـ float-32
- ↑ باك، إيان (13 مارس 2005)، "الفصل 32: الغوص في حوسبة وحدة معالجة الرسومات" ، في فار، مات (محرر)، جواهر وحدة معالجة الرسومات ، أديسون-ويسلي، ISBN 0-321-33559-7تم الاطلاع عليه بتاريخ 2018-04-05.
- 1 2 "تنسيق bfloat16 العددي" . جوجل كلاود . تم الاسترجاع في 11 يوليو 2023.
في وحدة معالجة الموتر (TPU)، يتم التقريب إلى أقرب عدد زوجي، ويتم تجاوز السعة إلى ما لا نهاية.
- ↑ "بنية مجموعة تعليمات Arm A64" . developer.arm.com . تم الاطلاع عليه بتاريخ 26-07-2023 .
يستخدم وضع التقريب غير المتوافق مع معيار IEEE Round-to-Odd.
- ↑ "1.3.5. تحويل دقة Bfloat16 ونقل البيانات" (ملف PDF) . docs.nvidia.com . صفحة 199. تاريخ الاسترجاع: 26-07-2023 .
يقوم بتحويل عدد الفاصلة العائمة إلى دقة nv_bfloat16 بتقريبها إلى أقرب عدد زوجي، ويعيد nv_bfloat16 مع القيمة المحولة.
- الحساب الثنائي
- أنواع الفاصلة العائمة 16 بت
