[Share Experiences] 2 docker或docker compose 离线部署ollama和deepseek
Tofloor
poster avatar
sleepytime
deepin
2025-02-27 11:18
Author

使用docker快速离线部署ollama并运行deepseek模型。

0 环境要求

先查看显卡是否计算能力和显存大小,来判断是否使用纯GPU模式或者混合模式。

如果没有符合条件的GPU,那只能使用纯CPU模式,很慢!

(1)安装docker-ce 。

(2)如有符合条件的NVIDIA GPU,安装CUDA和NVIDIA Container Toolkit。amd或其他GPU,本帖没研究过暂不讨论。

CUDA安装,参考帖子 https://bbs.deepin.org/post/271418

docker-ce和NVIDIA Container Toolkit安装,参考帖子 https://bbs.deepin.org/post/262226

Ollama 支持计算能力为 5.0 及以上的 Nvidia GPU!

查询自己的NVIDIA GPU的计算能力:https://developer.nvidia.com/cuda-gpus

点击图标即可展开列表显示内容

wechat_2025-02-27_133504_391.png

1 准备离线文件

wechat_2025-02-27_132238_865.png

(1)获取ollama的docker镜像文件,目前最新版是 ollama/ollama:0.5.12,查询 https://hub.docker.com/r/ollama/ollama

docker pull ollama/ollama:0.5.12
# 得到离线镜像文件 ollama-0.5.12.tar
docker save ollama/ollama:0.5.12 -o ollama-0.5.12.tar

(2)下载deepseek模型文件,莫大社区下载地址

https://modelscope.cn/models/unsloth/DeepSeek-R1-Distill-Qwen-7B-GGUF/files

https://modelscope.cn/models/unsloth/DeepSeek-R1-Distill-Qwen-14B-GGUF/files

https://modelscope.cn/models/unsloth/DeepSeek-R1-Distill-Qwen-32B-GGUF/files

关于模型选择,根据硬件资源选择

截图_选择区域_20250305214209.png

我选择的模型 DeepSeek-R1-Distill-Qwen-7B-Q5_K_M.gguf

Distill 蒸馏模型,高效压缩的模型。

7B 适合6GB显存的显卡。混合模式或纯CPU模式可以选择更大的模型,GPU参与比例越少,速度越慢。

Qwen 与 Llama 的区别和量化区别 https://xiaoyi.vc/deepseek-qwen-llama.html,Qwen侧重中文。

Q4KM,Q5KM,Q6K,Q8_0区别 https://blog.51cto.com/zhangxueliang/13450686

gguf 加载快。https://www.datalearner.com/blog/1051705718835586

(3)提前准备好ollama导入自定义模型要用到的Modelfile文件(实测Modelfile文件名称任意都可以)

# 这里填入gguf文件路径
FROM /root/models/DeepSeek-R1-Distill-Qwen-7B-Q5_K_M.gguf

# 以下为模型模板配置
TEMPLATE """{{- if .System }}{{ .System }}{{ end }}
{{- range $i, $_ := .Messages }}
{{- $last := eq (len (slice $.Messages $i)) 1}}
{{- if eq .Role "user" }}<|User|>{{ .Content }}
{{- else if eq .Role "assistant" }}<|Assistant|>{{ .Content }}{{- if not $last }}<|end▁of▁sentence|>{{- end }}
{{- end }}
{{- if and $last (ne .Role "assistant") }}<|Assistant|>{{- end }}
{{- end }}"""


PARAMETER stop "<|begin▁of▁sentence|>"
PARAMETER stop "<|end▁of▁sentence|>"
PARAMETER stop "<|User|>"
PARAMETER stop "<|Assistant|>"

# PARAMETER num_ctx 12800

docker方式离线部署

# 1 导入镜像
docker load -i ollama-0.5.12.tar

# 2 nvidia运行ollama,纯cpu模式去掉 --gpus 参数
docker run -d --gpus=all -v ./ollama:/root/.ollama -v ./models:/root/models -p 11434:11434 --name ollama ollama/ollama:0.5.12

# 3 导入gguf模型,实测Modelfile文件名称任意都可以
docker exec -it ollama ollama create DeepSeek7B -f /root/models/Modelfile

命令行运行模型:

会一直停留在命令输入窗口中,只有退出,模型才会停止并释放使用的CPU和GPU资源;

而且输入和显示效果有限。一般用于部署完测试,不推荐日常会话使用。

# 手动运行模型
docker exec -it ollama ollama run DeepSeek7B
# 此时,就可以在终端中和模型对话了

# 最后退出模型
/bye

推荐客户端方式:

适合日常会话使用,可以使用浏览器插件或者cherry studio之类的客户端工具,连接ollama的端口11434即可。
优点:列表中可以方便的切换多个模型;自动运行和停止模型,减少闲置时CPU和GPU资源占用。
聊天时会自动run模型,闲置一段时间会自动stop模型。

本地下载号的模型

image.png

纯CPU模式、纯GPU模式、CPU/GPU混合模式

image.pngimage.png截图_选择区域_20250227214740.png

4个DCU海光Z100 32GB,纯GPU模式,卡显存使用情况。

image.png

默认设置下ollama给GPU加载的就是最大层数。

单卡最多可设置模型层数(取整):单卡模型层数上限=单卡显存大小/模型大小*模型总层数

多卡同理累加,不过每个卡层数都取整。

