【django】模型部署过程

模型部署

  • 示例:保存 Scikit-learn 模型
  • myapp/views.py
  • 全局加载模型
  • tasks.py(Celery任务)
  • views.py 修改为异步调用
  • views.py

  1. 准备工作
    模型保存格式
    确保你的模型已保存为可加载的格式:
    ● TensorFlow/Keras:.h5 或 SavedModel 格式
    ● PyTorch:.pt 或 .pth 文件
    ● Scikit-learn:使用 joblib 或 pickle 保存(推荐 joblib)

示例:保存 Scikit-learn 模型

from sklearn.ensemble import RandomForestClassifier
import joblib

model = RandomForestClassifier()
model.fit(X_train, y_train)
joblib.dump(model, ‘my_model.joblib’)

  1. 项目结构规划
    建议的 Django 项目结构:
    myproject/
    ├── myapp/
    │ ├── models/ # 存放模型文件
    │ │ └── my_model.joblib
    │ ├── views.py # 处理请求和模型调用
    │ ├── urls.py # 定义API路由
    │ └── …
    ├── myproject/
    │ ├── settings.py
    │ └── urls.py # 主路由
    └── manage.py

  2. 模型加载与初始化
    在 Django 中全局加载模型
    在 myapp/apps.py 或 views.py 中初始化模型,避免每次请求重复加载。

myapp/views.py

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import joblib
import os

全局加载模型

model_path = os.path.join(os.path.dirname(file), ‘models/my_model.joblib’)
model = joblib.load(model_path)

@csrf_exempt # 若需跨域访问可临时禁用CSRF(生产环境需谨慎)
def predict(request):
if request.method == ‘POST’:
try:
# 获取输入数据(假设发送JSON)
data = json.loads(request.body)
features = data[‘features’]

        # 调用模型预测prediction = model.predict([features])[0]return JsonResponse({'prediction': prediction})except Exception as e:return JsonResponse({'error': str(e)}, status=400)
return JsonResponse({'error': '仅支持POST请求'}, status=405)
  1. 配置路由
    在 myapp/urls.py 中添加API路由
    from django.urls import path
    from . import views

urlpatterns = [
path(‘predict/’, views.predict, name=‘predict’),
]
在项目主路由 myproject/urls.py 中引入
from django.urls import include, path

urlpatterns = [
path(‘api/’, include(‘myapp.urls’)),
]

  1. 测试API
    使用 curl 或 Postman 发送POST请求测试:
    curl -X POST http://localhost:8000/api/predict/
    -H “Content-Type: application/json”
    -d ‘{“features”: [1.2, 3.4, 5.6]}’
    预期响应:
    {“prediction”: 0}

  2. 高级优化
    异步处理(Celery + Redis)
    如果模型推理耗时较长,可用 Celery 异步任务避免阻塞请求:

tasks.py(Celery任务)

from celery import shared_task
from myapp.views import model # 复用全局加载的模型

@shared_task
def async_predict(features):
return model.predict([features])[0]

views.py 修改为异步调用

@csrf_exempt
def predict(request):
if request.method == ‘POST’:
data = json.loads(request.body)
task = async_predict.delay(data[‘features’])
return JsonResponse({‘task_id’: task.id}, status=202)
缓存模型输出
使用 Django 缓存减少重复计算:
from django.core.cache import cache

def predict(request):
data = json.loads(request.body)
features = tuple(data[‘features’]) # 转换为可哈希类型

# 检查缓存
if cache.has_key(features):return JsonResponse({'prediction': cache.get(features)})# 计算并缓存
prediction = model.predict([features])[0]
cache.set(features, prediction, timeout=3600)  # 缓存1小时
return JsonResponse({'prediction': prediction})
  1. 关键注意事项
  2. 线程安全:
    from threading import Lock
    model_lock = Lock()

