撰于 阅读 67

Ollama 模型存储位置以及 Cache 方案构想

ollama pull 命令拉取下来的模型主要存放在 /root/.ollama/models 中

主要包括下面两部分

  • /blobs
  • /manifests/registry.ollama.ai/library

/manifests/registry.ollama.ai/library 中存放模型的描述

比如 qwen3:1.7b 的模型就会有文件 /qwen3/1.7b,该文件的具体内容如下所示:

{"schemaVersion":2,"mediaType":"application/vnd.docker.distribution.manifest.v2+json","config":{"mediaType":"application/vnd.docker.container.image.v1+json","digest":"sha256:517ccaff02fe9f99718ab2f478e611aa2813c36263eeed86c2427bc122d14ad8","size":487},"layers":[{"mediaType":"application/vnd.ollama.image.model","digest":"sha256:3d0b790534fe4b79525fc3692950408dca41171676ed7e21db57af5c65ef6ab6","size":1359279776},{"mediaType":"application/vnd.ollama.image.template","digest":"sha256:ae370d884f108d16e7cc8fd5259ebc5773a0afa6e078b11f4ed7e39a27e0dfc4","size":1723},{"mediaType":"application/vnd.ollama.image.license","digest":"sha256:d18a5cc71b84bc4af394a31116bd3932b42241de70c77d2b76d69a314ec8aa12","size":11338},{"mediaType":"application/vnd.ollama.image.params","digest":"sha256:cff3f395ef3756ab63e58b0ad1b32bb6f802905cae1472e6a12034e4246fbbdb","size":120}]}

这个文件指出 qwen3:1.7b 该模型共有 4 个 layer,5 个 blobs

/blobs 中存放具体的模型块

构成 qwen3:1.7b 的 5 个 blobs 就被存放在 /blobs 文件夹中,名称就是将上文模型描述中的 digest 部分中的 ":" 替换为 "-",比如 "sha256:517ccaff02fe9f99718ab2f478e611aa2813c36263eeed86c2427bc122d14ad8" 会作为 "sha256-517ccaff02fe9f99718ab2f478e611aa2813c36263eeed86c2427bc122d14ad8" 被存放。

缓存模型的方案设想

使用 llm-create 创建的云主机,按照 containerimage-cache 的方式从宿主机获取指定文件夹(即 model-cache 存放的文件夹)的读写权限,并且修改 pod-create 的创建参数,在 container-create 时额外映射这个文件夹到容器中的 /cache 路径。

在 pulling_model 阶段开始前,读取模型名称,在 /cache 中查找,确认是否已被 Cached

  • 若已被 cached,则直接使用 container-exec-sync 将文件复制到指定路径(同时修改 /cache 中对应模型文件夹下的 touch 文件,更新修改时间),此时 ollama list 即可识别到相应模型,完成 pull_model 操作。
  • 若未被 cached,则正常进入 pulling_model 阶段开始拉取模型。

在 pulling_model 阶段结束后,根据模型名称读取模型描述文件

  • 首先确认 /cache 剩余的空间大小以及模型大小(模型大小可以通过 ollama list 直接获取),空间不足则按照 LRU 算法删除最近最久未使用的模型文件夹直到剩余空间大小大于模型大小。
  • 然后在 /cache 文件夹下以模型全称为名新建一个文件夹。
  • 然后将模型描述文件复制到那个文件夹下。
  • 之后根据模型描述文件找到所有的 blobs,将这些 blobs 也复制到指定的文件夹下。

读取模型以及缓存模型的操作都可以通过容器中的脚本来进行,这些脚本可以直接存放在 /cache 文件夹中