我正在使用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 = 0
和AVX_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?
6条答案
按热度按时间gcxthw6b1#
这是我的本地编译日志:
在这里,当它构建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库的代码块中。7hiiyaii2#
目前,我们只编译了支持AVX的GPU运行器。有些用户希望没有向量扩展,这可以通过#2187进行跟踪。
为了避免过多排列组合的蔓延,我们需要在CPU/GPU之间运行模型时验证它是否具有足够的性能影响,以证明添加它是合理的。
hec6srdp3#
目前,我们只编译了支持AVX的GPU运行器。有些用户希望没有向量扩展,这可以通过#2187进行追踪。我们试图避免过多的排列组合,因此在CPU/GPU之间运行模型时,我们需要验证这是否会产生足够大的影响,以证明添加它是有意义的。
这是否意味着Ollama没有充分利用CPU的所有功能?如果是这样,我们会看到CPU时间得到改善吗?
x33g5p2x4#
@dhiltgen ,我该如何帮助基准测试一台充分利用Intel Core i9 14900k功能的羊驼电脑?它配备了集成显卡,如果我甚至与CPU一起使用它,我会对此感兴趣。基准测试将被Nvidia RTX 4070 TI Super 16GB抵消。
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来选择执行哪个运行器。
我们添加的每个变体都会增加构建时间、安装大小和系统的一般复杂性,所以我们试图在排列混乱与优化性能之间取得平衡。
esyap4oy6#
PR #4517 为我们的文档提供了基础,以便我们可以轻松地从源代码构建,并为GPU运行者获得具有不同矢量扩展的本地构建。一旦合并,这个问题可以通过开发者文档得到解决。