def predict(request):
with model_lock:
prediction = model.predict(…)
○ 如果模型非线程安全(如某些 TensorFlow 旧版本),需加锁或使用单例模式。
2. 性能优化:
○ 使用 gunicorn 或 uvicorn 替代 Django 自带的开发服务器。
○ 启用 GPU 加速(如 TensorFlow/PyTorch 的 GPU 版本)。
3. 输入验证:
def validate_features(features):
if len(features) != 3:
raise ValueError(“必须提供3个特征”)
if not all(isinstance(x, (int, float)) for x in features):
raise ValueError(“特征必须为数字”)
○ 严格校验前端传入的数据格式和范围,防止恶意输入。
4. 依赖管理:
tensorflow2.12.0
scikit-learn
1.2.2
joblib==1.2.0
○ 在 requirements.txt 中明确指定模型库版本:

完整示例:图像分类模型集成
假设有一个图像分类模型(如 ResNet),可按以下方式处理文件上传:

views.py

from django.core.files.storage import default_storage
from tensorflow.keras.preprocessing import image
import numpy as np

def predict_image(request):
if request.method == ‘POST’:
file = request.FILES[‘image’]
file_path = default_storage.save(‘tmp/’ + file.name, file)

    # 预处理图像img = image.load_img(file_path, target_size=(224, 224))img_array = image.img_to_array(img)img_array = np.expand_dims(img_array, axis=0) / 255.0# 预测prediction = model.predict(img_array)class_idx = np.argmax(prediction)return JsonResponse({'class': class_idx})

通过以上步骤,你可以将训练好的模型无缝集成到 Django 中,并通过 RESTful API 提供服务。根据实际需求调整代码结构和优化策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、计算机网络技术——概述、性能指标

网络技术发展历程 第一阶段 一九六九年美国国防部研制的ARPANET,采用“接口报文处理机”将四台独立的计算机主机互联在一起,实现数据的转发。 这一阶段的主要特点是TCP/IP协议初步成型 第二阶段: 采用三级结构,这一阶段的主要…

【向量数据库Weaviate】与ChromaDB的差异、优劣

