Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah perbezaan antara FP dan BF Berikut penjelasan yang baik untuk anda

Apakah perbezaan antara FP dan BF Berikut penjelasan yang baik untuk anda

WBOY
WBOYasal
2024-07-30 00:03:43871semak imbas

What is the difference between FPand BF Here a good explanation for you

Perwakilan Titik Terapung:

FP16 (Separuh Ketepatan): Dalam FP16, nombor titik terapung diwakili menggunakan 16 bit. Ia terdiri daripada 1 bit tanda, 5 bit untuk eksponen, dan 10 bit untuk pecahan (mantissa). Format ini memberikan ketepatan yang lebih tinggi untuk mewakili nilai pecahan dalam julatnya.

BF16 (BFloat16): BF16 juga menggunakan 16 bit, tetapi dengan pengedaran yang berbeza. Ia mempunyai 1 bit tanda, 8 bit untuk eksponen, dan 7 bit untuk mantissa. Format ini mengorbankan beberapa ketepatan dalam bahagian pecahan untuk menampung julat eksponen yang lebih luas.

Julat Berangka:

FP16 mempunyai julat yang lebih kecil tetapi ketepatan yang lebih tinggi dalam julat itu disebabkan oleh mantissa 10-bitnya.
BF16 mempunyai julat yang lebih luas tetapi ketepatan yang lebih rendah untuk nilai pecahan disebabkan oleh eksponen 8-bit dan mantissa 7-bit.

Contoh:

Mari kita gunakan contoh untuk menggambarkan perbezaan antara FP16 dan BF16 dengan 3 contoh kes. TensorFlow digunakan untuk membuat ujian dan kod dikongsi di bahagian bawah:

Nilai asal: 0.0001 — Kedua-dua kaedah boleh mewakili
FP16: 0.00010001659393 (Perduaan: 0|00001|101000110, 8 Hextis: 10, 8 HexEon: 10, 8 HexEonsa 🎜>
BF16: 0.00010013580322 (Perduaan: 0|01110001|1010010, Hex: 38D2) — 7 mantissa dan 8 eksponen

Seperti yang anda lihat, ia mempunyai eksponen dan mantissa yang berbeza dan dengan itu dapat mewakili secara berbeza.

Tetapi kita dapat melihat bahawa FP16 mewakilinya dengan lebih tepat dengan nilai yang lebih dekat.

Nilai asal: 1e-08 (0.00000001)FP16: 0.00000000000000 (Perduaan: 0|00000|000000000, 0.0000000000000,00000000000000, 0.00000000000000000000000000,00000000000000000000000000000000000000000000000000000000000000000 01172 (Perduaan: 0|01100100| 0101100, Hex: 322C)

Ini adalah kes yang sangat menarik.

FP16 gagal

dan menjadikan keputusan 0 tetapi BF16 mampu mewakilinya dengan pemformatan khas.

Nilai asal: 100000.00001

FP16: inf (Perduaan: 0|11111|0000000000, Hex: 7C00)BF16: 000000.00000 01111|1000011, Hex: 47C3 )

Dalam kes di atas,

FP16 gagal

kerana semua bit eksponen menjadi penuh dan tidak mencukupi untuk mewakili nilai. Walau bagaimanapun BF16 berfungsi

Kes Penggunaan:

FP16 biasanya digunakan dalam latihan pembelajaran mendalam dan inferens, terutamanya untuk tugasan yang memerlukan ketepatan tinggi dalam mewakili nilai pecahan kecil dalam julat terhad.

BF16 menjadi popular dalam seni bina perkakasan yang direka untuk tugasan pembelajaran mesin yang mendapat manfaat daripada julat nilai yang boleh diwakili yang lebih luas, walaupun dengan kos ketepatan tertentu dalam bahagian pecahan. Ia amat berguna apabila menangani kecerunan yang besar atau apabila kestabilan berangka merentas julat yang luas adalah lebih penting daripada ketepatan nilai yang kecil.

Ringkasnya

FP16 menawarkan ketepatan yang lebih tinggi untuk nilai pecahan dalam julat yang lebih kecil, menjadikannya sesuai untuk tugasan yang memerlukan perwakilan tepat nombor kecil. BF16, sebaliknya, menyediakan julat yang lebih luas dengan kos ketepatan tertentu, menjadikannya berfaedah untuk tugasan yang melibatkan spektrum nilai yang lebih luas atau di mana kestabilan berangka merentas julat yang luas adalah penting. Pilihan antara FP16 dan BF16 bergantung pada keperluan khusus tugas pembelajaran mesin yang ada.

Kesimpulan Akhir

Disebabkan semua sebab di atas, apabila melakukan latihan Stable Diffusion XL (SDXL), FP16 dan BF16 memerlukan kadar pembelajaran yang sedikit berbeza dan saya dapati BF16 berfungsi dengan lebih baik.

Kod Digunakan Untuk Menjana Contoh Di Atas

import tensorflow as tf
import struct

def float_to_binary(f):
    return ''.join(f'{b:08b}' for b in struct.pack('>f', f))

def display_fp16(value):
    fp16 = tf.cast(tf.constant(value, dtype=tf.float32), tf.float16)
    fp32 = tf.cast(fp16, tf.float32)
    binary = format(int.from_bytes(fp16.numpy().tobytes(), 'big'), '016b')
    sign = binary[0]
    exponent = binary[1:6]
    fraction = binary[6:]
    return f"FP16: {fp32.numpy():14.14f} (Binary: {sign}|{exponent}|{fraction}, Hex: {fp16.numpy().view('uint16'):04X})"

def display_bf16(value):
    bf16 = tf.cast(tf.constant(value, dtype=tf.float32), tf.bfloat16)
    bf32 = tf.cast(bf16, tf.float32)
    binary = format(int.from_bytes(bf16.numpy().tobytes(), 'big'), '016b')
    sign = binary[0]
    exponent = binary[1:9]
    fraction = binary[9:]
    return f"BF16: {bf32.numpy():14.14f} (Binary: {sign}|{exponent}|{fraction}, Hex: {bf16.numpy().view('uint16'):04X})"

values = [0.0001, 0.00000001, 100000.00001]

for value in values:
    print(f"\nOriginal value: {value}")
    print(display_fp16(value))
    print(display_bf16(value))

Atas ialah kandungan terperinci Apakah perbezaan antara FP dan BF Berikut penjelasan yang baik untuk anda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn