sklearn-porter
sklearn-porter 是一款专为机器学习开发者设计的实用工具,它能将训练好的 scikit-learn 模型自动“翻译”成 C、Java、JavaScript、Go、PHP 或 Ruby 等多种主流编程语言的代码。
在实际应用中,许多高性能场景(如嵌入式设备、移动端应用或对延迟极其敏感的关键系统)无法直接运行依赖庞大的 Python 环境。sklearn-porter 恰好解决了这一痛点:它让开发者无需手动重写复杂的算法逻辑,即可将 Python 中训练的模型无缝迁移到资源受限或非 Python 的生产环境中,同时确保预测结果的高度一致性与执行效率。
这款工具特别适合需要将原型快速落地的算法工程师、嵌入式开发人员以及追求极致性能的后端开发者。其核心亮点在于支持广泛的模型类型(包括支持向量机、决策树及随机森林等)与多种语言模板的灵活组合,部分模式还专门针对生产环境进行了优化。通过 sklearn-porter,你可以轻松打破语言壁垒,让机器学习模型在任何需要的地方高效运行。
使用场景
某工业物联网团队需要在资源受限的嵌入式网关上实时运行故障预测模型,以监测生产线电机状态。
没有 sklearn-porter 时
- 环境依赖沉重:网关必须安装完整的 Python 解释器和 scikit-learn 库,导致固件体积庞大,启动缓慢。
- 推理延迟过高:Python 的动态特性在低主频 CPU 上执行效率低下,无法满足毫秒级的实时报警需求。
- 部署维护困难:嵌入式系统缺乏完善的包管理工具,更新模型版本往往需要重刷整个系统镜像,风险极高。
- 语言生态隔离:底层控制逻辑由 C/Java 编写,调用 Python 模型需通过复杂的进程间通信或 API,增加了系统不稳定性。
使用 sklearn-porter 后
- 原生代码集成:直接将训练好的决策树或 SVM 模型转译为纯 C 或 Java 代码,无需任何外部依赖即可编译进固件。
- 极致运行性能:生成的代码利用编译器优化,在嵌入式芯片上的推理速度提升数十倍,轻松实现实时响应。
- 轻量级部署:模型逻辑变为普通源代码文件,更新算法只需替换单个文件并重新编译,极大降低了运维成本。
- 无缝系统融合:预测逻辑直接嵌入现有的 C/C++ 或 Java 控制流中,消除了跨语言调用的开销与复杂性。
sklearn-porter 成功打破了数据科学原型与高性能生产环境之间的壁垒,让复杂的机器学习模型能在最苛刻的硬件边缘高效落地。
运行环境要求
不需要 GPU
未说明

