高性能聊天大模型的本地部署,最近成了不少开发者的刚需。DeepSeek-R1:32B 发布后,风头直追 ChatGPT o1,可官方服务动不动就“服务器繁忙”,实在让人头疼。与其等官方扩容,不如自己动手——在 Ubuntu 上通过 Docker 部署一套 Ollama + DeepSeek 环境,再配上流式接口调用,既稳定又可控。下面就把完整流程拆开来讲。
先说几个关键判断:DeepSeek 最近确实火,官方压力太大,自己部署是最省心的替代方案。部署基于 Docker,前提是让 Docker 能调用 GPU——纯 CPU 跑不但慢,内存消耗也惊人。整个过程除了模型下载速度比较玄学,环境配置一次搞定后基本没有坑。
服务器基础资源
这次演示用的服务器配置如下:
- 操作系统:Ubuntu 24.04
- 显卡:Tesla P100-PCIE-16GB × 2
- CPU:48核
- 内存:64G
这么一套资源跑 32B 模型还算从容,如果硬件偏弱,后面也会提到轻量模型的替代方案。
运行 Docker 命令
先启动 Ollama 容器,注意加上 --gpus=all 才能启用 GPU 加速。持久化目录挂载到宿主机,方便模型文件管理。
docker run --name ollama -d --restart=always --gpus=all -v /data/docker/ollama:/root/.ollama -p 11434:11434 ollama/ollama
容器启动后,进入容器内执行后续操作:
docker exec -it ollama /bin/sh
然后下载并运行 32B 模型:
ollama run deepseek-r1:32b
如果资源不够,可以退而求其次,选择 1.5B 或 7B 的版本:
ollama run deepseek-r1:1.5b
下载提示
模型下载速度是个变数。开局如果有 MB/s 级别的速度,说明网络条件不错,但过一会可能降到几百 KB。一个实操技巧:直接 Ctrl+C 中断下载,然后重新执行下载命令,速度又能提上去。重复这个过程,能把大模型“分段加速”拉下来——听起来有点取巧,但实测有效。
运行模型
几个常用命令先列出来:
ollama pull deepseek-r1:1.5b //拉取模型
ollama run deepseek-r1:1.5b //运行模型
ollama list //查看所有模型
如果要在局域网内其他设备访问,需要放开防火墙端口:
sudo ufw allow 11434/tcp
先看看本地已拉取了哪些模型:
ollama list
好,现在正式运行 32B 模型:
ollama run deepseek-r1:32b
进入交互模式后直接发消息。第一个问题:“DeepSeek为何如此优秀?”——回答比较简短、官方。换一个问题:“如何看待目前的各种AI产品?”——这次回复就详尽多了,能看出模型的思维链能力确实不赖。
模型跑起来之后,还可以通过 HTTP 接口查看 Ollama 的运行状态:
http://192.168.0.120:11434/
通过这个 API 查看已部署的模型列表:
http://192.168.0.120:11434/api/tags
可以看到,当前 Ollama 上一共部署了三个模型,可以根据需求切换。
GPU 资源耗费情况
跑 32B 模型时,单张 P100 16GB 显存还剩 5GB 左右,意味着还有余量给其他业务。如果是双卡,负载更均衡。
接口方式调用 DeepSeek R1,控制台流式输出
Ollama 部署好模型后,直接通过 REST API 调用即可,比在 Docker 里敲命令更方便。下面是用 .NET 实现的流式调用示例。
先引入 NuGet 包:
Codeblaze.SemanticKernel.Connectors.Ollama
完整代码如下(基于 Semantic Kernel 实现流式输出):
static async Task Main(string[] args)
{
var builder = Kernel.CreateBuilder()
.AddOllamaChatCompletion("deepseek-r1:32b", "http://192.168.0.120:11434");
builder.Services.AddScoped();
var kernel = builder.Build();
while (true)
{
string input = "";
Console.Write("请输入: ");
input = Console.ReadLine();
Console.WriteLine("");
var contents = kernel.InvokePromptStreamingAsync(input);
if (contents == null)
{
Console.WriteLine("Error: 内容为空!");
continue;
}
else
{
Console.WriteLine($"\nDeepseek:\n");
await foreach (var item in contents)
{
Console.Write(item.ToString());
}
}
Console.WriteLine("");
}
}
这段代码启动后进入循环,接收输入后通过流式接口实时输出回复,效果跟直接在 Docker 里用命令行一样,但更方便集成到自己的应用中。实际跑起来,响应速度取决于模型大小和 GPU 性能,32B 模型单卡 P100 基本能做到秒级响应,已经足够日常使用。
