深度学习笔记(4)模型部署和实用
文章目录
一、环境部署
1. 模型加载和预处理
1,flask:
安装:
conda activate 环境名
pip install flask
2.导入常用的库
import io# 二进制数据处理
import json# json数据处理
# 安装所需工具包
import flask# 服务框架
import torch
import torch# pytorch
import torch.nn.functional as F#这行代码的作用是导入 PyTorch 的神经网络(nn)模块中的功能性API,并将其重命名为 F。torch.nn.functional 模块包含了许多在构建和训练神经网络时常用的函数,这些函数通常是无状态的,也就是说它们不需要存储任何状态(比如模型参数)。因此,这些函数可以被用来构建更加复杂的网络结构,比如自定义的损失函数、激活函数等。
from PIL import Image# 图像处理
from torch import nn
from torchvision import transforms as T# 图像处理
from torchvision.models import resnet50# resnet50模型
from torch.autograd import Variable #自动求导
3.初始化flask
# 初始化Flask app
app = flask.Flask(__name__)#初始化一个Flask对象
model = None#模型初始化
use_gpu = True#是否使用gpu,这里默认使用
# 返回结果用的
with open('imagenet_class.txt', 'r') as f:#打开文件,读取文件,举例的文件这里面存的是类别的标签,id和label的对应关系
idx2label = eval(f.read()) #读取文件内容,转换为字典
注意这里遇到两个坑with open('imagenet_class.txt', 'r') as f:
这句代码在 我的系统上会报错FileNotFoundError: [Errno 2] No such file or directory: 'imagenet_class.txt'
于是我改成了绝对路径H:\develop\NLP\Modelinstall\pytorhModel\deploy-pytorch-model-master\imagenet_class.txt 报错SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 10-11: malformed \N character escape
这个错误通常发生在 Python 中处理文件路径时,特别是在字符串字面量中使用了反斜杠(\)字符。在 Python 字符串中,反斜杠用作转义字符,这可能会导致问题,尤其是在 Windows 文件路径中。于是最后我改成了with open('H:/develop/NLP/Modelinstall/pytorhModel/deploy-pytorch-model-master/imagenet_class.txt', 'r') as f:
解决。
# 初始化Flask app
app = flask.Flask(__name__)#初始化一个Flask对象
model = None#模型初始化
use_gpu = True#是否使用gpu,这里默认使用
4.加载模型
(随便找个模型试验 ) resnet50 是预训练模型 这里加载一下。
def load_model():
"""Load the pre-trained model, you can use your model just as easily.
"""
global model#全局变量,因为后面也要用
model = resnet50(pretrained=True)#加载预训练模型 pretrained=True就是所有权重的参数都下载下来。
model.eval()#.eval就是一个测试的模型
if use_gpu:
model.cuda()#如果用gpu就用cuda执行
如果下载速度慢的话放在C:\Users\用户名.cache\torch\hub\checkpoints里就可以了
5.数据预处理
这个不同的模型各不相同。
6.开启服务
@app.route("/predict", methods=["POST"])
使用 Flask 框架定义的一个路由。这个路由对应于一个名为 predict 的端点,它只接受 HTTP POST 请求。一旦应用运行,你就可以向 http://localhost:5000/predict 发送 POST 请求来测试这个端点。
def predict():
# Initialize the data dictionary that will be returned from the view.
data = {"success": False}
我们调用 predict 函数,并将结果存储在 response_data 变量中。如果预测成功,更新 ‘data’ 字典 data[“success”] = True
if flask.request.method == 'POST':#如果是post请求
if flask.request.files.get("image"):#如果请求中有image文件
# Read the image in PIL format
image = flask.request.files["image"].read()
image = Image.open(io.BytesIO(image)) #二进制数据
image = prepare_image(image, target_size=(224, 224))#读数据然后进行上面的预处理操作
preds = F.softmax(model(image), dim=1)#如果之前处理没有softmax操作在这里做下softmax
results = torch.topk(preds.cpu().data, k=3, dim=1)#取前几个概率,这里k=3 就是前三个
results = (results[0].cpu().numpy(), results[1].cpu().numpy())
data['predictions'] = list()
# 遍历结果,并将它们添加到返回的预测列表中。
for prob, label in zip(results[0][0], results[1][0]):
label_name = idx2label[label]#根据label找到对应的类别
data["success"] = True#标签改成true
return flask.jsonify(data)#返回json格式的数据
二、怎么使用
没做前端,用命令行模式展示
进入环境,cd到你代码所在路径,我是:
H:\develop\NLP\Modelinstall\pytorhModel\deploy-pytorch-model-master
先进入环境conda activate NLP
输入
H:
CD develop\NLP\Modelinstall\pytorhModel\deploy-pytorch-model-master
执行下服务
python run_pytorch_server.py
PyTorch_REST_API_URL = 'http://127.0.0.1:5000/predict'
def predict_result(image_path):
# Initialize image path
image = open(image_path, 'rb').read()#读取图片
payload = {'image': image}#图片数据
r = requests.post(PyTorch_REST_API_URL, files=payload).json()#发送post请求
if r['success']:#如果请求成功
for (i, result) in enumerate(r['predictions']):
print('{}. {}: {:.4f}'.format(i + 1, result['label'],
result['probability']))#打印结果
# Otherwise, the request failed.
else:
print('Request failed')
然后配置形参,输入图片的路径
结果如下
在运行自己的模型的时候,有以下几个地方要改
1.你自己的模型,你要加进来
def load_model():
"""Load the pre-trained model, you can use your model just as easily.
"""
global model#全局变量,因为后面也要用
model = resnet50(pretrained=True)#加载预训练模型 pretrained=True就是所有权重的参数都下载下来。
model.eval()#.eval就是一个测试的模型
if use_gpu:
model.cuda()#如果用gpu就用cuda执行
2.预处理
3.得到的结果
三、docker
1.安装docker
去docker官网下载安装,下载后的docker 是英文版
去https://github.com/asxez/DockerDesktop-CN下载汉化包,安装汉化包步骤
1.关闭Docker Desktop
2.在Docker安装目录(Windows下默认为C:\Program Files\Docker\Docker\frontend\resources)找到app.asar文件并将其备份,防止出现意外。
3.将从本仓库下载的asar文件改名为app.asar后替换原文件
安装后在cmd下输入docker version出现版本信息就证明安装成功了
docker info可以查看信息
2.docker hub
默认是官网,但是会非常慢。
所以一般都是配置国内源,阿里云镜像
登陆https://www.aliyun.com/注册开发账号
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 镜像配置 镜像配置
点镜像加速器并复制地址
打开docker desktop ->设置->docker引擎,代码修改为
{
"registry-mirrors": [
"https://你的网址",
"https://mirror.ccs.tencentyun.com"
]
}
重启docker
注意阿里云可能抽风,不行的话就只能梯子了、
3 docker命令和实际pull
docker images 查看镜像
想用什么镜像去docker hub搜索,比如pytorch
也可以利用github来拉取镜像
阿里云——>容器镜像服务–>个人实实例—>创建命名空间
在txt上先编辑这几个ALIYUN_NAME_SPACE 你命名空间的名字
ALIYUN_REGISTRY_USER 访问凭证里$ sudo docker login --username=后面的一串
ALIYUN_REGISTRY 访问凭证里你用户名后面那一长串
ALIYUN_REGISTRY_PASSWORD 那设置的密码
然后去github fork https://github.com/hanliu2003/docker_image_pusher
然后选Settings——>Actions secrets and variables 添加上面四个变量
然后去code那里
docker_image_pusher
/images.txt
添加自己想用的镜像
然后run这个action后去自己的阿里云镜像仓库看,镜像就在里面了
然后进入这个镜像,从Registry中拉取镜像复制命令,然后去查看版本号,就可以用命令拉取镜像了
拉取的镜像到本地后可以改名格式是docker tag [老镜像名称]:[老镜像版本][新镜像名称]:[新镜像版本]
比如我命名的是pytorch 那么在cmd里运行docker run -it pytorch
docker run --gpus all -it --rm -p 8888:8888 pytorch /bin/bash 就是指定端口
pip install jupyter 安装朱庇特
jupyter notebook --ip=0.0.0.0 --allow-root 运行
将自己的docker上传到云
docker login --username=aliyun5049531880 crpi-n6kr3hc50k43ri5o.cn-chengdu.personal.cr.aliyuncs.com
输入密码
然后输入docker images查看自己的id
docker tag [ID] crpi-n6kr3hc50k43ri5o.cn-chengdu.personal.cr.aliyuncs.com/hl_image/hl_pytorch:[镜像版本号]比如我的版本是1.0就是
docker tag 11691e035a36 crpi-n6kr3hc50k43ri5o.cn-chengdu.personal.cr.aliyuncs.com/hl_image/hl_pytorch:1.0
docker push crpi-n6kr3hc50k43ri5o.cn-chengdu.personal.cr.aliyuncs.com/hl_image/hl_pytorch:1.0