TAO Chutes Subnet 64 挖矿全面教程:从零开始搭建你的 AI 计算矿机

TAO Chutes Subnet 64 挖矿全面教程:从零开始搭建你的 AI 计算矿机

本文档将指导您如何搭建 Chutes.ai 平台的矿机,Chutes.ai 是一个无需许可、无服务器、以 AI 为中心的计算平台。我们将自动化大部分流程,通过 Ansible、Helm 和 Kubernetes 简化部署。


请注意: 本教程基于 Chutes 官方文档编写,内容均来自 Chutes 官方 github 以及本人实战部署经验。

目录

  1. 什么是 Chutes.ai 矿机?
  2. 核心组件概览
    • 部署/管理工具
    • 矿机组件
  3. 入门准备
    • 服务器硬件要求与注意事项
    • 网络配置注意事项
  4. Ansible 安装与配置
    • 安装 Ansible
    • 安装 Ansible Collections
    • (可选)Ansible 性能优化
    • 更新 inventory.yml 配置
  5. 连接网络:Wireguard 配置
  6. 引导系统:Kubernetes 部署
  7. 加入 Kubernetes 集群
  8. 安装第三方 Helm Charts
  9. 配置先决条件
    • 配置 kubectlhelm
    • 创建 Docker Hub 凭证
    • 创建矿机凭证
  10. 配置您的环境:values.yaml
    • 验证器(Validators)配置
    • Huggingface 模型缓存配置
    • Miner API 配置
  11. 更新 Gepetto 优化策略
  12. 在 Kubernetes 集群中部署矿机
  13. 注册矿机
  14. 将 GPU 节点添加到库存
  15. 增加服务器容量

1. 什么是 Chutes.ai 矿机?

Chutes.ai 挖矿的目标是提供尽可能多的计算能力,并优化冷启动时间(运行新应用程序或已被抢占的应用程序)。整个系统通过 Kubernetes 自动化,并由 gepetto.py 脚本协调,以优化成本效率并最大化您的计算份额。奖励基于总计算时间(包括首次提供代码应用推理的赏金)。

建议运行各种 GPU,从便宜的(如 a10、a5000、t4)到强大的(如 8x h100 节点)。请勿注册多个 UID,这只会导致您与自己竞争,降低总计算时间。只需将容量添加到一台矿机即可。激励/权重根据 7 天的计算总量计算,因此开始挖矿时请耐心等待。

2. 核心组件概览

Chutes 矿机系统由多个组件和活动部件组成。在开始之前,了解每个组件的功能至关重要。

部署/管理工具

  • Ansible:强烈建议使用 Chutes 提供的 Ansible 脚本来配置服务器,因为手动设置存在许多细微差别和要求。
  • Wireguard:一个快速、安全的 VPN 服务,由 Ansible 配置创建,允许您的节点在不在同一内部网络上时进行通信。它使得 Kubernetes 集群可以跨越任意数量的提供商而不会出现问题。
  • Kubernetes:Chutes 矿机的全部内容必须在 Kubernetes 中运行。建议使用 microk8s,Ansible 脚本会自动处理。

矿机组件

  • Postgres:所有服务器、GPU、部署等都在 Kubernetes 集群中作为 StatefulSet 与持久卷声明一起部署的 PostgreSQL 中进行跟踪。
  • Redis:主要用于矿机内部的 pubsub 功能。事件(如验证器添加了新的 Chute、系统添加了 GPU、移除了 Chute 等)会触发 Redis 中的 pubsub 消息,从而触发代码中的各种事件处理器。
  • GraVal Bootstrap:Chutes 使用自定义的 C/CUDA 库来验证显卡。当您向 Kubernetes 集群添加新节点时,服务器上的每个 GPU 都必须使用 GraVal 包进行验证。
  • Registry Proxy:为了保持 Chute Docker 镜像的私有性,每个矿机上都使用一个注册表代理,通过 Bittensor 密钥签名注入身份验证。每个 Docker 镜像都以 [validator hotkey ss58].localregistry.chutes.ai:30500/[image username]/[image name]:[image tag] 的形式显示给 kubelet。
  • API:每个矿机都运行一个 API 服务,它执行各种任务,包括服务器/库存管理、与验证器 API 的 websocket 连接以及 Docker 镜像注册表身份验证。
  • Gepetto:Gepetto 是负责所有 Chute(即应用程序)管理的关键组件。它负责实际配置 Chute、扩展/缩减 Chute、尝试领取赏金等。这是矿工需要优化的主要部分。

