讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Python中用FastAPI高效调用Scikit-learn

秋丽君_4178

秋丽君_4178

发布时间:2026-09-04 12:35:07

|

479人浏览过

|

来源于php中文网

原创

FastAPI 应在启动时加载模型而非每次请求:用 lifespan 机制全局加载,避免 on_event;输入需用 Pydantic 校验并转为 numpy 数组;输出须显式转为 Python 原生类型。

如何在python中用fastapi高效调用scikit-learn

FastAPI 启动时加载模型比每次请求都加载快得多

直接在 predict 路由函数里用 joblib.load() 加载模型,会导致每次请求都反序列化一次,CPU 和 I/O 开销叠加,QPS 瞬间掉一半。正确做法是应用启动时一次性加载,并存为全局变量或依赖项。

推荐用 FastAPI 的 lifespan 机制(Python 3.8+)管理生命周期:

from fastapi import FastAPI
from sklearn.ensemble import RandomForestClassifier
import joblib
<p>model = None</p><p>async def lifespan(app: FastAPI):
global model
model = joblib.load("model.pkl")  # 启动时加载一次
yield
model = None  # 可选:退出时清理</p><p>app = FastAPI(lifespan=lifespan)
  • 避免用 on_event("startup") —— 已被 lifespan 替代,旧写法在最新 FastAPI 中会警告
  • 如果模型大于 200MB,考虑用 mmap_mode="r" 参数传给 joblib.load(),减少内存拷贝
  • 别把模型放在 Depends() 函数里返回——那只是“每次请求都调一次”,没解决根本问题

输入数据必须和训练时的 shape/dtype 完全一致

FastAPI 默认把 JSON 解析成 dict 或 list,而 scikit-learn 模型只认 numpy.ndarray 或 pandas.DataFrame,且列顺序、缺失值处理、类别编码都必须对齐,否则报 ValueError: X has 5 features, but RandomForest expected 7 这类错。

立即学习“Python免费学习笔记(深入)”;

最稳妥的方案是定义 Pydantic 模型做校验 + 显式转换:

python-pro
python-pro

高级 Python 特性、异步编程、性能调优、静态类型、内存管理、Python 内部机制及生态库方面的专家。

下载
from pydantic import BaseModel
import numpy as np
<p>class PredictionRequest(BaseModel):
sepal_length: float
sepal_width: float
petal_length: float
petal_width: float</p><p>@app.post("/predict")
def predict(req: PredictionRequest):</p><h1>严格按训练时的列序构造 array</h1><pre class="brush:php;toolbar:false;">X = np.array([[req.sepal_length, req.sepal_width, 
               req.petal_length, req.petal_width]])
y_pred = model.predict(X)
return {"prediction": int(y_pred[0])}

  • 不要用 dict(req).values() 构造数组——字典无序,字段顺序不保证
  • 如果训练时用了 OneHotEncoder 或 StandardScaler,这些预处理器也得一起加载并串在推理链路里
  • 整数特征传了小数(比如 "age": 25.0)一般不影响,但 scikit-learn 对 int64 和 float64 敏感,建议统一转 float32 避免隐式转换失败

并发请求下 model.predict() 本身是线程安全的,但要注意状态污染

sklearn 大多数 estimator 的 predict 方法是纯函数式、无内部状态的,多线程/异步并发调用没问题。真正要防的是你自己加的逻辑:比如缓存中间结果、修改模型属性、或在预测中调用了带副作用的自定义函数。

  • 别在 predict 里写 model.classes_ = [...] —— 这会污染其他请求看到的模型状态
  • 如果用了 CalibratedClassifierCV 并启用了 n_jobs > 1,注意它底层用 joblib.Parallel,可能和 FastAPI 的异步事件循环冲突,建议设 n_jobs=1
  • 异步包装 model.predict() 没意义——它本身不阻塞,强行用 run_in_executor 反而增加调度开销

模型输出要主动降维,别让 FastAPI 自动 JSON 化 numpy 类型

直接 return {"prob": model.predict_proba(X)[0]} 会触发 FastAPI 尝试序列化 numpy.ndarray,抛出 TypeError: Object of type ndarray is not JSON serializable。

必须显式转成原生 Python 类型:

y_proba = model.predict_proba(X)[0].tolist()  # → list[float]
y_pred = int(model.predict(X)[0])              # → int
return {"prediction": y_pred, "confidence": y_proba}
  • .tolist() 是必须的,json.dumps(np.array([1,2])) 会失败,但 json.dumps(np.array([1,2]).tolist()) 可以
  • 如果输出是 np.int64,直接 int(x) 转,别用 int(float(x)) 多此一举
  • 别依赖 orjson 或 ujson 自动支持 numpy——FastAPI 默认不用它们,且行为不一致,显式转换最稳

模型热更新、特征在线验证、A/B 测试路由这些进阶需求,得靠额外服务编排,不是加几行 joblib.load 就能解决的。先确保单模型路径干净、可测、可压测,再谈扩展。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1671

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4164

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1669

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

24117

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2947

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2987

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1163

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

100

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn