掘金 人工智能 前天 17:08
DeepSeek部署:LobeChat+AI 网关+Ollama(一)
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了Ollama,一个开源框架,它简化了在本地设备上部署大型语言模型(LLM)的过程,例如DeepSeek和Llama3。Ollama通过权重量化、分块加载和GPU/CPU灵活调度等技术,降低了部署门槛,使得即使在普通硬件上也能流畅运行大模型。文章详细阐述了Ollama的安装、配置,以及如何部署和测试DeepSeek-R1模型,并探讨了模型“思考”机制,为用户提供了在本地高效运行AI模型的实用指南。

💡 Ollama是一个开源框架,简化了本地部署大型语言模型(LLM)的流程,支持DeepSeek、Qwen、Llama3等多种模型,降低了部署门槛,方便开发者和企业搭建私有化AI服务。

⚙️ Ollama的核心技术包括权重量化、分块加载和缓存机制、以及GPU/CPU灵活调度,这些优化使得大模型能够在普通硬件上流畅运行,例如通过量化处理降低显存占用。

🐳 文章提供了使用Docker安装Ollama的详细步骤,包括镜像下载、容器启动、以及解决可能出现的NVIDIA Container Toolkit未安装问题,并介绍了两种部署DeepSeek-R1模型的方法,包括在容器内下载模型和将模型文件挂载进容器。

🤔 此外,文章还探讨了模型“思考”机制,解释了为什么在某些情况下模型可能不会主动思考,并提供了通过添加“think”标签来强制模型思考的解决方案。

什么是 Ollama ?

首先来了解一下 Ollama。这一开源框架堪称本地部署大型语言模型(LLM)的 “瑞士军刀”—— 无需复杂配置,仅通过简单命令行,就能将 DeepSeek、Qwen、Llama3 等热门模型快速 “搬” 到本地设备上运行。无论是开发者调试模型,还是企业搭建私有化 AI 服务,Ollama 都能大幅降低部署门槛。

Ollama 的 “黑科技” 在于其底层优化技术。权重量化、分块加载与缓存机制、GPU/CPU 灵活调度三大核心技术协同发力,让大模型在普通硬件上也能流畅运行。以 DeepSeek-R1 的蒸馏模型 DeepSeek-R1-Distill-Qwen-7B 为例,原生部署至少需要 14G 显存,而经 Ollama 量化处理后,显存占用显著降低。

或许有同学对 “量化” 概念感到抽象,不妨用微信传图来类比:当我们接收微信图片时,选择 “不下载原图”,图片虽牺牲部分画质(分辨率降低),但文件大小仅几百 KB,节省大量存储空间;若点击 “下载原图”,虽然画质清晰,但占用内存明显增加。大模型量化与此异曲同工:原版模型如同高清原图,完整保留所有参数细节,但对硬件要求极高;而量化模型通过调整权重参数的精度,在保证核心功能的前提下大幅缩减内存占用,就像压缩后的低清图片,更适配普通设备运行。这种优化不仅让小型企业和个人开发者也能玩转大模型,更推动了 AI 技术的普及应用。

环境准备

为了节省资源,我是在联通云上开通了一台带有 2 张 T4 卡的云服务器,操作系统是 Ubuntu 22.04。T4 卡的单卡显存是 16 G,理论上至多能跑满血版的 7B 模型,但由于使用的是 Ollama 部署,因此我们可以以 32B 模型为例做演示。只要你学会了 32B 模型的部署,之后不管是部署 1.5B 还是 671B,方法都一模一样,没有任何区别。首先使用 nvidia-smi 命令,确认 GPU 卡的驱动已经装好,可以被识别。

root@aitest:~# nvidia-smi                                                                                                                                                Sun Feb 16 13:56:24 2025                                                                                                                                                 +-----------------------------------------------------------------------------+                                                                                          | NVIDIA-SMI 515.76       Driver Version: 515.76       CUDA Version: 11.7     |                                                                                          |-------------------------------+----------------------+----------------------+                                                                                          | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |                                                                                          | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |                                                                                          |                               |                      |               MIG M. |                                                                                          |===============================+======================+======================|                                                                                          |   0  Tesla T4            Off  | 00000000:00:07.0 Off |                    0 |                                                                                          | N/A   42C    P0    25W /  70W |      2MiB / 15360MiB |      0%      Default |                                                                                          |                               |                      |                  N/A |                                                                                          +-------------------------------+----------------------+----------------------+                                                                                          |   1  Tesla T4            Off  | 00000000:00:08.0 Off |                    0 |                                                                                          | N/A   43C    P0    26W /  70W |      2MiB / 15360MiB |      5%      Default |                                                                                          |                               |                      |                  N/A |                                                                                          +-------------------------------+----------------------+----------------------+                                                                                                                                                                                                                                                                   +-----------------------------------------------------------------------------+                                                                                          | Processes:                                                                  |                                                                                          |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |                                                                                          |        ID   ID                                                   Usage      |                                                                                          |=============================================================================|                                                                                          |  No running processes found                                                 |                                                                                          +-----------------------------------------------------------------------------+ 

