ollama 支持使用AVX2的GPU运行者

tvokkenx  于 6个月前  发布在  其他
关注(0)|答案(6)|浏览(52)

我正在使用i7-14700K运行ollama,它支持AVX2和AVX_VNNI,以及GeForce RTX 1060。在阅读#2205后,我启用OLLAMA_DEBUG=1以检查ollama是否利用了这颗CPU的AVX2。但是与其他人不同,我无法让ollama使用AVX2。调试信息显示:

time=2024-01-30T12:27:26.016-05:00 level=INFO source=/tmp/ollama/gpu/gpu.go:146 msg="CUDA Compute Capability detected: 6.1"
time=2024-01-30T12:27:26.016-05:00 level=INFO source=/tmp/ollama/gpu/cpu_common.go:11 msg="CPU has AVX2"
loading library /tmp/ollama1660685050/cuda_v12/libext_server.so
time=2024-01-30T12:27:26.032-05:00 level=INFO source=/tmp/ollama/llm/dyn_ext_server.go:90 msg="Loading Dynamic llm server: /tmp/ollama1660685050/cuda_v12/libext_server.so"
time=2024-01-30T12:27:26.032-05:00 level=INFO source=/tmp/ollama/llm/dyn_ext_server.go:145 msg="Initializing llama server"
[1706635646] system info: AVX = 1 | AVX_VNNI = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 0 | ARM_FMA = 0 | F16C = 0 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 |
[1706635646] Performing pre-initialization of GPU
ggml_init_cublas: GGML_CUDA_FORCE_MMQ:   yes
ggml_init_cublas: CUDA_USE_TENSOR_CORES: no
ggml_init_cublas: found 1 CUDA devices:
  Device 0: NVIDIA GeForce GTX 1060 3GB, compute capability 6.1, VMM: yes

因此,ollama确实检测到了GPU,并报告了CPU has AVX2。然而,在初始化服务器时,它仍然显示AVX2 = 0AVX_VNNI = 0。我还按照here的指导,设置了OLLAMA_CUSTOM_CPU_DEFS="-DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_F16C=on -DLLAMA_FMA=on",以便在本地构建带有AVX2支持的二进制文件。然而,结果与发布的二进制文件相同,我仍然得到了AVX_VNNI = 0 | AVX2 = 0。如何让我的CPU中的ollama使用AVX2?

gcxthw6b

gcxthw6b1#

这是我的本地编译日志:

+ echo 'CUDA libraries detected - building dynamic CUDA library'
CUDA libraries detected - building dynamic CUDA library
+ init_vars
+ case "${GOARCH}" in
+ ARCH=x86_64
+ LLAMACPP_DIR=../llama.cpp
+ CMAKE_DEFS=
+ CMAKE_TARGETS='--target ext_server'
+ echo ''
+ grep -- -g
+ CMAKE_DEFS='-DCMAKE_BUILD_TYPE=Release -DLLAMA_SERVER_VERBOSE=off '
+ case $(uname -s) in
++ uname -s
+ LIB_EXT=so
+ WHOLE_ARCHIVE=-Wl,--whole-archive
+ NO_WHOLE_ARCHIVE=-Wl,--no-whole-archive
+ GCC_ARCH=
+ '[' -z '50;52;61;70;75;80' ']'
++ head -1
++ cut -f3 -d.
++ ls /usr/local/cuda/lib64/libcudart.so.12 /usr/local/cuda/lib64/libcudart.so.12.3.101
+ CUDA_MAJOR=12
+ '[' -n 12 ']'
+ CUDA_VARIANT=_v12
+ CMAKE_DEFS='-DLLAMA_CUBLAS=on -DLLAMA_CUDA_FORCE_MMQ=on -DCMAKE_CUDA_ARCHITECTURES=50;52;61;70;75;80 -DCMAKE_POSITION_INDEPENDENT_CODE=on -DLLAMA_NATIVE=off -DLLAMA_AVX=on -DLLAMA_AVX2=off -DLLAMA_AVX512=off -DLLAMA_FMA=off -DLLAMA_F16C=off -DCMAKE_BUILD_TYPE=Release -DLLAMA_SERVER_VERBOSE=off '
+ BUILD_DIR=../llama.cpp/build/linux/x86_64/cuda_v12
+ EXTRA_LIBS='-L/usr/local/cuda/lib64 -lcudart -lcublas -lcublasLt -lcuda'
+ build
+ cmake -S ../llama.cpp -B ../llama.cpp/build/linux/x86_64/cuda_v12 -DLLAMA_CUBLAS=on -DLLAMA_CUDA_FORCE_MMQ=on '-DCMAKE_CUDA_ARCHITECTURES=50;52;61;70;75;80' -DCMAKE_POSITION_INDEPENDENT_CODE=on -DLLAMA_NATIVE=off -DLLAMA_AVX=on -DLLAMA_AVX2=off -DLLAMA_AVX512=off -DLLAMA_FMA=off -DLLAMA_F16C=off -DCMAKE_BUILD_TYPE=Release -DLLAMA_SERVER_VERBOSE=off