3. 入门准备

服务器硬件要求与注意事项

  • 操作系统:建议使用 Ubuntu 22.04,如果可能,最好不要安装 NVIDIA 驱动程序。
  • GPU 类型:支持多种 GPU 类型。您可以在 https://github.com/rayonlabs/chutes-api/blob/main/api/gpu.py 找到支持的 GPU 列表。
  • RAM (内存)非常重要! 每 GPU 的 RAM 应该与 VRAM 尽可能接近(或更多)。例如,如果服务器有 4 个 A40 GPU(48GB VRAM),则服务器必须至少有 48 * 4 = 192 GB 的 RAM。
  • 存储:一些提供商可能以不方便的方式挂载主存储。在运行 Ansible 脚本之前,请登录服务器检查存储分配。如果需要存储 Huggingface 缓存、镜像等,请确保尽可能多的空间分配在 /var/snap 下。您可以使用简单的 bind mount 来实现,例如:
    1
    2
    3
    rsync -azv /var/snap/ /home/snap/
    echo '/home/snap /var/snap none bind 0 0' >> /etc/fstab
    mount -a
  • 服务器类型:所有服务器必须是裸机/VM,不支持 Runpod、Vast 等共享或动态 IP。IP 必须是唯一的、静态的,并提供 1:1 的端口映射。
  • CPU 节点:您需要一台非 GPU 服务器(最低 8 核,64GB RAM)负责运行 Postgres、Redis、Gepetto 和 API 组件。

网络配置注意事项

在开始任何操作之前,您应该检查您的服务器提供商使用的 IP 地址,并确保您不使用与 Wireguard 重叠的网络。

  • Wireguard 默认网络:Chutes 默认使用 192.168.0.0/20 作为 Wireguard 网络。这可能与某些提供商(例如 Nebius 通过 Shadeform 有时使用 192.168.x.x 网络空间)冲突。如果网络重叠,您的路由表将出现冲突条目,机器可能会因此而基本报废。
  • 更改 Wireguard 网络:如果您一开始就使用不同的网络,更改 Wireguard 网络范围非常简单。但如果已经设置好矿机,再迁移会比较麻烦。要使用不同的范围,请更新以下四个文件:
    1. join-cluster.yml:需要更新 regex 以搜索正确的网络加入命令。
    2. templates/wg0-worker.conf.j2:指定 Wireguard 网络,可以更改或限制,例如 192.168.254.0/24 或使用完全不同的私有网络,如 10.99.0.0/23
    3. templates/wg0-primary.conf.j2:与 worker 配置相同,CIDR 必须匹配。
    4. inventory.yml:您的主机需要更新 wireguard_ip 值以匹配。
      不建议在运行中更改 Wireguard 网络,除非绝对必要。如果需要更改,最好的办法是完全清除 microk8s 并重新开始运行 Wireguard、site 和 extras playbook。
  • 私有网络范围:您可以使用以下三个主要私有网络:10.0.0.0/8172.16.0.0/12192.168.0.0/16。有时也可以使用运营商 NAT 范围 100.64.0.0/10
  • external_ip:Chutes API/验证器直接向每个 GPU 节点发送流量,不通过主 CPU 节点路由。这意味着每个 GPU 节点必须有一个可公开路由的 IP 地址,并且不能在共享 IP 后面。此公共 IP 必须是专用且用于入口和出口的。
  • 防火墙:在开始之前,您必须禁用所有防火墙层,或启用以下规则:
    • 允许所有节点之间的所有流量(所有端口,所有协议包括 UDP)。
    • 允许所有 GPU 节点上的 Kubernetes 临时端口范围(默认 30000-32767)。
    • 允许从管理机器访问 API 中的各种 nodePort 值(特别是 API 节点端口,默认为 32000)。
  • IP 转发:作为 Wireguard 主节点的 CPU 节点需要启用 IP 转发。

国内先换阿里云源以免安装过程中卡顿太久

1
2
3
sudo sed -i 's|http://.*archive.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list
sudo sed -i 's|http://.*security.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list
apt update

4. Ansible 安装与配置

Ansible 应安装在您的本地系统上,而不是矿机节点上。

安装 Ansible

  • Mac
    1
    2
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    brew install ansible
  • Ubuntu/Ubuntu (WSL)/基于 aptitude 的系统
    1
    sudo apt -y update && sudo apt -y install ansible python3-pip
  • CentOS/RHEL/Fedora
    1
    2
    sudo dnf install epel-release -y # 如果是 Fedora 则不需要
    sudo dnf install ansible -y

