模型生产化:从本地部署到云端容器化
立即解锁
发布时间: 2025-09-01 01:17:28 阅读量: 3 订阅数: 12 AIGC 


现代计算机视觉与PyTorch
# 模型生产化:从本地部署到云端容器化
## 1. 安装 FastAPI 及依赖
FastAPI 是一个 Python 模块,可使用 pip 进行安装,同时安装一些必要的依赖项。在新终端中运行以下命令:
```bash
$ pip install fastapi uvicorn aiofiles jinja2
```
各依赖项的作用如下:
- `uvicorn`:一个用于设置 API 的底层服务器/应用程序接口。
- `aiofiles`:使服务器能够异步处理请求,例如同时接受和响应多个独立的并行请求。
## 2. 搭建图像分类服务
### 2.1 文件夹结构设置
为了部署模型并从端点获取预测结果,需要设置如下文件夹结构:
| 文件夹/文件 | 说明 |
| ---- | ---- |
| `files` 文件夹 | 作为传入请求的下载位置 |
| `sdd.weights.pth` | 包含训练好的 SDD 模型的权重 |
| `sdd.py` | 包含加载权重、接受传入图像、进行预处理、预测和后处理预测结果的逻辑 |
| `server.py` | 包含 FastAPI 功能,用于设置 URL、接受客户端请求、与 `sdd.py` 进行输入/输出交互,并将输出作为响应发送给客户端请求 |
### 2.2 编写 sdd.py 文件
`sdd.py` 文件应包含加载模型并返回给定图像预测结果的逻辑。具体步骤如下:
1. 创建模型类:
```python
from torch_snippets import *
class SDD(nn.Module):
classes = ['defect', 'non_defect']
def __init__(self, model, device='cpu'):
super().__init__()
self.model = model.to(device)
self.device = device
```
2. 定义 forward 方法:
```python
@torch.no_grad()
def forward(self, x):
x = x.view(-1, 3, 224, 224).to(device)
pred = self.model(x)
conf = pred[0][0]
clss = np.where(conf.item() < 0.5, 'non_defect', 'defect')
print(clss)
return clss.item()
```
3. 定义 predict 方法:
```python
def predict(self, image):
im = (image[:, :, ::-1])
im = cv2.resize(im, (224, 224))
im = torch.tensor(im / 255)
im = im.permute(2, 0, 1).float()
clss = self.forward(im)
return {"class": clss}
```
### 2.3 编写 server.py 文件
`server.py` 文件用于将用户请求与 PyTorch 模型连接起来,具体步骤如下:
1. 加载库:
```python
import os, io
from sdd import SDD
from PIL import Image
from fastapi import FastAPI, Request, File, UploadFile
```
2. 加载模型:
```python
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = SDD(torch.load('sdd.weights.pth', map_location=device))
```
3. 创建应用模型:
```python
app = FastAPI()
```
4. 创建 URL:
```python
@app.post("/predict")
def predict(request: Request, file: UploadFile = File(...)):
content = file.file.read()
image = Image.open(io.BytesIO(content)).convert('L')
output = model.predict(image)
return output
```
### 2.4 运行服务器
#### 2.4.1 启动服务器
在包含 `sdd.py` 和 `server.py` 的文件夹中,打开新终端并运行以下命令:
```bash
$ uvicorn server:app
```
当看到 `Uvicorn running on ...` 消息时,表明服务器已启动并运行。
#### 2.4.2 获取预测结果
在另一个新终端中运行以下命令,以获取 `/home/me/Pictures/defect.png` 图像的预测结果:
```bash
$ curl -X POST "http://127.0.0.1:8000/predict" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "file=@/home/me/Pictures/defect.png;type=image/png"
```
该命令的主要组成部分如下:
- **REST API 方法**:使用 POST 方法,表示要向服务器发送自己的数据。
- **URL - 服务器地址**:服务器主机 URL 为 `http://127.0.0.1:8000/`(本地服务器,默认端口为 8000),`/predict/` 是客户端用于创建 POST 请求的路由。
0
0
复制全文
相关推荐










