cube-studio/docs/example
FerdinandWard cab99b5a8e add aihub
2022-08-22 13:29:21 +08:00
..
readme.md delete kfserving 2022-08-18 15:15:14 +08:00
service.md add aihub 2022-08-22 13:29:21 +08:00

基础认识:

容器:对于建模人员,可以认为容器是一个轻量的虚拟机,一个机器可以同时启动多个容器,容器之间资源是隔离的。在平台上运行的任务,最终都会以容器内进程的形式运行在实体机上。所有容器的/mnt目录下都是自己的个人工作目录容器重启后环境消失。

镜像可以将容器整个操作系统的文件和目录打包成镜像只需要解压打包好的容器镜像容器就被重现出来了。所以我们可以用这种方式打包运行ml任务的复杂环境。

任务模板当我们要在平台例行化运行一个ml任务例如xgb分类可以先定义好这个任务用到的镜像需要什么参数分配多少资源等信息形成一个任务模板。以后使用的时候只需选择模板并填写相应参数即可。

任务流(pipeline): 多个任务及其依赖关系形成的DAG图。任务的构建产物可以在任务间传递。

运行实例:任务流的一次运行。

notebook开启一个jupyter-notebook自动挂载个人工作目录。有jupyter、vscode两种模式

加入项目组

申请加入项目组

路径:项目组->项目分组oa联系creator将自己加入到项目组中

image

备注:

  • 每个人自动都在public项目组中
  • 可自行创建项目组

creator添加用户

路径:项目组->项目分组。编辑项目组添加组成员。creator角色的组成员可以添加其他用户进组

项目组控制调度集群cluster管理员学习

平台支持跨集群调度。需要管理员创建集群并配置到系统配置后可通过项目组的expand字段控制项目组的调度集群

{
	"cluster": "dev"
}

项目组控制调度机器node_selector管理员学习

平台支持单集群中划分资源组。需要管理员配置不同机器所属的资源组后可通过项目组的expand字段控制项目组的调度机器。

调度机器可以是不同项目组,不同机型,不同区域等划分方式

{
	"node_selector": "org=public"
}

项目组控制挂载volume_mount管理员学习

平台支持单集群中划分挂载。可以配置项目组下成员将自有分布式存储挂载到平台以及项目组内共享目录等功能可通过项目组的expand字段控制项目组的挂载.

  • 挂载pvc会自动挂载pvc下面的个人用户子目录。默认挂载kubeflow-user-workspace的pvc
  • 挂载hostpath不会自动挂载个人子目录可以用来控制多人共享同一个目录
  • 挂载memory主要用来控制k8s中共享内存的挂载
	{
		"volume_mount": "kubeflow-user-workspace(pvc):/mnt/;data/aidata(hostpath):/aidata;4G(memory):/dev/shm"
	}

项目组控制服务service代理ip管理员学习

平台支持单集群中划分服务的代理ip多用于边缘集群或多网关情况下。可通过项目组的expand字段控制项目组的服务的代理ip.

	{
		"SERVICE_EXTERNAL_IP":"xx.xx.xx.xx"
	}

在线notebook开发

notebook支持类型

  1. Jupyter cpu/gpu
  2. vscodecpu/gpu

支持功能

  1. 代码开发/调试,上传/下载命令行git工蜂/github内网/外网tensorboard自主安装插件

添加notebook

路径:在线开发->notebook->添加

image

备注:

  1. Running状态下方可进入
  2. 无法进去时reset重新激活
  3. notebook会自动挂载一下目录
  • a个人工作目录到容器 /mnt/$username
  • b个人归档目录到容器/archives/$username

jupyter示例

167874734-5b1629e0-c3bb-41b0-871d-ffa43d914066

vscode示例

image

切换归档目录示例:

image

tensorboard示例

进入到对应的日志目录再打开tensorboard按钮

image

在线构建镜像

image

扩展字段高级配置:

{
  "volume_mount":"kubeflow-user-workspace(pvc):/mnt,kubeflow-archives(pvc):/archives",
  "resource_memory":"8G",
  "resource_cpu": "4"
}

基础镜像和封装方法参考

配置/调试/定时运行pipeline

