[object Object]

← back to Exo

workaround f16 cast ambiguity

05ff20fa89f7950cb850ca04f349aa38e18eb3df · 2025-02-06 18:54:15 +0100 · divinity76

for unknown reasons, without this, when trying to execute "Llama 3.2 1B", I get the error below. Fwiw I do not know the performance impact for this change. I can't even get exo running, but this change allows me to /get further/ (before running into a second issue with vram allocation? story for another day i suppose)


error: 
Failed to fetch completions: Error processing prompt (see logs with DEBUG>=2): Nvrtc Error 6, NVRTC_ERROR_COMPILATION
<null>(18): error: more than one user-defined conversion from "nv_bfloat16" to "half" applies:
            function "__half::__half(float)" (declared at line 214 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(short)" (declared at line 227 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(unsigned short)" (declared at line 228 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(int)" (declared at line 229 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(unsigned int)" (declared at line 230 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(long long)" (declared at line 231 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(unsigned long long)" (declared at line 232 of /usr/include/cuda_fp16.hpp)
    *((half4*)((data0+(alu0+(gidx1<<14)+(lidx0<<11)+alu1)))) = make_half4(((half)(val0)),((half)(val1)),((half)(val2)),((half)(val3)));
                                                                                 ^

<null>(18): error: more than one user-defined conversion from "nv_bfloat16" to "half" applies:
            function "__half::__half(float)" (declared at line 214 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(short)" (declared at line 227 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(unsigned short)" (declared at line 228 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(int)" (declared at line 229 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(unsigned int)" (declared at line 230 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(long long)" (declared at line 231 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(unsigned long long)" (declared at line 232 of /usr/include/cuda_fp16.hpp)
    *((half4*)((data0+(alu0+(gidx1<<14)+(lidx0<<11)+alu1)))) = make_half4(((half)(val0)),((half)(val1)),((half)(val2)),((half)(val3)));
                                                                                                ^

<null>(18): error: more than one user-defined conversion from "nv_bfloat16" to "half" applies:
            function "__half::__half(float)" (declared at line 214 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(short)" (declared at line 227 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(unsigned short)" (declared at line 228 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(int)" (declared at line 229 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(unsigned int)" (declared at line 230 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(long long)" (declared at line 231 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(unsigned long long)" (declared at line 232 of /usr/include/cuda_fp16.hpp)
    *((half4*)((data0+(alu0+(gidx1<<14)+(lidx0<<11)+alu1)))) = make_half4(((half)(val0)),((half)(val1)),((half)(val2)),((half)(val3)));
                                                                                                               ^

<null>(18): error: more than one user-defined conversion from "nv_bfloat16" to "half" applies:
            function "__half::__half(float)" (declared at line 214 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(short)" (declared at line 227 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(unsigned short)" (declared at line 228 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(int)" (declared at line 229 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(unsigned int)" (declared at line 230 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(long long)" (declared at line 231 of /usr/include/cuda_fp16.hpp)
            function "__half::__half(unsigned long long)" (declared at line 232 of /usr/include/cuda_fp16.hpp)
    *((half4*)((data0+(alu0+(gidx1<<14)+(lidx0<<11)+alu1)))) = make_half4(((half)(val0)),((half)(val1)),((half)(val2)),((half)(val3)));
                                                                                                                              ^

4 errors detected in the compilation of "<null>".

Files touched

Diff

commit 05ff20fa89f7950cb850ca04f349aa38e18eb3df
Author: divinity76 <hans@loltek.net>
Date:   Thu Feb 6 18:54:15 2025 +0100

    workaround f16 cast ambiguity
    
    for unknown reasons, without this, when trying to execute "Llama 3.2 1B", I get the error below. Fwiw I do not know the performance impact for this change. I can't even get exo running, but this change allows me to /get further/ (before running into a second issue with vram allocation? story for another day i suppose)
    
    
    error:
    Failed to fetch completions: Error processing prompt (see logs with DEBUG>=2): Nvrtc Error 6, NVRTC_ERROR_COMPILATION
    <null>(18): error: more than one user-defined conversion from "nv_bfloat16" to "half" applies:
                function "__half::__half(float)" (declared at line 214 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(short)" (declared at line 227 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(unsigned short)" (declared at line 228 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(int)" (declared at line 229 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(unsigned int)" (declared at line 230 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(long long)" (declared at line 231 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(unsigned long long)" (declared at line 232 of /usr/include/cuda_fp16.hpp)
        *((half4*)((data0+(alu0+(gidx1<<14)+(lidx0<<11)+alu1)))) = make_half4(((half)(val0)),((half)(val1)),((half)(val2)),((half)(val3)));
                                                                                     ^
    
    <null>(18): error: more than one user-defined conversion from "nv_bfloat16" to "half" applies:
                function "__half::__half(float)" (declared at line 214 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(short)" (declared at line 227 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(unsigned short)" (declared at line 228 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(int)" (declared at line 229 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(unsigned int)" (declared at line 230 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(long long)" (declared at line 231 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(unsigned long long)" (declared at line 232 of /usr/include/cuda_fp16.hpp)
        *((half4*)((data0+(alu0+(gidx1<<14)+(lidx0<<11)+alu1)))) = make_half4(((half)(val0)),((half)(val1)),((half)(val2)),((half)(val3)));
                                                                                                    ^
    
    <null>(18): error: more than one user-defined conversion from "nv_bfloat16" to "half" applies:
                function "__half::__half(float)" (declared at line 214 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(short)" (declared at line 227 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(unsigned short)" (declared at line 228 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(int)" (declared at line 229 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(unsigned int)" (declared at line 230 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(long long)" (declared at line 231 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(unsigned long long)" (declared at line 232 of /usr/include/cuda_fp16.hpp)
        *((half4*)((data0+(alu0+(gidx1<<14)+(lidx0<<11)+alu1)))) = make_half4(((half)(val0)),((half)(val1)),((half)(val2)),((half)(val3)));
                                                                                                                   ^
    
    <null>(18): error: more than one user-defined conversion from "nv_bfloat16" to "half" applies:
                function "__half::__half(float)" (declared at line 214 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(short)" (declared at line 227 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(unsigned short)" (declared at line 228 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(int)" (declared at line 229 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(unsigned int)" (declared at line 230 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(long long)" (declared at line 231 of /usr/include/cuda_fp16.hpp)
                function "__half::__half(unsigned long long)" (declared at line 232 of /usr/include/cuda_fp16.hpp)
        *((half4*)((data0+(alu0+(gidx1<<14)+(lidx0<<11)+alu1)))) = make_half4(((half)(val0)),((half)(val1)),((half)(val2)),((half)(val3)));
                                                                                                                                  ^
    
    4 errors detected in the compilation of "<null>".
---
 exo/inference/tinygrad/models/llama.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/exo/inference/tinygrad/models/llama.py b/exo/inference/tinygrad/models/llama.py
index d0cb1050..bc99fbfd 100644
--- a/exo/inference/tinygrad/models/llama.py
+++ b/exo/inference/tinygrad/models/llama.py
@@ -322,6 +322,6 @@ def fix_bf16(weights: Dict[Any, Tensor]):
     }
   if getenv("SUPPORT_BF16", 1):
     # TODO: without casting to float16, 70B llama OOM on tinybox.
-    return {k: v.cast(dtypes.float16) if v.dtype == dtypes.bfloat16 else v for k, v in weights.items()}
+    return {k: v.cast(dtypes.float32).cast(dtypes.float16) if v.dtype == dtypes.bfloat16 else v for k, v in weights.items()
   # TODO: check if device supports bf16
   return {k: v.llvm_bf16_cast(dtypes.half).to(v.device) if v.dtype == dtypes.bfloat16 else v for k, v in weights.items()}

← 5157d80a remove tenacity dependency, implement simple retry logic ins  ·  back to Exo  ·  code-breaking typo 5fe241ec →