全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:使用Arena提交TensorFlow单机训练作业

更新时间:Mar 10, 2026

本文展示如何使用Arena提交TensorFlow基于PS-Worker模式的分布式训练作业,并通过TensorBoard可视化查看训练作业。

前提条件

背景信息

本文示例从Git URL下载源代码,数据集放在共享存储系统(基于NAS的PV和PVC)中。示例假设您已经获得了一个名称为training-data的PVC实例(一个共享存储),里面存在一个目录tf_data,存放了示例所使用的数据集。

操作步骤

步骤一:查看 GPU 资源

arena top node

预期输出:

NAME                        IPADDRESS        ROLE    STATUS  GPU(Total)  GPU(Allocated)
cn-beijing.192.168.xxx.xxx  192.168.xxx.xxx  <none>  Ready   0           0
cn-beijing.192.168.xxx.xxx  192.168.xxx.xxx  <none>  Ready   0           0
cn-beijing.192.168.xxx.xxx  192.168.xxx.xxx  <none>  Ready   2           0
cn-beijing.192.168.xxx.xxx  192.168.xxx.xxx  <none>  Ready   2           0
---------------------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
0/4 (0.0%)

可以看到集群中有2个GPU节点,每个GPU节点都包含2张空闲的GPU卡可用于运行训练作业。

步骤二:提交 TensorFlow 训练作业

执行arena submit tfjob/tf [--flag] command形式命令提交TensorFlow作业。

通过以下代码示例提交 PS-Worker 模式下的 TensorFlow 分布式训练作业,它包含 1 个 PS 节点,2 个 Worker 节点。

arena submit tf \
    --name=tf-mnist-dist \
    --namespace=default \
    --working-dir=/root \
    --ps=1 \
    --ps-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
    --workers=2 \
    --worker-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
    --gpus=1 \
    --sync-mode=git \
    --sync-source=https://github.com/kubeflow/arena.git \
    --env=GIT_SYNC_BRANCH=master \
    --data=training-data:/mnt \
    --tensorboard \
    --logdir=/mnt/tf_data/logs \
    "python /root/code/arena/examples/tensorflow/mnist/main.py --data /mnt/tf_data/mnist.npz --dir /mnt/tf_data/logs"

预期输出:

service/tf-mnist-dist-tensorboard created
deployment.apps/tf-mnist-dist-tensorboard created
tfjob.kubeflow.org/tf-mnist-dist created
INFO[0004] The Job tf-mnist-dist has been submitted successfully
INFO[0004] You can run `arena get tf-mnist-dist --type tfjob -n default` to check the job status

参数解释如下表。

参数

是否必选

解释

默认值

--name

必选

指定提交的作业名字,全局唯一,不能重复。

--working-dir

可选

指定当前执行命令所在的目录。

/root

--gpus

可选

指定作业Worker节点需要使用的GPU卡数。

0

--workers

可选

指定作业Worker节点的数量。

1

--image

如果不单独指定--worker-image--ps-image,则必选。

指定训练环境的镜像地址。如果不指定--worker-image或者--ps-image,则Worker节点和PS节点都使用该镜像地址。

--worker-image

如果不指定--image,则必选。

指定作业Worker节点需要使用的镜像地址。如果--image同时出现,则覆盖--image

--sync-mode

可选

同步代码的模式,您可以指定gitrsync。本文使用Git模式。

--sync-source

可选

同步代码的仓库地址,需要和--sync-mode一起使用。本文示例使用Git模式,该参数可以为任何github项目地址。阿里云code项目地址等支持Git的代码托管地址。项目代码将会被下载到--working-dir下的code/目录中。本文示例即为:/root/code/tensorflow-sample-code

--ps

分布式作业必选

指定参数服务器PS节点数。

0

--ps-image

如果不指定--image,则必选。

指定PS节点的镜像地址。如果--image同时出现,则覆盖--image

--data

可选

挂载共享存储卷PVC到运行环境中。它由两部分组成,通过冒号(:)分割。冒号左侧是您已经准备好的PVC名称。您可以通过命令arena data list查看当前集群可用的PVC列表;冒号右侧是您想将PVC的挂载到运行环境中的路径,也是您训练代码要读取数据的本地路径。这样通过挂载的方式,您的代码就可以访问PVC的数据。

说明

执行arena data list查看本文示例当前集群可用的PVC列表。

