什么是 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 等相对不错的显卡,可以尝试按文章内容实践一遍,加深理解。