可以看到两张 T4 卡已经就绪了。

安装 Ollama

我们用官方推荐的 Docker 方式部署 Ollama,便于进行版本的管理与测试。

首先将 Ollama 镜像下载到本地,由于国内无法访问 DockerHub,因此大家可以使用后面命令中的代理地址访问:

docker pull docker.1ms.run/ollama/ollama:0.5.11

之后使用命令启动 Ollama 容器:

docker run -dp 8880:11434 --gpus device=0 --name DeepSeek-R1-1 docker.1ms.run/ollama/ollama:0.5.11

这条命令的意思是,首先将容器的 11434 端口映射到宿主机的 8880 端口,11434 即 Ollama 提供 API 访问的端口。–gpus device=0 表示该容器要使用 GPU 0 号卡,怎么知道 GPU 卡的编号的呢?是在前面执行 nvidia-smi 命令时知道的。

根据前面 nvidia-smi 命令的执行结果,两张 Tesla T4 的编号分别是 0 和 1。–name DeepSeek-R1-1 是给容器起一个名字,叫 abc 都可以,只要你喜欢。最后是下载下来的容器镜像的名称。

如果一切正常,启动后,就会返回容器的 ID。接着我们通过 docker ps 命令,就可以查询到容器的信息。

root@aitest:~# docker run -dp 8880:11434 --gpus device=0 --name DeepSeek-R1-1 docker.1ms.run/ollama/ollama:latest                                                        7049f65fd9d34392c26355174f4701c1b2c5aa718cdc168d19a982f0519d7635root@aitest:~# docker ps                                                                                                                                                 CONTAINER ID   IMAGE                                 COMMAND               CREATED          STATUS         PORTS                                           NAMES         7049f65fd9d3   docker.1ms.run/ollama/ollama:0.5.11   "/bin/ollama serve"   10 seconds ago   Up 9 seconds   0.0.0.0:8880->11434/tcp, [::]:8880->11434/tcp   DeepSeek-R1-1

这一步,经常会报如下的错误:

root@aitest:~# docker run -dp 8880:11434 --gpus device=0 --name DeepSeek-R1-1 docker.1ms.run/ollama/ollama:0.5.11bd74646a26c6a539aa7660eb664caa585dba188720f0975701b73d87263b6cdf                                                                                                         docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]. 

这是因为服务器的 NVIDIA Container Toolkit 没有装,需要执行如下命令安装一下:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.listapt-get updateapt-get install -y nvidia-docker2systemctl restart docker

安装完成后,执行 docker info 命令,确保 docker 守护进程已经正确配置 GPU 支持。命令和输出如下:

root@aitest:~# docker info | grep -i nvidia                                                                                                                               Runtimes: io.containerd.runc.v2 nvidia runc

此时再重新 docker run,就可以将 Ollama 容器拉起了。

部署与测试 DeepSeek-R1

Ollama 官方提供了一个可视化的模型仓库,便于我们了解 Ollama 已经支持了哪些模型,以及下载模型。仓库的地址是:ollama.com/library点开链接后,第一个就是 DeepSeek-R1 模型,分为 1.5b 到 671b 多个版本。点进去之后可以选择模型版本以及看到模型运行命令,更新记录等。

这里我介绍两种 Ollama 拉起 DeepSeek-R1 的方案。

1. 在容器内下载模型和拉起 *

我们需要进入到 Ollama 容器的内部,去执行模型运行命令。进入容器的命令为:

docker exec -it <你的容器名称或 ID> /bin/bash

然后执行模型运行命令:

ollama run deepseek-r1:32b

输出如下,由于本地没有模型,所以,会先在模型仓库下载模型,我们需要耐心等待模型下载完毕。下载完成后,就会加载模型,直到出现 success,模型就加载好了。直接输入对话,测试效果。例如:可以看到,模型带有 DeepSeek-R1 标志性的 也就是深度思考,但是由于我们问的问题太简单了,模型认为不需要深度思考就能回答,因此就直接回答了。

2. 将模型文件挂载进容器(推荐)

