离线私有化环境部署deepseek之ollama模型缓存

离线私有化环境部署 deepseek 之 ollama 模型缓存

在某些特殊的环境下,导致我们使用 ollama 模型存在各种各样的问题。最常见的就是拉取不了或者拉取速度很慢。基于这点,想到了如何去镜像缓存这些。

应用场景

方便给离线环境下的用户部署私有大模型体验。

ollama 与 oci

可以跳过这部分记录早期我的探索,得出目前不支持通用 OCI 方式。

从上面 ollama 拉取模型来看,是不是很眼熟,和我们经常拉取容器镜像是不是很相似。深入研究后发现,有着容器镜像的模型名称、分层存储结构,其中 manifest 保存 layer 列表,blob 存储二进制文件。那灵机一动是不是,可以存镜像的 registry 是不是也可以存 model。

搭建镜像服务

services:
  registry:
    image: registry:latest
    container_name: registry
    restart: always
    ports:
      - "5000:5000"
    environment:
      TZ: Asia/Shanghai

基于官方的 registry 镜像跑了一个镜像仓库来模拟,将上面的文件保存为 docker-compose.yaml

运行起来

docker compose pull
docker compose up -d

下载 deepseek-r1 小模型

# 下载deepseek最小模型验证
ollama pull deepseek-r1:1.5b
# 重命名
ollama cp deepseek-r1:1.5b 127.0.0.1:5000/ollama/deepseek-r1:1.5b

推送到本地镜像仓库

ollama push 127.0.0.1:5000/ollama/deepseek-r1:1.5b --insecure

推送很成功,给人一种万事俱备,只等下载了

验证下载

ollama pull 100.90.80.29:5001/ollama/deepseek-r1:1.5b --insecure
pulling manifest
pulling aabd4debf0c8...   0% ▕                                                                                                                                                                                    ▏    0 B/1.1 GB
Error: http: no Location header in response

下载提示这个,去搜了一下这个报错,也有人反馈这个问题,解决也可以参考这个 ollama#7474

根据核心开发者的反馈,我大概总结了一下:

尚未公开使用 OCI 规范,因为我们正在对其进行重大修改,以确保未来的灵活性。

其实到这里使用 oci 的方式行不通了。另外官方也没有透露如何搭建私有化模型仓库。

基于 caddy+ollama 部署镜像缓存加速

主要参考了大佬 ollama 模型缓存这篇博客,有兴趣的可以看看作者的逆向分析。这里主要讲一下如何快速搭建模型缓存。

镜像版本

使用这个镜像,可能有丢丢麻烦,但是也还好,需要套两层 caddy,一个是镜像内置的 caddy,一个是外部的 caddy 代理服务。

services:
  ollama-registry:
    image: wbuntu/ollama-registry:v0.1
    container_name: ollama-registry
    restart: always
    ports:
      - "8080:8080"
    volumes:
      - '/data/ollama-models:/data'

将上面的文件保存为 docker-compose.yaml, 执行

docker compose pull
docker compose up -d

配置 caddy 服务

ai-models.china.12306.work {
    import LOG "/var/log/caddy/ai-models.log"
	reverse_proxy 127.0.0.1:8080
}

到这里基本模型缓存服务就搭建完了,但是使用需要满足以下几点需求

  1. 首先需要 ollama-registry 服务缓存相关模型
  2. 其次才能通过 ollama-registry 拉取模型
# 通过ollama-registry缓存qwen2.5的模型
docker exec ollama-registry ollama pull qwen2.5:latest
# 其他服务器下载模型
ollama pull ai-models.china.12306.work/library/qwen2.5:latest

非镜像版本

要求部署了 ollama 和 caddy,方便操作 caddy 部署用户使用 root,避免权限问题.(默认情况,两者都已经跑起来了), 主要是配置 caddy。

其实就是将镜像里的 caddy 独立出来了,Caddyfile 示例如下:

ai-models.china.12306.work {
 	import LOG "/var/log/caddy/ai-models.log"
	# root directory 
	root * /root/.ollama/models

	# match blob request
	@blobRequests path_regexp blob /v2/([^/]+)/([^/]+)/blobs/sha256:(.+)
	# rewrite blob request
	rewrite @blobRequests /blobs/sha256-{re.blob.3}
	# add Location header on response
	header @blobRequests {
		Location {uri}
	}

	# match manifest request
	@manifestRequests {
		path_regexp manifest /v2/([^/]+)/([^/]+)/manifests/(.+)
	}
	# rewrite manifest request
	rewrite @manifestRequests /manifests/registry.ollama.ai/{re.manifest.1}/{re.manifest.2}/{re.manifest.3}
	# add Content-Type header on response
	header @manifestRequests {
		Content-Type application/vnd.docker.distribution.manifest.v2+json
	}

	# static file server
	file_server browse
}

其他

目前,我已经缓存了 5 个通用大模式供大家下载, 如果大家还有其他模型需要加速,可以私信我。

ai-models.china.12306.work/library/qwen2.5:latest
ai-models.china.12306.work/library/qwen2.5-coder:latest
ai-models.china.12306.work/library/deepseek-r1:1.5b
ai-models.china.12306.work/library/deepseek-r1:7b
ai-models.china.12306.work/library/deepseek-r1:8b

附录

Sponsor

Like this article? $1 reward

Comments

lsx ·v1 香港 Reply

哈喽 使用镜像版本方式部署可以成功拉取到镜像,其他机器上也能拉取到镜像,是否可以从其他机器上上传镜像呢?

ysicing 👨‍💻 ·v1 Reply

@lsx 不支持的,registry可以存镜像,可以参考这个构建一个 ollama#7474 看看