]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commit
ggml : introduce bfloat16 support (#6412)
authorJustine Tunney <redacted>
Wed, 8 May 2024 06:30:09 +0000 (02:30 -0400)
committerGitHub <redacted>
Wed, 8 May 2024 06:30:09 +0000 (09:30 +0300)
commit3855416027cb25d9a708ffa5581cf503a87856a6
tree3ffa10c4a16ca74234019e9bd498d82134205ed6
parentc0e6fbf8c380718102bd25fcb8d2e55f8f9480d1
ggml : introduce bfloat16 support (#6412)

* Introduce bfloat16 support

Many models on Hugging Face (e.g. Mistral, TinyLLaMA) use bfloat16 as
their canonical floating point format.

      ┌sign
      │
      │   ┌exponent
      │   │
      │   │      ┌mantissa
      │   │      │
      │┌──┴───┐┌─┴───┐
    0b0000000000000000 brain16

This encoding has the same number of exponent bits as float32. That
makes conversion relatively straightforward, even in the absence of
hardware support. For example, converting brain16 to binary32 means
simply shifting 16 bits to the left.

      ┌sign
      │
      │   ┌exponent
      │   │
      │   │      ┌mantissa
      │   │      │
      │┌──┴───┐┌─┴───────────────────┐
    0b00000000000000000000000000000000 IEEE binary32

The issue is that converting bf16 to fp16 can result in information
loss. Only 13% of bf16 numbers can be precisely represented in fp16
which in practice ends up being 99.71% of Mistral 7b v0.2's weights
however there is currently no way other than fp32 to get the others

      ┌sign
      │
      │  ┌exponent
      │  │
      │  │    ┌mantissa
      │  │    │
      │┌─┴─┐┌─┴──────┐
    0b0000000000000000 IEEE binary16

This change fixes that, by adding a bf16 data type to GGML. Support
for CPU inference has been implemented along with optimizations for
the AVX2, AVX512, and AVX512BF16 ISAs. Perplexity on Mistral 7b 0.2
improves somewhere around -0.0024 to -0.0046 compared to using fp16

* Remove GGML code that's not needed

* Minimize the GGML API surface area for BF16

* Remove bf16 luts

* Make the GGML header look nicer

* Fix documentation

* Apply ggerganov's fixes for test-backend-ops

* Add BF16 code for new ggml_validate_row_data() function
examples/finetune/finetune.cpp
examples/quantize/quantize.cpp
ggml-impl.h
ggml-metal.m
ggml-quants.c
ggml.c
ggml.h
gguf-py/gguf/constants.py
llama.cpp
llama.h
tests/test-backend-ops.cpp