创建pipeline

路径:训练->任务流->新建

image

主要配置: 参考每个配置参数的描述

编排pipeline

image

  • task公共参数参考每个配置的描述
  • task的模板参数参考每个模板的链接教程文档

运行调试

task运行调试

使用task的run按钮和log按钮可单独调试一个task

image

pipeline运行调试

pipeline的运行按钮发起调度

image

pipeline日志效果

image

pod查看示意图

image

pod效果

image

实例记录

image

调度实例记录。停止可以清除调度容器

image

定时调度

配置定时pipeline编辑界面

167874734-5b1629e0-c3bb-41b0-871d-ffa43d914066

查看路径:训练-定时调度记录

image

字段说明执行时间为这个pipeline本次调度该发起的时间点
状态comed为调度配置已经产生。created为调度已经发起。

操作说明
1、平台会根据pipeline的配置决定是否发起调度。
2、状态链接中可以看到本地调度发起的workflow的运行情况
3、日志链接中可以看到本地调度发起的日志

nni超参搜索

可以参考nni官网的书写方式

超参空间

必须是标准的json。示例

{
    "batch_size": {"_type":"choice", "_value": [16, 32, 64, 128]},
    "hidden_size":{"_type":"choice","_value":[128, 256, 512, 1024]},
    "lr":{"_type":"choice","_value":[0.0001, 0.001, 0.01, 0.1]},
    "momentum":{"_type":"uniform","_value":[0, 1]}
}

不同超参算法支持不同的超参空间

choice choice(nested) randint uniform quniform loguniform qloguniform normal qnormal lognormal qlognormal
TPE Tuner
Random Search Tuner
Anneal Tuner
Evolution Tuner
SMAC Tuner
Batch Tuner
Grid Search Tuner
Hyperband Advisor
Metis Tuner
GP Tuner

代码要求

参数接收

启动超参搜索会根据用户配置的超参搜索算法选择好超参的可选值并将选择值传递给用户的容器。例如上面的超参定义会在用户docker运行时传递下面的参数。所以用户不需要在启动命令或参数中添加这些变量系统会自动添加用户只需要在自己的业务代码中接收这些参数并根据这些参数输出值就可以了。

--lr=0.021593113434583065 --num-layers=5 --optimizer=ftrl

结果上报

业务方容器和代码启动接收超参进行迭代计算,通过主动上报结果来进行迭代。 示例如下用户代码需要能接受超参可取值为输入参数同时每次迭代通过nni.report_intermediate_result上报每次epoch的结果值并使用nni.report_final_result上报每次实例的结果值。

import os
import argparse
import logging,random,time
import nni
from nni.utils import merge_parameter

logger = logging.getLogger('mnist_AutoML')

def main(args):
    test_acc=random.randint(30,50)
    for epoch in range(1, 11):
        test_acc_epoch= random.randint(3,5)
        time.sleep(3)
        test_acc+=test_acc_epoch
        # 上报当前迭代目标值
        nni.report_intermediate_result(test_acc)
    # 上报最总目标值
    nni.report_final_result(test_acc)


def get_params():
    # 必须接收超参数为输入参数
    parser = argparse.ArgumentParser(description='PyTorch MNIST Example')
    parser.add_argument('--batch_size', type=int, default=64, help='input batch size for training (default: 64)')

    args, _ = parser.parse_known_args()
    return args


if __name__ == '__main__':
    try:
        # get parameters form tuner
        tuner_params = nni.get_next_parameter()
        params = vars(merge_parameter(get_params(), tuner_params))
        print(tuner_params,params)
        main(params)
    except Exception as exception:
        logger.exception(exception)
        raise

web发起一个搜索实验

image

web查看搜索效果

可以参考:https://nni.readthedocs.io/zh/stable/Tutorial/WebUI.html

总览界面可以看到实验的id和当前示例运行的状态

image

image

可以看每次trial的运行情况计算出来的目标值

image

也可以看某次trial中每次epoch得到的结果值

内部服务

普通服务

开发注册

1、开发你的服务化镜像push到docker仓库内

2、注册你的服务

image

mysql web服务

