使用 Dragonfly 通过 P2P 网络高效下载 OpenCSG 模型

下载模型,通常只是使用大模型前的第一步。

在个人电脑上,这个过程可能只是打开模型页面、复制命令,然后等待文件下载完成。但当模型进入训练集群、推理集群或者持续运行的评测环境,问题就不再是"能不能下载",而是同一份模型如何快速、稳定地到达多台计算节点。

假设一套推理服务需要同时在多台 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

CSGHub 链接:GitHub - OpenCSGs/csghub: CSGHub is a brand-new open-source platform for managing LLMs, developed by the OpenCSG team. It offers both open-source and on-premise/SaaS solutions, with features comparable to Hugging Face. Gain full control over the lifecycle of LLMs, datasets, and agents, with Python SDK compatibility with Hugging Face. Join us! ⭐️ · GitHub

关于 OpenCSG

OpenCSG 是全球领先的开源大模型社区平台,致力于打造开放、协同、可持续生态。AgenticOps 是人工智能领域的一种 AI 原生方法论,由 OpenCSG(开放传神)提出,是 Agentic AI 的最佳落地实践也是方法论。核心产品 CSGHub 提供模型、数据集、代码与 AI 应用的一站式托管、协作与共享服务,具备业界领先的模型资产管理能力,支持多角色协同和高效复用。

OpenCSG (开放传神) | Hybrid Huggingface+ |大模型开源社区与企业AI平台 | AgenticOps 大模型平台

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值