XGBoost Operator源码分析
文章目录
1 Overview
分布式的 XGBoost 可以用 Spark 来跑,当然也支持用其他分布式的方法去跑,比如用 XGBoost Operator,可以很轻松的实现 XGBoost 算法的分布式执行。
2 Code
目前在 Kubeflow 的框架下去开发一个机器学习相关的 Operator 已经比较容易了,首先 kubebuilder 打造好 Operator 的框架,然后通过 Kubeflow 社区抽象的 common 包,在新的 Operator 下调整业务逻辑还是比较简单的。XGBoost Operator 也是在这样的背景下诞生的,所以可以看到其源码是相对 tf-operator 这些 Kubeflow 早起的项目,代码会更加简练清晰一点。
重点分析 XGBoost Operator 的 Reconcile
协调方法。
func (r *ReconcileXGBoostJob) Reconcile(request reconcile.Request) (reconcile.Result, error) {
// Fetch the XGBoostJob instance
xgboostjob := &v1alpha1.XGBoostJob{}
err := r.Get(context.Background(), request.NamespacedName, xgboostjob)
if err != nil {
if errors.IsNotFound(err) {
// Object not found, return. Created objects are automatically garbage collected.
// For additional cleanup logic use finalizers.
return reconcile.Result{}, nil
}
// Error reading the object - requeue the request.
return reconcile.Result{}, err
}
// Check reconcile is required.
needSync := r.satisfiedExpectations(xgboostjob)
if !needSync || xgboostjob.DeletionTimestamp != nil {
log.Info("reconcile cancelled, job does not need to do reconcile or has been deleted",
"sync", needSync, "deleted", xgboostjob.DeletionTimestamp != nil)
return reconcile.Result{}, nil
}
// Set default priorities for xgboost job
scheme.Scheme.Default(xgboostjob)
// Use common to reconcile the job related pod and service
err = r.xgbJobController.ReconcileJobs(xgboostjob, xgboostjob.Spec.XGBReplicaSpecs, xgboostjob.Status.JobStatus, &xgboostjob.Spec.RunPolicy)
if err != nil {
logrus.Warnf("Reconcile XGBoost Job error %v", err)
return reconcile.Result{}, err
}
return reconcile.Result{}, err
}
实际上,自定义资源对象 XGBoostJob 由 XGBoost Operator 的 Reconcile
方法来协调就可以了,因为这个方法的背后,是 Kubeflow 的 common 包,会统一再做 Pod/Service 的协调的,所以开发者只要专注自定义资源的协调就够了。
就这?对的,就是挺简单的。
3 Test
下面运行一个 XGBoost Opearator 提供的 Demo。
按照官方文档,build
镜像。
docker build -f Dockerfile -t kubeflow/xgboost-dist-rabit-test:1.2 ./
镜像里主要运行的代码是 xgboost_smoke_test.py
。
Master 正常运行的日志。
Worker 正常运行的日志。
这个 smoke test 仅仅是建立一个 rabit 拓扑并进行通信的简单例子,运行成功说明 XGBoost Operator 的部署也是成功的,因为 worker 之间以及与 master 通过 pod ip 是可以建立 tcp 连接的。
4 Summary
目前在 Kubeflow Common 包的框架下开发一个分布式的机器学习 Operator 还是比较方便的。
- 迪菲-赫尔曼密钥交换
- 分布式系统组件之配置中心
- github 提交报403 forbidden的错误解决
- Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架
- redis主从集群搭建及容灾部署(哨兵sentinel)
- 浅谈ASP.NET的Postback
- redis配置详解(中英文)
- 我所理解的Remoting(1):Marshaling & Activation[下篇]
- 5分钟短视频,带你走进日志易SPL,助你日志分析更容易
- Unity Application Block 1.2 for Silverlight - December 2008
- 算法学堂 - 二分查找及其变形
- Zookeeper权限管理与Quota管理
- 刘鹏:保大还是保小?无人汽车也将面临这样的道德窘境
- 浅谈DNS
- 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 数组属性和方法
- Pytorch实现卷积神经网络训练量化(QAT)
- VBA解压缩ZIP文件11——存在问题
- 算法集锦(14)|图像识别| 图像识别算法的罗夏测试
- CenterNet骨干网络之hourglass
- 语音识别中的声学特征提取:梅尔频率倒谱系数MFCC | 老炮儿改名PPLOVELL | 5th
- 基于Apriori的数据关联分析 | 工业数据分析 | 冰水数据智能专题 | 4th
- 基于FP树的频繁项挖掘 | 工业数据分析 | 冰水数据智能 | 5th
- ICCV2019 高通Data-Free Quantization论文解读
- VBA解压缩ZIP文件10——解压-动态Huffman
- 海思NNIE之PFPLD训练与量化
- [译] 用 Truffle 插件自动在Etherscan上验证合约代码
- 二层网络上的以太坊智能合约: Optimistic Rollup
- 基于决策树的工业数据分类——数据智能
- Kestrel的ListenAnyIP和ListenLocalhost的区别
- 【为宏正名】什么?我忘了去上“数学必修课”!