背景
有需求要用到 google 的 medgemma-27b-text-it
模型,但当前GPU服务器只有两卡 4090D 24G,显存很显然不够用,所以计划使用量化版模型
在 huggingface 上找到了gguf量化模型,由 unsloth 提供,其仓库地址为: unsloth/medgemma-27b-text-it-GGUF
根据模型大小分别下载了 medgemma-27b-text-it-Q4_1.gguf
、medgemma-27b-text-it-Q4_K_M.gguf
、medgemma-27b-text-it-Q8_0.gguf
几个版本到本地
尝试vllm启动
了解到 vllm 也是支持启动 gguf 模型的,那么首先尝试用该后端启动:
vllm serve /data/Modules/medgemma-27b-text-it-GGUF/medgemma-27b-text-it-Q4_1.gguf -tp 2 --max-model-len 40960
注意使用本地模型的时候路径需要使用绝对路径,否则会认为需要通过 hf 来拉取模型
但以上命令启动失败,提示不支持 gemma3_text 模型
于是我指定了模型配置文件和tokenizer
,并且覆盖了模型的architectures
,使用以下命令启动
vllm serve /data/Modules/medgemma-27b-text-it-GGUF/medgemma-27b-text-it-Q4_1.gguf --trust-remote-code --hf-config-path unsloth/gemma-3-27b-it -tp 2 --max-model-len 4096 --tokenizer unsloth/gemma-3-27b-it --hf-overrides '{"architectures": ["Gemma3ForCausalLM"]}'
以上指定了 hf 的仓库,需要注册 hf 账号,并且在后台生成token,然后在本地使用 huggingface-cli login
即可拉取仓库文件了,全程需要代理
不过结果还是未启动成功,仍然是不支持的模型,接着我尝试升级了vllm版本、降低和升高了 transformers
的版本,也依然没有效果
至此尝试使用vllm来启动 medgemma3-27b-text-it gguf格式的模型失败
尝试llama.cpp启动
看了 unsloth/medgemma-27b-text-it-GGUF
页面,还是原版 google 页面的内容,并没有建议使用哪个后端启动gguf模型,既然 vllm 也无法有效使用,那还是考虑使用 llama.cpp 了
编译安装
首先拉取最新的仓库代码,地址: https://github.com/ggml-org/llama.cpp
使用如下命令编译二进制文件:
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release
需要使用参数 -DGGML_CUDA=ON
否则编译的版本只支持 cpu
llama-server启动
进入到build/bin目录下,有 llama-cli 和 llama-server,启动 cli 是命令行交互使用,而 server 可以作为 api 服务,使用以下命令启动模型:
CUDA_VISIBLE_DEVICES="0,1" ./llama-server -m /data/Modules/medgemma-27b-text-it-GGUF/medgemma-27b-text-it-Q4_1.gguf --port 8080 --host 0.0.0.0 -ngl 99 -dev cuda0,cuda1 -sm row -fa --jinja -c 50000 --no-context-shift
重点参数解析:
-m 指定本地模型的路径
-ngl 允许将一些层卸载到 GPU 进行计算,以上值表示99层
-sm 表示使用row来切分所有层卸载到gpu,也可以使用其他方式如 layer
-fa 开启 Flash Attention
--jinja 表示使用嵌入在 GGUF 中的聊天模板(推荐)
-c 表示允许的最大上下文长度
-n 表示允许生成的最大长度,默认-1表示无限制直到结束,建议指定
--no-context-shift 建议指定,具体作用查看参数说明
使用以上命令成功启动服务,并且使用通用api请求成功响应,如下:
{
"model": "/data/Modules/medgemma-27b-text-it-GGUF/medgemma-27b-text-it-Q8_0.gguf",
"messages": [
{
"role": "system",
"content": "你是一个专业知识丰富的医疗助手"
},
{
"role": "user",
"content": "埃博拉病毒和狂犬病哪个死亡率更高"
}
],
"temperature": 0.7,
"top_p": 0.8,
"chat_template_kwargs": {
"enable_thinking": false
},
"repetition_penalty": 1.05
}
疑难问题
但实际循环一批请求发现执行了一会儿之后总是会卡住,无法继续,等待了一个小时、甚至两个小时仍然没有结束
其他表现形式为:新增请求可以,但也无法结束,使用GET获取模型列表倒是可以正常返回
于是重新启动,开启了 -v
调试日志,发现运行一段时间后推理的内容就不太对了,如下:
next token: 38 ''
也许一两个空字符是正常的,但以上 38
和 ''
几乎是刷屏的,也就是说后续一直都没有正常推理出内容了
更换量化模型
怀疑是 Q4 模型生成的质量可能有问题,于是更换为了 Q8
但持续测试后现象依旧
继续排查
因为每次出现问题的进度都差不多,所以在代码中请求之前打印了问题和列表,发现总是到固定问题的时候出现这个现象
重启服务后测试单独请求,结果必然复现,会持续输出大量的空字符,过了很久输出完毕后,下一个问题也变成输出空字符
由此可见,输出也许是有上限的,当然我也没有使用 -n
控制在一个合理的范围,更重要的问题是重复输出和影响后续问题的推理
柳暗花明
经过查找资料,发现近两天就有同样的问题出现,也是关于重复输出的问题,地址如下:
https://github.com/ggml-org/llama.cpp/issues/14888
其中描述的现象,以及其他人回复的内容,跟我们的问题都非常符合,并且lcarrere
进行了相关的分析,其中主要为:
Investigating, we notice very abnormal repetitions when the KV cache size exceeds approximately 1024 tokens.
This is occurring only with flash attention enabled, with swa on/off.
This issue occurs regardless of whether vision tensors are used.
但此时还没有合适的解决办法,只能先尝试关闭 flash attention
,看能否解决了
在移除fa
的参数后启动,再次提交推理,此时顺利通过之前卡住的部分
CUDA_VISIBLE_DEVICES="0,1" ./llama-server -m /data/Modules/medgemma-27b-text-it-GGUF/medgemma-27b-text-it-Q4_1.gguf --port 8080 --host 0.0.0.0 -ngl 99 -dev cuda0,cuda1 -sm row --jinja -c 50000
20250730
根据帖子的最新回复内容,已经提交了针对这个问题的修改
但编译了 6019
版本,使用 -fa
参数的时候仍然无法正常响应
评论 (0)