下载模型,通常只是使用大模型前的第一步。
在个人电脑上,这个过程可能只是打开模型页面、复制命令,然后等待文件下载完成。但当模型进入训练集群、推理集群或者持续运行的评测环境,问题就不再是"能不能下载",而是同一份模型如何快速、稳定地到达多台计算节点。
假设一套推理服务需要同时在多台 GPU 节点上启动,每个节点都从模型社区单独下载一遍权重。节点越多,重复传输的数据越多;模型版本更新或者服务重新扩容时,这个过程还会再次发生。模型文件不断增大后,下载逐渐从一个普通准备步骤,变成影响任务启动效率的基础设施问题。
这项变化表面上只是增加了一种新的下载协议,背后解决的却是模型从社区进入大规模计算环境时,如何减少重复回源、复用集群带宽的问题。
1. 模型变大之后,下载也成为基础设施问题
传统模型下载采用的是客户端直接访问源站的方式。对于个人开发者来说,这种方式简单直接,也完全够用。但在多节点环境里,每台机器都要分别向模型仓库请求相同的文件。
如果一份模型需要部署到多台机器,源站就要重复传输多份相同内容。训练任务重新调度、推理实例扩容、评测任务反复启动时,已经下载过的模型也可能被再次拉取。除了占用外部带宽,这些重复下载还会延长计算节点从启动到真正开始工作的时间。
一些团队会把模型预先复制到共享存储,或者制作进容器镜像,也有人会在内部对象存储中再维护一份镜像。这些方式可以缓解部分问题,但也会带来新的维护工作:模型版本需要同步,共享存储可能成为新的性能瓶颈,而把大模型直接写进镜像又会让镜像体积和更新成本快速增加。
Dragonfly 采取的是另一种思路:让已经参与下载的节点,也成为文件分发网络的一部分。
2. Dragonfly 是什么?
Dragonfly 是一个基于 P2P 技术的开源文件分发系统,目前已经成为 CNCF 毕业项目。它最早被广泛用于容器镜像和大规模文件分发,现在也逐渐扩展到 AI 模型、数据集和其他机器学习资源的交付场景。
当一个节点发起下载后,Dragonfly 会把文件划分成多个较小的分片,并根据不同节点的状态安排传输来源。首个节点仍然需要从原始模型仓库获取内容,但当部分分片下载完成后,这些内容就可以继续提供给其他节点,而不必等待整个文件全部落盘。
随着更多节点加入,同一份模型可以从 Seed Peer 或已经拥有相应分片的其他 Peer 获取。原始模型仓库主要承担首次回源,后续传输则更多发生在集群内部。

