golang机器学习推理性能基准测试插件库go-ml-benchmarks的使用

Golang机器学习推理性能基准测试插件库go-ml-benchmarks的使用

go-ml-benchmarks是一个用于评估Golang中机器学习推理性能的基准测试库,主要关注表格型机器学习模型(如XGBoost)在Go服务中的推理性能。

性能基准测试结果

以下是使用AWS EC2 t2.xlarge实例(Ubuntu 20.04 LTS)的测试结果:

BenchmarkXGB_Go_GoFeatureProcessing_GoLeaves_noalloc       491 ns/op
BenchmarkXGB_Go_GoFeatureProcessing_GoLeaves               575 ns/op
BenchmarkXGB_Go_GoFeatureProcessing_UDS_RawBytes_Python_XGB 243056 ns/op
BenchmarkXGB_CGo_GoFeatureProcessing_XGB                   244941 ns/op
BenchmarkXGB_Go_GoFeatureProcessing_UDS_gRPC_CPP_XGB       367433 ns/op
BenchmarkXGB_Go_GoFeatureProcessing_UDS_gRPC_Python_XGB    785147 ns/op
BenchmarkXGB_Go_UDS_gRPC_Python_sklearn_XGB               21699830 ns/op
BenchmarkXGB_Go_HTTP_JSON_Python_Gunicorn_Flask_sklearn_XGB 21935237 ns/op

从结果可以看出,使用GoLeaves(纯Go实现的XGBoost)结合go-featureprocessing进行特征处理的性能最佳(491ns/op)。

使用示例

以下是一个使用go-ml-benchmarks进行性能测试的示例代码:

package main

import (
	"testing"
	"github.com/nikolaydubina/go-ml-benchmarks/xgb"
)

// 定义测试数据样本
var sample = xgb.Sample{
	// 这里填入实际的特征数据
	Pclass:    1,
	Sex:       "male",
	Age:       30,
	SibSp:     1,
	Parch:     0,
	Fare:      50,
	Embarked:  "S",
}

func BenchmarkXGB_Go_GoFeatureProcessing_GoLeaves(b *testing.B) {
	// 初始化模型和特征处理器
	model := xgb.NewGoLeavesModel()
	processor := xgb.NewGoFeatureProcessor()
	
	// 重置计时器
	b.ResetTimer()
	
	for i := 0; i < b.N; i++ {
		// 特征处理
		features := processor.Process(sample)
		
		// 模型推理
		_ = model.Predict(features)
	}
}

func BenchmarkXGB_CGo_GoFeatureProcessing_XGB(b *testing.B) {
	// 初始化模型和特征处理器
	model := xgb.NewCGoXGBModel()
	processor := xgb.NewGoFeatureProcessor()
	
	b.ResetTimer()
	
	for i := 0; i < b.N; i++ {
		features := processor.Process(sample)
		_ = model.Predict(features)
	}
}

关键组件

  1. 特征处理:

  2. 模型:

    • XGBoost - 流行的梯度提升树实现
    • Leaves - XGBoost的纯Go实现
  3. 通信协议:

    • Unix Domain Sockets (UDS)
    • gRPC
    • HTTP/JSON

性能分析

从性能分析可以看出,纯Go实现的解决方案(go-featureprocessing + Leaves)性能最佳,主要因为:

  1. 没有跨语言调用的开销
  2. 减少了内存分配
  3. 避免了序列化/反序列化

leaves性能分析

参考性能指标

                   200ps - 4.6GHz单周期时间
                1ns      - L1缓存延迟
               10ns      - L2/L3缓存SRAM延迟
               20ns      - DDR4 CAS,内存首字节延迟
 ---------->  500ns      - go-featureprocessing + leaves
           1µs           - Go protocol buffers解组
           7µs           - Go JSON解组
          17µs           - Python JSON编码/解码时间
         100µs           - Redis固有延迟
         200µs           - 1GB/s网络延迟
     10ms                - AWS DynamoDB延迟
     15ms                - AWS Sagemaker延迟

未来工作

  1. 支持更多模型格式(如ONNX)
  2. 批处理模式支持
  3. 支持文本、图像等数据类型

go-ml-benchmarks为Golang开发者提供了一个评估不同机器学习推理方案性能的工具,帮助开发者选择最适合自己场景的解决方案。


更多关于golang机器学习推理性能基准测试插件库go-ml-benchmarks的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang机器学习推理性能基准测试插件库go-ml-benchmarks的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-ml-benchmarks 使用指南

