0%

在 microk8s 上部署 chutes

chutes: https://github.com/chutesai/chutes-miner
本文记录了在 microk8s 上部署 chutes 的过程,该部署流程已在多个集群环境中验证可行。
系统选用 Ubuntu 24.04 Server 版,无需提前准备驱动。
不单独使用 CPU 机作为集群主节点,所有节点均为带 GPU 的计算节点。

Bittensor 钱包准备

该步骤在本地管理机执行。
安装 btcli 钱包管理工具:

1
pip3 install -U bittensor-cli

创建钱包:

1
2
3
4
5
6
# 创建冷钱包
btcli wallet new-coldkey --wallet-name coldkey --no-use-password
# 创建热钱包
btcli wallet new-hotkey --wallet-name coldkey --hotkey hotkey --no-use-password
# 列出钱包地址
btcli wallet list

按照提示完成操作,存好钱包地址和助记词,冷钱包用于转账,热钱包用于部署。

在 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.yamlchutes-miner/charts/chutes-miner/values.yaml 改成:

1
multiCluster: false

或者可以通过下方的 secrets.yaml 内变量覆盖。

chutes-miner/charts/chutes-miner/values.yaml 内所有 affinity 内容改成:

1
2
3
4
5
6
7
8
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node.kubernetes.io/microk8s-controlplane
operator: In
values: ["microk8s-controlplane"]

修改镜像拉取策略

避免重复拉取镜像,减少部署时间和网络带宽占用。
chutes-miner/src/chutes-miner/chutes_miner/api/server/verification.pychutes-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
2
3
4
5
multiCluster: false # 禁用多集群方案

minerCredentials:
ss58Address: "通过 cat ~/.bittensor/wallets/coldkey/hotkey/hotkey | jq -r .ss58Address 获取"
secretSeed: "通过 cat ~/.bittensor/wallets/coldkey/hotkey/hotkey | jq -r .secretSeed 获取,去掉 0x 前缀"

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
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
all:
vars:
validator: 5Dt7HZ7Zpw4DppPxFM7Ke3Cm7sDAWhsZXmM5ZAmE7dSVJbcQ
is_primary: false
gpu_enabled: true
fabric_enabled: false
registry_port: 30500
ansible_ssh_common_args: "-o ControlPath=none"
ansible_ssh_retries: 3
ubuntu_major: "24" # Ubuntu 24.04
ubuntu_minor: "04"
cuda_version: "13-0" # CUDA 13.0
nvidia_version: "580" # NVIDIA 驱动版本
skip_cuda: false
ipv6_enabled: false
infiniband: false
ansible_user: ubuntu
ansible_port: 22
external_ip: 1.2.3.4
# microk8s 集群主节点的公网 IP,需要对外开放 30000-32767 端口
# 如果使用 NAT,需要注意内外端口映射一致
hosts:
host100: # microk8s 集群主节点
ansible_host: 192.168.100.100
is_primary: true
host101:
ansible_host: 192.168.100.101
host102:
ansible_host: 192.168.100.102

修改完成后,执行部署命令:

1
ansible-playbook site.yml

环境配置步骤完成后,创建并添加集群:

1
ansible-playbook join-cluster.yml

chutes 部署

该步骤在 microk8s 集群的管理机执行。

通过 helm 部署环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# /charts/MIGRATE.md
sudo microk8s helm upgrade --install prometheus prometheus-community/prometheus \
--namespace monitoring \
--create-namespace \
--set server.persistentVolume.enabled=false \
--set alertmanager.persistentVolume.enabled=false \
--set prometheus-pushgateway.persistentVolume.enabled=false \
--set prometheus-server.persistentVolume.enabled=false \
--set alertmanager.persistence.enabled=false

sudo microk8s helm upgrade --install gpu-operator nvidia/gpu-operator \
--namespace gpu-operator \
--create-namespace \
--set nodeSelector.kubernetes.io/gpu="true" \
--set driver.enabled=true \
--set toolkit.enabled=true \
--set devicePlugin.enabled=true \
--set operator.runtimeClass="nvidia-container-runtime" \
--set operator.defaultRuntime=containerd \
--set containerRuntime.socketPath=/var/snap/microk8s/common/run/containerd.sock

ansible/microk8s/extras.yml 文件的配置方式似乎已经过期,以上命令来自 microk8s 迁移到 k3s 的配置脚本。

将修改完成的 chutes-miner/charts 文件夹复制到 microk8s 集群的管理机上,进入目录,执行:

1
2
sudo microk8s helm upgrade --install chutes-gpu ./chutes-miner-gpu/ -f secrets.yaml --namespace chutes --create-namespace
sudo microk8s helm upgrade --install chutes ./chutes-miner -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
2
3
4
# 检查远程节点状态
chutes-miner remote-inventory --hotkey ~/.bittensor/wallets/coldkey/hotkey/hotkey
# 检查本地节点状态
chutes-miner local-inventory --hotkey ~/.bittensor/wallets/coldkey/hotkey/hotkey --miner-api http://microk8s-主机-ip:32000

如果节点状态正常,静待 validator 完成验证后即可接取任务。

后续管理

目前已放弃跟进该项目,以下内容可能未来不会再补充。
待补充:

  • 在本地管理机管理 microk8s
  • 钱包导入,取消质押,转账
  • 模型拉取
  • 镜像导出导入