Pytorch模型训练与在线部署

本文涉及的产品
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 本文以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+LLaMA Factory微调Qwen2-VL模型,搭建文旅领域知识问答机器人
使用PAI和LLaMA Factory框架,基于全参方法微调 Qwen2-VL模型,使其能够进行文旅领域知识问答,同时通过人工测试验证了微调的效果。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
2月前
|
机器学习/深度学习 数据采集 人工智能
PyTorch学习实战:AI从数学基础到模型优化全流程精解
本文系统讲解人工智能、机器学习与深度学习的层级关系,涵盖PyTorch环境配置、张量操作、数据预处理、神经网络基础及模型训练全流程,结合数学原理与代码实践,深入浅出地介绍激活函数、反向传播等核心概念,助力快速入门深度学习。
186 1
|
3月前
|
人工智能 自然语言处理 运维
【新模型速递】PAI-Model Gallery云上一键部署Kimi K2模型
月之暗面发布开源模型Kimi K2,采用MoE架构,参数达1T,激活参数32B,具备强代码能力及Agent任务处理优势。在编程、工具调用、数学推理测试中表现优异。阿里云PAI-Model Gallery已支持云端部署,提供企业级方案。
299 0
【新模型速递】PAI-Model Gallery云上一键部署Kimi K2模型
|
6月前
|
机器学习/深度学习 PyTorch API
PyTorch量化感知训练技术:模型压缩与高精度边缘部署实践
本文深入探讨神经网络模型量化技术,重点讲解训练后量化(PTQ)与量化感知训练(QAT)两种主流方法。PTQ通过校准数据集确定量化参数,快速实现模型压缩,但精度损失较大;QAT在训练中引入伪量化操作,使模型适应低精度环境,显著提升量化后性能。文章结合PyTorch实现细节,介绍Eager模式、FX图模式及PyTorch 2导出量化等工具,并分享大语言模型Int4/Int8混合精度实践。最后总结量化最佳策略,包括逐通道量化、混合精度设置及目标硬件适配,助力高效部署深度学习模型。
998 21
PyTorch量化感知训练技术:模型压缩与高精度边缘部署实践
|
4月前
|
机器学习/深度学习 PyTorch 测试技术
从训练到推理:Intel Extension for PyTorch混合精度优化完整指南
PyTorch作为主流深度学习框架,凭借动态计算图和异构计算支持,广泛应用于视觉与自然语言处理。Intel Extension for PyTorch针对Intel硬件深度优化,尤其在GPU上通过自动混合精度(AMP)提升训练与推理性能。本文以ResNet-50在CIFAR-10上的实验为例,详解如何利用该扩展实现高效深度学习优化。
266 0
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
Cosmos on PAI系列一:PAI-Model Gallery云上一键部署NVIDIA Cosmos Reason-1
本篇文章介绍 Cosmos 最新世界基础模型 Cosmos Reason-1 如何在阿里云人工智能平台 PAI 上进行快速部署使用。
|
2月前
|
机器学习/深度学习 存储 PyTorch
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
Neural ODE将神经网络与微分方程结合,用连续思维建模数据演化,突破传统离散层的限制,实现自适应深度与高效连续学习。
154 3
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
|
1月前
|
边缘计算 人工智能 PyTorch
130_知识蒸馏技术:温度参数与损失函数设计 - 教师-学生模型的优化策略与PyTorch实现
随着大型语言模型(LLM)的规模不断增长,部署这些模型面临着巨大的计算和资源挑战。以DeepSeek-R1为例,其671B参数的规模即使经过INT4量化后,仍需要至少6张高端GPU才能运行,这对于大多数中小型企业和研究机构来说成本过高。知识蒸馏作为一种有效的模型压缩技术,通过将大型教师模型的知识迁移到小型学生模型中,在显著降低模型复杂度的同时保留核心性能,成为解决这一问题的关键技术之一。
|
3月前
|
PyTorch 算法框架/工具 异构计算
PyTorch 2.0性能优化实战:4种常见代码错误严重拖慢模型
我们将深入探讨图中断(graph breaks)和多图问题对性能的负面影响,并分析PyTorch模型开发中应当避免的常见错误模式。
252 9
|
3月前
|
人工智能 自然语言处理 运维
【新模型速递】PAI-Model Gallery云上一键部署gpt-oss系列模型
阿里云 PAI-Model Gallery 已同步接入 gpt-oss 系列模型,提供企业级部署方案。
|
5月前
|
机器学习/深度学习 存储 PyTorch
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
本文通过使用 Kaggle 数据集训练情感分析模型的实例,详细演示了如何将 PyTorch 与 MLFlow 进行深度集成,实现完整的实验跟踪、模型记录和结果可复现性管理。文章将系统性地介绍训练代码的核心组件,展示指标和工件的记录方法,并提供 MLFlow UI 的详细界面截图。
256 2
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统

热门文章

最新文章

相关产品

  • 人工智能平台 PAI
  • 推荐镜像

    更多