镜像ccr.ccs.tencentyun.com/cube-studio/phpmyadmin

环境变量:

PMA_HOST=xx.xx.xx.xx
PMA_PORT=xx
PMA_USER=xx
PMA_PASSWORD=xx

端口80

mongo web服务

镜像mongo-express:0.54.0

环境变量:

ME_CONFIG_MONGODB_SERVER=xx.xx.xx.xx
ME_CONFIG_MONGODB_PORT=xx
ME_CONFIG_MONGODB_ENABLE_ADMIN=true
ME_CONFIG_MONGODB_ADMINUSERNAME=xx
ME_CONFIG_MONGODB_ADMINPASSWORD=xx
ME_CONFIG_MONGODB_AUTH_DATABASE=xx
VCAP_APP_HOST=0.0.0.0
VCAP_APP_PORT=8081
ME_CONFIG_OPTIONS_EDITORTHEME=ambiance

端口8081

redis web

镜像ccr.ccs.tencentyun.com/cube-studio/patrikx3:latest

环境变量

REDIS_NAME=xx
REDIS_HOST=xx
REDIS_PORT=xx
REDIS_PASSWORD=xx

端口7843

图数据库neo4j

镜像ccr.ccs.tencentyun.com/cube-studio/neo4j:4.4

环境变量

NEO4J_AUTH=neo4j/admin

端口7474,7687

jaeger链路追踪

镜像jaegertracing/all-in-one:1.29

端口5775,16686

服务暴露:

  • 1、域名暴露需要平台配置泛域名SERVICE_DOMAIN
  • 2、ip暴露需要平台配置SERVICE_EXTERNAL_IP=[xx.xx.xx.xx]或者项目中配置SERVICE_EXTERNAL_IP=xx.xx.xx.xx ip需为集群中节点的ip或者clb的ip

推理服务

版本/域名/pod的关系

$服务名=$服务类型-$模型名-$模型版本(只取版本中的数字)

image

$k8s-deploymnet-name=$服务名

image

$k8s-hpa-name=$服务名

在最大最小副本数不一致时创建hpa

image

$k8s-service-name=$服务名 用于域名的代理

$k8s-service-name=$服务名-external 用户ip/L5的代理

image

系统自带域名

自动配置域名需要泛域名支持。例如泛域名为domain = *.woa.com

生产域名

http://$服务名.service.$domain

测试环境域名

http://test.$服务名.service.$domain
http://debug.$服务名.service.$domain

自定义域名

用户可通过host字段配置服务的访问域名但是必须与泛域名结尾

多个服务可以配置相同的域名

流量复制和分流

多个服务(可以是相同模型或者不同模型间)配置相同的域名
1、分流属性字段控制分配多少流量到其他服务上剩余流量归属于当前服务
2、流量镜像字段控制复制多少流量到其他服务上。但只会将当前服务的响应返回给客户端

image

灰度升级

1、同一个服务灰度升级只需要修改服务的配置重新部署服务会自动滚动升级pod
2、不同服务进行灰度升级。比如同一个模型的不同版本之间那么多个服务使用相同的域名新部署的服务上线正常后会自动下线同域名的旧服务。

弹性伸缩容

弹性伸缩容的触发条件可以使用自定义指标可以使用其中一个指标或者多个指标示例cpu:50%,mem:%50,gpu:50%

环境变量

系统携带的环境变量

KUBEFLOW_ENV=test
KUBEFLOW_MODEL_PATH=
KUBEFLOW_MODEL_VERSION=
KUBEFLOW_MODEL_IMAGES=
KUBEFLOW_MODEL_NAME=
KUBEFLOW_AREA=shanghai/guangzhou

K8S_NODE_NAME=
K8S_POD_NAMESPACE=
K8S_POD_IP=
K8S_HOST_IP=
K8S_POD_NAME=

服务暴露:

  • 1、域名暴露需要平台配置泛域名SERVICE_DOMAIN
  • 2、ip暴露需要平台配置SERVICE_EXTERNAL_IP=[xx.xx.xx.xx]或者项目中配置SERVICE_EXTERNAL_IP=xx.xx.xx.xx ip需为集群中节点的ip或者clb的ip