我更推荐接下来的这种方法,因为下一节我们讲负载均衡方案时,需要起两个 Ollama 容器,因此用这种方式只下载一次模型文件就可以,比较方便。

执行如下命令,在服务器上安装 Ollama 工具。

curl -fsSL https://ollama.com/install.sh | sh

之后直接将模型下载到本地:

ollama pull deepseek-r1:32b

启动容器,将模型挂载进去,需要注意 Ollama 在 ubuntu 服务器上的默认是模型文件存放目录 /usr/share/ollama/.ollama/models,但是在容器中的目录是 /root/.ollama/models,挂载时要写成服务器目录: 容器目录的格式,注意不要写反了。

docker run -dp 8880:11434 --runtime=nvidia --gpus device=0 --name DeepSeek-R1-1 -v /usr/share/ollama/.ollama/models:/root/.ollama/models docker.1ms.run/ollama/ollama:0.5.11

最后查看容器中的模型是否已经运行:

root@aitest:~# docker ps                                                                                                                                                 CONTAINER ID   IMAGE                                 COMMAND               CREATED         STATUS         PORTS                                           NAMES          9a44f04e78f7   docker.1ms.run/ollama/ollama:0.5.11   "/bin/ollama serve"   6 minutes ago   Up 6 minutes   0.0.0.0:8880->11434/tcp, [::]:8880->11434/tcp   DeepSeek-R1-1  root@aitest:~# docker exec -it 9a44f04e78f7 ollama list                                                                                                                  NAME               ID              SIZE     MODIFIED                                                                                                                     deepseek-r1:32b    38056bbcbb2d    19 GB    About an hour ago

模型为什么不思考?

在上文中,我们问 “hello”,DeepSeek 并没有思考。但是我们用官方版本的去问同样的问题,会发现,官方版的无论简单问题还是复杂问题都会思考:这是什么原因呢?我们使用如下命令看一下 deepseek-r1:32b 的聊天模板。

ollama show --modelfile deepseek-r1:32b

输出如下:可以看到在 <| Assistant| > 后面直接就是跟的 Content,没有可以强调 的事情,因此就相当于把是否 think 的主动权交给大模型了。这个其实是对的,如果每一个问题无论简单与否都要思考,会劳民伤财,费时费钱。但这个事情反过来看,如果大模型的能力不能达到极致,在遇到我们想让它思考的问题时,它不思考,体验性又不好。所以这也是官方版本做了强制 think 的原因吧。

那我们如何像官方一样强制 think 呢?其实很简单,按官方教程描述,只需要加一个 think 标签即可。

操作步骤是这样的。首先将聊天模板保存下来:

ollama show --modelfile deepseek-r1:32b > Modelfile

之后,在 <| Assistant| > 之后加上 \n,如下图所示:之后基于 Modelfile 创建一个新的模型:

ollama create deepseek-r1-think:32b -f ./Modelfile

这时,再按照前面讲的将模型文件挂载进容器的启动方式,启动容器。

进入容器后,执行一下 ollama list,可以看到现在有两个模型了。使用如下命令,将模型 deepseek-r1-think:32b 运行起来,然后测试:

ollama run deepseek-r1-think:32b

测试结果如下:再问相同的问题,模型具备了思考能力。

API 访问

最后,我们看一下,Ollama 的 API 访问。由于 Ollama 的 API 兼容了 OpenAI 的数据结构,因此测试非常简单,直接 curl 一下即可:

curl http://localhost:8880/v1/chat/completions \-H "Content-Type: application/json" \-d '{    "model": "deepseek-r1-think:32b",  "messages": [    {"role": "user", "content": "hello"}  ]}'

结果如下:

总结

Ollama 致力于让用户可以以极简的方式快速部署运行开源模型。为了减少对于显存的占用,Ollama 对模型进行了量化处理,因此我们才可以在一张 16GB 显存的 T4 卡上,体验 DeepSeek-R1:32B 模型。

除此之外,Ollama 还对各个大模型进行了统一的 API 封装,API 兼容 OpenAI 数据格式,因此用户可以直接通过访问 OpenAI 模型的方式去访问 Ollama 拉起的模型,非常方便。

最后,还结合 DeepSeek-R1 的一个典型特征,深度思考,进行了测试,并解决了模型遇到简单问题不思考的问题。如果你手头上有服务器,或者个人笔记本的显卡是 3090、4090 等相对不错的显卡,可以尝试按文章内容实践一遍,加深理解。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Ollama 大语言模型 本地部署 DeepSeek-R1 Docker
相关文章