MPI 操作器
MPI 操作器使在 Kubernetes 上运行 allreduce 式分布式训练变得简单。请查看这篇博客文章,了解 MPI 操作器及其行业应用的介绍。
安装
您可以通过运行以下命令使用默认设置部署操作器:
- 最新开发版本
kubectl apply --server-side -f https://raw.githubusercontent.com/kubeflow/mpi-operator/master/deploy/v2beta1/mpi-operator.yaml
- 发布版本
kubectl apply --server-side -f https://raw.githubusercontent.com/kubeflow/mpi-operator/v0.5.0/deploy/v2beta1/mpi-operator.yaml
或者,按照入门指南部署 Kubeflow。
MPI 支持的 alpha 版本在 Kubeflow 0.2.0 中引入。您必须使用 0.2.0 以上版本的 Kubeflow。
您可以通过以下方式检查是否安装了 MPI Job 自定义资源:
kubectl get crd
输出应包含 mpijobs.kubeflow.org
,如下所示:
NAME AGE
...
mpijobs.kubeflow.org 4d
...
如果未包含,您可以使用 kustomize 按如下方式添加:
git clone https://github.com/kubeflow/mpi-operator
cd mpi-operator
kustomize build manifests/overlays/kubeflow | kubectl apply -f -
请注意,从 Kubernetes v1.14 开始,kustomize
成为 kubectl
的子命令,因此您也可以运行以下命令:
从 Kubernetes v1.21 开始,您可以使用:
kubectl apply -k manifests/overlays/kubeflow
kubectl kustomize base | kubectl apply -f -
创建 MPI Job
您可以通过定义 MPIJob
配置文件来创建 MPI job。请参阅 TensorFlow 基准示例 配置文件,以启动多节点 TensorFlow 基准训练作业。您可以根据需求更改配置文件。
cat examples/v2beta1/tensorflow-benchmarks/tensorflow-benchmarks.yaml
部署 MPIJob
资源以开始训练:
kubectl apply -f examples/v2beta1/tensorflow-benchmarks/tensorflow-benchmarks.yaml
监控 MPI Job
创建 MPIJob
资源后,您现在应该能够看到与指定 GPU 数量相匹配的已创建 pod。您还可以从状态部分监控作业状态。以下是作业成功完成时的示例输出。
kubectl get -o yaml mpijobs tensorflow-benchmarks
apiVersion: kubeflow.org/v2beta1
kind: MPIJob
metadata:
creationTimestamp: "2019-07-09T22:15:51Z"
generation: 1
name: tensorflow-benchmarks
namespace: default
resourceVersion: "5645868"
selfLink: /apis/kubeflow.org/v1alpha2/namespaces/default/mpijobs/tensorflow-benchmarks
uid: 1c5b470f-a297-11e9-964d-88d7f67c6e6d
spec:
runPolicy:
cleanPodPolicy: Running
mpiReplicaSpecs:
Launcher:
replicas: 1
template:
spec:
containers:
- command:
- mpirun
- --allow-run-as-root
- -np
- "2"
- -bind-to
- none
- -map-by
- slot
- -x
- NCCL_DEBUG=INFO
- -x
- LD_LIBRARY_PATH
- -x
- PATH
- -mca
- pml
- ob1
- -mca
- btl
- ^openib
- python
- scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py
- --model=resnet101
- --batch_size=64
- --variable_update=horovod
image: mpioperator/tensorflow-benchmarks:latest
name: tensorflow-benchmarks
Worker:
replicas: 1
template:
spec:
containers:
- image: mpioperator/tensorflow-benchmarks:latest
name: tensorflow-benchmarks
resources:
limits:
nvidia.com/gpu: 2
slotsPerWorker: 2
status:
completionTime: "2019-07-09T22:17:06Z"
conditions:
- lastTransitionTime: "2019-07-09T22:15:51Z"
lastUpdateTime: "2019-07-09T22:15:51Z"
message: MPIJob default/tensorflow-benchmarks is created.
reason: MPIJobCreated
status: "True"
type: Created
- lastTransitionTime: "2019-07-09T22:15:54Z"
lastUpdateTime: "2019-07-09T22:15:54Z"
message: MPIJob default/tensorflow-benchmarks is running.
reason: MPIJobRunning
status: "False"
type: Running
- lastTransitionTime: "2019-07-09T22:17:06Z"
lastUpdateTime: "2019-07-09T22:17:06Z"
message: MPIJob default/tensorflow-benchmarks successfully completed.
reason: MPIJobSucceeded
status: "True"
type: Succeeded
replicaStatuses:
Launcher:
succeeded: 1
Worker: {}
startTime: "2019-07-09T22:15:51Z"
训练应运行 100 步,在 GPU 集群上需要几分钟。您可以检查日志以查看训练进度。当作业开始时,从 launcher
pod 访问日志:
PODNAME=$(kubectl get pods -l training.kubeflow.org/job-name=tensorflow-benchmarks,training.kubeflow.org/job-role=launcher -o name)
kubectl logs -f ${PODNAME}
TensorFlow: 1.14
Model: resnet101
Dataset: imagenet (synthetic)
Mode: training
SingleSess: False
Batch size: 128 global
64 per device
Num batches: 100
Num epochs: 0.01
Devices: ['horovod/gpu:0', 'horovod/gpu:1']
NUMA bind: False
Data format: NCHW
Optimizer: sgd
Variables: horovod
...
40 images/sec: 154.4 +/- 0.7 (jitter = 4.0) 8.280
40 images/sec: 154.4 +/- 0.7 (jitter = 4.1) 8.482
50 images/sec: 154.8 +/- 0.6 (jitter = 4.0) 8.397
50 images/sec: 154.8 +/- 0.6 (jitter = 4.2) 8.450
60 images/sec: 154.5 +/- 0.5 (jitter = 4.1) 8.321
60 images/sec: 154.5 +/- 0.5 (jitter = 4.4) 8.349
70 images/sec: 154.5 +/- 0.5 (jitter = 4.0) 8.433
70 images/sec: 154.5 +/- 0.5 (jitter = 4.4) 8.430
80 images/sec: 154.8 +/- 0.4 (jitter = 3.6) 8.199
80 images/sec: 154.8 +/- 0.4 (jitter = 3.8) 8.404
90 images/sec: 154.6 +/- 0.4 (jitter = 3.7) 8.418
90 images/sec: 154.6 +/- 0.4 (jitter = 3.6) 8.459
100 images/sec: 154.2 +/- 0.4 (jitter = 4.0) 8.372
100 images/sec: 154.2 +/- 0.4 (jitter = 4.0) 8.542
----------------------------------------------------------------
total images/sec: 308.27
有关使用 Intel MPI 的示例,请参见:
cat examples/pi/pi-intel.yaml
有关使用 MPICH 的示例,请参见:
cat examples/pi/pi-mpich.yaml
暴露的指标
指标名称 | 指标类型 | 描述 | 标签 |
---|---|---|---|
mpi_operator_jobs_created_total | 计数器 | 计算创建的 MPI 作业数量 | |
mpi_operator_jobs_successful_total | 计数器 | 计算成功的 MPI 作业数量 | |
mpi_operator_jobs_failed_total | 计数器 | 计算失败的 MPI 作业数量 | |
mpi_operator_job_info | 仪表 | MPI 作业的信息 | launcher =<launcher-pod-name> namespace =<job-namespace> |
连接指标
使用 kube-state-metrics,可以通过标签连接指标。
例如 kube_pod_info * on(pod,namespace) group_left label_replace(mpi_operator_job_infos, "pod", "$0", "launcher", ".*")
Docker 镜像
我们为每个版本在 Dockerhub 上推送 mpioperator 的 Docker 镜像。 您可以使用以下 Dockerfile 自行构建镜像:
或者,您可以使用 make 构建镜像:
make RELEASE_VERSION=dev IMAGE_NAME=registry.example.com/mpi-operator images
这将生成一个标签为 registry.example.com/mpi-operator:dev
的镜像。
贡献
在 CONTRIBUTING 中了解更多信息。