Download utils.cuh from RedHatAI/quantization: direct link, hf CLI and curl.
- Browser
- Download file 1.84 kB
-
https://huggingface.co/RedHatAI/quantization/resolve/refs%2Fpr%2F2/utils.cuh
- Command line
-
hf download hf://RedHatAI/quantization@refs/pr/2/utils.cuh
-
curl -L -o utils.cuh https://huggingface.co/RedHatAI/quantization/resolve/refs%2Fpr%2F2/utils.cuh
1.84 kB
| /** | |
| * Quantization utilities including: | |
| * Adjusted maximum values for qtypes. | |
| * Minimum scaling factors for qtypes. | |
| */ | |
| // ROCm doesn't seem to need C10_HOST_DEVICE for static constexpr | |
| template <typename T, | |
| typename = std::enable_if_t<std::is_same_v<T, c10::Float8_e4m3fn> || | |
| std::is_same_v<T, c10::Float8_e4m3fnuz> || | |
| std::is_same_v<T, int8_t>>> | |
| struct quant_type_max { | |
| static constexpr T val() { return std::numeric_limits<T>::max(); } | |
| }; | |
| // Using the default max value from pytorch (240.0 0x7F) will cause accuracy | |
| // issues when running dynamic quantization. Here use 224.0 0x7E for rocm. | |
| template <> | |
| struct quant_type_max<c10::Float8_e4m3fnuz> { | |
| static constexpr c10::Float8_e4m3fnuz val() { | |
| return c10::Float8_e4m3fnuz(0x7E, c10::Float8_e4m3fnuz::from_bits()); | |
| } | |
| }; | |
| template <typename T> | |
| MAYBE_HOST_DEVICE static constexpr T quant_type_max_v = | |
| quant_type_max<T>::val(); | |
| template <typename T, | |
| typename = std::enable_if_t<std::is_same_v<T, c10::Float8_e4m3fn> || | |
| std::is_same_v<T, c10::Float8_e4m3fnuz> || | |
| std::is_same_v<T, int8_t>>> | |
| struct min_scaling_factor { | |
| C10_DEVICE C10_ALWAYS_INLINE static float val() { | |
| return 1.0f / (quant_type_max_v<T> * 512.0f); | |
| } | |
| }; | |
| template <> | |
| struct min_scaling_factor<int8_t> { | |
| C10_DEVICE C10_ALWAYS_INLINE static float val() { | |
| return std::numeric_limits<float>::epsilon(); | |
| } | |
| }; |