一、背景
1、什么是Ollama
Ollama是一个在本地运行大语言模型(LLM)的开源框架,提供了针对Windows、Linux、MacOS预先封装好的一系列模型,可一键方式在开发者本地(例如笔记本)运行大模型,大大简化了体验和开发的过程。Ollma将不同模型封装到自定义的容器架构内,并针对不同硬件架构做好了适配,可在包括Apple M1处理器在内的多种机型上运行。
2、关于Deekseek R1
DeepSeek是位于杭州的一家初创公司,其团队具有量化行业背景。DeepSeek据称拥有1万张A100级别的算力,并在2024年5月发布DeepSeek V2模型,2024年12月发布V3模型。DeepSeek模型是开源模型,通过Github这里可以获取。DeepSeek目前使用MIT协议,可免费用于商用。DeepSeek官方对V3版本的描述是:“DeepSeek-V3 为自研 MoE 模型,671B 参数,激活 37B,在 14.8T token 上进行了预训练。DeepSeek-V3 多项评测成绩超越了 Qwen2.5-72B 和 Llama-3.1-405B 等其他开源模型,并在性能上和世界顶尖的闭源模型 GPT-4o 以及 Claude-3.5-Sonnet 不分伯仲”。DeepSeek V3的论文在Github的这里。
由V3演进而来的是R1模型。DeepSeek官方的对R1版本的描述是:“DeepSeek-R1 在后训练阶段大规模使用了强化学习技术,在仅有极少标注数据的情况下,极大提升了模型推理能力。在数学、代码、自然语言推理等任务上,性能比肩 OpenAI o1 正式版”。R1版本的论文在Github的这里。DeekSeek R1版本是660B参数的模型,同时官方通过 DeepSeek-R1 的输出,基于阿里千问Qwen和Meta(Facebook)的Llama蒸馏出了6个小模型,官方的评测显式基于Llama蒸馏的32B和70B模型在多项能力上实现了对标OpenAI o1-mini的效果。R1模型和所有蒸馏的模型也都遵循MIT协议,可免费用于商用。
虽然DeepSeek的模型使用MIT协议可以自行部署,但部署R1模型需要数百GB显存,一般用户不具备条件部署完整版,此时可根据需要选择蒸馏版本。本文将演示最低成本的1.5b模型的部署。
二、在MacOS本机上运行1.5b模型
本文以使用M1处理器的MacBook Pro 13英寸机型为例,配备4个性能核心+4个效率核心(4P+4E)共计8个内核的CPU,以及8核心GPU,搭配16GB统一内存。
1、安装Ollama
从Ollama官网 https://ollama.com/ 下载对应的操作系统Windows、Linux或MacOS的安装包。
下载时候是ZIP格式,解压缩后是应用程序,双击运行。MacOS上会提示是否将这个程序移动到Application应用程序文件夹,这里点击确认。如下截图。
第一次运行Ollama,会提示是否要安装,点击确认。
在安装命令行位置点击安装即可。如下截图。
2、下载并启动DeepSeek R1
从Ollama官网这里的模型清单中,查找要在本地部署的模型。这里找到DeepSeek R1模型的蒸馏后的1.5b模型,可以看到在model介绍部分也显示其架构师基于Qwen2模型蒸馏而来。点击复制按钮,将部署命令复制下来。如下截图。
打开本机的终端,运行上一步复制下来的命令:
ollama run DeepSeek-r1:1.5b
现在可以看到ollama的命令行程序正在下载对应模型。根据网速不同,可能需要几分钟。如下截图。
部署完毕后,出现Send a message (/? for help)
提示符。已经就绪可直接输入Prompt提示词。如下截图。
由此可看到在MacOS本机运行模型正常。
3、使用CURL通过API交互
注意,Ollama默认只监听本机地址,即127.0.0.1的本地地址,因此除本计算机之外的本地局域网的其他计算机是不能访问的。如果希望开放本地局域网访问,可以修改Ollama的配置文件,使其监听在0.0.0.0
本机所有地址即可。此外还需要注意,默认的Ollama服务端口是没有身份认证的,如果要开放给本机127.0.0.1之外的地址,还需要注意访问安全。
本文的例子是针对本地请求的例子。
curl http://localhost:11434/api/generate -d '{"model": "deepseek-r1:1.5b", "prompt": "你是什么模型"}'
即可看到返回结果。注意,返回内容是Stream流式的,因此CURL会给出多条返回记录,每个记录一个文字或者一个单词。
4、使用本机C/S架构聊天客户端
Ollama有很多的开源客户端,这里选择名为OllamaChat
的客户端。这个客户端也是开源的,可以从Github的这里获取。这里以MacOS版本为例。
下载到本地后,解压缩即可直接运行。在主界面左下角的齿轮符号是进入配置界面。配置界面中可看到调用的API。默认的API端口不用修改,可直接使用。如下截图。
输入提示词可看到运行正常。如下截图。
5、启动和停止服务
由于推理容器一直会占用本机资源,因此在需要使用的时候,需要手工停止。如果当前还在Ollama的Shell下,可以按CTRL+C
键,返回到命令行。如果不结束命令行,那么再次输入提示词时候,Ollama又会自动启动。
执行ollama ps
命令查看正在运行的模型。返回结果如下:
NAME ID SIZE PROCESSOR UNTIL
deepseek-r1:1.5b a42b25d8c10a 2.1 GB 100% GPU 4 minutes from now
找到正在运行的模型ID,运行如下命令停止它。
ollama stop deepseek-r1:1.5b
如果要再次运行之前停止的模型,可首先执行ollama list
命令查询本地可用的模型镜像。返回结果如下:
NAME ID SIZE MODIFIED
deepseek-r1:1.5b a42b25d8c10a 1.1 GB 4 days ago
可以看到本机有之前下载过的镜像,复制下来ID,然后执行如下命令启动:
ollama run deepseek-r1:1.5b
启动完成,出现Send a message (/? for help)
提示符即可开始交互。
三、在云端GPU机型运行32b模型
刚才在MacOS本机部署的是R1蒸馏后的Qwen-1.5b模型,选择这个模型是考虑到Mac本地的运算能力和Mac的内存大小(Apple M1的内存叫统一内存,也是显存),因而选择1.5b模型。
如果在云端,可使用较大显存的机型,运行参数更大的模型。本文使用蒸馏后Qwen-32B模型,机型选择A10单卡有24GB显存的机型做推理,在AWS云上对应型号为G5/G6等机型。实际启动后占用约23GB显存,因此可以说是勉强能启动,如果是生产环境使用,建议更换为单卡48GB显存的EC2 G6e机型。
对应70b的从llama蒸馏而来的模型,可以选择使用Nvidia L40s显卡且单卡配备48GB显存的G6e机型。注意EC2 G6和G6e机型是不同的显卡,显存差一倍。
1、创建EC2
创建一台g5.2xlarge机型,其配置是8vCPU/32GB,一个A10 GPU/24GB显存。操作系统选择Ubuntu Server 24.04 LTS版本。
由于要从Ollama官方镜像下载模型,因此需要确保本机的EBS磁盘足够大(建议选100GB的gp3),并且确保本机能够访问互联网(可为本VPC增加NAT gateway)。
创建完毕。
2、安装Ollama并启动服务
执行如下命令安装ollama。
curl -fsSL https://ollama.com/install.sh | sh
这里拉取DeepSeek R1蒸馏后参数32B的Qwen-32b模型。
ollama run deepseek-r1:32b
等待一段时间后(注意保持网络不要中断),即可看到模型部署完毕。Ollama的shell控制台可以直接按CTRL+D
键退出,不会影响后台模型的运行。
为了确认机型正确且模型被完全加载到显存中,可执行ollama ps
命令。如果下方显示100% GPU
则表示显存足够。如果显示50% CPU 50% GPU
则表示显存不够,一部分模型只能通过系统内存加载,建议更换更大的机型。
deepseek-r1:70b 0c1615a8ca32 46 GB 100% GPU 4 minutes from now
3、在本EC2上使用Python代码流式对话(Stream)
在本EC2上安装依存性包。
sudo -i
apt install pipx
pipx install ollama --include-deps
pipx ensurepath
export PYTHONPATH=$PYTHONPATH:/root/.local/share/pipx/venvs/ollama/lib/python3.12/site-packages
在本EC2上编写如下代码,并保存为chat.py
。
from ollama import chat
messages = [
{
'role': 'user',
'content': '你是什么模型?',
},
]
for part in chat('deepseek-r1:32b', messages=messages, stream=True):
print(part['message']['content'], end='', flush=True)
print()
需要注意以上代码的模型ID必须与执行ollma ps
显示正在运行的模型的ID一致。运行这个脚本python3 chat.py
测试,即可看到正常运行。
四、参考资料
Ollama支持的GPU型号
https://github.com/ollama/ollama/blob/main/docs/gpu.md
查询模型
https://ollama.com/library/DeepSeek-r1:1.5b
Ollama MacOS GUI
https://github.com/rijieli/OllamaChat
Ollama python example