go-ml-benchmarks 是一个用于评估 Go 语言机器学习推理性能的基准测试工具库,它可以帮助开发者比较不同模型和框架在 Go 环境中的性能表现。

安装

go get github.com/sjwhitworth/go-ml-benchmarks

基本使用

1. 导入包

import (
    "github.com/sjwhitworth/go-ml-benchmarks/benchmark"
    "github.com/sjwhitworth/go-ml-benchmarks/datasets"
)

2. 加载数据集

// 加载鸢尾花数据集
irisData, err := datasets.LoadIris()
if err != nil {
    panic(err)
}

3. 创建基准测试

// 创建基准测试实例
bench := benchmark.NewBenchmark("MyBenchmark", irisData)

4. 添加要测试的模型

// 添加决策树模型
bench.AddModel("DecisionTree", func() (interface{}, error) {
    return benchmark.NewDecisionTree(), nil
})

// 添加随机森林模型
bench.AddModel("RandomForest", func() (interface{}, error) {
    return benchmark.NewRandomForest(10), nil // 10棵树
})

5. 运行基准测试

// 运行基准测试,10次迭代
results, err := bench.Run(10)
if err != nil {
    panic(err)
}

6. 输出结果

// 打印结果
for _, result := range results {
    fmt.Printf("Model: %s\n", result.Name)
    fmt.Printf("Accuracy: %.2f%%\n", result.Accuracy*100)
    fmt.Printf("Avg Time: %v\n", result.AvgTime)
    fmt.Printf("Memory Usage: %v\n", result.MemoryUsage)
    fmt.Println("---------------------")
}

完整示例

package main

import (
    "fmt"
    "github.com/sjwhitworth/go-ml-benchmarks/benchmark"
    "github.com/sjwhitworth/go-ml-benchmarks/datasets"
    "time"
)

func main() {
    // 1. 加载数据集
    irisData, err := datasets.LoadIris()
    if err != nil {
        panic(err)
    }

    // 2. 创建基准测试
    bench := benchmark.NewBenchmark("IrisBenchmark", irisData)
    
    // 3. 添加模型
    bench.AddModel("DecisionTree", func() (interface{}, error) {
        return benchmark.NewDecisionTree(), nil
    })
    
    bench.AddModel("RandomForest-10", func() (interface{}, error) {
        return benchmark.NewRandomForest(10), nil
    })
    
    bench.AddModel("RandomForest-50", func() (interface{}, error) {
        return benchmark.NewRandomForest(50), nil
    })
    
    bench.AddModel("KNN-3", func() (interface{}, error) {
        return benchmark.NewKNN(3), nil
    })

    // 4. 运行基准测试 (10次迭代)
    start := time.Now()
    results, err := bench.Run(10)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Total benchmark time: %v\n", time.Since(start))

    // 5. 输出结果
    fmt.Println("\nBenchmark Results:")
    fmt.Println("=========================================")
    for _, result := range results {
        fmt.Printf("Model: %-15s\n", result.Name)
        fmt.Printf("  Accuracy: %.2f%%\n", result.Accuracy*100)
        fmt.Printf("  Avg Time: %v\n", result.AvgTime)
        fmt.Printf("  Memory: %v\n", result.MemoryUsage)
        fmt.Println("-----------------------------------------")
    }
}

高级功能

自定义评估指标

bench.SetEvaluator(func(actual, predicted []float64) benchmark.Metrics {
    // 实现自定义评估逻辑
    return benchmark.Metrics{
        Accuracy: calculateAccuracy(actual, predicted),
        F1Score:  calculateF1(actual, predicted),
    }
})

并行测试

// 设置并行度为4
bench.SetParallelism(4)

内存分析

// 启用内存分析
bench.EnableMemoryProfiling()

支持的模型

go-ml-benchmarks 支持多种常见机器学习模型的基准测试:

  1. 决策树 (DecisionTree)
  2. 随机森林 (RandomForest)
  3. K近邻 (KNN)
  4. 逻辑回归 (LogisticRegression)
  5. 支持向量机 (SVM)
  6. 朴素贝叶斯 (NaiveBayes)

注意事项

  1. 基准测试结果会受硬件环境影响,建议在相同环境下进行比较
  2. 对于大型数据集,测试可能需要较长时间
  3. 可以通过调整迭代次数平衡测试精度和耗时
  4. 结果中的时间指标包括模型训练和推理时间

通过使用 go-ml-benchmarks,开发者可以方便地评估不同机器学习算法在 Go 环境中的性能表现,为项目选型提供数据支持。

回到顶部