主要目的就是记录,因为我想要解决的这几个问题都没找到可用的方法,都是试了多少次后试出来的,也可能是我的搜索关键字没有输入对,但我搜索的真的都是完全不相关或是解决不了的,所以才在解决问题后记录一下,都是小问题,大神勿喷,有更好的方法也希望能指导一下,先谢谢。
唠叨
就是一点自己的想法,实际llama.cpp的问题在后面,可直接跳过这段
之前用的是 ollama 但后来发现几个问题有点接受不了,以windows为例
1.ollama 的预编译二进制文件太大了,1.9G多,llama.cpp才不到300M,加上cuda文件才1G,但这并不重要,硬盘空间有的是,所以这个其实真无所谓,纯吐槽,多的也不是我现在需要的功能,当然了,我是知道ollama底层就是llama.cpp的;
2.ollama好像是同样的模型占用的显存要大一些,主要是我显存确实太小了,得精打细算,我用llama.cpp设置大的参数可以把多个模型都放进显存,但在ollama上就不行了,可能是因为ollama为了安全会预留一块显存保险,而llama.cpp完全是自己掌握;只要是显存够大,并且只有一个模型的人,其实ollama真的方便,真推荐想省事儿,不想折腾的个人自用;
3.ollama也是因为太方便了,太省心了,所以吧他是一个serve的服务进程进行管理,可以加载多个模型的,但可能是后来更新的原因,在同一个serve下,正常的run多个模型都是用的一个serve的统一配置参数,并不灵活,想要按每个模型设置不同的参数就只有用curl启动模型或先run后再进入对话里/set修改参数,好麻烦的说,llama.cpp就是一个进程管一个模型,和对这个模型的配置参数,虽然多个模型,多个llama.cpp进程,但真的省事儿;
4.如果一不小时后面加载的模型超过了显存大小,会挤掉前面加载完成的模型,用于把显存空出来加载自己,所以再想用前面的模型还需要再次加载,这样就感觉不快;llama.cpp也是因为一个进程一个模型,所以是谁先来谁先占显存,后来的显存不够就把多出来的进内存,不影响前面加载的,虽然现在llama.cpp也升级有个ollama的这种一个serve管理多个模型的功能了,但我要的就不ollama那种把别的挤的功能,所以还是一个进程管一个模型最省心省事儿;
5.ollama的token/s好像跟llama.cpp的计算不一样还是什么原因我不知道,看统计ollama的数字偏大,但是看着跟llama.cpp输出显示的token/s速度差不多,但统计的数据可是多出好多,这个不重要了,只是奇怪而已,因为是同参数配置的同模型;
问题(llama.cpp)
1. 模型的 think 模式开关问题
我真是不得吐槽下这个问题,真是翻遍了我能找到的各种位置都没有找到方法,中英文都翻了,是大家都不需要关么?真是奇怪,说什么的都,基本上都是指要给模型灌一些提示词呀,还有给模型灌什么配置chat什么的think=false的,真当是ollama 加上--think=off这么简单呢?
后来我是在llama-server的webui上无意见看到一个英文才找到了这个开关的参数,其实llama-server的帮助里有,但一是太长,更主要是英文,真的不懂英文,让AI给我翻译一下,我挨个看的都没看到是关闭思考的功能,AI就特喵的一天瞎翻译,实际这个参数就是
--reasoning off
这个值有三个选项 {auto | on | off},off就是关闭模型的思考模型,这个我在gemma4模型上测试已经好用了,因为宽带小水流,所以还没下载其他带思考的模型,但感觉应该也可以用,有心人可以试试,可以的话麻烦留言告诉我一下能不能行;
2. 上下文超过设置问题
问题我描述一下哈,就是在llama-server 或 llama-cli 启动时设置了模型的上下文大小,比如 -c 4096,然后与模型开始聊天,一来一回一来一回的聊,其实每次你要发完问题时,对话的页面都是把当前会话中已经聊完的所有内容包括一些比如提示词或一些后台信息一起打包发给llama.cpp的,所以越往后聊发送的信息就越大,因为是从当前会话开始到现在所有的内容,所以总会在一次发送请求时超过设置的4096个上下文,结果后台服务因为超过了这个设置大小就报错停止与到在当前会话对话了,就这么个问题;
然后我就是上网找呀,ai问下,真特喵的没一个说正事儿的,甚至有一个说是一个空格的原因怎么怎么地的,还要收费看,也不知道是不是真是这个原因,当然了,这种的我从来也不惯着,不会给他钱的,这是我的选择,现在来看跟没线就对了;是大家都显存够大,设置的上下文太大了,没有那么多话跟模型瞎聊是么?只在老外的讨论里看到在b6721这个版本会滑动窗口来处理超出的上下文内容,也就是删掉旧的对话内容,保留近期的内容,保证你请求的上下文不超过设置值,以让对话可以永久进行下去(先不考虑模型失忆问题),再后来的版本都反应滑动窗口不好使了,只要提交的内容够长超过了设置的值就会报错停止与你聊天,只得重新再开一个新的会话重新开始;
解决:后来看了老外的各种讨论,发现有可能是代码的编写者回复的,现在这种上下文超设置值就停止是预期的结果,也就是人家后来就是要这样设计的,那如何解决这个上下文滑动窗口的功能,以让聊天可以无限聊下去呢,就是这个功能要在客户端上实现,服务端的滑动窗口只是实现模型回复时的超过设置的上下文截断功能,以保证当前的回复可以正常回复完成,因为不设置上下文的滑动窗口,在回复到一半就到了设置的值4096,那就直接停了,后半部分就不回复了;
所以答案就是,不要用llama-server自带的webui那个一是没有自动滑动的功能,二是不能安装插件或功能,所以只要满了就只能重开会话;想要实现一直聊下去,就要用比如open-webui加上上下文自动处理功能的函数来解决,在vscode装了continue插件设置里设置上下文长度也可以自动处理上下文大小,但要注意设置一定要小于你llama-server上设置的上下文值,测试成功
下面是我现在用的启动模型的命令和说明,要是再有需要优化的还请大神不吝赐教;
llama-server.exe -m ..\models\qwen2.5-coder-7b-instruct-q4_k_m.gguf --host 0.0.0.0 --port 8080 -ngl 99 -ctk q8_0 -ctv q8_0 -b 1024 -ub 1024 -fa on --context_shift --mlock --no-mmap --reasoning off -c 32768
llama-server.exe 这是启动服务的命令,还有一个llama-cli可以直接在命令行里跟模型聊天,也是不能超过设置的上下文大小
-m 要加载的模型gguf文件
--host 服务器地址,0.0.0.0,就是所有地址都可以访问进来
--port 设置端口 8080,如果启动多个server进程注意修改端口,以保证可以多个模型通过不同的端口来访问
-ngl 99 模型多少层加载在显存,当然了,要是显存不够的话,超出的会进内存,那模型运行也就慢了,要是0就全进内存不进显存了,你也可以定制,比如qwen2.5 coder 是29层,如果想要20层加载在显存,就设置为20,其他的就进入内存了,自己定义,我最喜欢的功能之一,ollama操作这个有点麻烦
-ctk q8_0 -ctv q8_0 这个是为了省显存,把上下文缓存做了量化管理q8_0,损失极小精度,可以忽略不计,但显存是真的省下来了不少
-b 1024 -ub 1024 这个1024是我根据我的显存调的,一般好像调成2048更好些,默认是512,说是批处理什么的,说是对于长的上下文,这个越大速度越稳定越快,这个我也不太明白了
-fa on 这个说是必开,说是可以加快首token的回复速度,但我没感觉有什么区别,只是在ollama有个同设置要是开了,也发现是真的省显存,开了这个设置q8_0的上下文缓存量化都不用开了,因为q8_0感觉都没什么效果了
--context_shift 这个就是滑动窗口,就是用来滑动上下文的,b6721是可以滑动截断请求和回复显示的,后来的版本只能滑动截断模型的回复信息了,请求的要靠客户端了;另外,哪位大神能告知一个好用llama.cpp的前置工具,可以在请求模型前提前处理上下文到小于设置后再发到llama-server上,以免报错的工具
--mlock 锁位模型在显存里,毕竟在显存里快呀,是真快呀
--no-mmap 不在内存里投影,也是为了不在CPU上运算,为了快
--reasoning off 关闭think思考模式,如果你需要思考模型,首先模型要是带think的,然后这个可以设置为auto或on,或者就不要写这个参数
-c 32768 设置上下文是32K,配合了 --context_shift 参数,再配置客户端对发送的上下文请求的处理,只要发送的上下文内容不超过这个值,就可以一直对话下去了
客户端设置
Open-WebUI
需要安装函数
左下角或右上角,用户头像 ->管理员面板,在上面有一个选项"函数",下面有个选项去社区开发 找 发现更多函数,会新开个页面,查找Async Context Compression这个函数安装,再设置一下就好了,自己翻译一下,然后对应设置一下就好了,主要就是设置的值要小于等于你服务设置的值
VSCode
安装插件continue,在配置模型的yaml文件中加上一条:contextLength,设置不超过你服务设置的值就行,最好比你设置的值再少点更保险一些