【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.pswp.cn/news/896824.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896824.shtml
英文地址,請注明出處:http://en.pswp.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…