当前位置: 首页 > news >正文

模型部署在docker中对外提供服务

这里采用flask框架实现,项目文件如下:
在这里插入图片描述
main.py

from typing import List
from flask import Flask, request, jsonify
from PIL import Image
import io
import torch
from torchvision import transforms, models
import requests  # For downloading ImageNet class labels# -------------------- Initialization --------------------
app = Flask(__name__)# Load pre-trained MobileNetV2 model (instead of ResNet18)
model = models.mobilenet_v2(pretrained=True)  # Changed to MobileNetV2
model.eval()  # Switch to evaluation mode# Define image preprocessing pipeline (works for MobileNet as well)
preprocess = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],  # ImageNet mean valuesstd=[0.229, 0.224, 0.225]   # ImageNet standard deviation values)
])# Load ImageNet class labels (1000 classes total)
try:LABELS_URL = "https://raw.githubusercontent.com/anishathalye/imagenet-simple-labels/master/imagenet-simple-labels.json"labels = requests.get(LABELS_URL).json()  # List where index corresponds to class ID
except Exception as e:print(f"Failed to load class labels: {e}")labels = [f"class{i}" for i in range(1000)]  # Default labels if loading fails# -------------------- Existing Route: Numeric Processing --------------------
@app.route("/predict", methods=["POST"])
def predict():try:req_data = request.get_json()if "data" not in req_data:return jsonify({"error": "Request data is missing the 'data' field"}), 400x: List[float] = req_data["data"]y = list(map(lambda n: n + 1, x))return jsonify({"prediction": y})except Exception as e:return jsonify({"error": str(e)}), 500# -------------------- Route: Image Classification (MobileNetV2) --------------------
@app.route("/classify", methods=["POST"])
def classify_image():try:# 1. Check file uploadif 'file' not in request.files:return jsonify({"error": "Please upload an image using the 'file' field"}), 400file = request.files['file']if file.filename == '':return jsonify({"error": "No file selected"}), 400# 2. Read and preprocess imagetry:image = Image.open(io.BytesIO(file.read())).convert('RGB')input_tensor = preprocess(image)input_batch = input_tensor.unsqueeze(0)  # Add batch dimensionexcept Exception as e:return jsonify({"error": f"Image processing failed: {str(e)}"}), 400# 3. Model inferencetry:with torch.no_grad():  # Disable gradient calculationoutput = model(input_batch)  # MobileNetV2 output shape: [1, 1000]# Parse results (same logic works for MobileNet)probabilities = torch.nn.functional.softmax(output[0], dim=0)top3_prob, top3_idx = torch.topk(probabilities, 3)results = []for idx, prob in zip(top3_idx, top3_prob):results.append({"class": labels[idx.item()],"probability": round(prob.item() * 100, 2)})return jsonify({"status": "success","top3_predictions": results})except Exception as e:return jsonify({"error": f"Model inference failed: {str(e)}"}), 500except Exception as e:return jsonify({"error": str(e)}), 500# -------------------- Entry Point --------------------
if __name__ == "__main__":app.run(host="0.0.0.0", port=9201, debug=False)   

requirements.txt

flask
pillow
numpy==1.26
requests--extra-index-url https://download.pytorch.org/whl/cpu
torch==1.8.0+cpu
torchvision==0.9.0+cpu

Dockerfile

FROM python:3.9-slim
WORKDIR /app
COPY ./app /app
RUN pip install -r requirements.txt -i https://pypi.mirrors.ustc.edu.cn/simple/
EXPOSE 9201
CMD ["python", "main.py"]

bus.jpg
在这里插入图片描述

构建docker镜像:

docker build -t flask_image .

运行容器:

docker run -d -p 9201:8001 --name flask_container flask_image

客户端发送:

curl -X POST "http://172.17.0.4:9201/predict" -H "Content-Type: application/json" -d '{"data": [1.0, 2.0, 3.0]}'

收到响应:

{"prediction":[2.0,3.0,4.0]}

客户端发送:

curl -X POST "http://172.17.0.4:9201/classify" -F "file=@bus.jpg"

收到响应:

{"status":"success","top3_predictions":[{"class":"class734","probability":48.18},{"class":"class654","probability":42.36},{"class":"class757","probability":4.04}]}
http://www.dtcms.com/a/619049.html

相关文章:

  • 基于KALI_ARPspoof的ARP Poisoning攻击及其防护
  • 萧山网站建设xsszwl免费ppt模板下载app
  • 太原seo网站排名优化网站seo资讯
  • 使用 speechSynchesis.speak()为web程序添加语音
  • 平台网站模板素材图片下载建设网站编程语言
  • extern “C“ _declspec(dllexport)导出函数
  • 堡垒机的概念
  • 工信部网站信息查询做电影解析网站
  • 自贡市网站建设网站建设设计价格
  • 化学式字符串解析:一道考验递归功底的经典题
  • 免费推广网站平台成都定制网站建
  • 【Java 微服务中间件】RabbitMQ 全方位解析:同步异步对比、SpringAMQT基础入门、实战、交换机类型及消息处理详解
  • 做网站的收益lnmp wordpress 伪静态
  • 华为HuaweiCloudStack(一)介绍与架构
  • 招商网站建设定做如何给wordpress增加表单
  • 网站维护项目织梦网站安装播放视频插件下载
  • mysql锁机制入门笔记(备份)
  • Snakemake 从入门到实战:生信自动化工作流搭建指南
  • 深入理解CSS布局:从格子布局到响应式栅格系统
  • 做一个电商网站网站源代码下载软件
  • 网站怎么做网上报名河北网站建设方案
  • 珲春建设局网站备案用网站建设方案书
  • 南京小程序开发网站建设网页设计一页多少钱
  • 做投标的网站南平建设集集团网站
  • 以投资思维做网站h5响应式网站开发
  • 做旅游攻略去什么网站密云网站建设公司
  • Linux 中的 CPU。文章 1. 利用率
  • 自然语言处理实战——基于混合专家模型(MoE)的文本生成
  • ps做网站浏览器预览网站备案号显示红色
  • 暗黑模式【闪白】解决方案