chutes: https://github.com/chutesai/chutes-miner
本文记录了在 microk8s 上部署 chutes 的过程,该部署流程已在多个集群环境中验证可行。
系统选用 Ubuntu 24.04 Server 版,无需提前准备驱动。
不单独使用 CPU 机作为集群主节点,所有节点均为带 GPU 的计算节点。
Bittensor 钱包准备
该步骤在本地管理机执行。
安装 btcli 钱包管理工具:
1 | pip3 install -U bittensor-cli |
创建钱包:
1 | # 创建冷钱包 |
按照提示完成操作,存好钱包地址和助记词,冷钱包用于转账,热钱包用于部署。
在 chutes 子网中注册热钱包地址:
1 | btcli subnets register --wallet-name coldkey --hotkey hotkey --netuid 64 |
注册需要一定的费用(TAO),可先通过加密货币交易所购买一些 TAO 转入冷钱包地址。
注册完成后,查询钱包地址和 seed:
1 | cat ~/.bittensor/wallets/coldkey/hotkey/hotkey | jq |
记录 ss58Address 和 secretSeed 备用,secretSeed 需要去掉 0x 前缀。
源码修改
该步骤在本地管理机执行。
安装 git:
1 | sudo apt install git -y |
克隆 chutes-miner 仓库:
1 | git clone https://github.com/chutesai/chutes-miner.git |
以下修改基于 https://github.com/chutesai/chutes-miner/tree/2d62b25cc2aaf2949491b89f663053c37395d43b 的版本。
让 chutes 可以在 microk8s 上部署
默认的 k3s 方案是多集群,每个节点创建单独的集群,通过 hostname 筛选限制管理用 pod 只能调度到特定节点上。
各个节点之间使用机器的公网 IP 互相访问,服务端口也通过各自的公网 IP 对外开放。
在 microk8s 可以改成单集群方案,只需要主节点拥有公网 IP 对外提供访问入口,并修改调度策略让管理用 pod 调度到主节点上。
将 charts/chutes-miner/values.yaml 和 chutes-miner/charts/chutes-miner/values.yaml 改成:
1 | multiCluster: false |
或者可以通过下方的 secrets.yaml 内变量覆盖。
将 chutes-miner/charts/chutes-miner/values.yaml 内所有 affinity 内容改成:
1 | affinity: |
修改镜像拉取策略
避免重复拉取镜像,减少部署时间和网络带宽占用。
将 chutes-miner/src/chutes-miner/chutes_miner/api/server/verification.py 和 chutes-miner/src/chutes-miner/chutes_miner/api/k8s/util.py 改成:
1 | image_pull_policy="IfNotPresent", |
修改端口开放策略
默认的 k3s 方案是多集群,每个节点都需要公网 IP 并对外开放端口。
在 microk8s 改成单集群后,只需要主节点有公网 IP 并对外开放端口,其他节点不需要公网 IP 和端口开放。
将 chutes-miner/src/chutes-miner/chutes_miner/api/k8s/util.py 改成:
1 | external_traffic_policy="Cluster", |
写入钱包信息
在 chutes-miner/charts 目录下创建 secrets.yaml 文件,内容如下:
1 | multiCluster: false # 禁用多集群方案 |
Ansible 部署
该步骤在本地管理机执行,确保管理机可以连接到用于部署的机器。
安装 Ansible:
1 | sudo apt install ansible git -y |
进入 chutes-miner/ansible/microk8s 目录,修改 inventory.yml 文件,添加主机信息。
需要正确填写 microk8s 集群主节点的公网 IP 到 external_ip 变量,在 join-cluster.yml 步骤会将该 IP 标记到每个节点上,如果 IP 不正确或无法访问,会导致后续部署失败。
示例配置:
1 | all: |
修改完成后,执行部署命令:
1 | ansible-playbook site.yml |
环境配置步骤完成后,创建并添加集群:
1 | ansible-playbook join-cluster.yml |
chutes 部署
该步骤在 microk8s 集群的管理机执行。
通过 helm 部署环境:
1 | # /charts/MIGRATE.md |
在 ansible/microk8s/extras.yml 文件的配置方式似乎已经过期,以上命令来自 microk8s 迁移到 k3s 的配置脚本。
将修改完成的 chutes-miner/charts 文件夹复制到 microk8s 集群的管理机上,进入目录,执行:
1 | sudo microk8s helm upgrade --install chutes-gpu ./chutes-miner-gpu/ -f secrets.yaml --namespace chutes --create-namespace |
等待镜像拉取和 pod 启动,使用 kubectl get pods -A 命令查看 pod 状态,确保所有 pod 都处于 Running 状态后继续操作。
chutes 节点添加
该步骤在本地管理机执行。
安装 chutes-miner:
1 | pip3 install -U chutes-miner-cli |
添加节点:
1 | chutes-miner add-node --name hostname --validator 5Dt7HZ7Zpw4DppPxFM7Ke3Cm7sDAWhsZXmM5ZAmE7dSVJbcQ --hourly-cost 0.4 --gpu-short-ref 4090 --hotkey ~/.bittensor/wallets/coldkey/hotkey/hotkey --miner-api http://microk8s-主机-ip:32000 |
name 参数是 microk8s 集群内节点的 hostname,每个带 GPU 的节点都需要添加一次。
validator 的值:chutes-miner/ansible/k3s/roles/common/defaults/main.yml
hourly-cost、gpu-short-ref 可以参考 chutes-api/api/gpu.py 内的定义完成设置。
hotkey 参数是热钱包的文件路径。
miner-api 参数是 microk8s 集群主节点的 IP 地址。
对每个带 GPU 的节点执行一次添加命令后,使用以下命令检查节点状态:
1 | # 检查远程节点状态 |
如果节点状态正常,静待 validator 完成验证后即可接取任务。
后续管理
目前已放弃跟进该项目,以下内容可能未来不会再补充。
待补充:
- 在本地管理机管理 microk8s
- 钱包导入,取消质押,转账
- 模型拉取
- 镜像导出导入