-
Notifications
You must be signed in to change notification settings - Fork 816
新人用户使用指南
容器:对于建模人员,可以认为容器是一个轻量的虚拟机,一个机器可以同时启动多个容器,容器之间资源是隔离的。在平台上运行的任务,最终都会以容器内进程的形式运行在实体机上。所有容器的/mnt目录下都是自己的个人工作目录,容器重启后环境消失。
镜像:可以将容器整个操作系统的文件和目录打包成镜像,只需要解压打包好的容器镜像,容器就被重现出来了。所以我们可以用这种方式打包运行ml任务的复杂环境。
任务模板:当我们要在平台例行化运行一个ml任务(例如xgb分类),可以先定义好这个任务用到的镜像,需要什么参数,分配多少资源等信息,形成一个任务模板。以后使用的时候只需选择模板并填写相应参数即可。
任务流(pipeline): 多个任务及其依赖关系形成的DAG图。任务的构建产物可以在任务间传递。
运行实例:任务流的一次运行。
notebook:开启一个jupyter-notebook,自动挂载个人工作目录。有jupyter、vscode两种模式
cube studio可以自己注册新的账号,也可以对接公司现有的OA系统,具备统一的账号管理和对接体系。
路径:项目空间->项目分组,oa联系creator将自己加入到项目组中

备注:
- 每个人自动都在public项目组中
- 可自行创建项目组
路径:项目空间->某个项目分组->更多->组成员->添加组成员。creator角色的组成员可以添加其他用户进组
平台支持跨集群调度。需要管理员创建集群并配置到系统配置后,可在“添加项目分组”的“扩展”字段控制项目组的调度集群,即设置“扩展”为
{
"cluster": "dev"
}
如下图所示,后面的配置同理,只是修改这个json字段。

平台支持单集群中划分资源组。需要管理员配置不同机器所属的资源组后,可在“添加项目分组”的“扩展”字段控制项目组的调度机器。
调度机器可以是不同项目组,不同机型,不同区域等划分方式,比如下面我们控制调度机器属于pulic项目组,我们配置为
{
"org": "public"
}
平台支持单集群中划分挂载。可以配置项目组下成员将自有分布式存储挂载到平台,以及项目组内共享目录等功能,可通过项目组的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"
}
平台支持单集群中划分服务的代理ip,多用于边缘集群,或多网关情况下。可通过项目组的expand字段控制项目组的服务的代理ip.
{
"SERVICE_EXTERNAL_IP":"xx.xx.xx.xx"
}
- Jupyter (cpu/gpu)
- vscode(cpu/gpu)
- 代码开发/调试,上传/下载,命令行,git工蜂/github,内网/外网,tensorboard,自主安装插件
路径:在线开发->notebook->添加

备注:
- Running状态下,方可进入
- 无法进去时,reset重新激活
- notebook会自动挂载一下目录
- a)个人工作目录到容器 /mnt/$username
- b)个人归档目录到容器/archives/$username


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


扩展字段高级配置:
{
"volume_mount":"kubeflow-user-workspace(pvc):/mnt,kubeflow-archives(pvc):/archives",
"resource_memory":"8G",
"resource_cpu": "4"
}路径:训练->任务流->新建

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

- task公共参数:参考每个配置的描述
- task的模板参数:参考每个模板的链接教程文档
使用task的run按钮和log按钮可单独调试一个task

pipeline的运行按钮发起调度



pod效果:


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

配置定时:pipeline编辑界面
查看路径:训练-定时调度记录

字段说明:执行时间为这个pipeline本次调度该发起的时间点
状态:comed,为调度配置已经产生。created为调度已经发起。
1、平台会根据pipeline的配置决定是否发起调度。
2、状态链接中可以看到本地调度发起的workflow的运行情况
3、日志链接中可以看到本地调度发起的日志
可以参考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

可以参考:https://nni.readthedocs.io/zh/stable/Tutorial/WebUI.html
总览界面可以看到实验的id,和当前示例运行的状态


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

也可以看某次trial中每次epoch得到的结果值
1、开发你的服务化镜像,push到docker仓库内
2、注册你的服务

镜像:ccr.ccs.tencentyun.com/cube-studio/phpmyadmin
环境变量:
PMA_HOST=xx.xx.xx.xx
PMA_PORT=xx
PMA_USER=xx
PMA_PASSWORD=xx
端口:80
镜像: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
镜像:ccr.ccs.tencentyun.com/cube-studio/patrikx3:latest
环境变量
REDIS_NAME=xx
REDIS_HOST=xx
REDIS_PORT=xx
REDIS_PASSWORD=xx
端口:7843
镜像:ccr.ccs.tencentyun.com/cube-studio/neo4j:4.4
环境变量
NEO4J_AUTH=neo4j/admin
端口:7474,7687
镜像: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
$服务名=$服务类型-$模型名-$模型版本(只取版本中的数字)

$k8s-deploymnet-name=$服务名

$k8s-hpa-name=$服务名
在最大最小副本数不一致时创建hpa

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

自动配置域名需要泛域名支持。例如泛域名为domain = *.kfserving.woa.com
生产域名
http://$服务名.service.$domain
测试环境域名
http://test.$服务名.service.$domain
http://debug.$服务名.service.$domain
用户可通过host字段配置服务的访问域名,但是必须与泛域名结尾
多个服务可以配置相同的域名
多个服务(可以是相同模型或者不同模型间)配置相同的域名
1、分流属性字段控制分配多少流量到其他服务上,剩余流量归属于当前服务
2、流量镜像字段控制复制多少流量到其他服务上。但只会将当前服务的响应返回给客户端

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