Kubeflow实战: 入门介绍与部署实践

2020-08-08

更多内容关注专辑:
机器学习实战

1 介绍

Kubeflow是在k8s平台之上针对机器学习的开发、训练、优化、部署、管理的工具集合,内部集成的方式融合机器学习中的很多领域的开源项目,比如Jupyter、tfserving、Katib、Fairing、Argo等。可以针对机器学习的不同阶段:数据预处理、模型训练、模型预测、服务管理等进行管理。只要安装了k8s,可以在本地、机房、云环境中部署。

2 开发工具集

机器学习的目标最终还是为了在生产环境或者业务场景中使用,但这个过程却是很复杂的,需要进行数据加载、切分、预处理、特征工程、模型训练、验证、超参数调优、模型部署等等;为了正常使用模型,还需要在模型上线后,持续不断的输入数据才能得到预测的结果。

人工构建整个过程并进行维护是很复杂的,使用Kubeflow可以节省很多成本。比如在构建模型时,可以选择你喜欢的算法框架进行模型开发,试验阶段可以通过Jupyter进行交互式的编程,基于Pipeline构建整个训练过程的工作流实现各种处理逻辑,基于Katib进行超参数的自动优化;生产环境中,可以使用TFJob等进行分布式训练,基于KFServing等进行在线模型的服务,基于Metadata或TensorBoard进行模型的监控。

3 使用场景

扩展性:Kf基于k8s可以达到可扩展、可移植、分布式ML平台, 通过Kf你可以轻松管理整个AI生命周期,比如在模型部署的时候自动进行扩容、在试验阶段自由创建笔记本。由于底层基于K8s来提供一致性与高可靠,使用者可以更聚焦于上层的算法模型设计,而不用过多的关注底层构建。

迭代性:构建高质量的机器学习模型可能需要快速的迭代,Kf提供友好的UI界面支持快速追踪对比实验结果,你可以很方便的决定哪个模型训练效果更好。Kf内部提供Jupyter笔记本,支持如Tensorflow、Pytorch等流行的深度学习框架。模型训练配置简单,方便进行分布式训练、部署,提升端到端的开发过程。

混合性:机器学习模型的训练可能涉及多个团队、多个集群和云环境的共享,Kf支持主流的云平台,提供各个环境之间的移植性。你可以在本地开发模型、在集群的GPU上进行训练、最后部署到云环境中,快速的开发模式和高效的部署使得整个过程就像单机操作一样。

超参调优:在模型训练中,超参数调优是很关键也很复杂的过程,对模型最终的准确度和性能有很大的影响,手动尝试各种超参数的组合非常浪费时间。Kf通过Katib来支持自动超参数优化,这种自动优化会节省大量的计算时间,提高模型优化的效率。

持续集成:Kf目前并没有这个方面成型的产品,但是可以通过Pipeline组件来实现。Pipeline支持创建可重复的工作流,可以自动触发整个工作流的重跑以及模型的训练。

4 部署

Kubeflow的部署其实很简单,主要是依赖的镜像大多出自Google因此会遇到很多网络问题。解决办法推荐是通过阿里云镜像手动下载docker镜像,然后tag成目标镜像;或者直接修改kustomize中的镜像地址。

安装时需要下载kfctl并按照文档配置环境变量,比如我试过Ubuntu 18,可以参考下面的文档:https://www.kubeflow.org/docs/started/k8s/kfctl-k8s-istio/,大致流程如下:

1 到地址中下载对应的kfctl,darwin为mac,linux为其他,不支持windows
https://github.com/kubeflow/kfctl/releases/tag/v1.0.2

2 压缩包解压缩
tar -xvf kfctl_v1.0.2_<platform>.tar.gz

3 配置环境变量 vi /etc/profile
export PATH=$PATH:"<path-to-kfctl>"
export KF_NAME=<自定义名称>
export BASE_DIR=<path to a base directory>
export KF_DIR=${BASE_DIR}/${KF_NAME}
export CONFIG_URI="https://raw.githubusercontent.com/kubeflow/manifests/v1.0-branch/kfdef/kfctl_k8s_istio.v1.0.2.yaml"

4 更新环境变量
source /etc/profile

5 执行命令
mkdir -p ${KF_DIR}
cd ${KF_DIR}
kfctl apply -V -f ${CONFIG_URI}

6 查看安装服务
kubectl -n kubeflow get all

整个安装过程很缓慢,尤其是前期需要安装cert-manager进行权限控制,需要等服务正常。

中间会有大量的镜像报错ImagePullBackOff,这表示镜像拉取失败。解决办法:

1 查看具体pod的详情
kubectl describe pod admission-webhook-bootstrap-stateful-set-0 -n kubeflow

2 去阿里云镜像站搜索镜像
docker pull registry.cn-hangzhou.aliyuncs.com/pigeonw/ingress-setup

3 重命名
sudo docker tag registry.cn-hangzhou.aliyuncs.com/pigeonw/ingress-setup:latest gcr.io/kubeflow-images-public/ingress-setup:latest

4 修改kustomize中的配置
cd ./kustomize/webhook/base
sudo vim deployment.yaml
修改镜像拉取策略
imagePullPolicy: IfNotPresent
原来如果是Always表示总是会去拉取远程镜像,IfNotPresent表示本地不存在时才会拉取

5 修改完成后等待一会,如果状态还没有变成Running,可以执行
kfctl apply -f kfctlxxx.yaml 重新创建

都部署成功后,大致可以看到如下的运行状态,仅供参考:


5 使用

部署成功后,通过端口映射可以支持在外部访问:

export NAMESPACE=istio-system
kubectl port-forward --address 0.0.0.0 -n ${NAMESPACE} svc/istio-ingressgateway 8080:80

然后访问目标地址即可,如localhost:8080,自定义namespace后可以看到如下画面:

后面将会分享Notebook、Pipeline、Katib等的使用,感谢关注。