【AI时代】使用ollama私有化部署deepseek-r1系列模型的过程及问题记录

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

说明

对于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

image.png

退出:Use Ctrl + d or /bye to exit.

下载完成后,可以使用以下命令查看模型信息:

image.png

通过modelscope下载

这种方式主要可以解决直接从ollama仓库下载慢、网络不稳定的问题

ollama支持两种格式的模型文件导入:gguf和safetensors,步骤都差不多,下面以gguf为例。

较大参数的模型,可以使用离线下载模型后,导入至ollama运行。

以70B-Q5_K_M为例:

下载地址:https://modelscope.cn/models/unsloth/DeepSeek-R1-Distill-Llama-70B-GGUF

下载好之后上传至服务器并创建ModelFile文件:

image.png

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指定,其实并不是!
image.png
指定临时文件夹执行: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

可以看到已经生效了:
image.png

单机多卡部署

这个也花了很多时间才解决,最新的官方文档没有对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|>"""

这样就不用每次都写了。下面是展示《红楼梦》的介绍:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结还是蛮好的,各个方面都说得很贴切。

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值