最近需要实验室的集群跑实验,无奈网上关于docker k8s Polyaxon的使用经验很少。因此,笔者分别搜集了三个工具和平台的一些文章和文档,整理成本文,旨在提供polyaxon的快速使用方法和一些关于docker,k8s的介绍和使用。推荐先跳到最后看参考资料部分的说明。
Polyaxon 介绍
A platform for reproducing and managing the whole life cycle of machine learning and deep learning applications.
这是来自官方文档的介绍。就我理解而言,polyaxon依靠k8s部署在集群上,可以自主分配需要集群资源,创建简单,可重复,可移植的部署,依靠docker定制运行环境,用于大规模深度学习和机器学习训练。
它提供了一些特性:调度多个实验或者多组实验(用于不同参数实验的比较或者大规模调参),监控资源和状态,跟踪参数,日志,配置和标签,向用户报告指标,输出和其他结果。
同时,它还提供了一些超参数调优算法进行大规模调参,以及方便的Notebook,Tensorboard。
我们用Polyaxon来干嘛
我们可以通过Polyaxon上传本地代码到集群,然后通过写polyaxon配置文件,定制我们所需要的docker镜像,所需要的资源(内存,CPU,GPU),以及实验类型(jupyter notebook, tensorboard 或者 普通实验)等选项来创建一个或者一组实验(运行在集群指定节点的一个个容器里面),同时通过web界面的dashboard或者polyaxon-cli提供的众多命令监控资源和状态,跟踪参数,日志,配置和标签,以及最终的结果和输出等。
k8s 介绍
Kubernetes (简称k8s) 将一个网络中的多个机器管理成一个集群,分为主节点(master)和其他节点(Node)。它可以把用户提交的容器(Container)放到其管理的集群的某一台节点(Node)上去,并根据容器大小规格自动调度并分配相应的资源。主节点负责管理所有节点的相关状态,下发给其他节点命令并执行等。
K8s 的 Node 是真正运行业务负载的,每个业务负载会以 Pod 的形式运行。一个 Pod 中运行着一个或者多个容器,真正去运行这些 Pod 的组件的是叫做 kubelet,它接收到所需要 Pod 运行的状态,然后提交到 Container Runtime 组件中。 ----《从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念》
另外一个需要了解的概念是volume (卷)。
它是用来管理 Kubernetes 存储的,是用来声明在 Pod 中的容器可以访问文件目录的,一个卷可以被挂载在 Pod 中一个或者多个容器的指定路径下面。----《从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念》
容器实际一次运行结束后,除非将数据保存在永久存储卷中,否则数据会丢失。因此k8s将一定的本地存储空间挂载在容器中,成为一个可访问目录。容器运行时产生的数据可以存储在这个卷中。
接下来我们介绍k8s和polyaxon的联系。
polyaxon被部署在k8s上,使用polyaxon创建一个或者一组实验时,会根据配置文件创建一个或者多个容器由k8s实际调度运行在集群的某个或多个节点上。k8s负责其资源的调度,状态的监控等。也就是说,polyaxon实际提供了一个更加上层的接口,不需要用户自己执行任何k8s的命令来创建容器,创建Pod, 运行bash,输出状态信息等。这一切的一切都可以通过polyaxon完成。
正如上文所言,polyaxon 要指定路径来进行持久存储(persistence storage),不然实验数据和实验结果在容器运行结束后都无法保存了。因此,我们可以指定一台节点上的某几个文件夹作为挂载到容器的永久存储卷。
这些文件夹在本地的路径以及容器上挂载的别名可以通过查看polyaxonpolyaxon-config.yml
得知。
比如上图:定义了如下的持久存储卷(注:PVC: PersistentVolumeClaim):
polyaxon-pvc-logs
(默认挂载为logs
) 用于保存实验的日志polyaxon-pvc-repos
(默认挂载为code
) ,上传的代码将保存在这里polyaxon-pvc-data
(默认挂载为data
),一些大数据集可以事先上传到这个文件夹中,故不需要在上传代码时费时上传很大的数据集polyaxon-pvc-outputs
(默认挂载为outputs
) , 实验的输出和模型断点保存在该文件夹中
k8s 常用命令
k8s提供了kubectl
命令行工具对集群进行管理。我们可以登录master节点,利用该工具执行命令。
一些常用命令总结如下:
代码语言:javascript复制# 查看所有节点/Pod
$ kubectl get nodes/pods
# 查看指定节点/Pod的详细信息
$ kubectl describe nodes/pods [name]
# 在一个pod的运行的某个容器(如果只有一个,则省略-c部分)中获取shell
$ kubectl exec -it [pod-name] -c [container-name] -- /bin/bash
# 列出每个节点GPU的使用情况
# 目前无法列出具体GPU的编号,但是我认为这部分是由k8s管理起来了,即自动调度可用的GPU
$ kubectl describe nodes | tr -d '