安装 Ansible Collections

1
2
ansible-galaxy collection install community.general
ansible-galaxy collection install kubernetes.core

(可选)Ansible 性能优化

下载 Mitogen 并解压:

1
2
wget https://files.pythonhosted.org/packages/source/m/mitogen/mitogen-0.3.22.tar.gz
tar -xzf mitogen-0.3.22.tar.gz

然后在 ansible.cfg 中添加以下配置:

1
2
3
4
5
[defaults]
strategy_plugins = /path/to/mitogen-0.3.22/ansible_mitogen/plugins/strategy
strategy = mitogen_linear
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=2m

更新 inventory.yml 配置

使用您喜欢的文本编辑器(例如 Vim)编辑 inventory.yml 以满足您的需求。以下是一个示例配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
all:
vars:
# SSH 公钥列表,例如 cat ~/.ssh/id_rsa.pub
ssh_keys:
- "ssh-rsa AAAA... user@hostname"
- "ssh-rsa BBBB... user2@hostname2"
# 用于登录这些机器的用户名(您的公钥将被添加到此用户)。
user: billybob
# 用于登录的初始用户名,对于可能尚未设置您的用户名的全新节点。
ansible_user: ubuntu
# 每个 GPU 工作节点将分配到的默认验证器。
validator: 5Dt7HZ7Zpw4DppPxFM7Ke3Cm7sDAWhsZXmM5ZAmE7dSVJbcQ
# 默认情况下,没有节点是主节点(运行所有应用程序、Wireguard 等的 CPU 节点)。仅在下方覆盖此标志一次。
is_primary: false
# 我们假设所有节点都启用了 GPU,但您需要为下面的 CPU 节点禁用此功能。
gpu_enabled: true
# 您将用于注册表代理的端口,必须与 chart/values.yaml 中的 registry.service.nodePort 匹配!
registry_port: 30500
# SSH 有时会挂起,没有这个会很麻烦...
ansible_ssh_common_args: '-o ControlPath=none'
# SSH 重试次数...
ansible_ssh_retries: 3
# Ubuntu 主/次版本。
ubuntu_major: "22"
ubuntu_minor: "04"
# CUDA 版本 - 除非使用 h200s,否则保持原样,在这种情况下,请使用 12-5 或 skip_cuda: true(如果提供商已预安装驱动程序)
cuda_version: "12-6"
# NVIDIA GPU 驱动程序 - 除非使用 h200s,否则保持原样,在这种情况下,应为 555
nvidia_version: "560"
# 如果提供商已安装 CUDA 12.x+,则完全跳过 CUDA 安装的标志(请注意,某些 chutes 除非是 12.6+,否则无法工作)
skip_cuda: false

hosts:
# 这是主节点,运行 postgres, redis, gepetto 等。
chutes-miner-cpu-0:
ansible_host: 1.0.0.0
external_ip: 1.0.0.0
wireguard_ip: 192.168.0.1
gpu_enabled: false
is_primary: true
wireguard_mtu: 1420 # 可选 (默认 1380)

# 这些是 GPU 节点,实际运行 chutes。
chutes-miner-gpu-0:
ansible_host: 1.0.0.1
external_ip: 1.0.0.1
wireguard_ip: 192.168.0.3

5. 连接网络:Wireguard 配置

运行以下命令通过 Wireguard 连接网络:

1
ansible-playbook -i inventory.yml wireguard.yml

6. 引导系统:Kubernetes 部署

运行以下命令引导系统:

1
ansible-playbook -i inventory.yml site.yml

这里如安装错误!请更新Ansible

1
pip install --upgrade ansible -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

如果未成功安装显卡驱动,请使用以下命令:

1
ansible-playbook -i inventory.yml upgrade-nvidia.yml --limit chutes-miner-gpu-0 -e "ubuntu_major=22 ubuntu_minor=04 cuda_version=12-9 nvidia_version=575"

7. 加入 Kubernetes 集群

如果您有多个主机,请确保它们都属于同一个集群:

1
ansible-playbook -i inventory.yml join-cluster.yml

8. 安装第三方 Helm Charts

此步骤将在您的服务器上安装 NVIDIA GPU Operator 和 Prometheus。此步骤只需运行一次。

1
ansible-playbook -i inventory.yml extras.yml

9. 配置先决条件

最简单的与 Kubernetes 交互的方式是在主节点内部,但您也可以在本地机器或其他服务器上设置。