NAME           ACCESSMODE     DESCRIPTION  OWNER  AGE
training-data  ReadWriteMany                      35m

如果没有可用的PVC,您可创建PVC。详情请参见配置NAS共享存储

--tensorboard

可选

为训练任务开启一个TensorBoard服务,用作数据可视化,您可以结合--logdir指定TensorBoard要读取的event路径。不指定该参数,则不开启TensorBoard服务。

--logdir

可选

需要结合--tensorboard一起使用,该参数表示TensorBoard需要读取event数据的路径。

/training_logs

说明

如果您使用的是非公开Git代码仓库,则可以通过配置环境变量GIT_SYNC_USERNAMEGIT_SYNC_PASSWORD的方式来设置Git用户名和密码。

 arena submit tf \
    --name=tf-mnist-dist \
    --namespace=default \
    --working-dir=/root \
    --ps=1 \
    --ps-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
    --workers=2 \
    --worker-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
    --gpus=1 \
    --sync-mode=git \
    --sync-source=https://github.com/kubeflow/arena.git \
    --env=GIT_SYNC_BRANCH=master \
    --env=GIT_SYNC_USERNAME=yourname \
    --env=GIT_SYNC_PASSWORD=yourpwd \
    --data=training-data:/mnt \
    --tensorboard \
    --logdir=/mnt/tf_data/logs \
    "python /root/code/arena/examples/tensorflow/mnist/main.py --data /mnt/tf_data/mnist.npz --dir /mnt/tf_data/logs"

arena命令使用git-sync同步源代码。您可以设置在git-sync项目中定义的环境变量。

重要

本文示例从 GitHub 仓库中拉取源代码,如遇到网络原因等导致代码无法成功拉取时,可以手动将代码下载到共享存储系统中,本文提供的演示镜像中已经包含了示例代码 /code/github.com/kubeflow/arena/examples/tensorflow/mnist/main.py,可以如下直接提交训练作业:

arena submit tf \
    --name=tf-mnist-dist \
    --namespace=default \
    --working-dir=/root \
    --ps=1 \
    --ps-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
    --workers=2 \
    --worker-image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
    --gpus=1 \
    --data=training-data:/mnt \
    --tensorboard \
    --logdir=/mnt/tf_data/logs \
    "python /code/github.com/kubeflow/arena/examples/tensorflow/mnist/main.py --data /mnt/tf_data/mnist.npz --dir /mnt/tf_data/logs"

步骤三:查看 TensorFlow 训练作业

  1. 查看通过 Arena 提交的所有训练作业。

    arena list

    预期输出:

    NAME     STATUS     TRAINER  AGE  NODE
    tf-dist  RUNNING    TFJOB    58s  192.1xx.x.xx
  2. 执行以下命令检查作业所使用的GPU资源。

    arena top job

    预期输出:

    NAME     GPU(Requests)  GPU(Allocated)  STATUS     TRAINER  AGE  NODE
    tf-dist  2              2               RUNNING    tfjob    1m   192.1xx.x.x
    tf-git   1              0               SUCCEEDED  tfjob    2h   N/A
    
    Total Allocated GPUs of Training Job:
    2
    
    Total Requested GPUs of Training Job:
    3
  3. arena top job

    预期输出:

    NAME     GPU(Requests)  GPU(Allocated)  STATUS     TRAINER  AGE  NODE
    tf-dist  2              2               RUNNING    tfjob    1m   192.1xx.x.x
    tf-git   1              0               SUCCEEDED  tfjob    2h   N/A
    
    Total Allocated GPUs of Training Job:
    2
    
    Total Requested GPUs of Training Job:
    3
  4. arena top node

    预期输出:

    NAME                       IPADDRESS     ROLE    STATUS  GPU(Total)  GPU(Allocated)
    cn-huhehaote.192.1xx.x.xx  192.1xx.x.xx  master  ready   0           0
    cn-huhehaote.192.1xx.x.xx  192.1xx.x.xx  master  ready   0           0
    cn-huhehaote.192.1xx.x.xx  192.1xx.x.xx  master  ready   0           0
    cn-huhehaote.192.1xx.x.xx  192.1xx.x.xx  <none>  ready   2           1
    cn-huhehaote.192.1xx.x.xx  192.1xx.x.xx  <none>  ready   2           1
    cn-huhehaote.192.1xx.x.xx  192.1xx.x.xx  <none>  ready   2           0
    -----------------------------------------------------------------------------------------
    Allocated/Total GPUs In Cluster:
    2/6 (33%)
  5. arena get -n default tf-mnist-dist

    预期输出:

    STATUS: RUNNING
    NAMESPACE: default
    PRIORITY: N/A
    TRAINING DURATION: 1m
    
    NAME     STATUS   TRAINER  AGE  INSTANCE          NODE
    tf-dist  RUNNING  TFJOB    1m   tf-dist-ps-0      192.1xx.x.xx
    tf-dist  RUNNING  TFJOB    1m   tf-dist-worker-0  192.1xx.x.xx
    tf-dist  RUNNING  TFJOB    1m   tf-dist-worker-1  192.1xx.x.xx
    
    Your tensorboard will be available on:
    http://192.1xx.x.xx:31870
    说明

    本文示例因为开启TensorBoard,在上述作业详情中最后两行,可以看到TensorBoard的Web访问地址;如果没有开启TensorBoard,最后两行信息不存在。

  6. 执行以下命令检查集群所使用的GPU资源。

  7. 执行以下命令获取任务详情。

