อ่าน 7 นาที
รูปแบบจุดลอยตัว bfloat16
รูปแบบ จุดลอยตัว bfloat16 ( brain floating point ) [ 1 ] [ 2 ] เป็น รูปแบบตัวเลขคอมพิวเตอร์ ที่ใช้ หน่วยความจำคอมพิวเตอร์ 16 บิต โดยแสดง ช่วงไดนามิก ที่กว้างของค่าตัวเลขโดย ใช้...
รูปแบบจุดลอยตัว bfloat16
| รูปแบบจุดลอยตัว |
|---|
| อีไออี 754 |
|
| อื่น |
| ทางเลือกอื่นๆ |
| จุดลอยตัวแบบเรียว |
รูปแบบ จุดลอยตัว bfloat16 ( brain floating point ) [ 1 ] [ 2 ]เป็นรูปแบบตัวเลขคอมพิวเตอร์ที่ใช้หน่วยความจำคอมพิวเตอร์ 16 บิตโดยแสดงช่วงไดนามิก ที่กว้างของค่าตัวเลขโดย ใช้จุดฐานลอยตัว รูปแบบนี้เป็นเวอร์ชันย่อ (16 บิต) ของรูปแบบจุดลอยตัวความแม่นยำเดี่ยว 32 บิต IEEE 754 (binary32) โดยมีจุดประสงค์เพื่อเร่งการเรียนรู้ของเครื่องและ การ คำนวณใกล้เซ็นเซอร์[ 3 ]มันรักษาช่วงไดนามิกโดยประมาณของตัวเลขจุดลอยตัว 32 บิตโดยการคงบิตเลขชี้กำลัง 8 บิตแต่รองรับความแม่นยำเพียง 8 บิตแทนที่จะเป็นค่าสำคัญ 24 บิต ของรูปแบบ binary32 ตัวเลข bfloat16 ไม่เหมาะสมสำหรับการคำนวณจำนวนเต็มมากกว่าตัวเลขจุดลอยตัวความแม่นยำเดี่ยว 32 บิต แต่ก็ไม่ใช่การใช้งานที่ตั้งใจไว้ Bfloat16 ใช้เพื่อลดความต้องการพื้นที่จัดเก็บและเพิ่มความเร็วในการคำนวณของอัลกอริธึมการเรียนรู้ของเครื่อง[ 4 ]
รูปแบบ bfloat16 ได้รับการพัฒนาโดยGoogle Brainซึ่งเป็นกลุ่มวิจัยปัญญาประดิษฐ์ที่ Google มีการใช้งานใน CPU, GPU และโปรเซสเซอร์ AI หลายตัว เช่นโปรเซสเซอร์ Intel Xeon (ส่วนขยาย AVX-512 BF16), Intel Data Center GPU, Intel Nervana NNP-L1000, Intel FPGA [ 5 ] [ 6 ] [ 7 ] AMD Zen , AMD Instinct , NVIDIA GPU, Google Cloud TPU [ 8 ] [ 9 ] [ 10 ] AWS Inferentia, AWS Trainium, ARMv8.6-A [ 11 ] และ Apple M2 [ 12 ]และชิปA15 และรุ่นต่อๆ มา ไลบรารีจำนวนมากรองรับ bfloat16 เช่นCUDA [ 13 ] Intel oneAPI Math Kernel Library , AMD ROCm [ 14 ] AMD Optimizing CPU Libraries, PyTorchและTensorFlow [ 10 ] [ 15 ] บนแพลตฟอร์ม เหล่านี้ bfloat16 ยังสามารถใช้ใน การ คำนวณเลขคณิตแบบความแม่นยำผสมได้โดยที่ตัวเลข bfloat16 สามารถดำเนินการและขยายไปยังประเภทข้อมูลที่กว้างขึ้น ได้
รูปแบบจุดลอยตัว bfloat16
bfloat16มีรูปแบบดังต่อไปนี้:
- บิตเครื่องหมาย : 1 บิต
- ความกว้าง ของเลขชี้กำลัง : 8 บิต
- ความแม่นยำของตัวเลขสำคัญ : 8 บิต (จัดเก็บอย่างชัดเจน 7 บิต โดยมีบิตนำหน้าโดยปริยาย ) ซึ่งแตกต่างจาก 24 บิตในรูปแบบเลขทศลอยความแม่นยำเดี่ยวแบบดั้งเดิม
รูปแบบ bfloat16 ซึ่งเป็น เลขทศลอย 32 บิต ความแม่นยำเดี่ยว IEEE 754 ที่ย่อลง ช่วยให้สามารถแปลงไปมาระหว่างเลขทศลอย 32 บิตความแม่นยำเดี่ยว IEEE 754 ได้อย่างรวดเร็ว ในการแปลงเป็นรูปแบบ bfloat16 บิตเลขชี้กำลังจะถูกเก็บรักษาไว้ ในขณะที่ฟิลด์ตัวเลขสำคัญสามารถลดลงได้โดยการตัดทอน (ซึ่งสอดคล้องกับการปัดเศษเข้าหา 0 ) หรือกลไกการปัดเศษ อื่นๆ โดยไม่สนใจ กรณีพิเศษ ของ NaN การเก็บรักษาบิตเลขชี้กำลังจะรักษาช่วงของเลข ทศลอย 32 บิตไว้ที่ ≈ 10 −38ถึง ≈ 3 × 10 38 [ 16 ]
ส่วนประกอบต่างๆ ถูกจัดเรียงไว้ดังนี้:
| ค่าทศลอย 16 บิตความแม่นยำครึ่งหนึ่งของ IEEE | ||||||||||||||||||||||||||||||||||
| เข้าสู่ระบบ | เลขชี้กำลัง (5 บิต) | เศษส่วน (10 บิต) | ||||||||||||||||||||||||||||||||
| ┃ | ||||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||
| 15 | 14 | 10 | 9 | 0 | ||||||||||||||||||||||||||||||
| บฟลัต16 | ||||||||||||||||||||||||||||||||||
| เข้าสู่ระบบ | เลขชี้กำลัง (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 ของ Pixar | ||||||||||||||||||||||||||||||||||
| เข้าสู่ระบบ | เลขชี้กำลัง (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
| เลขชี้กำลัง | เลขนัยสำคัญศูนย์ | ตัวเลขสำคัญไม่เป็นศูนย์ | สมการ |
|---|---|---|---|
| 00 น. | ศูนย์ , −0 | ตัวเลขต่ำกว่าปกติ | (−1) signbit ×2 −126 × 0.significandbits |
| 01 H , ..., FE H | ค่าปกติ | (−1) signbit ×2 exponentbits−127 × 1.significandbits | |
| เอฟเอฟเอช | ± อนันต์ | NaN (เงียบ, ส่งสัญญาณ) | |
ค่าปกติบวกต่ำสุดคือ 2 −126 ≈ 1.18 × 10 −38และค่าบวกต่ำสุด (ค่าย่อยปกติ) คือ 2 −126−7 = 2 −133 ≈ 9.2 × 10 −41
การปัดเศษและการแปลง
กรณีการใช้งานที่พบบ่อยที่สุดคือการแปลงระหว่างเลขฐานสองIEEE 754 binary32และ bfloat16 ส่วนต่อไปนี้จะอธิบายกระบวนการแปลงและวิธีการปัดเศษในการแปลง โปรดทราบว่ายังมีสถานการณ์อื่นๆ ที่เป็นไปได้สำหรับการแปลงรูปแบบไปหรือกลับจาก bfloat16 ตัวอย่างเช่น int16 และ bfloat16
- จาก binary32 เป็น bfloat16 เมื่อ bfloat16 ถูกนำมาใช้เป็นรูปแบบการจัดเก็บครั้งแรก[ 15 ]การแปลงจาก IEEE 754 binary32 (เลขทศลอย 32 บิต) เป็น bfloat16 นั้นเป็นการตัดทอน ( ปัดเศษเข้าหา 0 ) ต่อมา เมื่อมันกลายเป็นอินพุตของหน่วยการคูณเมทริกซ์ การแปลงสามารถมีกลไกการปัดเศษที่หลากหลายขึ้นอยู่กับแพลตฟอร์มฮาร์ดแวร์ ตัวอย่างเช่น สำหรับ Google TPU รูปแบบการปัดเศษในการแปลงคือการปัดเศษไปยังเลขคู่ที่ใกล้ที่สุด[ 18 ] ARM ใช้โหมดปัดเศษไปยังเลขคี่ที่ไม่ใช่ IEEE [ 19 ]สำหรับ NVIDIA รองรับการแปลงเลขทศลอยเป็นความแม่นยำ bfloat16 ในโหมดปัดเศษไปยังเลขคู่ที่ใกล้ที่สุด[ 20 ]
- จาก bfloat16 เป็น binary32 เนื่องจาก binary32 สามารถแทนค่าที่แน่นอนทั้งหมดใน bfloat16 ได้ การแปลงจึงเพียงแค่เติมศูนย์ 16 ตัวในบิตสำคัญ[ 18 ]
การเข้ารหัสค่าพิเศษ
อนันต์บวกและอนันต์ลบ
เช่นเดียวกับในมาตรฐาน IEEE 754ค่าอนันต์บวกและลบจะถูกแทนด้วยบิตเครื่องหมาย ที่สอดคล้องกัน โดยบิต เลขชี้กำลังทั้ง 8 บิตจะถูกตั้งค่า (FF hex ) และบิตส่วนสำคัญทั้งหมดจะเป็นศูนย์ กล่าวคือ
val s_exponent_signcnd +inf = 0_11111111_0000000 -inf = 1_11111111_0000000 ไม่ใช่ตัวเลข
เช่นเดียวกับในมาตรฐาน IEEE 754ค่าNaNจะถูกแทนด้วยบิตเครื่องหมาย บิตเลขชี้กำลังทั้ง 8 บิตถูกตั้งค่า (FF hex ) และไม่ใช่บิตสำคัญทั้งหมดเป็นศูนย์ กล่าวคือ
val s_exponent_signcnd +NaN = 0_11111111_klmnopq -NaN = 1_11111111_klmnopq โดยที่อย่างน้อยหนึ่งในk, l, m, n, o, pหรือqมีค่าเป็น 1 เช่นเดียวกับ IEEE 754 ค่า NaN อาจเป็นค่าเงียบหรือค่าส่งสัญญาณ แม้ว่าจะไม่มีการใช้งานค่า NaN ที่เป็นสัญญาณที่ทราบกันดีก็ตาม
ระยะและความแม่นยำ
Bfloat16 ถูกออกแบบมาเพื่อรักษาระยะของตัวเลขจาก รูปแบบจุดลอยตัวความแม่นยำเดี่ยว 32 บิต IEEE 754 (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³⁸ ซึ่งต่ำกว่าเล็กน้อย (2²⁴ − 1) × 2 −²³ × 2¹²⁷ = 3.402823466 × 10³⁸ซึ่งเป็นค่าบวกจำกัดสูงสุดที่สามารถแสดงได้ในความแม่นยำเดี่ยว
ศูนย์และอนันต์
0000 = 0 00000000 0000000 = 0 8000 = 1 00000000 0000000 = −0
7f80 = 0 11111111 0000000 = อนันต์ ff80 = 1 11111111 0000000 = −อนันต์
คุณค่าพิเศษ
4049 = 0 10000000 1001001 = 3.140625 bai π ( ไพ ) 3eab = 0 01111101 0101011 = 0.333984375 data 1/3
NaNs
ffc1 = x 11111111 1000001 => qNaN ff81 = x 11111111 0000001 => sNaN
ดูเพิ่มเติม
- รูปแบบเลขทศนิยมแบบความแม่นยำครึ่งหนึ่ง : เลขทศนิยม 16 บิต โดยมีเครื่องหมาย 1 บิต เลขชี้กำลัง 5 บิต และส่วนสำคัญ 11 บิต ตามที่กำหนดโดยมาตรฐานIEEE 754
- ISO/IEC 10967การคำนวณเลขคณิตที่ไม่ขึ้นกับภาษา
- ประเภทข้อมูลพื้นฐาน
- มินิโฟลต
- กูเกิลเบรน
- ฟ้องร้อง Google เนื่องจากการใช้ bfloat16 ใน TPU
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ รูปแบบจุดลอยตัว bfloat16
รูปแบบ จุดลอยตัว bfloat16 ( brain floating point ) [ 1 ] [ 2 ] เป็น รูปแบบตัวเลขคอมพิวเตอร์ ที่ใช้ หน่วยความจำคอมพิวเตอร์ 16 บิต โดยแสดง ช่วงไดนามิก ที่กว้างของค่าตัวเลขโดย ใช้...
การเข้ารหัสเลขยกกำลัง
เลขชี้กำลังแบบจุดลอยตัวไบนารี bfloat16 ถูกเข้ารหัสโดยใช้ การแสดงผล แบบไบนารีออฟเซ็ต โดยออฟเซ็ตศูนย์คือ 127 ซึ่งเรียกอีกอย่างว่าค่าเบี่ยงเบนเลขชี้กำลังในมาตรฐาน IEEE 754
การปัดเศษและการแปลง
กรณีการใช้งานที่พบบ่อยที่สุดคือการแปลงระหว่างเลขฐานสอง IEEE 754 binary32 และ bfloat16 ส่วนต่อไปนี้จะอธิบายกระบวนการแปลงและวิธีการปัดเศษในการแปลง โปรดทราบว่ายังมีสถานการณ์อื่นๆ ที่เป็นไปได้สำหรับการแปลงรูปแบบไปหรือกลับจาก bfloat16 ตัวอย่างเช่น int16 และ...
อนันต์บวกและอนันต์ลบ
เช่นเดียวกับใน มาตรฐาน IEEE 754 ค่าอนันต์บวกและลบจะถูกแทนด้วย บิตเครื่องหมาย ที่สอดคล้องกัน โดยบิต เลขชี้กำลังทั้ง 8 บิตจะถูกตั้งค่า (FF hex ) และบิตส่วนสำคัญทั้งหมดจะเป็นศูนย์ กล่าวคือ