配置 kubectlhelm

  • 安装 kubectl
  • 从 CPU 主节点复制 Kubernetes 配置:
    • 运行 microk8s config 并将其放置在工作站的 ~/.kube/config
    • 将集群的 IP 地址替换为主节点的公共 IP 地址。
    • 由于 IP 不匹配证书,从该服务器运行任何 kubectl 命令时需要指定 --insecure-skip-tls-verify
  • 如果您计划使用主节点,请为 kubectlhelm 设置别名:
    1
    2
    echo 'alias kubectl="microk8s kubectl"' >> .bashrc
    echo 'alias helm="microk8s helm"' >> .bashrc

创建 Docker Hub 凭证

创建一个 Docker Hub 登录以避免公共镜像拉取速率限制。

  • 前往 https://hub.docker.com/ 注册,生成一个用于公共只读访问的新个人访问令牌。
  • 然后创建 secret:
    1
    kubectl create secret docker-registry regcred --docker-server=docker.io --docker-username=[替换为您的用户名] --docker-password=[替换为您的访问令牌] --docker-email=[替换为您的电子邮件]

创建矿机凭证

您需要从将用于挖矿的 hotkey 文件中找到 ss58AddresssecretSeed,例如 cat ~/.bittensor/wallets/default/hotkeys/hotkey

1
2
3
4
kubectl create secret generic miner-credentials \
--from-literal=ss58=[替换为 ss58Address 值] \
--from-literal=seed=[替换为 secretSeed 值,删除 '0x' 前缀] \
-n chutes

完整 secret 创建示例:
假设您创建了一个 hotkey 如下:

1
2
$ btcli wallet new_hotkey --wallet.name offline --wallet.hotkey test --wallet.path ~/.bittensor/wallets
...

打印该 hotkey 的内容,并可选地管道到 jq 以美化输出:

1
2
3
4
5
6
7
8
9
$ cat ~/.bittensor/wallets/offline/hotkeys/test | jq .
{
"accountId": "0x5a30cd5517328838f69ed48531894d94e9f231dff241e1561260a8522a167731",
"publicKey": "0x5a30cd5517328838f69ed48531894d94e9f231dff241e1561260a8522a167731",
"privateKey": "0x69de0e5d7e66902d5b9da02091bb130aedf49d6c53a2fe67eeb914520e0ea70aa2176663f7b30c93d8826c702e9b22c35ab1a99afbdc02c35618c97e00edab3a",
"secretPhrase": "inform sell fitness extra kitten unit hood glass window law spider desk",
"secretSeed": "0xe031170f32b4cda05df2f3cf6bc8d76827b683bbce23d9fa960c0b3fc21641b8",
"ss58Address": "5E6xfU3oNU7y1a7pQwoc31fmUjwBZ2gKcNCw8EXsdtCQieUQ"
}

要从该密钥创建 secret,命令为:

1
2
3
4
kubectl create secret generic miner-credentials \
--from-literal=ss58=5E6xfU3oNU7y1a7pQwoc31fmUjwBZ2gKcNCw8EXsdtCQieUQ \
--from-literal=seed=e031170f32b4cda05df2f3cf6bc8d76827b683bbce23d9fa960c0b3fc21641b8 \
-n chutes

10. 配置您的环境:values.yaml

仔细检查 charts/values.yaml 并根据您的特定环境进行更新。

验证器(Validators)配置

Chutes 的验证器列表必须明确配置,而不是依赖于 metagraph。您希望支持的任何验证器都必须在顶级 validators 部分中进行配置。

默认的主网配置为:

1
2
3
4
5
6
7
8
validators:
defaultRegistry: registry.chutes.ai
defaultApi: https://api.chutes.ai
supported:
- hotkey: 5Dt7HZ7Zpw4DppPxFM7Ke3Cm7sDAWhsZXmM5ZAmE7dSVJbcQ
registry: registry.chutes.ai
api: https://api.chutes.ai
socket: wss://ws.chutes.ai

Huggingface 模型缓存配置

为了实现更快的冷启动,Kubernetes 部署使用 hostPath 挂载来缓存 Huggingface 模型。默认设置为当消耗超过 500GB 时,清除超过 7 天的任何内容。

1
2
3
4
cache:
max_age_days: 30
max_size_gb: 850
overrides:

您可以使用 overrides 块按节点覆盖设置。例如:

1
2
3
4
5
cache:
max_age_days: 30
max_size_gb: 850
overrides:
node-0: 5000

在此示例中,默认将为 850GB,而 node-0 将有 5TB。

Miner API 配置