步骤四:查看 TensorBoard

通过浏览器查看TensorBoard。

  1. 在本地执行如下命令,将集群中的TensorBoard映射到本地9090端口。

  2. 重要

    请注意kubectl port-forward建立的端口转发不具备生产级别的可靠性、安全性和扩展性,因此仅适用于开发和调试目的,不适合在生产环境使用。更多关于Kubernetes集群内生产可用的网络方案的信息,请参见Ingress管理

    kubectl port-forward -n default svc/tf-dist-tensorboard 9090:6006
  3. 在浏览器中访问localhost:9090,即可查看TensorBoard。如下图所示。

    tf

步骤五:查看训练作业日志

执行以下命令获取作业日志信息。

arena logs -n default tf-dist

预期输出:

WARNING:tensorflow:From code/tensorflow-sample-code/tfjob/docker/mnist/main.py:120: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.
Instructions for updating:
...
Accuracy at step 960: 0.9691
Accuracy at step 970: 0.9677
Accuracy at step 980: 0.9687
Accuracy at step 990: 0.968
Adding run metadata for 999
Total Train-accuracy=0.968

使用上述命令获取作业日志信息时,默认输出 worker-0 节点的日志。如果需要查看分布式训练任务中的某个节点日志,可以先查看作业详情获取作业的节点列表,然后使用命令arena logs $job_name -i $instance_name查看具体实例的日志。

示例代码如下。

arena get tf-dist

预期输出:

STATUS: SUCCEEDED
NAMESPACE: default
PRIORITY: N/A
TRAINING DURATION: 1m

NAME     STATUS     TRAINER  AGE  INSTANCE          NODE
tf-dist  SUCCEEDED  TFJOB    5m   tf-dist-ps-0      192.16x.x.xx
tf-dist  SUCCEEDED  TFJOB    5m   tf-dist-worker-0  192.16x.x.xx
tf-dist  SUCCEEDED  TFJOB    5m   tf-dist-worker-1  192.16x.x.xx

Your tensorboard will be available on:
http://192.16x.x.xx:31870

执行以下命令获取作业日志。

arena logs tf-dist -i tf-dist-worker-1

预期输出:

WARNING:tensorflow:From code/tensorflow-sample-code/tfjob/docker/mnist/main.py:120: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.
Instructions for updating:
...
Accuracy at step 970: 0.9676
Accuracy at step 980: 0.968
Accuracy at step 990: 0.967
Adding run metadata for 999
Total Train-accuracy=0.967

您还可以通过命令arena logs $job_name -f实时查看作业的日志输出,通过命令arena logs $job_name -t N查看尾部N行的日志,以及通过arena logs --help查询更多参数使用情况。

查看尾部N行的日志示例代码如下。

arena logs tf-dist -t 5

预期输出:

Accuracy at step 9970: 0.9834
Accuracy at step 9980: 0.9828
Accuracy at step 9990: 0.9816
Adding run metadata for 9999
Total Train-accuracy=0.9816

(可选)步骤六:环境清理

训练作业执行结束后如不再需要,执行如下命令进行删除:

arena delete -n default tf-mnist-dist

预期输出:

INFO[0002] The training job tf-mnist-dist has been deleted successfully