以下是 Weaviate 和 ChromaDB 的详细对比,涵盖设计目标、核心功能、性能、适用场景及优劣势分析: 1. 核心定位与设计目标 维度WeaviateChromaDB类型向量数据库 图数据库(支持混合搜索)轻量级纯向量数据库(专注嵌入存…

Lua | 每日一练 (4)

💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…

Fiji —— 基于 imageJ 的免费且开源的图像处理软件

文章目录 一、Fiji —— 用于科学图像处理和分析1.1、工具安装(免费)1.2、源码下载(免费) 二、功能详解2.0、Fiji - ImageJ(Web应用程序)2.1、常用功能(汇总)2.2、Fiji - Plugins&am…

PyQT(PySide)的上下文菜单策略设置setContextMenuPolicy()

在 Qt 中,QWidget 类提供了几种不同的上下文菜单策略,这些策略通过 Qt::ContextMenuPolicy 枚举类型来定义,用于控制控件(如按钮、文本框等)在用户右键点击时如何显示上下文菜单。 以下是 Qt::ContextMenuPolicy 枚举中…

快慢指针【等分链表、判断链表中是否存在环】

一、等分链表:找到链表的中间节点 Java 实现 class ListNode {int val;ListNode next;ListNode(int val) {this.val val;this.next null;} }public class MiddleOfLinkedList {public ListNode findMiddleNode(ListNode head) {if (head null) {return null;}L…

系统架构设计师—计算机基础篇—计算机网络

文章目录 网络互联模型网络协议与标准应用层协议FTP协议TFTP协议 HTTP协议HTTPS协议 DHCP动态主机配置协议DNS协议迭代查询递归查询 传输层协议网络层协议IPV4协议IPV6协议IPV6数据报的目的地址IPV4到IPV6的过渡技术 网络设计分层设计接入层汇聚层核心层 网络布线综合布线系统工…

计算机基础面试(操作系统)

操作系统 1. 什么是进程和线程?它们的核心区别是什么? 专业解答: 进程是操作系统分配资源的基本单位,拥有独立的内存空间;线程是进程内的执行单元,共享同一进程的资源。区别在于:进程间资源隔离…

考研408数据结构线性表核心知识点与易错点详解(附真题示例与避坑指南)

一、线性表基础概念 1.1 定义与分类 定义:线性表是由n(n≥0)个相同类型数据元素构成的有限序列,元素间呈线性关系。 分类: 顺序表:元素按逻辑顺序存储在一段连续的物理空间中(数组实现&…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.2倒排索引原理与分词器(Analyzer)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 1.2.2倒排索引原理与分词器(Analyzer)1. 倒排索引:搜索引擎的基石1.1 正排索引 vs 倒排索引示例数据对比: 1.2 倒排索引核心结…

Springboot项目本地连接并操作MySQL数据库

目录 前提 准备工作 用cmd在本地创建数据库、表: 1.创建springboot项目(已有可跳过) 2.编辑Mybatis配置 3.连接数据库 4.创建模型类,用于与数据库里的数据表相连 5.创建接口mapper,定义对数据库的操作 6.创建…

《宝塔 Nginx SSL 端口管理实战指南:域名解析、端口冲突与后端代理解析》

📢 Nginx & SSL 端口管理分析 1️⃣ 域名解析与 SSL 申请失败分析 在使用宝塔申请 www.mywebsite.test 的 SSL 证书时,遇到了解析失败的问题。最初,我认为 www 只是一个附加的前缀,不属于域名的关键部分,因此只为…

java和Springboot和vue开发的企业批量排班系统人脸识别考勤打卡系统

演示视频: https://www.bilibili.com/video/BV1KU9iYsEBU/?spm_id_from888.80997.embed_other.whitelist&t52.095574&bvidBV1KU9iYsEBU 主要功能: 管理员管理员工,采集员工人脸特征值存入数据库,可选择多个员工批量排班…

DeepSeek学习规划

DeepSeek是一个专注于深度学习和人工智能技术研究与应用的平台,旨在通过系统化的学习和实践,帮助用户掌握深度学习领域的核心知识和技能。为了在DeepSeek平台上高效学习,制定一个科学合理的学习规划至关重要。以下是一个详细的学习规划&#…

打开 Windows Docker Desktop 出现 Docker Engine Stopped 问题

一、关联文章: 1、Docker Desktop 安装使用教程 2、家庭版 Windows 安装 Docker 没有 Hyper-V 问题 3、安装 Windows Docker Desktop - WSL问题 二、问题解析 打开 Docker Desktop 出现问题,如下: Docker Engine Stopped : Docker引擎停止三、解决方法 1、检查服务是否…

突破Ajax跨域困境,解锁前端通信新姿势

一、引言 在当今的 Web 开发领域,前后端分离的架构模式已经成为主流,它极大地提升了开发效率和项目的可维护性。在这种开发模式下,前端通过 Ajax 技术与后端进行数据交互,然而,跨域问题却如影随形,成为了开…

Mercury、LLaDA 扩散大语言模型

LLaDA 参考: https://github.com/ML-GSAI/LLaDA https://ml-gsai.github.io/LLaDA-demo/ 在线demo: https://huggingface.co/spaces/multimodalart/LLaDA Mercury 在线demo: https://chat.inceptionlabs.ai/ 速度很快生成

Rust~String、str、str、String、Box<str> 或 Box<str>

Rust语言圣经中定义 str Rust 语言类型大致分为两种:基本类型和标准库类型,前者由语言特性直接提供,后者在标准库中定义 str 是唯一定义在 Rust 语言特性中的字符串,但也是几乎不会用到的字符串类型 str 字符串是 DST 动态大小…

大数据SQL调优专题——底层调优

引入 上一篇我们提到了调优的常见切入点,核心就是通过数据产出情况发现问题,借助监控等手段收集信息排查瓶颈在哪,最后结合业务理解,等价重写思路去解决问题。 在实际工作场景中,去保证数据链路产出SLA的时候&#x…

Hue 编译异常:ImportError: cannot import name ‘six‘ from ‘urllib3.packages‘

个人博客地址:Hue 编译异常:ImportError: cannot import name six from urllib3.packages | 一张假钞的真实世界 在编译Hue的时候出现错误信息如下: Running /home/zhangjc/ysten/git/ysten-hue/build/env/bin/hue makemigrations --noinpu…