默认值应该相当不错,但如果您想更改端口,可以调整服务,即 nodePort

1
2
3
4
5
minerApi:
...
service:
nodePort: 32000
...

其他

您可以根据需要调整 redis/postgres 等,但可能不是必需的。

11. 更新 Gepetto 优化策略

Gepetto 作为矿机最重要的组件,负责选择要部署的 Chute、扩缩容、删除等。您需要仔细检查此代码并进行任何您认为可以为您带来更多总计算时间的更改。

一旦您对 gepetto.py 文件的状态满意,您需要创建一个 Kubernetes ConfigMap 对象来存储您的文件(从克隆的 chutes-miner 目录内部):

1
kubectl create configmap gepetto-code --from-file=gepetto.py -n chutes

任何时候您希望对 Gepetto 进行进一步更改,您都需要重新创建 ConfigMap:

1
kubectl create configmap gepetto-code --from-file=gepetto.py -o yaml --dry-run=client | kubectl apply -n chutes -f -

您还必须在更改后重新启动 Gepetto 部署,但这仅在完成其余设置指南之后才有效(初始设置矿机时无需运行):

1
kubectl rollout restart deployment/gepetto -n chutes

12. 在 Kubernetes 集群中部署矿机

首先,仅一次,您需要为 Postgres 和 Redis 生成密码——切勿多次运行,否则会出错!
charts 目录执行此操作:

1
helm template . --set createPasswords=true -s templates/one-time-passwords.yaml | kubectl apply -n chutes -f -

创建 secret 后,您可以随时在 charts 目录中运行此命令来生成部署 charts:

1
helm template . -f values.yaml > miner-charts.yaml

任何时候您更改 values.yaml,您都需要重新运行模板命令以获取更新后的 charts!

然后,您将使用以下命令部署 Chutes 组件:

1
kubectl apply -f miner-charts.yaml -n chutes

注册矿机前请先安装 btcli

1
2
3
https://docs.learnbittensor.org/getting-started/install-btcli/   # btcli官方文档安装教程

pip install bittensor-cli -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com # 或直接安装pip镜像源下载

13. 注册矿机

在子网 64 上注册为矿机:

1
btcli subnet register --netuid 64 --wallet.name [COLDKEY] --wallet.hotkey [HOTKEY]

不应在此处宣布 axon!所有通信都通过客户端初始化的 socket.io 连接完成,因此公共 axon 没有任何目的,只会增加安全风险。

14. 将 GPU 节点添加到库存

在矿机中启用 GPU 节点的最后一步是使用 chutes-miner CLI 中的 add-node 命令。这将调用矿机 API,触发启动 GraVal 验证服务等。每个 GPU 节点必须运行此命令一次,才能被您的矿机使用。

确保安装 chutes-miner-cli 包(您可以在 CPU 节点、笔记本电脑等任何地方执行此操作):

1
pip install chutes-miner-cli
1
pip install chutes-miner-cli -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com  # 如下载慢请使用阿里云镜像源下载

为您的库存中的每个 GPU 节点运行此命令:

1
2
3
4
5
6
7
chutes-miner add-node \
--name [来自 inventory.yaml 的服务器名称] \
--validator [验证器热键] \
--hourly-cost [每小时成本] \
--gpu-short-ref [GPU 短标识符] \
--hotkey [~/.bittensor/wallets/[COLDKEY]/hotkeys/[HOTKEY] \
--miner-api http://[MINER API 服务器 IP]:[MINER API 端口]
  • --name:对应于 ansible inventory.yaml 文件中的短名称,它不是完整的 FQDN。
  • --validator:此服务器将分配到的验证器 hotkey ss58 地址。
  • --hourly-cost:您为此服务器上每 GPU 每小时支付的费用。Gepetto 中的优化策略之一是选择部署 Chute 时最小化成本。
  • --gpu-short-ref:服务器上 GPU 类型的短标识符字符串,例如 a6000l40sh100_sxm 等。
  • --hotkey:您注册的 hotkey 文件的路径,用于签名请求,以便通过矿机 API 管理系统库存。
  • --miner-api:您的矿机 API 服务的基准 URL,将是 http://[非 GPU 节点 IP]:[矿机 API 端口,默认为 32000]

15. 增加服务器容量

要扩展矿机的库存,您应该使用 Ansible 脚本引导它们,特别是 sitejoin-cluster 部分。然后,运行上述的 chutes-miner add-node ... 命令。


检查所有 Kubernetes Pod 的状态

1
microk8s kubectl get pods -n chutes