基于kubeflow进行分布式训练

云机器操作

在云节点上直接操作 Kubernetes,需要先安装 kubectl:

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
mv kubectl /usr/local/bin/
kubectl version --client

配置 kubeconfig,指向 KBS 云集群

mkdir -p ~/.kube
vim ~/.kube/config

config 文件里面填入配置,配置文件在 资源管理 -> 集群 ,选择对应集群点击右侧 连接集群 按钮,创建 KubeConfig,将 KubeConfig内容保存到 config

测试连接,运行:

kubectl cluster-info

如果能看到类似:

Kubernetes control plane is running at https://xxx.xxx.xxx.xxx
CoreDNS is running at ...

说明配置成功。

安装 Training Operator

kubectl apply --force-conflicts --server-side -k "https://ghfast.top/github.com/kubeflow/training-operator.git/manifests/overlays/standalone?ref=v1.8.0"

运行以下指令验证 CRD 是否存在

kubectl get crd | grep -i kubeflow

启动训练

将以下代码,保存为 demo.py,存储在挂载存储根目录下。例:挂载存储盘为 /data,则存储为 /data/demo.py

import os

'''
for key, value in os.environ.items():
    print(f"{key} = {value}")
print("-------------------------------")
print("")
'''

import torch

torch.distributed.init_process_group(init_method="env://")
rank = torch.distributed.get_rank()
world_size = torch.distributed.get_world_size()
print(f"rank {rank} world_size {world_size}")

a = torch.tensor([1])
torch.distributed.all_reduce(a)
print(f"rank {rank} world_size {world_size} result {a}")

torch.distributed.barrier()
print(f"rank {rank} world_size {world_size}")

执行以下命令,启动训练:

kubectl apply -f pytorch_cpu_demo.yaml

注意:如果出现以下错误

error when creating "pytorch_cpu_demo.yaml": Internal error occurred: failed calling webhook "validator.pytorchjob.training-operator.kubeflow.org": failed to call webhook: Post "https://training-operator.kubeflow.svc:443/validate-kubeflow-org-v1-pytorchjob?timeout=10s": dial tcp 10.233.18.200:443: connect: connection refused

删掉旧的 Secret,让 Operator 重建:

kubectl delete secret -n kubeflow training-operator-webhook-cert

重启 Operator:

kubectl rollout restart deploy -n kubeflow training-operator

说明:如果还是报错,说明集群里 cert-rotator 没有正确给 webhook 创建证书。这种情况在某些自建 K8s、KubeSphere、或者缺少 CA 管理组件的环境里很常见。

先绕过 webhook 运行,直接关掉 webhook 校验

kubectl delete validatingwebhookconfiguration validator.training-operator.kubeflow.org

再次启动训练

kubectl apply -f pytorch_cpu_demo.yaml

出现以下输出,即创建成功

pytorchjob.kubeflow.org/torchrun-cpu created

这样不会再走 webhook,所以不会报 TLS 错误。

缺点:参数不会被校验,运行时可能报错。