Chutes Miner 官方中文最新版仓库

Chutes Miner 官方中文最新版仓库
WeekendChutes Miner 官方中文最新版仓库
本仓库包含了与在 chutes.ai 平台上进行挖矿相关的所有组件,Chutes 是一个无许可、无服务器、以 AI 为中心的计算平台。
我们通过 Ansible 和 Helm/Kubernetes 自动化了大部分流程,因此虽然系统组件较多,但上手并不复杂。
📋 目录
⛏️ TL;DR(简要说明)
在 chutes 上挖矿的目标是提供尽可能多的计算能力,并针对冷启动时间(运行新应用程序或已被抢占的应用程序)进行优化。一切都通过 kubernetes 自动化,并由 gepetto.py 脚本协调,以优化成本效率并最大化您的计算份额。
激励措施基于总计算时间(包括首次为代码应用提供推理所获得的赏金)。
您应该运行各种各样的 GPU,从非常便宜的(a10、a5000、t4 等)到非常强大的(8x h100 节点)。
切勿注册多个 UID,因为它只会减少您的总计算时间,并且您会无谓地与自己竞争。只需将容量添加到单个矿工即可。
激励/权重是根据 7 天的计算总量计算的,因此在开始挖矿时请保持耐心。我们希望拥有高质量、稳定的、愿意长期投入的矿工!
🔍 组件概述
🛠️ 供应/管理工具
🤖 Ansible
虽然不是绝对必要,但我们强烈鼓励所有矿工使用我们提供的 ansible 脚本来供应服务器。存在许多细微差别和要求,手动设置相当困难。
*有关使用 ansible 脚本的更多信息,请参阅后续章节。*
☸️ Kubernetes
整个 chutes 矿工必须在 kubernetes 中运行。虽然不是绝对必要,但我们建议使用 k3s(这全部由 ansible 脚本自动处理)。如果您选择不使用 k3s,您还必须修改或不使用提供的 ansible 脚本。
*这由 ansible 脚本自动安装和配置*
🧩 矿工组件
系统中有很多组件和活动部件,因此在进行任何操作之前,请先熟悉每一个组件!
🐘 Postgres
我们在 chutes 中大量使用 SQLAlchemy/postgres。所有服务器、GPU、部署等都在 postgresql 中进行跟踪,postgresql 通过主机卷部署在您的 kubernetes 集群内。
这在通过 helm charts 部署时自动安装和配置
🔄 Redis
Redis 主要用于矿工内部的 pubsub(发布/订阅)功能。事件(新的 chute 添加到验证器、GPU 添加到系统、chute 删除等)会触发 redis 中的 pubsub 消息,进而触发代码中的各种事件处理程序。
这在通过 helm charts 部署时自动安装和配置
✅ GraVal bootstrap
Chutes 使用一个自定义的 c/CUDA 库来验证显卡:https://github.com/rayonlabs/graval
简而言之,它使用设备信息作为种子进行矩阵乘法,以验证 GPU 的真实性,包括 VRAM 容量测试(95% 的总 VRAM 必须可用于矩阵乘法)。发送到 chutes 网络上实例的所有流量都使用只能由所宣传的 GPU 解密的密钥进行加密。
当您向 kubernetes 集群添加新节点时,服务器上的每个 GPU 都必须使用 GraVal 包进行验证,因此会部署一个引导服务器来完成此任务(自动完成,无需担心)。
每次 chute 启动/部署时,它还需要运行 GraVal 来计算所需的解密密钥,该密钥适用于 chute 部署到的 GPU。
这是自动完成的
🔀 注册表代理
为了使 chute docker 镜像保持一定程度的私密性(因为并非所有镜像都是公开的),我们在每个矿工上采用了一个注册表代理,该代理通过 bittensor 密钥签名注入身份验证。
每个 docker 镜像对 kubelet 显示为 [validator hotkey ss58].localregistry.chutes.ai:30500/[image username]/[image name]:[image tag]
该子域指向 127.0.0.1,因此它始终通过 NodePort 路由和本地优先 k8s 服务流量策略从每个 GPU 服务器上的注册表服务代理加载。
注册表代理本身是一个 nginx 服务器,它对矿工 API 执行身份验证子请求。请参阅 nginx configmap:https://github.com/rayonlabs/chutes-miner/blob/main/charts/templates/registry-cm.yaml
注入签名的矿工 API 代码在此处:https://github.com/rayonlabs/chutes-miner/blob/main/api/registry/router.py
然后 Nginx 将请求向上游代理回相关的验证器(基于子域中的热密钥),该验证器验证签名并用可用于我们自托管注册表的基本身份验证替换这些标头:https://github.com/rayonlabs/chutes-api/blob/main/api/registry/router.py
这在通过 helm charts 部署时自动安装和配置
⚡ API
每个矿工都运行一个 API 服务,它执行各种任务,包括:
- 服务器/资产清单管理
- 与验证器 API 的 websocket 连接
- docker 镜像注册表身份验证
这在通过 helm charts 部署时自动安装和配置
🧙♂️ Gepetto
Gepetto 是负责所有 chute(即应用程序)管理的关键组件。除其他事项外,它负责实际供应 chute、扩展/缩减 chute、尝试领取赏金等。
这是矿工需要优化的主要内容!
🚀 入门
1. 服务器设置
第 2 节和第 3 节介绍了配置和使用 ansible 供应服务器/kubernetes 的过程。
所有服务器必须是裸机/VM,这意味着它不能在 Runpod、Vast 等上运行,并且我们目前不支持共享或动态 IP - IP 必须是唯一的、静态的,并提供 1:1 的端口映射。
重要的内存注意事项!
每个 GPU 的 RAM 必须与 VRAM 尽可能多(或非常接近)是非常重要的。这意味着,例如,如果您使用的服务器有 4 个 a40 GPU(48GB VRAM),则服务器必须具有 >= $48 \times 4 = 192$ GB 的 RAM! 如果每个 GPU 的 RAM 少于 VRAM,部署可能会失败,并且您的服务器将无法得到适当利用。
重要的存储注意事项!
一些提供商以不方便的方式挂载主存储,例如 latitude.sh 在使用 raid 1 时将卷挂载在 /home 上,hyperstack 挂载在 /ephemeral 下等。在运行 ansible 脚本之前,请务必登录您的服务器并检查存储是如何分配的。如果您想要存储空间用于 huggingface 缓存、镜像等,您需要确保尽可能多的空间分配在 /var/snap 下。您可以使用简单的绑定挂载来实现,例如,如果主存储在 /home 下,请运行:
Bash
1 | rsync -azv /var/snap/ /home/snap/ |
重要的网络注意事项!
在开始之前,您必须禁用所有级别的防火墙(如果您喜欢冒险),或者启用以下内容:
- 允许您的资产清单中所有节点之间的所有流量(所有端口,所有协议包括 UDP)
- 允许您的所有 GPU 节点上的 kubernetes 临时端口范围,因为 chute 部署的端口将是随机的,在该范围内,并且需要公共可访问性 - 默认端口范围是 30000-32767
- 允许从您管理/运行 chutes-miner add-node/等的机器访问您的 API 中的各种 nodePort 值,或者干脆将其公开(特别是 API 节点端口,默认为 32000,非常重要)
您将需要一个非 GPU 服务器(最低 4 核、32GB 内存)负责运行 k3s、postgres、redis、gepetto 和 API 组件(不是 chutes),以及所有 GPU 服务器 😄(当然是开玩笑,您可以使用任意数量)
2. 配置先决条件
本地配置
将您的本地配置与仓库分开。这样可以确保在拉取最新代码时更新不会引起冲突。
- Ansible 配置
Bash
1 | mkdir ~/chutes |
从 ansible/k3s/inventory.yml 复制默认配置并放入此文件以更新占位符值。
- Chart 配置
Bash
1 | mkdir ~/chutes |
克隆仓库并准备目录
1 | git clone https://gitcode.com/liutao0708/chutes-miner.git |
定义您的资产清单
使用您喜欢的文本编辑器(当然是 vim),编辑您的本地 inventory.yml 以满足您的需求。
例如:
YAML
1 | all: |
设置您的值
在大多数情况下,默认值都能正常工作。值在Chart 配置部分有详细说明。如果您发现需要自定义 chart 值,只需更新您的本地值文件,即 ~/chutes/values.yaml。
YAML
1 | cache: |
Kubernetes CLI
与 kubernetes 交互的最简单方法是从主节点内部,但您也可以选择在本地机器或其他服务器上进行设置。为此:
安装 kubectl
将
ansible/k3s/inventory.yml中的setup_local_kubeconfig标志设置为true- 您也可以选择更新要使用的 kubeconfig 文件/目录
YAML
1
controller_kubeconfig: ~/.kube/chutes.config
矿工凭证
为了与验证器进行身份验证,您需要通过 k8s secret 提供矿工凭证。此 secret 可以由 ansible 自动创建,但您首先需要钱包。
这是一个使用一次性密钥的示例。假设您创建了一个热密钥,如下所示:
Bash
1 | $ btcli wallet new_hotkey --wallet.name offline --wallet.hotkey test --wallet.path ~/.bittensor/wallets |
然后,在您的本地资产清单(即 ~/chutes/inventory.yml)中设置热密钥的路径。Ansible 将解析热密钥并通过环境提供值,因此热密钥不会暴露在节点上。
YAML
1 | hotkey_path: ~/bittensor/wallets/offline/hotkey/test |
3. Chart 配置
chutes 组件被分成几组独立的 charts,以支持独立集群。
chutes-miner charts 包含 chutes 矿工 API 和相关组件的模板。
chutes-miner-gpu charts 包含 GPU 节点专门使用的 chutes 矿工组件的模板。
chutes-monitoring charts 包含监控组件的模板,包括从成员集群到中央 karmada prometheus 实例的指标联合。监控 charts 和值由 ansible 自动生成和部署。
请务必仔细检查每组 charts 的值,并根据您的特定环境进行更新。将任何覆盖应用到您的自定义值文件(~/chutes/values.yaml),如第 2 节中所述。
要更新的主要部分:
Chutes Miner
a. 验证器
与大多数子网不同,chutes 的验证器列表必须明确配置,而不是依赖于元图。由于在该子网上操作验证器的极端复杂性和高昂成本,我们希望大多数验证器将选择使用子热密钥功能,而不是操作自己的验证器。
为此,您希望支持的任何验证器必须在顶级 validators 部分进行配置:
默认主网配置为:
YAML
1 | validators: |
b. huggingface 模型缓存
为了实现更快的冷启动,kubernetes 部署使用 hostPath 挂载来缓存 huggingface 模型。默认设置为清除任何超过 7 天、且消耗量大于 500GB 的内容:
YAML
1 | cache: |
您可以使用 overrides 块来覆盖每个节点的设置,例如:
YAML
1 | cache: |
在此示例中,默认将为 850GB,而 node-0 将拥有 5TB。
如果您有大量的存储空间,您可能需要增加此值或更改其他默认值。
c. minerApi
默认值应该相当不错,但您可能希望调整服务,即 nodePort,如果您想更改端口的话。
YAML
1 | minerApi: |
d. 其他
您可以随意调整 redis/postgres/等,但可能没有必要。
e. multiCluster
此标志用于允许与旧的 microk8s 设置向后兼容。如果您尚未迁移并且需要使用新 charts 进行更新,请在您的值中将此标志设置为 false。
Chutes Miner GPU
默认值应该没问题。
a. multiCluster
此标志用于允许与旧的 microk8s 设置向后兼容。如果您尚未迁移并且需要使用新 charts 进行更新,请在您的值中将此标志设置为 false。
4. 设置您的基础设施
现在所有配置都已设置完毕,请使用 ansible 按照指南设置您的基础设施。部署完节点后,请回到此处完成设置。
5. 使用您的优化策略更新 Gepetto
Gepetto 是矿工最重要的组件。它负责选择要部署、扩展、缩减、删除的 chute 等。您需要仔细研究这段代码,并进行任何您认为可以为您带来更多总计算时间的更改。
一旦您对 gepetto.py 文件的状态感到满意,您将需要在 kubernetes 中创建一个 configmap 对象来存储您的文件(从仓库中的 src/chutes-miner/chutes_miner 目录内部):
Bash
1 | kubectl create configmap gepetto-code --context chutes-miner-cpu-0 --from-file=gepetto.py -n chutes |
每当您希望对 gepetto 进行进一步更改时,您都需要重新创建 configmap:
Bash
1 | kubectl create configmap gepetto-code --from-file=gepetto.py -o yaml --dry-run=client | kubectl apply --context chutes-miner-cpu-0 -n chutes -f - |
进行更改后,您还必须重新启动 gepetto 部署,但这仅在您完成设置指南的其余部分之后才能奏效(在您最初设置矿工时无需运行):
1 | kubectl rollout restart deployment/gepetto --context chutes-miner-cpu-0 -n chutes |
6. 安装后
Dockerhub 登录(可选)
- 创建一个 docker hub 登录以避免在拉取公共镜像时受到速率限制(您可能根本不需要这个,但有备无患):
- 前往 https://hub.docker.com/ 注册,生成一个新的个人访问令牌用于公共只读访问,然后创建 secret:
Bash
1 | # 为上下文创建 secret |
7. 注册
在子网 64 上注册为矿工。
Bash
1 | btcli subnet register --netuid 64 --wallet.name [COLDKEY] --wallet.hotkey [HOTKEY] |
您不应在此处宣布 axon!所有通信都通过客户端初始化的 socket.io 连接完成,因此公共 axon 没有任何作用,只是一个安全风险。
8. 将您的 GPU 节点添加到资产清单
在您的矿工中启用 GPU 节点的最后一步是使用 chutes-miner CLI 中的 add-node 命令。这会调用矿工 API,触发启动 graval 验证服务等。对于您的矿工要使用的每个 GPU 节点,必须精确运行此命令一次。
确保您安装了 chutes-miner-cli 包(您可以在 CPU 节点、您的笔记本电脑或任何地方执行此操作):
Bash
1 | pip install chutes-miner-cli |
这会在控制节点上自动安装
为您的资产清单中的每个 GPU 节点运行此命令:
Bash
1 | chutes-miner add-node \ |
- 这里的
--name对应于您的ansible inventory.yaml文件中的短名称,它不是完整的 FQDN。 --validator是此服务器将分配到的验证器的 hotkey ss58 地址。--hourly-cost是您在此服务器上每小时为每个 GPU 支付的费用;gepetto 中的优化策略的一部分是在选择要部署 chute 的服务器时最小化成本。--gpu-short-ref是服务器上 GPU 类型的短标识符字符串,例如a6000、l40s、h100_sxm等。支持的 GPU 列表可以在此处找到。--hotkey是您注册的热密钥文件的路径,用于签署请求,以便通过矿工 API 管理系统上的资产清单。--agent-api是在 GPU 节点上运行的代理的 URL。这只是节点在端口 32000 上的公共 IP。--miner-api是您的矿工 API 服务的基本 URL,它将是 http://[非 GPU 节点 IP]:[minerAPI 端口,默认 32000],即找到您的纯 CPU 节点的公共/外部 IP 地址,以及您为 API 服务配置的任何端口(如果您没有更改默认值,则为 32000)。
➕ 添加服务器
您可以通过简单地更新 inventory.yaml 并运行带有标签 add-nodes 的 site.yaml 剧本,随时添加额外的 GPU 节点:ansible readme
这将确保仅配置新节点,并更新控制平面所需的监控/kubectl 配置。
运行 ansible 设置节点后,运行上面的 chutes-miner add-node ... 命令。
🔧 集群管理工具
该剧本安装了额外的工具来简化多集群操作:
ktx (Kube 上下文切换器):
- 从以下位置安装在控制节点上:
https://raw.githubusercontent.com/blendle/kns/master/bin/ktx - 快速在 kubernetes 上下文之间切换
- 用法:
ktx以交互方式列出和选择上下文
kns (Kube 命名空间切换器):
- 从以下位置安装在所有节点上:
https://raw.githubusercontent.com/blendle/kns/master/bin/kns - 快速在 kubernetes 命名空间之间切换
- 用法:
kns以交互方式列出和选择命名空间 - 需要
fzf(自动安装)
迁移后可用的上下文
Bash
1 | # 列出可用的上下文 |
Grafana
因为节点作为独立集群运行,Grafana 提供了一个默认仪表板以供可见性。但您始终可以构建自己的仪表板。
您可以通过 nodePort 或如果使用本地 kubectl 则通过 kubefwd 访问 grafana:
导航到 http://[CONTROL_NODE_IP]:30080
使用
kubefwd转发 grafana 服务
Bash
1
kubectl port-forward svc/monitoring-grafana -n monitoring 8080:80
故障排除
Postgres
| 问题 | 症状 | 解决方案 |
|---|---|---|
| 身份验证/密码 | Pod 报告身份验证到 postgres 失败 | 1. charts 自动检查是否存在 PG 密码的现有 secret。如果不存在,则创建。 2. 如果 postgres 以前部署在此节点上,或者 secret 被手动删除,请清除主机上 /var/snap/postgres-data 的 postgres 数据卷。 |












