0%

在学院服务器部署小模型

免费的glm4.7-flash太拥堵了,虽然我也不常用,但是用的时候看见请求失败很影响心情。所以我又想到了许久未用的1080ti。

服务器状况

252G内存,一张11G显存的1080ti,系统是Ubuntu18.04,cuda版本是12.0,gcc版本是7.5,因为系统太老了正常安装不了llama.cpp。

使用conda创建环境

之前不知道conda能安装指定版本的gcc,还自己编译了gcc14,这次直接用conda装了

1
2
3
conda create -n llama-build -c conda-forge gcc_linux-64=11 gxx_linux-64=11 cmake make
conda activate llama-build
conda install -c "nvidia/label/cuda-12.0.0" cuda-toolkit cuda-nvcc

因为cuda12的nvcc是gcc12的,不支持gcc14,所以还是得装个gcc11(因为之前不知道nvcc支持那个版本,但是知道14高了,所以装的11)

克隆并编译llama.cpp

版本我没有多注意,就是最新的版本,而且也编译通过了

1
git clone https://github.com/ggml-org/llama.cpp

下面是构建和编译的参数,只需要编译llama_server,全部编译的话有一个东西会失败,但是只需要llama_server就行了

1
2
3
4
5
6
7
8
9
10
11
export CC=conda环境里的gcc
export CXX=conda环境里的g++

cmake -B build \
-DGGML_CUDA=ON \
-DCMAKE_CUDA_ARCHITECTURES=61 \ # 1080ti要指定
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_BUILD_RPATH="${CONDA_PREFIX}/lib:${CONDA_PREFIX}/lib64" \
-DCMAKE_INSTALL_RPATH="${CONDA_PREFIX}/lib:${CONDA_PREFIX}/lib64" \
-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON
cmake --build build --target llama-server -j16

qwen3.6-35b-a3b

因为只有11g显存,理论上应该运行不了什么模型的。但是有一种很神奇的MoE模型,可以只激活一部分参数,于是我找到了qwen3.6-35b-a3b,可以从modelscope下载它的gguf版本,可以去这里看看想要哪一个,网址

下面是我的启动配置

1
2
3
4
5
6
7
8
9
10
11
CUDA_VISIBLE_DEVICES=0 ./llama-server \
-m Qwen3.6-35B-A3B-UD-Q5_K_M.gguf \
--mmproj mmproj-F16.gguf \
-c 262144 \
--n-cpu-moe 99 \
--cache-type-k f16 \
--cache-type-v f16 \
--load-mode none \
--host 0.0.0.0 \
--port 自己写 \
--no-ui

这样运行的话大约会用掉9.6G的显存,以及25.6G内存,模型有262K的上下文,而且有视觉,使用起来大约22tok/s,跟免费的glm4.7-flash差不多。

CPU版

本来这个事情到上面应该就已经结束了,但是我转念一想,服务器这么大内存,这么多核,干脆试试纯CPU跑了,而且纯CPU的话不会受低版本的cuda驱动影响,所以又编译了个CPU版本的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
export CC=自己的gcc
export CXX=自己的g++

cmake -B build_cpu \
-DGGML_NATIVE=ON \
-DGGML_AVX=ON \
-DGGML_AVX2=ON \
-DGGML_FMA=ON \
-DGGML_F16C=ON \
-DGGML_BMI2=ON \
-DCMAKE_BUILD_TYPE=Release \
-DLLAMA_BUILD_UI=OFF \
-DLLAMA_BUILD_WEBUI=OFF

cmake --build build_cpu --target llama-server -j 32

然后运行了CPU版本的配置,并且装了个numactl,并且因为有超大内存,所以能用YaRN扩展上下文(不知道效果怎么样,先试试),-t和--threads-batch根据自己的CPU修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
numactl --interleave=all \
llama-server \
-m Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf \
--mmproj mmproj-F16.gguf \
-a Qwen3.6-35B-A3B \
-ngl 0 \
-t 24 \
--threads-batch 24 \
--load-mode none \
--cache-type-k f16 \
--cache-type-v f16 \
--rope-scaling yarn \
--rope-scale 4 \
--yarn-orig-ctx 262144 \
--override-kv qwen35.context_length=int:1048576 \
--host 0.0.0.0 \
--port 自己写 \
--no-ui

提醒:CPU下运行速度约为GPU的30%到40%,极有可能句首就超时了,所以如果使用的是dsh,可以去修改~/.dsh/profiles/web/cordis.patch.yml,然后找到llm-pi-ai,在形如下面的的配置里面加上超时时间设置

1
2
3
4
5
6
7
8
9
- id: llm-pi-ai
name: "@deepseek-ai/dsh-llm-pi-ai"
config:
providers:
你的供应商名字:
......
timeoutMs: 1800000
streamIdleTimeoutMs: 1800000
......

嗯,虽然首句速度非常非常慢,但是我是个非常有耐心的人(其实是一句话发过去一天不看一眼),以及应该没什么人使用CPU也没人会用这么多内存,所以我用一半的CPU和53G内存应该也没事。不过还是建议,256k上下文将就用着,这样强开1M上下文根本用不了。