文章目录
说明
对于DeepSeek的私有化部署,现在网上已经有很全面的资料了,本文主要记录部署以及部署过程中遇到的问题。目前对于这些问题,网上的资料比较少,我也会持续更新在此过程中遇到的各种问题。
这篇文章对DeepSeek的部署说的很全面,包括ollama、open-webui、dify的安装:
https://www.cnblogs.com/shook/p/18700561
下载模型
通过ollama下载
适合部署小参数的模型,下载速度比较慢,而且不稳定。
ollama模型地址:https://ollama.com/library/deepseek-r1
下载并运行deepseek-r1-7b:
ollama run deepseek-r1:7b
该命令会自动下载并运行,如果只需要下载,使用命令:ollama pull deepseek-r1:7b

退出:Use Ctrl + d or /bye to exit.
下载完成后,可以使用以下命令查看模型信息:

通过modelscope下载
这种方式主要可以解决直接从ollama仓库下载慢、网络不稳定的问题
ollama支持两种格式的模型文件导入:gguf和safetensors,步骤都差不多,下面以gguf为例。
较大参数的模型,可以使用离线下载模型后,导入至ollama运行。
以70B-Q5_K_M为例:
下载地址:https://modelscope.cn/models/unsloth/DeepSeek-R1-Distill-Llama-70B-GGUF
下载好之后上传至服务器并创建ModelFile文件:

ModelFile中指定模型文件路径:
FROM ./DeepSeek-R1-Distill-Llama-70B-Q5_K_M.gguf
关于ModelFile更多内容见:https://github.com/ollama/ollama/blob/main/docs/modelfile.md
准备好之后,执行命令:ollama create deepseek-r1-70b -f ./ModelFile
执行完成之后,通过ollama list命令可以看到模型已导入成功。

这个过程的耗时和模型大小有关。
参考:https://github.com/ollama/ollama/blob/main/docs/import.md
部署open-webui
git地址:https://github.com/open-webui/open-webui
使用docker部署:
docker run -d -p 8080:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
第一次进来需要设置账号,我这个已经设置过了

进去之后,左上角会展示所有已经拉取过的模型

问题记录
临时目录空间不足
使用ollama create导入外部模型时,报错:临时文件夹空间不足,这个很坑,大部分人都说是通过环境变量OLLAMA_TMPDIR指定,其实并不是!

指定临时文件夹执行:TMPDIR=/mnt/largeroom/ollama/ollama/.ollama/tmp ollama create deepseek-r1-70b -f ModelFile
或者修改systemd文件,添加:Environment=“TMPDIR=/mnt/largeroom/ollama/ollama/.ollama/tmp”
参考:https://github.com/ollama/ollama/issues/8086
可以看到已经生效了:

单机多卡部署
这个也花了很多时间才解决,最新的官方文档没有对num_gpu参数的解释,我一直以为是GPU数量。
修改ModelFile,增加参数:num_gpu
FROM ./DeepSeek-R1-Distill-Llama-70B-Q5_K_M.gguf
PARAMETER num_gpu 80
验证过程中发现,当参数num_gpu设置越小,VRAM占用越小,猜想该参数可以控制GPU的负载情况,通过查阅资料和验证,发现:num_gpu参数表示加载至 GPU 的模型层数,根据机器配置,增大该参数的值,当单个GPU无法完全加载所配置的层数时,将分布在所有可用的GPU上。
可以看到显存的使用已经平均分配到每张卡上了

每个模型的层数不一样,猜测该值只要超过单卡的负载就会使用多卡,显存资源足够的情况下,不需要调优该参数。
参考:
https://github.com/ollama/ollama/blob/main/docs/faq.md#how-does-ollama-load-models-on-multiple-gpus
https://snowkylin.github.io/blogs/a-note-on-deepseek-r1.html
后台启动
nohup ollama run deepseek-r1-70b:latest --verbose --keepalive 1200m > output.log 2>&1 < /dev/null &
默认5m就自动释放了,可以通过–keepalive指定模型保留加载的时间。
或者可以使用api来启动,常驻内存:
curl --location '172.22.244.78/api/generate' \
--header 'Content-Type: application/json' \
--data '{
"model": "deepseek-r1:7b",
"keep_alive": -1
}'

分段模型文件的导入
对于有的大参数模型,gguf文件是分段的:

尝试过只指定其中一个文件进行导入,并不会自动合并,需要先合并后再执行ollama create命令。
网上的资料说可以用cat命令先对模型文件进行合并:cat *.gguf > combined_model.gguf,试了一下,合并文件、执行ollama create这两步都没问题,导入后模型不能正常运行
show模型信息也有问题,而且导入后模型文件巨大:

在模型下载的官网,忽略了一句话:

醍醐灌顶,马上开始安装llama.cpp。
安装参考:https://blog.csdn.net/m0_61797126/article/details/140583788
安装好之后可以看到很多工具:

安装完成之后,使用llama-gguf-split进行合并,其基本使用格式为 llama-gguf-split [options] GGUF_IN GGUF_OUT
该命令需要提供第一个分片文件和合并后的模型文件名。在合并过程中,gguf-split 会自动检查分片文件的完整性,并在合并完成后输出合并后的模型文件。

重新编辑ModelFile文件:

指定导入命令:ollama create deepseek-r1-671b-q4 -f ModelFile

查看模型信息:

导入成功了!!!
Error: llama runner process has terminated: GGML_ASSERT(hparams.n_expert <= LLAMA_MAX_EXPERTS) failed

我现在用的ollama版本是0.5.1,升级为0.5.7(当前最新版)解决。
升级参考:https://github.com/ollama/ollama/blob/main/docs/faq.md#how-can-i-upgrade-ollama
Error: timed out waiting for llama runner to start - progress 0.00 -

设置环境变量,将超时时间改大(默认5m):OLLAMA_LOAD_TIMEOUT=60m
所有环境变量:https://github.com/ollama/ollama/blob/021817e59ace5e351b35b2e6881f83a09f038546/envconfig/config.go#L243
升级ollama后,模型只在CPU上运行
手动下载ollama安装包升级后,推理很慢,没有使用到GPU,
看ollama日志,显示:msg=“Dynamic LLM libraries” runners=[cpu]

解决:将ollama/lib下的文件拷贝至ollama二进制文件所需要的lib路径下:…/lib/ollama/
查看当前ollama运行文件路径:

将安装包中的lib目录下的内容复制到:

重新运行,可以看到GPU占用了:


参考:
https://github.com/ollama/ollama/issues/8532#issuecomment-2616281903

模型胡乱回答/回答不正常

模型官网说明:

prompt用<|User|> <|Assistant|>包裹上就可以了:

或者直接在ModelFile中指定:
TEMPLATE """<|User|>{{ .Prompt }}<|Assistant|>"""
这样就不用每次都写了。下面是展示《红楼梦》的介绍:



总结还是蛮好的,各个方面都说得很贴切。


4854

被折叠的 条评论
为什么被折叠?



