-
Notifications
You must be signed in to change notification settings - Fork 641
多机、多集群、多项目组 部署调度
公有云,单机,多机,多集群,分布式存储,私有仓库,gpu,功能初步验证
本地调试时:(启动方式:install/docker/目录下执行docker-compose up
)
- k8s集群的config文件:在install/docker/kubeconfig/下面
- 配置文件config.py文件:在install/docker/config.py中
- 启动文件entrypoint.sh文件:在install/docker/entrypoint.sh中
线上部署时:(启动方式:install/kubernetes/目录下执行 kubectl apply -k cube/overlays
)
- k8s集群的config文件:在install/kubernetes/kubeconfig/下面
- 配置文件config.py文件:在install/kubernetes/cube/overlays/config/config.py中
- 启动文件entrypoint.sh文件:在install/kubernetes/cube/overlays/config/entrypoint.sh中
机器通过label进行管理,所有的调度机器由平台控制,不由用户直接控制。
开发训练服务机器管理:
- 对于cpu的train/notebook/service会选择cpu=true的机器
- 对于gpu的train/notebook/service会选择gpu=true的机器
- 对于vgpu的service会选择vgpu=true的机器
- 对于rdma网络的pod会选择rdma=true的机器
- 训练任务会选择train=true的机器
- notebook会选择notebook=true的机器
- 服务化会选择service=true的机器
- 不同资源组的任务会选择对应org=xx的机器。默认为org=public
- 可以通过gpu-type=xx表示gpu的型号,比如gpu-type=V100或gpu-type=T4,在配置gpu算力时也可以同步配置gpu型号。例如2(T4)表示2张T4卡。
控制器机器管理:
- mysql=true 部署mysql服务的机器
- redis=true 部署mysql服务的机器
- kubeflow-dashobard=true 部署cube服务的机器
- kubeflow=true 部署kubeflow的机器
- isito=true 部署istio的机器
- monitoring=true 部署prometheus的机器
实现原理:
基础准备:主机/data/k8s目录下需为分布式存储
1、初始化机器
在新机器上只需要拉取rancher镜像
cd install/kubernetes/rancher
python3 all_image.py > pull_rancher_images.sh
sh pull_rancher_images.sh
在新机器上只需要拉取cube-studio镜像
cd install/kubernetes/
bash init_node.sh
2、添加k8s,只需要worker角色
在rancher界面,将新机器加入rancher集群,新机器只需要为worker,并且为机器添加label。
操作路径:打开单机时创建的集群-> 点击节点菜单->编辑集群->底部复制加入集群命令。在新机器上执行复制的命令即可
3、 为机器添加标签
service=true train=true notebook=true org=public cpu=true # 按需 gpu=true # 按需 gpu-type=A100 # 按需
目前机器学习平台依赖强io性能的分布式存储。
参考分布式存储部署
!!!重要:分布式文件系统需要挂载到每台机器的/data/k8s/下面,当然也可以挂载其他目录下,以软链的形式链接到/data/k8s/下 (如果使用juicefs,则不需要这一步)
需要每台机器都有对应的目录/data/k8s为分布式存储目录(如果使用juicefs,则不需要这一步)
mkdir -p /data/k8s/kubeflow/minio
mkdir -p /data/k8s/kubeflow/global
mkdir -p /data/k8s/kubeflow/pipeline/workspace
mkdir -p /data/k8s/kubeflow/pipeline/archives
平台pvc会使用这些分布式存储目录下的subpath,所以如果你是rancher部署k8s集群,需要在kubelet容器中挂载主机的/data/k8s/目录到kubelet容器的/data/k8s/目录。
rancher修改kubelet容器挂载目录(选中集群-升级-编辑yaml)
kubelet:
extra_binds:
- '/data/k8s:/data/k8s'
每个k8s集群的算力都可以划分为多个资源组。这些划分是通过机器label来实现的。
为机器添加标签org=xx其中xx为资源组名称,
添加机器标签后,在项目组中添加资源组配置为上面的xx,然后保存项目组配置后,该项目组下的成员就会自动使用这一波资源组算力了。
多项目组之间的算力的均衡通过schedules.py中的adjust_node_resource任务实现。
基本原则是每5分钟,将可共享的机器(lable包含share=true),从当前负载最小的项目组划分到负载最高的项目组,同时保证项目组的最小可用算力