在这里,当它构建CUDA目标时。我检查了llm/generate/gen_linux.sh中的脚本,看起来OLLAMA_CUSTOM_CPU_DEFS只在构建CPU目标时使用。在构建CUDA目标时,它使用COMMON_CMAKE_DEFS,该设置设置了-DLLAMA_AVX2=off。我将其更改为COMMON_CMAKE_DEFS="-DCMAKE_POSITION_INDEPENDENT_CODE=on -DLLAMA_NATIVE=on -DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_AVX512=off -DLLAMA_FMA=on -DLLAMA_F16C=on"并重新构建ollama二进制文件。现在它可以在启用AVX2的情况下工作。因此,我建议将使用OLLAMA_CUSTOM_CPU_DEFS的类似代码添加到构建动态CUDA库的代码块中。

7hiiyaii

7hiiyaii2#

目前,我们只编译了支持AVX的GPU运行器。有些用户希望没有向量扩展,这可以通过#2187进行跟踪。

为了避免过多排列组合的蔓延,我们需要在CPU/GPU之间运行模型时验证它是否具有足够的性能影响,以证明添加它是合理的。

hec6srdp

hec6srdp3#

目前,我们只编译了支持AVX的GPU运行器。有些用户希望没有向量扩展,这可以通过#2187进行追踪。我们试图避免过多的排列组合,因此在CPU/GPU之间运行模型时,我们需要验证这是否会产生足够大的影响,以证明添加它是有意义的。
这是否意味着Ollama没有充分利用CPU的所有功能?如果是这样,我们会看到CPU时间得到改善吗?

x33g5p2x

x33g5p2x4#

@dhiltgen ,我该如何帮助基准测试一台充分利用Intel Core i9 14900k功能的羊驼电脑?它配备了集成显卡,如果我甚至与CPU一起使用它,我会对此感兴趣。基准测试将被Nvidia RTX 4070 TI Super 16GB抵消。

8zzbczxx

8zzbczxx5#

为了澄清这个过程是如何工作的,我们使用不同的编译标志编译llama.cpp组件的多个变体。目前,对于x86,我们为CPU仅使用(不支持GPU)编译3个变体。一个没有向量扩展(简单称为“cpu”),两个带有AVX*支持(“cpu_avx”和“cpu_avx2”)以利用许多CPU上可用的向量数学扩展。我们为CUDA和ROCm分别编译1个以支持NVIDIA和AMD GPU。这两个GPU运行器主要是为了GPU使用,但是,如果你尝试加载一个大于可用VRAM的模型,它会溢出到系统内存中,不得不使用CPU来解决LLM的部分。这就是CPU向量扩展发挥作用的地方。如果你有100%的模型在GPU VRAM中,那么CPU向量特性就无关紧要了。如果你溢出,那么在CPU上运行的那些部分的速度会受到向量扩展的影响。我们的测试显示AVX2比AVX快约10%,而AVX比没有向量扩展快约400%。这就是为什么我们专注于AVX作为我们GPU运行器的黄金标准。我们在运行时根据发现的CPU能力和找到的GPU来选择执行哪个运行器。
我们添加的每个变体都会增加构建时间、安装大小和系统的一般复杂性,所以我们试图在排列混乱与优化性能之间取得平衡。

esyap4oy

esyap4oy6#

PR #4517 为我们的文档提供了基础,以便我们可以轻松地从源代码构建,并为GPU运行者获得具有不同矢量扩展的本地构建。一旦合并,这个问题可以通过开发者文档得到解决。

相关问题