SQLFlow 自定义模型贡献新范式:从 Python 代码到 Model Zoo 的完整实战指南
人工智能机器学习后端编译器【免费下载链接】sqlflowBrings SQL and AI together.项目地址https://gitcode.com/gh_mirrors/sq/sqlflow点击查看免费下载SQLFlow 将 SQL 与机器学习结合在一起允许分析师通过TO TRAIN、TO PREDICT等扩展 SQL 语法直接调用由数据科学家用 Python 定义的模型。传统上模型贡献者需要掌握 Docker、Git 与工作流部署才能发布一个模型而本文要讲解的contribute models新方案则提出了一条全新的、极大简化的路径模型开发者只需用 Python 编写 Keras 模型通过 SQLFlow 高层 Python API 在本地完成训练验证与单元测试再用一行sqlflow release modeldef命令把模型发布到 Model Zoo供所有分析师共享使用。读完本文你将掌握如何用 Python 定义可被 SQLFlow 识别的模型、如何用sqlflow.init / sqlflow.train / sqlflow.evaluate在本地与多种数据库上验证模型、如何编写可复跑的单元测试以及发布/删除模型定义镜像的完整命令与底层原理。一、设计动机为什么需要一条全新的模型贡献路径SQLFlow 既有的模型贡献流程见 doc/contribute_models.md要求模型开发者在本地目录编写模型 Python 代码并手工编写Dockerfile且基础镜像必须是sqlflow/sqlflow启动 Docker 容器作为开发环境把模型目录挂载进容器并设置PYTHONPATH在 Jupyter Notebook 里通过%%sqlflow魔术命令反复调试最后手工docker build/docker push发布镜像再在 SQLFlow 语句中通过your-registry.com/your_group/model_image:v0.1/MyAwesomeClassifier这样的镜像前缀引用模型。这条路径对熟悉 Docker、Git 与 Kubernetes 工作流workflow mode的开发者是可行的但对只关心模型算法本身的研究者来说负担过重。设计文档 doc/design/contribute_models_comparison.md 中对比了 Docker、VM、Python API、原生模型等多种方案最终结论是应尽量让模型贡献者只关心模型代码本身——模型贡献者甚至可以完全不用关心模型能否与 SQLFlow 协同工作只需要以原生方式编写和测试它。本文所依托的设计文档 doc/design/contribute_models_new.md 正是这一思路的落地使用 SQLFlow 的 Python 高层 API 替代 Docker/Jupyter 调试链让模型开发、验证、测试与发布全部可以在纯 Python 环境中完成。二、环境准备安装 SQLFlow Python 绑定新方案的第一步非常简单——通过 pip 安装 SQLFlow 的 Python 绑定包pip install sqlflow安装完成后Python 进程中即可直接import sqlflow调用其高层 API 完成数据库连接、训练、评估等操作。该包是后续所有开发、验证与发布动作的基础依赖。三、用 Python 定义模型一个 Keras 类即是一个模型定义在新方案中一个深度学习模型定义就是一段普通的 Python 代码典型形态是一个继承自tf.keras.Model的 Keras 类。例如在some_model_definitions.py中import tensorflow as tf class MyAwesomeClassifier(tf.keras.Model): def __init__(self, ...): ...更完整的形态可以参考既有文档 doc/contribute_models.md 中的 Keras 子类模型示例__init__中可以定义feature_columns、hidden_units等任意参数这些参数可以在训练 SQL 语句中通过WITH 参数名值传入文件内还可以定义optimizer、loss、prepare_prediction_column等辅助函数分别用于指定默认优化器、默认损失函数以及预测输出的后处理方式。自定义训练循环的模型如果你需要精细控制训练过程而非使用 Keras 默认的训练逻辑可以在模型类中定义一个sqlflow_train_loop函数。注意此时模型类仍需继承tf.keras.ModelSQLFlow 才能识别其为自定义模型并调用该函数执行训练class MyAwesomeClassifier(tf.keras.Model): def __init__(self, feature_columnsNone): ... def sqlflow_train_loop(self, dataset, epochs1, verbose0): # 在这里实现自定义训练逻辑参数 dataset 是 tf.dataset 类型的输入数据 ...通过__init__.py暴露模型类为了让 SQLFlow以及后续的模型校验工具能够找到模型定义需要在包根目录的__init__.py中导出模型类from some_model_definitions import MyAwesomeClassifier四、用高层 Python API 测试与验证模型模型定义写好后要验证它能否与 SQLFlow 协同工作可以直接调用 SQLFlow 高层 API 在本地跑一次训练import sqlflow sqlflow.init(mysql://user:passlocalhost:3306) sqlflow.train( SELECT * FROM train_data_table, MyAwesomeClassifier, attrs{param1: value, param2: value2}, columns{column1: lambda(x): ..., column2: lambda(x): ...}, intotrained_model)各参数含义如下sqlflow.init(dsn)建立与底层数据库的连接参数为数据库连接串sqlflow.train(select, model, attrs..., columns..., into...)执行一次训练任务第一个参数是数据源 SQL 语句SELECT ...第二个参数是模型定义Keras 类attrs对应 SQL 语法中的WITH子句用于传递超参数columns对应COLUMN子句用于定义数据列到模型输入的转换如特征列 lambda 表达式into对应INTO子句指定训练产出模型的保存名称。该调用与下面的 SQL 语句完全等价SELECT ... TO TRAIN MyAwesomeClassifier WITH ... COLUMNS ... INTO trained_model;也就是说Python API 是 SQL 语句的一种程序化等价形式。调用sqlflow.train后SQLFlow 会在本地执行训练任务以此验证模型定义的正确性如果报错可以直接修改模型代码继续调试直到模型按预期工作——整个过程无需 Docker、无需 Jupyter。五、编写单元测试持续演进模型有了高层 API模型定义就可以像普通 Python 工程一样写单元测试文件如tests.py实现持续演进式的开发。连接本地 MySQL 的测试用例import sqlflow def test_MyAwesomeClassifier(): # 连接本地 MySQL 并测试 sqlflow.init(dbhostmysql://127.0.0.1:3306) sqlflow.train(SELECT ..., MyAwesomeClassifier, ... intomy_trained_model) auc, f1 sqlflow.evaluate(SELECT ..., usingmy_trained_model, metric[AUC, F1]) unittest.assert(auc 0.9) unittest.assert(f1 0.5)注意这里sqlflow.evaluate的用法通过usingmy_trained_model引用上一步训练产出的模型用metric[AUC, F1]指定评估指标返回指标值后即可用断言校验模型质量。连接远程 MaxCompute 的测试用例除了本地 MySQL还可以连接 SQLFlow 支持的其他数据库系统例如阿里云 MaxComputeimport sqlflow def test_MyAwesomeClassifier(): # 连接远程 MaxCompute 数据库 sqlflow.init(dbhostmaxcompute://[AK]:[SK]service-corp.odps.aliyun-inc.com/api?curr_projectalifin_jtest_devschemehttp) sqlflow.train(SELECT ..., MyAwesomeClassifier, ... intomy_trained_model) auc, f1 sqlflow.evaluate(SELECT ..., usingmy_trained_model, metric[AUC, F1]) unittest.assert(auc 0.9) unittest.assert(f1 0.5)MaxCompute 连接串中[AK]:[SK]为 AccessKey 与 SecretKey 占位符service-corp.odps.aliyun-inc.com/api为服务端点curr_project指定项目空间scheme指定访问协议。运行单元测试在测试文件所在目录直接执行pytestpytest 会收集所有test_*开头的函数并运行。当数据集或模型参数变化时只需修改断言或参数后重跑即可持续验证模型演进过程中的回归问题。六、用 SQLFlow 命令行工具做端到端测试MySQL 有命令行客户端mysqlSQLFlow 同样提供了命令行工具sqlflow。通过它可以直接连接 SQLFlow server用标准的 SQLFlow 扩展语法使用刚开发的模型定义$ sqlflow -host192.168.1.1:50051 -dbstrmaxcompute://.... sqlflow192.168.1.1:50051 SELECT * FROM iris TO TRAIN MyKerasModel LABEL class INTO my_iris_model;在sqlflow交互式提示符下输入上述 SQL 语句SQLFlow server 会完成训练并将结果保存到my_iris_model。这与第四节的 Python API 等价但走的是 SQL 语法路径更贴近分析师最终的使用方式。七、发布模型到 Model Zoo当模型验证通过、希望让其他用户也能使用时就可以把它发布到 SQLFlow Model Zoo。假设模型源代码位于my_model_collection/目录发布命令如下$ sqlflow release modeldef my_model_collection/ model_image:v0.1 checking model is valid ...[OK] building model docker image with version v0.1 ... [OK] model built as hub.docker.com/sqlflow_model_zoo_public/model_image:v0.1 on https://models.sqlflow.org. Model added successfullyYou can run it TO TRAIN hub.docker.com/sqlflow_model_zoo_public/model_image:v0.1/MyKerasModel命令的参数是模型源码目录与镜像名:版本号。整个发布过程输出三段提示分别对应三步checking model is valid校验模型目录内容的合法性building model docker image with version v0.1用指定的名称和版本构建模型 Docker 镜像model built as ...镜像被推送到预配置的 Docker registry并给出最终可用的镜像全名。注意Docker registry如上例中的hub.docker.com/sqlflow_model_zoo_public/由 Model Zoo server 配置而非由模型贡献者指定。关于 Model Zoo 的整体设计参见 doc/design/model_zoo.md。发布后如何使用发布完成后任何分析师都可以在 SQL 语句中直接引用该镜像中的模型类进行训练或预测SELECT ... TO TRAIN hub.docker.com/sqlflow_model_zoo_public/model_image:v0.1/MyKerasModel ...即TO TRAIN docker_image:tag/ClassName的完整形态。删除模型定义镜像当模型定义镜像过期时可以将其删除$ sqlflow drop modeldef model_image:v0.1关于使用 SQLFlow 命令行工具发布、共享、删除模型定义与训练模型的更多设计细节请参考 doc/design/model_zoo.md。八、源码级原理Model Zoo server 的发布与删除流程为了让读者对release modeldef的背后机制有深入理解下面结合当前仓库源码梳理完整的调用链。1. 命令行端打包上传gRPC 流式传输sqlflow release modeldef在命令行工具中对应release repo子命令。在 go/cmd/sqlflow/main.go 中可以看到完整的命令用法定义sqlflow [options] release repo [--force] repo_dir repo_name version sqlflow [options] release model [--force] [--local] [--descdesc] model_name version sqlflow [options] delete repo repo_name version sqlflow [options] delete model model_name version以及相关选项-s/--sqlflow-server指定 SQLFlow server 地址端口如localhost:50051、-m/--model-zoo-server指定 Model Zoo server 地址端口、-d/--data-source指定数据源、-c/--cert-file指定 TLS 证书文件不指定时使用不安全连接见 go/cmd/sqlflow/model_zoo_client.go 的getModelZooServerConn。发布仓库时客户端先调用tarRepo把模型源码目录打包成.tar.gz见 go/cmd/sqlflow/model_zoo_client.go然后通过ReleaseModelRepo这一 gRPC 流式接口按 32KB 的缓冲区把压缩包分块上传给 Model Zoo server见 go/cmd/sqlflow/model_zoo_client.go 的releaseRepo。2. 服务端校验 → 构建 → 推送 → 落库Model Zoo server 端由ReleaseModelRepo处理go/modelzooserver/modelzooserver.go完整流程如下接收上传从流中收取所有分块写入临时目录的servergot.tar.gz并检查镜像名与 tag 的合法性checkImageURL/checkTag查重通过imageExistsOnRegistry检查同名同 tag 的镜像是否已存在于 registrygo/modelzooserver/image_build.go已存在则直接报错——这也解释了为什么需要--force才能强制覆盖解包与校验模型解压 tar.gz 后调用getModelClassesgo/modelzooserver/get_model_classes.go检查目录结构目录下必须存在Dockerfile且至少有一个 Python 包子目录随后用一段内嵌 Python 脚本对每个子包执行__import__inspect.getmembers提取其中所有类的类名与__init__文档字符串作为模型定义描述modelClassDesc。若检测不到任何模型类直接返回 no model classes detected构建并推送 Docker 镜像buildAndPushImagego/modelzooserver/image_build.go在解包目录中执行docker build -t name:tag .随后用环境变量SQLFLOW_MODEL_ZOO_REGISTRY_USER/SQLFLOW_MODEL_ZOO_REGISTRY_PASS完成docker login并docker push。若 Model Zoo server 运行在 Kubernetes 环境中、没有/var/run/docker.sock则改用 Kaniko 方式构建buildAndPushImageKaniko见同文件 L111 起通过kubectl run启动 kaniko Pod 完成构建推送写数据库记录在model_repos表插入一条镜像记录nameversion再为检测到的每个模型类向model_definitions表插入一条记录model_coll_idclass_nameargs_desc记录该类对应的__init__文档字符串。3. 删除模型定义DropModelRepogo/modelzooserver/modelzooserver.go按镜像名与 tag 找到model_repos记录先删除其下所有model_definitions记录再删除model_repos记录本身完成逻辑上的删除。4. 发布训练好的模型除模型定义外sqlflow release model还可以把训练好的模型含权重发布为公共模型ReleaseModelgo/modelzooserver/modelzooserver.go会从用户的数据源中导出模型 tar 包或从实验性代码生成路径读取元数据把模型内容写入 Model Zoo server 连接的 MySQL 公共库sqlflow_public_models库中库名_表名_版本形式的 sqlfs 表并通过模型定义表反查model_definitions与model_repos关联记录最后在models表登记模型名称、版本、描述与评估指标。5. 三张核心表整个 Model Zoo 的数据库设计围绕三张表展开详见 doc/design/model_zoo.mdmodel_repos存储模型仓库 Docker 镜像及其版本 tagmodel_definitions存储每个镜像中包含的模型定义类/函数明细一个镜像可有多个模型定义models存储已发布模型的唯一名称及其实际存储位置的 URL。6. Model Zoo server 的启动配置Model Zoo server 是一个独立的 gRPC 服务默认监听50055端口启动时通过-mysql-addr指定其元数据库连接串go/cmd/modelzooserver/main.gosqlflow_model_zoo_server -mysql-addrmysql://root:roottcp(127.0.0.1:3306)/? -port50055其中 Docker registry 地址、账号密码通过环境变量SQLFLOW_MODEL_ZOO_REGISTRY、SQLFLOW_MODEL_ZOO_REGISTRY_USER、SQLFLOW_MODEL_ZOO_REGISTRY_PASS配置对应设计文档中registryhub.docker.com/sqlflow_model_zoo_public/、username...、password...的配置项。向公共 Model Zoo 发布模型定义时镜像名不应包含hub.docker.com/group/这类 URL 前缀——registry 由服务端统一配置。九、角色与命名体系一览从 Model Zoo 生态看SQLFlow 中存在三类角色用 Go 开发 SQLFlow 的工具开发者、用 Python 定义模型的数据科学家、以及用 SQL 训练/预测/解释模型的分析师详见 doc/design/model_zoo.md 的总结章节。本文的新方案把数据科学家的贡献流程压缩为四步在 Git 仓库中开发模型定义model repo用sqlflow release modeldef my_model_collection/ model_image:v0.1发布模型仓库反复训练实验直到模型达到可发布标准用sqlflow release model my_first_model v0.1发布训练好的模型。发布后分析师可通过完整镜像名如dockerhub.com/a_data_scientist/regressor:v0.2/DNNRegressor引用模型定义若镜像 tag 为latest可省略版本若使用默认 registry 可省略 registry 域名若是模型开发者本人还可进一步简写。十、小结contribute_models_new方案的核心价值在于把模型如何被 SQLFlow 使用这一工程问题从模型开发者身上剥离。开发者只需掌握三件事——用 Python 定义 Keras 模型、用sqlflow.train/sqlflow.evaluate验证、用sqlflow release modeldef发布。至于镜像构建、registry 推送、元数据登记等底层细节全部由 SQLFlow 命令行工具与 Model Zoo server 在背后自动完成。如果你希望深入了解底层设计推荐继续阅读 doc/design/model_zoo.md、doc/contribute_models.md 以及 Model Zoo server 源码 go/modelzooserver/modelzooserver.go、gRPC 协议定义 go/proto/modelzooserver.proto。赞分享人工智能机器学习后端编译器【免费下载链接】sqlflowBrings SQL and AI together.项目地址https://gitcode.com/gh_mirrors/sq/sqlflow点击查看免费下载相关推荐Ultimate Python 贡献指南从模块规范到代码合入的完整实战手册Ultimate Python 贡献指南从模块规范到代码合入的完整实战手册 本指南以仓库根目录的 CONTRIBUTING.md https://link.g教程示例工程Open Model Zoo 模型贡献指南技术规范与最佳实践Open Model Zoo 模型贡献指南技术规范与最佳实践 前言 Open Model Zoo 作为 OpenVINO™ 生态系统的重要组成部分为开发者提人工智能深度学习计算机视觉模型评测NLP语音ONNX Model Zoo 模型贡献指南从模型提交流程到 TurnkeyML 构建规范全解析ONNX Model Zoo 模型贡献指南从模型提交流程到 TurnkeyML 构建规范全解析 导读 本篇技术指南以 contribute.md https:人工智能机器学习后端编译器上一篇ThinkPad风扇终极控制TPFanControl2完全使用指南下一篇ThinkPad风扇控制终极指南TPFanControl2完全使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考