3. Dragonfly 开始原生理解 OpenCSG 仓库
OpenCSG 是面向 AI 开发者的开源模型社区,提供模型、数据集等 AI 资源的托管、版本管理与共享能力。开发者可以在社区中查找模型和数据,并通过 Git、SDK 等方式将资源下载到本地环境。
dfget opencsg://models/OpenCSG/csg-wukong-1B -O /models/csg-wukong-1B/ --recursive
更重要的是,OpenCSG 仓库原有的版本与权限信息仍然能够保留。下载指定版本时,可以通过 Revision 锁定分支、标签或者 Commit;访问私有仓库时,也可以继续使用 OpenCSG Token 完成认证。
4. 一次 OpenCSG 模型下载如何进入 P2P 网络
从使用者角度看,下载只需要一条 dfget 命令。但在命令背后,OpenCSG 与 Dragonfly 分别承担着不同的工作。
识别 OpenCSG 仓库:解析仓库名与文件/目录结构。
获取文件 / 文件列表:支持单文件或整个仓库的递归列表。
Scheduler 注册任务:Client 上报任务并申请调度。
Seed Peer 回源或 Peer 分片:按调度结果从源站或已有节点获取。
分片继续供给其他节点:边下边传,分片到达即被复用。
当一个分片完成下载后,它便可以继续被其他 Peer 使用。也就是说,模型不需要先在某一台机器上完整下载结束,再复制到其他机器;首次回源和集群内分发可以同时进行。
OpenCSG 继续负责模型仓库、文件、版本与访问权限,Dragonfly 则负责后续的分片传输、P2P 调度和缓存复用。原生协议的意义,就在于把这两个原本需要人工衔接的环节连接起来。
5. 完整实操:通过 Dragonfly 下载 OpenCSG 模型
一次完整使用流程可以分为环境准备、集群部署、安装并连接 dfget、执行模型下载以及验证 P2P 任务五个阶段。
完整流程:01 环境准备、02 集群部署、03 安装并连接 dfget、04 执行模型下载、05 验证 P2P 任务。
阶段 01 / 环境准备
1. 准备测试环境
基础环境包括 Kubernetes 1.20 以上版本、Helm 3.8 以上版本和 Python 3.8 以上版本。
如果已经有 Kubernetes 集群,可以直接进入部署步骤。如果需要在本地测试,可以使用 Kind 创建一个多节点集群。先准备 kind-config.yaml:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
创建集群并切换 kubectl Context:
kind create cluster --config kind-config.yaml
kubectl config use-context kind-kind
使用 Kind 时,可以提前拉取 Dragonfly 镜像并加载到测试集群:
docker pull dragonflyoss/scheduler:latest
docker pull dragonflyoss/client:latest
kind load docker-image dragonflyoss/scheduler:latest
kind load docker-image dragonflyoss/client:latest
如果使用普通 Kubernetes 集群,并且节点能够正常拉取镜像,则不需要执行 Kind 的镜像加载命令。
阶段 02 / 集群部署
2. 通过 Helm 部署 Dragonfly
按照 OpenCSG 集成文档准备 charts-config.yaml。这份配置会部署 Scheduler、Seed Client 和 Client,并让 Client 在各个节点上提供下载能力:
scheduler:
image:
repository: dragonflyoss/scheduler
tag: latest
metrics:
enable: true
seedClient:
image:
repository: dragonflyoss/client
tag: latest
metrics:
enable: true
client:
image:
repository: dragonflyoss/client
tag: latest
hostNetwork: true
metrics:
enable: true
config:
proxy:
server:
port: 4001
添加 Dragonfly Helm 仓库并完成安装:
helm repo add dragonfly \
https://dragonflyoss.github.io/helm-charts/
helm install \
--wait \
--create-namespace \
--namespace dragonfly-system \
dragonfly \
dragonfly/dragonfly \
-f charts-config.yaml
安装完成后,检查组件状态:
kubectl get pods -n dragonfly-system
正常情况下,可以看到 Scheduler、Seed Client 和部署在各节点上的 Client 处于 Running 状态。这里的 Client 中运行着 dfdaemon,后续 dfget 会通过它发起 P2P 下载。
阶段 03 / 安装并连接 dfget
3. 让 dfget 连接 dfdaemon
dfget 是使用者直接执行的命令行工具,真正的 P2P 下载由 dfdaemon 完成。因此,执行命令的节点需要安装 dfget,并能够访问 dfdaemon 的 Unix Domain Socket。
如果直接在 Dragonfly 节点上执行命令,可以按照 Dragonfly Client 的 RPM 或 DEB 安装文档准备 dfget。如果命令运行在训练或推理容器内,则需要在容器镜像中安装 dfget,并挂载宿主机上的 Socket:
apiVersion: v1
kind: Pod
metadata:
name: model-runtime
spec:
containers:
- name: runtime
image: your-image:tag
volumeMounts:
- name: dfdaemon-socket
mountPath: /var/run/dragonfly
volumes:
- name: dfdaemon-socket
hostPath:
path: /var/run/dragonfly
type: DirectoryOrCreate
挂载后,容器中的 dfget 就可以调用节点上的 dfdaemon。需要由 dfdaemon 通过 Socket 把文件内容返回容器时,可使用 --transfer-from-dfdaemon:
dfget \
--transfer-from-dfdaemon \
opencsg://models/OpenCSG/csg-wukong-1B/config.json \
-O /tmp/config.json
阶段 04 / 执行模型下载
4. 下载 OpenCSG 模型中的单个文件
完成上述准备后,可以直接下载 OpenCSG 模型仓库中的单个文件:
dfget opencsg://models/OpenCSG/csg-wukong-1B/config.json \
-O /tmp/config.json
dfget 会解析 OpenCSG 仓库和文件路径,OpenCSG Backend 获取文件信息后,下载任务会经由 dfdaemon 注册到 Scheduler。文件内容随后进入 Dragonfly 的分片下载流程。
5. 下载完整模型仓库
如果需要下载整个模型仓库,不再提供具体文件路径,并加入 --recursive:
dfget opencsg://models/OpenCSG/csg-wukong-1B -O /tmp/csg-wukong-1B/ --recursive
6. 下载指定版本
模型训练、评测和推理通常需要固定版本。可以通过 --csg-revision 指定分支、标签或 Commit:
dfget opencsg://models/OpenCSG/csg-wukong-1B --csg-revision v1.0 -O /tmp/csg-wukong-1B/ --recursive
7. 下载私有模型
访问私有仓库时,通过 --csg-token 提供 OpenCSG Token:
dfget opencsg://models/<owner>/<repo> -O /tmp/private-model/ \
--recursive --csg-token=<token>
Token 会用于仓库文件查询和后续文件请求,因此接入 Dragonfly 不会绕过 OpenCSG 原有的权限控制。
8. 连接私有化 CSGHub
dfget opencsg://models/<owner>/<repo>/<path> \
-O /tmp/model.safetensors \
--csg-base-url=https://hub.example.com/csg/
Base URL 需要包含 CSGHub SDK API 使用的路径前缀,例如 /csg/。仓库解析仍由 OpenCSG Backend 完成,文件则继续交给 Dragonfly 网络分发。
阶段 05 / 验证 P2P 任务
9. 检查文件并验证下载任务
下载完成后,先检查目标目录是否已经生成:
ls -lh /tmp/csg-wukong-1B/
然后找到 Dragonfly Client Pod:
kubectl get pods -n dragonfly-system -l component=client
进入对应 Client,检查 dfdaemon 日志:
kubectl -n dragonfly-system exec -it <client-pod> -- grep "download task succeeded" /var/log/dragonfly/dfdaemon/*
日志中出现下载成功记录以及相应的 Task ID、Peer ID,说明文件已经经过 Dragonfly 下载流程。需要进一步观察 P2P 效果时,可以在不同节点重复下载相同模型,并结合日志确认后续任务是否从已有 Peer 获取分片。
开源链接
Dragonfly 链接:GitHub - dragonflydb/dragonfly: A modern replacement for Redis and Memcached · GitHub
关于 OpenCSG
OpenCSG 是全球领先的开源大模型社区平台,致力于打造开放、协同、可持续生态。AgenticOps 是人工智能领域的一种 AI 原生方法论,由 OpenCSG(开放传神)提出,是 Agentic AI 的最佳落地实践也是方法论。核心产品 CSGHub 提供模型、数据集、代码与 AI 应用的一站式托管、协作与共享服务,具备业界领先的模型资产管理能力,支持多角色协同和高效复用。
OpenCSG (开放传神) | Hybrid Huggingface+ |大模型开源社区与企业AI平台 | AgenticOps 大模型平台

520

被折叠的 条评论
为什么被折叠?



