Pytorch模型训练与在线部署

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 本文以CIFAR10数据集为例,通过自定义神经元网络,完成模型的训练,并通过Flask完成模型的在线部署与调用,考略到实际生产模型高并发调用的述求,使用service_streamer提升模型在线并发能力。

一、训练模型

# 1. 加载并标准化数据集importtorchimporttorchvisionimporttorchvision.transformsastransformsimportsslssl._create_default_https_context=ssl._create_unverified_contexttransform=transforms.Compose(
    [transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
batch_size=4trainset=torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader=torch.utils.data.DataLoader(trainset, batch_size=batch_size,
shuffle=True, num_workers=0)
testset=torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader=torch.utils.data.DataLoader(testset, batch_size=batch_size,
shuffle=False, num_workers=0)
classes= ('plane', 'car', 'bird', 'cat',
'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
# 作图展示部分数据集样例importmatplotlib.pyplotaspltimportnumpyasnpdefimshow(img):
img=img/2+0.5npimg=img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show()
# 随机获取部分样例数据dataiter=iter(trainloader)
images, labels=next(dataiter)
# show imagesimshow(torchvision.utils.make_grid(images))
# print labelsprint(' '.join(f'{classes[labels[j]]:5s}'forjinrange(batch_size)))
# 2. 定义神经网络importtorch.nnasnnimporttorch.nn.functionalasFclassNet(nn.Module):
def__init__(self):
super().__init__()
self.conv1=nn.Conv2d(3, 6, 5)
self.pool=nn.MaxPool2d(2, 2)
self.conv2=nn.Conv2d(6, 16, 5)
self.fc1=nn.Linear(16*5*5, 120)
self.fc2=nn.Linear(120, 84)
self.fc3=nn.Linear(84, 10)
defforward(self, x):
x=self.pool(F.relu(self.conv1(x)))
x=self.pool(F.relu(self.conv2(x)))
x=torch.flatten(x, 1) # flatten all dimensions except batchx=F.relu(self.fc1(x))
x=F.relu(self.fc2(x))
x=self.fc3(x)
returnxnet=Net()
# 3. 定义损失函数和优化器importtorch.optimasoptimcriterion=nn.CrossEntropyLoss()
optimizer=optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
# 4. 训练神经网络forepochinrange(2):  # loop over the dataset multiple timesrunning_loss=0.0fori, datainenumerate(trainloader, 0):
# get the inputs; data is a list of [inputs, labels]inputs, labels=data# zero the parameter gradientsoptimizer.zero_grad()
# forward + backward + optimizeoutputs=net(inputs)
loss=criterion(outputs, labels)
loss.backward()
optimizer.step()
# print statisticsrunning_loss+=loss.item()
ifi%2000==1999:    # print every 2000 mini-batchesprint(f'[{epoch+1}, {i+1:5d}] loss: {running_loss/2000:.3f}')
running_loss=0.0print('Finished Training')
# 保存模型PATH='./cifar_net.pth'torch.save(net.state_dict(), PATH)

二、使用本地图片测试模型

importtorch.nnasnnimporttorch.nn.functionalasFimporttorchimporttorchvision.transformsastransformsimportiofromPILimportImageclassNet(nn.Module):
def__init__(self):
super().__init__()
self.conv1=nn.Conv2d(3, 6, 5)
self.pool=nn.MaxPool2d(2, 2)
self.conv2=nn.Conv2d(6, 16, 5)
self.fc1=nn.Linear(16*5*5, 120)
self.fc2=nn.Linear(120, 84)
self.fc3=nn.Linear(84, 10)
defforward(self, x):
x=self.pool(F.relu(self.conv1(x)))
x=self.pool(F.relu(self.conv2(x)))
x=torch.flatten(x, 1) # flatten all dimensions except batchx=F.relu(self.fc1(x))
x=F.relu(self.fc2(x))
x=self.fc3(x)
returnx# 加载网络模型参数PATH='./cifar_net.pth'net=Net()
net.load_state_dict(torch.load(PATH))
transform=transforms.Compose(
    [transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
deftransform_image(image_bytes):
my_transforms=transforms.Compose([transforms.Resize(255),
transforms.CenterCrop(32),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
image=Image.open(io.BytesIO(image_bytes))
returnmy_transforms(image).unsqueeze(0)
file=open('cat.jpg', 'rb')
img_bytes=file.read()
tensor=transform_image(image_bytes=img_bytes)
outputs=net(tensor)
classes= ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
_, predicted=torch.max(outputs, 1)
print('Predicted: ', ' '.join(f'{classes[predicted[j]]:5s}'forjinrange(1)))
  • 运行效果

图片.png

三、Flask 在线模型服务

fromflaskimportFlaskimportsslssl._create_default_https_context=ssl._create_unverified_contextimportioimportjsonimporttorchfromtorchvisionimportmodelsfromtorchvisionimporttransformsfromPILimportImageapp=Flask(__name__)
imagenet_class_index=json.load(open('./imagenet_class_index.json'))
model=models.densenet121(pretrained=True)
model.eval()
device='cpu'deftransform_image(image_bytes):
my_transforms=transforms.Compose([transforms.Resize(255),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(
                                            [0.485, 0.456, 0.406],
                                            [0.229, 0.224, 0.225])])
image=Image.open(io.BytesIO(image_bytes))
returnmy_transforms(image).unsqueeze(0)
defget_prediction(image_bytes):
tensor=transform_image(image_bytes=image_bytes)
outputs=model.forward(tensor)
_, y_hat=outputs.max(1)
predicted_idx=str(y_hat.item())
returnimagenet_class_index[predicted_idx]
@app.route('/predict', methods=['POST'])
defpredict():
ifrequest.method=='POST':
file=request.files['file']
img_bytes=file.read()
class_id, class_name=get_prediction(image_bytes=img_bytes)
returnjsonify({'class_id': class_id, 'class_name': class_name})
defbatch_prediction(image_bytes_batch):
image_tensors= [transform_image(image_bytes=image_bytes) forimage_bytesinimage_bytes_batch]
tensor=torch.cat(image_tensors).to(device)
outputs=model.forward(tensor)
_, y_hat=outputs.max(1)
predicted_ids=y_hat.tolist()
return [imagenet_class_index[str(i)] foriinpredicted_ids]
fromflaskimportjsonify, requestfromservice_streamerimportThreadedStreamerstreamer=ThreadedStreamer(batch_prediction, batch_size=64)
@app.route('/stream_predict', methods=['POST'])
defstream_predict():
ifrequest.method=='POST':
file=request.files['file']
img_bytes=file.read()
class_id, class_name=streamer.predict([img_bytes])[0]
returnjsonify({'class_id': class_id, 'class_name': class_name})
if__name__=='__main__':
app.run()

四、调用在线模型

importrequestsresp=requests.post("http://localhost:5000/stream_predict",
files={"file": open('dog.jpg','rb')})
print(resp.json())
  • 链接效果

图片.png

参考链接

Vision Recognition Service with Flask and service streamer

通过带Flask的REST API在Python中部署PyTorch

TRAINING A CLASSIFIER

相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
2月前
|
算法 PyTorch 算法框架/工具
Pytorch学习笔记(九):Pytorch模型的FLOPs、模型参数量等信息输出(torchstat、thop、ptflops、torchsummary)
本文介绍了如何使用torchstat、thop、ptflops和torchsummary等工具来计算Pytorch模型的FLOPs、模型参数量等信息。
359 2
|
25天前
|
人工智能 JSON 算法
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
阿里云的人工智能平台 PAI,作为一站式、 AI Native 的大模型与 AIGC 工程平台,为开发者和企业客户提供了 Qwen2.5-Coder 系列模型的全链路最佳实践。本文以Qwen2.5-Coder-32B为例,详细介绍在 PAI-QuickStart 完成 Qwen2.5-Coder 的训练、评测和快速部署。
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
|
19天前
|
机器学习/深度学习 人工智能 PyTorch
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
本文探讨了Transformer模型中变长输入序列的优化策略,旨在解决深度学习中常见的计算效率问题。文章首先介绍了批处理变长输入的技术挑战,特别是填充方法导致的资源浪费。随后,提出了多种优化技术,包括动态填充、PyTorch NestedTensors、FlashAttention2和XFormers的memory_efficient_attention。这些技术通过减少冗余计算、优化内存管理和改进计算模式,显著提升了模型的性能。实验结果显示,使用FlashAttention2和无填充策略的组合可以将步骤时间减少至323毫秒,相比未优化版本提升了约2.5倍。
35 3
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
|
1月前
|
人工智能 边缘计算 JSON
DistilQwen2 蒸馏小模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
本文详细介绍在 PAI 平台使用 DistilQwen2 蒸馏小模型的全链路最佳实践。
|
1月前
|
并行计算 监控 搜索推荐
使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程
当处理大规模图数据时,复杂性难以避免。PyTorch-BigGraph (PBG) 是一款专为此设计的工具,能够高效处理数十亿节点和边的图数据。PBG通过多GPU或节点无缝扩展,利用高效的分区技术,生成准确的嵌入表示,适用于社交网络、推荐系统和知识图谱等领域。本文详细介绍PBG的设置、训练和优化方法,涵盖环境配置、数据准备、模型训练、性能优化和实际应用案例,帮助读者高效处理大规模图数据。
51 5
|
2月前
|
机器学习/深度学习 自然语言处理 监控
利用 PyTorch Lightning 搭建一个文本分类模型
利用 PyTorch Lightning 搭建一个文本分类模型
69 8
利用 PyTorch Lightning 搭建一个文本分类模型
|
2月前
|
机器学习/深度学习 自然语言处理 数据建模
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
本文深入探讨了Transformer模型中的三种关键注意力机制:自注意力、交叉注意力和因果自注意力,这些机制是GPT-4、Llama等大型语言模型的核心。文章不仅讲解了理论概念,还通过Python和PyTorch从零开始实现这些机制,帮助读者深入理解其内部工作原理。自注意力机制通过整合上下文信息增强了输入嵌入,多头注意力则通过多个并行的注意力头捕捉不同类型的依赖关系。交叉注意力则允许模型在两个不同输入序列间传递信息,适用于机器翻译和图像描述等任务。因果自注意力确保模型在生成文本时仅考虑先前的上下文,适用于解码器风格的模型。通过本文的详细解析和代码实现,读者可以全面掌握这些机制的应用潜力。
119 3
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
|
1月前
|
机器学习/深度学习 数据采集 Python
从零到一:手把手教你完成机器学习项目,从数据预处理到模型部署全攻略
【10月更文挑战第25天】本文通过一个预测房价的案例,详细介绍了从数据预处理到模型部署的完整机器学习项目流程。涵盖数据清洗、特征选择与工程、模型训练与调优、以及使用Flask进行模型部署的步骤,帮助读者掌握机器学习的最佳实践。
111 1
|
3月前
|
并行计算 PyTorch 算法框架/工具
基于CUDA12.1+CUDNN8.9+PYTORCH2.3.1,实现自定义数据集训练
文章介绍了如何在CUDA 12.1、CUDNN 8.9和PyTorch 2.3.1环境下实现自定义数据集的训练,包括环境配置、预览结果和核心步骤,以及遇到问题的解决方法和参考链接。
164 4
基于CUDA12.1+CUDNN8.9+PYTORCH2.3.1,实现自定义数据集训练
|
3月前
|
机器学习/深度学习 PyTorch 调度
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
在深度学习中,学习率作为关键超参数对模型收敛速度和性能至关重要。传统方法采用统一学习率,但研究表明为不同层设置差异化学习率能显著提升性能。本文探讨了这一策略的理论基础及PyTorch实现方法,包括模型定义、参数分组、优化器配置及训练流程。通过示例展示了如何为ResNet18设置不同层的学习率,并介绍了渐进式解冻和层适应学习率等高级技巧,帮助研究者更好地优化模型训练。
202 4
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型

相关产品

  • 人工智能平台 PAI
  • 下一篇
    DataWorks