ollama支持多卡,docker参数设置如下:

  • --gpus all: 使用所有 GPU 设备
  • --gpus "device=0": 使用第一个 GPU 设备
  • --gpus "device=1": 使用第二个 GPU 设备
  • --gpus "device=2,3": 使用第三和第四个 GPU 设备

混合比例可以根据自己卡数量,显存大小,模型的层数,kv缓存的大小,手动设置加载进gpu的模型层数。

待后续研究和验证测试:

通过设置环境变量,设置 OLLAMA_GPU_LAYERcuda,并通过 CUDA_VISIBLE_DEVICES指定GPU的UUID。modelfile中添加参数

PARAMETER num_gpu xx

docker compose方式离线部署

个人推荐此方式,离线部署或者迁移的时候打包整个文件夹带走即可,修改端口或卡ID配置文件还是更方便一些。在上面的文件夹下添加docker-compose.yml文件即可

services:
  ollama:
    image: ollama/ollama:0.5.12
    ports:
      - 11434:11434
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./ollama:/root/.ollama
      - ./models:/root/models
    restart: always # 开机自启
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              capabilities: ["gpu"]
              # 指定数量或者指定卡ID只能二选一,使用哪个方式就取消注释这个方式,并注释另一个方式
              device_ids: ["0","2"] # 例如多个GPU型号、显存不一样时,指定只用某个型号的卡。
              # count: "all" # all或者数字
# 查看卡ID
nvidia-smi -L # 结果中开头的GPU n,n就是id值。

# 导入gguf模型,只需导入一次
docker compose exec -it ollama ollama create DeepSeek7B -f /root/models/ModelfileQ8
# 启动服务
docker compose up -d
# 停止服务
docker compose down
# 查看日志
docker compose logs -f

4 ollama 命令

使用“ollama [命令] --help”获取有关命令的更多信息。docker exec -it ollama ollama --help

用法:
ollama [标志]
ollama [命令]

标志:
  -h, --help      ollama的帮助
  -v, --version   显示版本信息

可用命令:
  serve,start       启动ollama,容器默认执行
  create      根据Modelfile创建一个模型
  show        显示模型信息
  run         运行模型
  stop        停止正在运行的模型
  pull        从注册表中拉取模型
  push        将模型推送到注册表
  list        列出模型,实测简写ls也可以。
  ps          列出正在运行的模型
  cp          复制模型
  rm          删除模型
  help        关于任何命令的帮助

使用“ollama [子命令] --help”获取有关子命令的帮助信息。
docker exec -it ollama ollama start --help

用法:
  ollama serve [标志]

别名:
  serve, start

标志:
  -h, --help   serve 命令的帮助信息

环境变量:
OLLAMA_DEBUG               显示额外的调试信息(例如 OLLAMA_DEBUG=1)
OLLAMA_HOST                ollama服务器的IP地址(默认127.0.0.1:11434)
OLLAMA_KEEP_ALIVE          模型在内存中保持加载的持续时间(默认“5m”)
OLLAMA_MAX_LOADED_MODELS   每个GPU上加载的最大模型数量
OLLAMA_MAX_QUEUE           队列中的最大请求数量
OLLAMA_MODELS              模型目录的路径
OLLAMA_NUM_PARALLEL        最大并行请求数量
OLLAMA_NOPRUNE             启动时不对模型块进行修剪
OLLAMA_ORIGINS             允许的来源列表,用逗号分隔
OLLAMA_SCHED_SPREAD        始终在所有GPU上调度模型
OLLAMA_FLASH_ATTENTION     启用快速注意力机制
OLLAMA_KV_CACHE_TYPE       K/V缓存的量化类型(默认:f16)
OLLAMA_LLM_LIBRARY         设置LLM库以绕过自动检测
OLLAMA_GPU_OVERHEAD        为每个GPU预留一部分VRAM(字节)
OLLAMA_LOAD_TIMEOUT        在放弃之前允许模型加载停滞的时间(默认“5m”)

5 ollama API

参考https://www.runoob.com/ollama/ollama-api.html

Reply Favorite View the author
All Replies
waittingsummer
deepin
2025-02-27 13:24
#1

cy

Reply View the author
luckyBunny
deepin
2025-02-27 13:40
#2

👍 只能看看……老爷机不配sob

Reply View the author
sleepytime
deepin
2025-02-27 15:39
#3
luckyBunny

👍 只能看看……老爷机不配sob

https://developer.nvidia.com/cuda-gpus 我看很多老卡都在5.0以上,就是显存不够。GTX 1060 6GB可以!

只使用8G内存也行!
wechat_2025-02-27_153534_708.png

Reply View the author
sleepytime
deepin
2025-02-27 15:40
#4
It has been deleted!
WangZhongyun
deepin
2025-02-27 16:14
#5

老显卡真不行

Reply View the author
爱开玩笑
deepin
2025-03-13 17:17
#6

请问有朋友试过双 3060TI16G显存接入DeepSeek吗?有没什么注意事项?

Reply View the author
sleepytime
deepin
2025-03-15 10:51
#7
爱开玩笑

请问有朋友试过双 3060TI16G显存接入DeepSeek吗?有没什么注意事项?

2个3060TI没试过。我试过4个其它型号的卡,模型可以近似平均的占用4个卡的显存。

ollama支持使用设备上的指定GPU:

  • --gpus all : 使用全部GPU
  • --gpus "device=0": 使用第一个 GPU 设备
  • --gpus "device=1": 使用第二个 GPU 设备
  • --gpus "device=2,3": 使用第三和第四个 GPU 设备
Reply View the author