llama-server推理medgemma3 gguf模型
侧边栏壁纸
博主昵称
yuc

  • 累计撰写 291 篇文章
  • 累计收到 0 条评论

llama-server推理medgemma3 gguf模型

yuc
yuc
2025-07-28 / 最后修改: 2025-07-30 06:48 / 0 评论 / 2 阅读 / 正在检测是否收录...
背景

有需求要用到 google 的 medgemma-27b-text-it 模型,但当前GPU服务器只有两卡 4090D 24G,显存很显然不够用,所以计划使用量化版模型

在 huggingface 上找到了gguf量化模型,由 unsloth 提供,其仓库地址为: unsloth/medgemma-27b-text-it-GGUF

根据模型大小分别下载了 medgemma-27b-text-it-Q4_1.ggufmedgemma-27b-text-it-Q4_K_M.ggufmedgemma-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

评论 (0)

取消