多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Python在线运行部署机器学习模型:从训练到上线5步全流程实战

Python在线运行部署机器学习模型:从训练到上线5步全流程实战 Python在线运行部署机器学习模型从训练到上线5步全流程实战前阵子帮一个做电商的朋友上线用户流失预测模型调参调了三个月AUC冲到了0.92结果部署上线第一天就崩了——内存溢出、推理超时、接口频繁502。朋友吐槽我模型训得这么好怎么上线就废了说实话这种情况见得太多了。很多人把90%的精力花在训练模型上剩下10%留给部署结果上线就是灾难。今天就聊点干的用python在线运行的方式怎么把一个训练好的机器学习模型从零部署上线还能跑得稳、跑得便宜。一、第一步模型轻量化——别带着全家桶上线先问你一个问题你训练模型用的环境和线上运行的环境是同一个吗大概率不是。本地可能装了几百个包pandas、numpy、sklearn、torch、tensorflow、xgboost……加起来好几个G。结果你把代码直接往线上一丢启动就花了三分钟内存先占了1个G模型还没跑起来钱先烧没了。注意注意注意模型部署的第一原则就是线上只保留推理需要的东西训练相关的一律丢掉。具体怎么做三件事1. 模型格式转换sklearn的模型用joblib存可以但加载慢、体积大。更好的做法是转成ONNX格式体积小、加载快、推理性能更高。一个简单的逻辑回归模型pkl格式可能有几十MB转成ONNX可能就几百KB。转换代码也很简单python9123456789from skl2onnx import convert_sklearnfrom skl2onnx.common.data_types import FloatTensorTypeinitial_type [(float_input, FloatTensorType([None, 10]))]onnx_model convert_sklearn(model, initial_typesinitial_type)with open(model.onnx, wb) as f:f.write(onnx_model.SerializeToString())加载和推理用onnxruntime比原生sklearn快2到5倍内存占用还低。2. 依赖最小化把requirements.txt里的包列出来一个个审这个包推理的时候真的用到了吗有没有更轻量的替代品比如用ujson代替json或者干脆不用pandas直接用numpy大模型框架能不能只装CPU版我见过最夸张的一个项目requirements.txt里有37个包实际推理只用了3个。剩下34个全是训练和数据处理的时候装的跟着上了线白白浪费资源。3. 模型剪枝和量化如果是深度学习模型可以做剪枝去掉不重要的权重和量化把32位浮点数转成8位整数。精度损失不大但模型体积能减少75%推理速度提升2到3倍。这一步做完你的部署包从几个G变成几十MB就成功了一半。二、第二步封装推理接口——让模型能被调用模型光放在那里没用得能被其他系统调用。最常见的方式就是封成一个HTTP API接口。用什么框架FlaskFastAPIDjango我推荐FastAPI原因很简单快、简单、自动生成文档、异步支持好。而且FastAPI是目前Python Web框架里性能最好的之一。一个最简的推理接口长这样python9912345678910111213from fastapi import FastAPIimport onnxruntime as ortimport numpy as npapp FastAPI()session ort.InferenceSession(model.onnx)app.post(/predict)def predict(data: list):input_data np.array(data, dtypenp.float32)result session.run(None, {float_input: input_data})return {prediction: result[0].tolist()}注意模型加载要放在接口外面启动的时候加载一次就行。别放在接口函数里每次调用都加载一次那性能直接就废了。接口设计要注意几点输入格式要清晰是传JSON数组还是传CSV文件字段名是什么类型是什么文档写清楚输出要简洁只返回调用方需要的结果别把中间过程数据也全塞回去错误处理要到位输入格式不对返回400模型推理失败返回500别全是500让人摸不着头脑超时控制推理时间超过多少秒就直接返回错误别让请求卡死你可能会问接口写好了怎么测试很简单FastAPI自带了Swagger文档启动后访问/docs就能在浏览器里直接调接口测试连Postman都省了。三、第三步选部署方式——三条路你走哪条接口写好了接下来就是上线。这里有三种主流方式各有优劣我给你掰扯清楚。第一种自己买服务器部署就是买一台云服务器装Python环境装依赖跑起来。优点是灵活什么都能自己控制。缺点呢贵一台2核4G的服务器一个月少说一百多还不算带宽和流量麻烦环境配置、安全设置、域名备案、SSL证书、监控告警……全得自己来不稳服务器挂了怎么办流量突增扛不住怎么办扩容又慢又麻烦适合有运维能力、流量稳定的团队。个人开发者和小团队我不建议走这条路。第二种用Serverless函数计算比如阿里云函数计算、腾讯云云函数、AWS Lambda这些。按调用次数收费没调用就不花钱自动扩容。听着挺好对吧但也有坑冷启动慢第一次调用可能要等好几秒用户体验差环境限制有的不支持自定义依赖有的内存和执行时间有限制调试麻烦本地跑好好的上线就出问题排查起来很头疼适合小流量、非实时的场景。比如定时任务、数据处理这种。第三种应用托管平台部署就是把整个Python应用打包好直接上传到托管平台平台帮你搞定环境、部署、域名、SSL这些事。我自己测过几个平台VicroCode是比较省心的一个。支持HTMLJSCSSPythonSQLite提供Python管理器零配置就能部署。上传代码设置启动命令就上线了。我用一个简单的文本分类模型测过本地开发完上传到平台设置启动命令不到20分钟就上线了。自带HTTPS域名不用备案不用配置服务器。对个人开发者和小团队来说这个效率提升是真的大。关键是便宜。很多托管平台有免费额度小流量的项目基本不用花钱。就算收费也比自己买服务器划算多了。你问我选哪种看你的情况。有运维团队、流量大、对可控性要求高选自己买服务器。小流量、间歇性调用选Serverless。想快速上线、省成本、少折腾直接用应用托管平台。四、第四步性能调优——从秒级到毫秒级接口上线了能跑了但是每次调用要等好几秒用户体验很差。怎么优化1. 模型预热第一次推理往往特别慢因为要加载模型、初始化环境。可以在服务启动的时候就调用一次空推理把模型热起来后面的请求就快了。2. 结果缓存如果输入重复率比较高比如同样的输入会被多次调用加个缓存就能大幅提升性能。相同的输入直接返回缓存结果不用每次都推理。Python里用functools.lru_cache就能简单实现python912345678from functools import lru_cachelru_cache(maxsize1000)def predict_cached(input_tuple):input_data np.array(input_tuple, dtypenp.float32)result session.run(None, {float_input: input_data})return result[0].tobytes()缓存命中率高的话QPS能翻好几倍。3. 批量推理如果一次来了很多请求能不能攒一批一起推理当然可以。批量推理能充分利用GPU/CPU的并行能力单位时间处理更多请求。但要注意批量不是越大越好。太大了延迟会上去得在吞吐量和延迟之间找平衡。4. 异步处理有些场景不需要实时返回结果比如批量数据处理就可以用异步队列。请求进来先丢队列里后台慢慢处理处理完了通知调用方。这样前端不会卡住系统也不容易被打垮。调优这件事记住一句话先测再调别瞎猜。用压测工具比如wrk、locust测一下当前的性能瓶颈在哪里是CPU、内存还是IO然后针对性地优化。别上来就瞎改代码改了半天发现瓶颈根本不在那。五、第五步监控与迭代——上线才是开始很多人以为上线了就完事了大错特错。上线只是开始后面的监控和迭代才是重头戏。监控要看什么三个维度1. 业务指标模型的预测准确率有没有下降各分类的分布有没有变化用户反馈怎么样模型不是一成不变的。数据分布会变用户行为会变今天准确率90%半年后可能就降到70%了。这个叫模型漂移必须持续监控。2. 性能指标平均响应时间是多少P95、P99呢每秒能处理多少请求错误率高不高都是什么类型的错误这些指标决定了用户体验和系统稳定性。响应时间突然变长肯定是出了什么问题得及时排查。3. 资源指标CPU使用率高不高内存有没有泄漏磁盘空间够不够资源异常往往是故障的前兆。比如内存慢慢往上涨可能就是有泄漏不处理早晚会崩。迭代怎么搞也有个流程收集线上数据和反馈标注新数据重新训练模型离线评估新模型的效果小流量灰度上线比如先切10%的流量观察一段时间没问题再全量有问题就回滚别硬扛这个流程跑顺了模型才能越用越好而不是上线即巅峰然后一路下滑。六、说点真心话聊了这么多步骤你可能觉得部署机器学习模型好麻烦。说实话确实不简单但也没有想象中那么难。关键是搞清楚自己的需求。如果只是做个demo、验证个idea完全可以用VicroCode - AI智能体开发与Web应用托管平台 | HTML在线运行/Python在线运行这种平台快速上线花最少的钱和时间验证想法。等跑通了、有流量了、有收入了再考虑升级架构、自己搭服务器也不迟。很多人犯的错误就是一开始就追求完美架构又是微服务又是K8s的结果项目还没验证完钱先花光了人先累垮了。这不是技术牛这是折腾自己。记住先跑起来再优化先验证再投入。这才是聪明人的做法。你现在手里有没有训好了但还没上线的模型有的话今天就试试用Python在线运行的方式部署一下。就五个步骤半天就能搞定。等你把模型真正跑起来、被人用上的那一刻那种成就感比调参冲AUC爽多了。我整理了一些市场信息和学习资料AI行业动态_AI编程实战案例_独立开发者资讯 - VicroCode
返回列表