Kubeflow实战: 入门介绍与部署实践
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等的使用,感谢关注。
- 学习笔记CB001:NLTK库、语料库、词概率、双连词、词典
- 时序列数据库武斗大会之 OpenTSDB 篇
- 应当使用 SQLite 的五个原因
- Apache Spark作为编译器:深入介绍新的Tungsten执行引擎
- DC/OS 的安装与部署
- Go语言实践:从新手入门到上线真实的小型服务所遇到的那些坑
- 4个简单的数据管理技巧
- MongoDB的设计模式策略
- 如何用容器实现生产级Redis sharding集群一键交付
- Hadoop旧mapreduce的map任务切分原理
- 解读Neo4j全新的Python驱动程序
- MySQL 5.7 X Plugin:流水线技术vs.并行查询技术
- 在下函数式编程,有何贵干?
- 基于Keras/Python的深度学习模型Dropout正则项
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法