快速开始
sklearn-porter
将训练好的 scikit-learn 估计器转译为 C、Java、JavaScript 等语言。
推荐用于资源受限的嵌入式系统以及对性能要求极高的关键应用。
导航: 估计器 • 安装 • 使用 • 已知问题 • 开发 • 引用 • 许可证
估算器
此表格概述了所有受支持的估算器、编程语言和模板的组合。
| 编程语言 | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| C | Go | Java | JS | PHP | Ruby | |||||||||||||
| svm.SVC | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | |
| svm.NuSVC | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | |
| svm.LinearSVC | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | |
| tree.DecisionTreeClassifier | ✓ᴾ | ✓ᴾ | ✓ᴾ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| ensemble.RandomForestClassifier | × | ✓ | × | × | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | × | ||||||
| ensemble.ExtraTreesClassifier | × | ✓ | × | × | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | × | ||||||
| ensemble.AdaBoostClassifier | × | ✓ | × | ✓ | ✓ | ✓ | ||||||||||||
| neighbors.KNeighborsClassifier | ✓ | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | ✓ | ✓ | × | ||||||
| naive_bayes.BernoulliNB | ✓ | ✓ | × | ✓ | ✓ | × | ||||||||||||
| naive_bayes.GaussianNB | ✓✓×✓✓× | |||||||||||||||||
| neural_network.MLPClassifier | ✓✓×✓✓× | |||||||||||||||||
| neural_network.MLPRegressor | ✓✓× | |||||||||||||||||
| ᴀ | ᴇ | ᴄ | ᴀ | ᴇ | ᴄ | ᴀ | ᴇ | ᴄ | ᴀ | ᴇ | ᴄ | ᴀ | ᴇ | ᴄ | ᴀ | ᴇ | ᴄ | |
| 模板 | ||||||||||||||||||
✓ = 支持 predict, ᴾ = 支持 predict_proba, × = 不支持或不可行
ᴀ = 附带模型数据, ᴇ = 导出模型数据(JSON), ᴄ = 组合模型数据
安装
| 用途 | 版本 | 分支 | 构建状态 | 命令 |
|---|---|---|---|---|
| 生产环境 | v0.7.4 | stable | pip install sklearn-porter |
|
| 开发环境 | v1.0.0 | main | pip install https://github.com/nok/sklearn-porter/zipball/main |
在两种环境下,唯一的先决条件是 scikit-learn >= 0.17, <= 0.22。
使用方法
Binder
基础用法
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn_porter import port, save, make, test
# 1. 加载数据并训练一个示例分类器:
X, y = load_iris(return_X_y=True)
clf = DecisionTreeClassifier()
clf.fit(X, y)
# 2. 导出或转译模型:
output = port(clf, language='js', template='attached')
print(output)
# 3. 保存导出的模型:
src_path, json_path = save(clf, language='js', template='exported', directory='/tmp')
print(src_path, json_path)
# 4. 使用导出的模型进行预测:
y_classes, y_probas = make(clf, X[:10], language='js', template='exported')
print(y_classes, y_probas)
# 5. 始终通过完整性检查来测试导出的模型:
score = test(clf, X[:10], language='js', template='exported')
print(score)
面向对象编程
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn_porter import Estimator
# 1. 加载数据并训练一个示例分类器:
X, y = load_iris(return_X_y=True)
clf = DecisionTreeClassifier()
clf.fit(X, y)
# 2. 导出或转译模型:
est = Estimator(clf, language='js', template='attached')
output = est.port()
print(output)
# 3. 保存导出的模型:
est.template = 'exported'
src_path, json_path = est.save(directory='/tmp')
print(src_path, json_path)
# 4. 使用导出的模型进行预测:
y_classes, y_probas = est.make(X[:10])
print(y_classes, y_probas)
# 5. 始终通过完整性检查来测试导出的模型:
score = est.test(X[:10])
print(score)
命令行工具
此外,您还可以在命令行中使用 sklearn-porter。安装完成后即可使用 porter 命令。
porter {show,port,save} [-h] [-v]
porter show [-l {c,go,java,js,php,ruby}] [-h]
porter port <estimator> [-l {c,go,java,js,php,ruby}]
[-t {attached,combined,exported}]
[--skip-warnings] [-h]
porter save <estimator> [-l {c,go,java,js,php,ruby}]
[-t {attached,combined,exported}]
[--directory DIRECTORY]
[--skip-warnings] [-h]
您可以序列化一个模型并将其本地保存。有关更多详细信息,请参阅 模型持久化 的说明。
from joblib import dump
dump(clf, 'estimator.joblib', compress=0)
之后,可以使用子命令 port 将模型转译:
porter port estimator.joblib -l js -t attached > estimator.js
为进一步处理,您可以将结果传递给其他应用程序,例如 UglifyJS。
porter port estimator.joblib -l js -t attached | uglifyjs --compress -o estimator.min.js
已知问题
- 在某些罕见情况下,支持向量机的回归测试,即 SVC 和 NuSVC,由于
scikit-learn>=0.22而会失败。因此会引发QualityWarning警告,提醒您使用test方法评估结果。
开发
别名
以下命令可在日常开发中节省时间:
# 使用 conda 安装 Python 环境:
make setup
# 启动包含示例的 Jupyter 笔记本:
make notebook
# 在主机或独立的 Docker 容器中运行测试:
make tests
make tests-docker
# 使用 pylint 检查源代码:
make lint
# 使用 jupytext 生成笔记本:
make examples
# 使用 twine 部署新版本:
make deploy
依赖项
先决条件是 Python 3.6,您可以通过 conda 安装:
conda env create -n sklearn-porter_3.6 python=3.6
conda activate sklearn-porter_3.6
之后,您需要安装所有必需的包:
pip install --no-cache-dir -e ".[development,examples]"
环境
所有测试均在以下 scikit-learn 和 Python 版本的组合上运行:
| Python | |||||
| 3.5 | 3.6 | 3.7 | 3.8 | ||
| scikit-learn | 0.17 | cython 0.27.3 | cython 0.27.3 | scikit-learn 不支持 | scikit-learn 不支持 |
| numpy 1.9.3 | numpy 1.9.3 | ||||
| scipy 0.16.0 | scipy 0.16.0 | ||||
| 0.18 | cython 0.27.3 | cython 0.27.3 | scikit-learn 不支持 | scikit-learn 不支持 | |
| numpy 1.9.3 | numpy 1.9.3 | ||||
| scipy 0.16.0 | scipy 0.16.0 | ||||
| 0.19 | cython 0.27.3 | cython 0.27.3 | scikit-learn 不支持 | scikit-learn 不支持 | |
| numpy 1.14.5 | numpy 1.14.5 | ||||
| scipy 1.1.0 | scipy 1.1.0 | ||||
| 0.20 | cython 0.27.3 | cython 0.27.3 | cython 0.27.3 | joblib 不支持 | |
| numpy | numpy | numpy | |||
| scipy | scipy | scipy | |||
| 0.21 | cython | cython | cython | cython | |
| numpy | numpy | numpy | numpy | ||
| scipy | scipy | scipy | scipy | ||
| 0.22 | cython | cython | cython | cython | |
| numpy | numpy | numpy | numpy | ||
| scipy | scipy | scipy | scipy | ||
对于回归测试,我们必须使用特定的编译器和解释器:
| 名称 | 来源 | 版本 |
|---|---|---|
| GCC | https://gcc.gnu.org | 10.2.1 |
| Go | https://golang.org | 1.15.15 |
| Java (OpenJDK) | https://openjdk.java.net | 1.8.0 |
| Node.js | https://nodejs.org | 12.22.5 |
| PHP | https://www.php.net | 7.4.28 |
| Ruby | https://www.ruby-lang.org | 2.7.4 |
请注意,通常情况下,您可以使用较旧的编译器和解释器来处理生成的源代码。例如,您可以使用 Java 1.6 来编译和运行模型。
日志记录
您可以通过更改 logging.level 选项来启用日志记录。
from sklearn_porter import options
from logging import DEBUG
options['logging.level'] = DEBUG
测试
您可以在本地机器(主机)或单独运行的 Docker 容器中运行单元测试和回归测试。
pytest tests -v \
--cov=sklearn_porter \
--disable-warnings \
--numprocesses=auto \
-p no:doctest \
-o python_files="EstimatorTest.py" \
-o python_functions="test_*"
docker build \
-t sklearn-porter \
--build-arg PYTHON_VER=${PYTHON_VER:-python=3.6} \
--build-arg SKLEARN_VER=${SKLEARN_VER:-scikit-learn=0.21} \
.
docker run \
-v $(pwd):/home/abc/repo \
--detach \
--entrypoint=/bin/bash \
--name test \
-t sklearn-porter
docker exec -it test ./docker-entrypoint.sh \
pytest tests -v \
--cov=sklearn_porter \
--disable-warnings \
--numprocesses=auto \
-p no:doctest \
-o python_files="EstimatorTest.py" \
-o python_functions="test_*"
docker rm -f $(docker ps --all --filter name=test -q)
引用
如果您在工作中使用了此实现,请添加对该论文的引用。您可以使用以下 BibTeX 条目:
@unpublished{sklearn_porter,
author = {Darius Morawiec},
title = {sklearn-porter},
note = {将训练好的 scikit-learn 估计器转译为 C、Java、JavaScript 等},
url = {https://github.com/nok/sklearn-porter}
}
许可证
该软件包是根据 BSD 3-Clause 许可证发布的开源软件。
版本历史
v0.7.22019/01/20v0.6.22018/02/03v0.6.12018/01/03v0.6.02017/12/04v0.5.22017/08/26v0.5.12017/08/26v0.5.02017/05/26v0.4.12017/04/16v0.4.02017/03/24v0.3.22017/01/29v0.3.12017/01/28v0.3.02017/01/08v0.2.12016/12/10v0.2.02016/11/18v0.1.02016/11/07常见问题
相似工具推荐
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
NextChat
NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。