กลับไปหน้าบทความ

อ่าน 7 นาที

รูปแบบจุดลอยตัว bfloat16

รูปแบบ จุดลอยตัว bfloat16 ( brain floating point ) [ 1 ] [ 2 ] เป็น รูปแบบตัวเลขคอมพิวเตอร์ ที่ใช้ หน่วยความจำคอมพิวเตอร์ 16 บิต โดยแสดง ช่วงไดนามิก ที่กว้างของค่าตัวเลขโดย ใช้...

รูปแบบจุดลอยตัว bfloat16

รูปแบบ จุดลอยตัว 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มีรูปแบบดังต่อไปนี้:

รูปแบบ 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 
15141090
 
บฟลัต16
เข้าสู่ระบบ เลขชี้กำลัง (8 บิต) เศษส่วน (7 บิต)
  ┃
 0  0  1  1  1  1  1  0  0  0  1  0  0  0  0  0 
1514760
 
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 
18171090
 
รูปแบบ 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 
232216150
 
รูปแบบ 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 
232215140
 
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 
313023220

การเข้ารหัสเลขยกกำลัง

เลขชี้กำลังแบบจุดลอยตัวไบนารี bfloat16 ถูกเข้ารหัสโดยใช้ การแสดงผล แบบไบนารีออฟเซ็ตโดยออฟเซ็ตศูนย์คือ 127 ซึ่งเรียกอีกอย่างว่าค่าเบี่ยงเบนเลขชี้กำลังในมาตรฐาน IEEE 754

ดังนั้น เพื่อให้ได้เลขชี้กำลังที่แท้จริงตามที่กำหนดโดยการแสดงผลแบบไบนารีที่มีค่าชดเชย จะต้องลบค่าชดเชย 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

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Bfloat16_floating-point_format&oldid=1348293568 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ รูปแบบจุดลอยตัว bfloat16

รูปแบบ จุดลอยตัว bfloat16 ( brain floating point ) [ 1 ] [ 2 ] เป็น รูปแบบตัวเลขคอมพิวเตอร์ ที่ใช้ หน่วยความจำคอมพิวเตอร์ 16 บิต โดยแสดง ช่วงไดนามิก ที่กว้างของค่าตัวเลขโดย ใช้...

การเข้ารหัสเลขยกกำลัง

เลขชี้กำลังแบบจุดลอยตัวไบนารี bfloat16 ถูกเข้ารหัสโดยใช้ การแสดงผล แบบไบนารีออฟเซ็ต โดยออฟเซ็ตศูนย์คือ 127 ซึ่งเรียกอีกอย่างว่าค่าเบี่ยงเบนเลขชี้กำลังในมาตรฐาน IEEE 754

การปัดเศษและการแปลง

กรณีการใช้งานที่พบบ่อยที่สุดคือการแปลงระหว่างเลขฐานสอง IEEE 754 binary32 และ bfloat16 ส่วนต่อไปนี้จะอธิบายกระบวนการแปลงและวิธีการปัดเศษในการแปลง โปรดทราบว่ายังมีสถานการณ์อื่นๆ ที่เป็นไปได้สำหรับการแปลงรูปแบบไปหรือกลับจาก bfloat16 ตัวอย่างเช่น int16 และ...

อนันต์บวกและอนันต์ลบ

เช่นเดียวกับใน มาตรฐาน IEEE 754 ค่าอนันต์บวกและลบจะถูกแทนด้วย บิตเครื่องหมาย ที่สอดคล้องกัน โดยบิต เลขชี้กำลังทั้ง 8 บิตจะถูกตั้งค่า (FF hex ) และบิตส่วนสำคัญทั้งหมดจะเป็นศูนย์ กล่าวคือ