Golang微服务接入Xgboost模型的经验

在线预测平台包括几个部分:

  1. 特征获取
  2. 特征变换
  3. 模型服务

可使用的Github项目(二选一),我使用的leaves

  1. https://github.com/Unity-Technologies/go-xgboost star:42
  2. https://github.com/dmitryikh/leaves star:204

模型加载方式

  1. 冷加载,服务启动的时候加载
    1. 优点是开发简单快捷
    2. 缺点是新增模型需要发版,扩展性不足,只能单个项目使用
  2. 热加载,使用公共盘方式,请求的时候加载模型
    1. 优点:无需发版,方便扩展
    2. 缺点:需要单独开发一个模型调用服务来管理模型

实际开发中遇到的问题

  1. 模型复杂的时候,加载会出现超时现象(首页到模型服务这边只有50ms)。走个协程去加载模型
  2. 模型管理的问题,日志报错的管理

leaves的使用(冷加载方式)

package main

import (
	"fmt"

	"github.com/dmitryikh/leaves"
)

func main() {
	// 1. Read model
	useTransformation := true
	model, err := leaves.XGEnsembleFromFile("xgboost_model.txt", useTransformation)
	if err != nil {
		panic(err)
	}

	// 2. Do predictions!
	fvals := []float64{1.0, 2.0, 3.0}
	p := model.PredictSingle(fvals, 0)
	fmt.Printf("Prediction for %v: %f\n", fvals, p)
}

 

leaves的使用(热加载方式)

package main

import (
	"fmt"

	"github.com/dmitryikh/leaves"
)

var m sync.Map

func main() {
    
    model_id = "xgboost_model"

    v,ok = m.Load(model_id)
	if !ok{
		// 1. Read model
	    useTransformation := true
	    model, err := leaves.XGEnsembleFromFile(model_id  + ".txt", useTransformation)
	    if err != nil {
	    	panic(err)
	    }
        m.store(model_id, model)
	}


	// 2. Do predictions!
	fvals := []float64{1.0, 2.0, 3.0}
	p := model.PredictSingle(fvals, 0)
	fmt.Printf("Prediction for %v: %f\n", fvals, p)
}

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页