TensorFlow 是一个开源的深度学习框架,广泛应用于各种深度学习模型的训练任务中。本文展示如何使用 Arena 提交 TensorFlow 单机训练作业,并通过 TensorBoard 可视化查看训练作业。
前提条件
已创建包含GPU的Kubernetes集群。具体操作,请参见创建包含GPU的Kubernetes集群。
集群节点可以访问公网。具体操作,请参见为集群开启访问公网的能力。
已安装Arena工具。具体操作,请参见配置Arena客户端。
创建一个名为
training-data的PVC实例,并在路径tf_data下存放MNIST数据集。具体操作,请参见配置NAS共享存储。
背景信息
本文示例从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]命令即可提交TensorFlow作业。
通过以下代码示例提交一个单机单卡的TensorFlow任务。
arena submit tf \
--name=tf-mnist \
--working-dir=/root \
--workers=1 \
--gpus=1 \
--image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--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-tensorboard created
deployment.apps/tf-mnist-tensorboard created
tfjob.kubeflow.org/tf-mnist created
INFO[0005] The Job tf-mnist has been submitted successfully
INFO[0005] You can run `arena get tf-mnist --type tfjob -n default` to check the job status参数解释如下表。
参数 | 是否必选 | 解释 | 默认值 |
--name | 必选 | 指定提交的作业名字,全局唯一,不能重复。 | 无 |
--working-dir | 可选 | 指定当前执行命令所在的目录。 | /root |
--gpus | 可选 | 指定作业Worker节点需要使用的GPU卡数。 | 0 |
--image | 必选 | 指定训练环境的镜像地址。 | 无 |
--sync-mode | 可选 | 同步代码的模式,您可以指定git、rsync。本文使用Git模式。 | 无 |
--sync-source | 可选 | 同步代码的仓库地址,需要和--sync-mode一起使用,本文示例使用Git模式,该参数可以为任何GitHub项目地址。阿里云Code项目地址等支持Git的代码托管地址。项目代码将会被下载到--working-dir下的code/目录中。本文示例即为:/root/code/arena。 | 无 |
--data | 可选 | 挂载共享存储卷PVC到运行环境中。它由两部分组成,通过分号 说明 执行 如果没有可用的PVC,您可创建PVC。具体操作,请参见配置NAS共享存储。 | 无 |
--tensorboard | 可选 | 为训练任务开启一个TensorBoard服务,用作数据可视化,您可以结合--logdir指定TensorBoard要读取的event路径。不指定该参数,则不开启TensorBoard服务。 | 无 |
--logdir | 可选 | 需要结合--tensorboard一起使用,该参数表示TensorBoard需要读取event数据的路径。 | /training_logs |
如果您使用的是非公开Git代码仓库,则可以通过配置环境变量GIT_SYNC_USERNAME和GIT_SYNC_PASSWORD的方式来设置Git用户名和密码。
arena submit tf \
--name=tf-mnist \
--working-dir=/root \
--workers=1 \
--gpus=1 \
--image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--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 --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 \
--working-dir=/root \
--workers=1 \
--gpus=1 \
--image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tensorflow-mnist-example:2.15.0-gpu \
--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 训练作业
执行以下命令查看当前通过Arena提交的所有作业。
arena list预期输出:
NAME STATUS TRAINER DURATION GPU(Requested) GPU(Allocated) NODE tf-mnist RUNNING TFJOB 3s 1 1 192.168.xxx.xxx执行以下命令检查作业所使用的GPU资源。
arena top job预期输出:
NAME STATUS TRAINER AGE GPU(Requested) GPU(Allocated) NODE tf-mnist RUNNING TFJOB 29s 1 1 192.168.xxx.xxx Total Allocated/Requested GPUs of Training Jobs: 1/1执行以下命令检查集群所使用的 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 1 cn-beijing.192.168.xxx.xxx 192.168.xxx.xxx <none> Ready 2 0 --------------------------------------------------------------------------------------------------- Allocated/Total GPUs In Cluster: 1/4 (25.0%)执行以下命令查看训练作业详情。
arena get -n default tf-mnist预期输出:
Name: tf-mnist Status: RUNNING Namespace: default Priority: N/A Trainer: TFJOB Duration: 22s CreateTime: 2026-01-26 16:01:42 EndTime: Instances: NAME STATUS AGE IS_CHIEF GPU(Requested) NODE ---- ------ --- -------- -------------- ---- tf-mnist-chief-0 Running 45s true 1 cn-beijing.192.168.xxx.xxx Tensorboard: Your tensorboard will be available on: http://192.168.xxx.xxx:31243说明本文示例因为开启 TensorBoard,在上述作业详情中最后两行,可以看到 TensorBoard 的 Web 访问地址;如果没有开启 TensorBoard,最后两行信息不存在。
步骤四:查看 TensorBoard
通过浏览器查看 TensorBoard。
在本地执行如下命令,将集群中的TensorBoard映射到本地9090端口。
重要请注意kubectl port-forward建立的端口转发不具备生产级别的可靠性、安全性和扩展性,因此仅适用于开发和调试目的,不适合在生产环境使用。更多关于Kubernetes集群内生产可用的网络方案的信息,请参见Ingress管理。
kubectl port-forward -n default svc/tf-mnist-tensorboard 9090:6006在浏览器中访问
http://localhost:9090,即可查看 TensorBoard,如下图所示。
步骤五:查看训练作业日志
执行以下命令获取作业日志信息。
arena logs -n default tf-mnist预期输出:
Train Epoch: 14 [55680/60000 (93%)] Loss: 0.029811
Train Epoch: 14 [56320/60000 (94%)] Loss: 0.029721
Train Epoch: 14 [56960/60000 (95%)] Loss: 0.029682
Train Epoch: 14 [57600/60000 (96%)] Loss: 0.029781
Train Epoch: 14 [58240/60000 (97%)] Loss: 0.029708
Train Epoch: 14 [58880/60000 (98%)] Loss: 0.029761
Train Epoch: 14 [59520/60000 (99%)] Loss: 0.029684
Test Accuracy: 9842/10000 (98.42%)
938/938 - 3s - loss: 0.0299 - accuracy: 0.9924 - val_loss: 0.0446 - val_accuracy: 0.9842 - lr: 0.0068 - 3s/epoch - 3ms/step如果需要实时查看作业日志,可以添加
-f参数;如果仅需要查看最后 N 行日志,可以添加
-t N或--tail N参数;更多用法请参见
arena logs --help。
(可选)步骤六:环境清理
训练作业执行结束后如不再需要,执行如下命令进行删除:
arena delete -n default tf-mnist预期输出:
INFO[0002] The training job tf-mnist has been deleted successfully