pytorch教程(1.7)——保存和加载模型

本文介绍了如何在PyTorch中保存和加载模型权重,确保在推理时设置模型为评估模式。此外,还展示了如何将模型导出到ONNX格式,以便在不同平台和语言上进行推理。关键步骤包括使用state_dict保存和加载权重,以及使用torch.onnx.export导出到ONNX。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在本节中,我们将了解如何通过保存、加载和运行模型预测来保持模型状态。

import torch 
import torch.onnx as onnx 
import torchvision.models as models

保存和加载模型权重

PyTorch 模型将学习到的参数存储在名为 state_dict 的内部状态字典中。 这些可以通过 torch.save 方法持久化:

model = models.vgg16(pretrained=True)
torch.save(model.state_dict(), 'model_weights.pth')

要加载模型权重,您需要先创建相同模型的实例,然后使用 load_state_dict() 方法加载参数。

model = models.vgg16() # 我们不指定 pretrained=True,即不加载默认权重
model.load_state_dict(torch.load('model_weights.pth'))
model.eval()

一定要在推理之前调用 model.eval() 方法,以将 dropout 和批量归一化层设置为评估模式。 不这样做会产生不一致的推理结果。

保存和加载带有形状的模型

在加载模型权重时,我们需要先实例化模型类,因为该类定义了网络的结构。 我们可能希望将此类的结构与模型一起保存,在这种情况下,我们可以将模型(而不是 model.state_dict())传递给保存函数:

torch.save(model, 'model.pth')

然后我们可以像这样加载模型:

model = torch.load('model.pth')

这种方法在序列化模型时使用 Python pickle 模块,因此它依赖于加载模型时可用的实际类定义。

将模型导出到 ONNX

PyTorch 还具有本机 ONNX 导出支持。 然而,鉴于 PyTorch 执行图的动态特性,导出过程必须遍历执行图以生成持久化的 ONNX 模型。 出于这个原因,应该将适当大小的测试变量传递给导出例程(在我们的例子中,我们将创建一个正确大小的虚拟零张量):

input_image = torch.zeros((1,3,224,224))
onnx.export(model, input_image, 'model.onnx')

您可以使用 ONNX 模型做很多事情,包括在不同平台和不同编程语言上运行推理。 有关更多详细信息,我们建议访问 ONNX 教程。

### 关于AMD 5700G核显支持DeepSeek模型的运行要求与性能分析 #### 硬件概述 AMD Ryzen 5 5700G 配备了 Vega 8 图形处理器,拥有 8 个计算单元(CU),总计 512 个流处理器。其基础频率为 1.7 GHz,在增强模式下可达 2.1 GHz。尽管这款 APU 的图形性能足以满足大多数日常任务需求以及部分游戏体验,但对于深度学习工作负载而言仍存在一定局限性[^1]。 #### 模型选择依据硬件配置 根据之前提到的不同级别显存对应的推荐模型列表可以看出,当面对低于 2 GB 显存的情况时,最合适的选项将是 DeepSeek-R1-Distill-Llama-1.5B 模型。此版本经过高度压缩处理之后仅占用大约 1.1 GB 存储空间,并且能够在非常有限的资源条件下维持基本功能性运作[^1]。 #### 技术实施细节说明 为了使得 AMD 5700G 成功加载并执行上述提及的小型化变体形式之一——即 DeepSeek-R1-Distill-Qwen-1.5B ,需要遵循如下几个关键步骤: 1. **环境搭建** - 安装适用于 Linux 或 Windows 平台上的 ROCm SDK 及相应驱动程序。 - 设置好 Python 开发环境并通过 pip 工具引入必要依赖项如 PyTorch、Transformers 等库文件。 2. **量化技术应用** - 推荐采用 INT8 或者更低位宽的数据表示方法进一步降低内存负担同时提升运算速度。 - 在初始化模型实例过程中加入类似 `--quantization_approach bitsandbytes` 参数指令以便激活内置量化引擎。 3. **混合精度推理策略** - 启用 FP16/BF16 类型数值表达方式从而削减一半传统单精度浮点数所需的存储容量。 - 修改启动脚本添加类似于 `--dtype float16` 的定义语句确保整个流程按照半精度标准推进下去。 4. **内存管理优化措施** - 当遇到极端情况下仍然面临显存溢出风险的时候,则考虑开启 swap-out 功能允许临时将不常用数据移回主机 RAM 区域暂存起来等待后续再读取回来继续参与计算过程。 - 执行命令行工具例如 `ollama serve --low-vram` 来强制启用此类特性开关。 以下是针对上述指导原则编写的一份简化版Python代码片段用于演示如何正确加载指定名称下的预训练权重档案: ```python from transformers import AutoTokenizer, AutoModelForCausalLM import torch device = 'cuda' if torch.cuda.is_available() else 'cpu' tokenizer = AutoTokenizer.from_pretrained("deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B") model = AutoModelForCausalLM.from_pretrained( "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B", load_in_8bit=True, device_map="auto" ).to(device) def generate_text(prompt, max_length=50): inputs = tokenizer.encode(prompt, return_tensors='pt').to(device) outputs = model.generate(inputs, max_new_tokens=max_length) result = tokenizer.decode(outputs[0], skip_special_tokens=True) return result if __name__ == "__main__": prompt = "Once upon a time," generated_text = generate_text(prompt) print(generated_text) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leetteel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值