踩坑小记:LLM训练后的模型精度保存问题

在基于 Qwen2.5-coder 模型进行继续预训练(continual pre-trian)后,保存的模型权重,多了整整一倍(原始 Qwen2.5-coder 的 3b 模型是 5 个 GB,训练后保存的 safetensor 体积是 10 多个 GB)。刚训练完就发现这个问题了,由于用 vllm 加载是能正常推理的且当时有些其他事情,就搁置没处理,这两天要准备部署相关的事情,就调查一下模型权重异常的问题。

有两个可能的因素会导致模型权重在训练前后发生变化:

  1. 权重中为 0 的值的数量发生了变化
  2. 保存的精度发生了变化

第一个原因不太可能导致整个模型的体积增倍,所以优先调查模型保存精度的问题。
Qwen2.5 系列模型应该使用的 fp16 精度来保存,我先使用了如下代码打印模型的精度:

from transformers import AutoModelmodel = AutoModel.from_pretrained("PATH")
print(model)
with open("qwen2.5-coder-3b-model_parameters.txt", "w") as f:for name, param in model.named_parameters():f.write(f"Layer: {name}\n")f.write(f"Shape: {param.shape}\n")f.write(f"Dtype: {param.dtype}\n")f.write(f"Number of parameters: {param.numel()}\n")f.write("---\n")

运行后发现训练前后的 Shape 和 Dtype 都是完全相同的,这就说不通了,莫非是 from_pretrained 方法默认指定了加载精度(torch_dtype)?

换一个方式查看模型的精度:

from safetensors import safe_openwith safe_open("PATH.safetensors", framework="pt") as f:for tensor_name in f.keys():tensor = f.get_tensor(tensor_name)print(f"Tensor: {tensor_name}")print(f"Data type: {tensor.dtype}")

果然结果发生了变化:

#训练前的精度
Data type: torch.bfloat16# 训练后的精度
Data type: torch.float32

由于训练框架使用的是 llama-facotry,所以先检查训练参数有没有问题。目前只能查到一个训练参数是跟精度有关的:

bf16: true

但显然结果没有按预期的来,要么是有什么参数没有配置,要么就是 llama-factory 的 bug。

先简单地转换一下精度:

from transformers import AutoModel
import safetensors.torchmodel = AutoModel.from_pretrained("PATH")
model = model.half()
safetensors.torch.save_file(model.state_dict(), 'new_model.safetensors')

但这样出来的模型有两个问题:

  1. 模型精度是 fp16,虽然用于推理没问题,但是要后续继续训练的话,就需要是 bf16,不容易出现梯度消失或爆炸,更稳定
  2. 模型只有单个 safetensor 文件,不方便使用

换一种方式保存:

import torch
from transformers import Qwen2ForCausalLMpath = "PATH"
model = Qwen2ForCausalLM.from_pretrained(path)
model = model.to(dtype=torch.bfloat16)
model.save_pretrained("NEW_PATH")

这样保存的结果是一个文件夹,包含了 safetensor, config.json, generation_config.json 等主要的文件,可以用 vllm 直接推理。但是当我去运行推理的时候,vllm 又报错了:

OSError: Can't load tokenizer for '...'. If you were trying to load it from 'https://huggingface.co/models', ma  ke sure you don't have a local directory with the same name. Otherwise, make sure '...' is the correct path to   a directory containing all relevant files for a Qwen2TokenizerFast tokenizer.

好吧,tokenizer 也是需要单独保存的,修改代码如下:

import torch
from transformers import AutoTokenizer, Qwen2ForCausalLMpath = "PATH"
model = Qwen2ForCausalLM.from_pretrained(path)
tokenizer = AutoTokenizer.from_pretrained(path)
model = model.to(dtype=torch.bfloat16)
model.save_pretrained("NEW_PATH")
tokenizer.save_pretrained("NEW_PATH")

这样改下来,模型就能顺利使用 vllm 加载推理了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881795.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

男人八题-点分治-Acwing252.树

Acwing252.树题目分析 树中的路径分为三种路径两端在同一个子树 路径两端在不同子树 路径有一端是重心因此可以分情况处理, 对于第一种情况可以进行递归处理, 第二种情况需要使用容斥原理求得(下面重点介绍), 第三种情况枚举重心到其他节点的路径就可以求得 代码分析 求子树大小…

【验证码逆向专栏】最新某验四代动态参数逆向详解

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术…

DeepSeek:AI界的“东方海啸”

嘿,大家有没有听说过DeepSeek?这个AI界的新星正在掀起一场“东方海啸”!让我们一起来看看它是如何改变游戏规则的。 一、技术革新:从参数到生态 想象一下,一个AI模型的参数从2360亿飙升到6710亿,训练成本却只有557.6万美元!这就是DeepSeek的魔力。你觉得这有多疯狂? 他…

007 数组扩展_新增方法

1、Array.from()Array.from方法用于将数组转为真正的数组温馨提示:常见的类数组有三类:①arguments②元素集合③类似数组的对象①argumentsfunction add(){let collect =Array.from(arguments);collect.push(40);console.log(collect);}add(10,20,30)②元素集合let divs=docu…

360度绩效考核法实例分析

某公司打算在2025年的上半年引进360度绩效考核体系,于是公司管理者就命令人力资源部制定出相应的考核体系实施方案。人力资源部根据360度绩效考核体系实施要点,并结合本公司内部实际情况,制定出了一套适用于本公司的360度绩效考核体系,具体内容如下: (一)确定考核队伍 考…

idea 远程断点

jar启动命令添加以下命令 0.0.0.0:端口号 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005idea中新增远程jvm调试

Star 4w+,Apache Dubbo 3.3 全新发布,Triple X 领衔,开启微服务通信新时代

在 Apache Dubbo 突破 4w Star 之际,Apache Dubbo 团队正式宣布,Dubbo 3.3 正式发布!作为全球领先的开源微服务框架,Dubbo 一直致力于为开发者提供高性能、可扩展且灵活的分布式服务解决方案。此次发布的 Dubbo 3.3,通过 Triple X 的全新升级,突破了以往局限,实现了对南…

1次搞懂大模型备案被驳回原因!

大模型备案被驳回的原因一、语料安全不合规 1、语料来源未合法授权 语料需确保来源合法,包括开源协议、商业授权或自采数据的合规性。若语料中包含未授权的版权内容(如使用他人知识产权作品作为训练数据),或涉及未获授权的个人信息,将直接导致备案被驳回。 示例:某企业因…

内外网安全文件交换系统:突破网络屏障,筑牢数据安全防线

内外网安全文件交换系统:突破网络屏障,筑牢数据安全防线在数字化浪潮蓬勃发展的当下,企业对于数据安全保障以及高效文件传输机制的需求日益凸显。特别是在内外网实施物理隔离的网络架构下,如何达成安全、便捷的文件交换操作,已然成为众多企业亟待攻克的关键难题。本内外网…

利用排列序列提升游戏动画的真实感

在游戏开发中,我们经常需要处理重复的动画序列,以增加游戏的真实感。例如,在海战游戏中,我们可能会有一组军舰停泊在港湾,它们的桅杆或甲板时不时地需要摇晃,以模拟海风的影响。实现这种效果有多种方法,例如完全随机选择某艘军舰播放动画,或者按照固定的顺序依次播放。…

最小表示(字符串和树)学习笔记

字符串的最小表示法 由来 字符串有时需要进行“旋转”,即一个一个把尾部元素放到前面。那么,我们怎么知道一个字符串是不是另一个字符串旋转过来的呢? 我们发现,这种旋转其实相当于把字符串首尾相接成环,然后取不同的起点重新组成字符串。在这些能够组成的字符串中,字典序…

破解风电远程监控难题:EtherNet/IP转Modbus TCP配置大揭秘

EtherNet/IP转Modbus TCP在新能源风力发电场远程监控与数据分析的配置案例一、案例背景 在风力发电场的中控室安装捷米特JM-EIPM-TCP网关,连接到风电场的局域网。确保风力发电机组的控制系统、变流器等采用 MODBUS TCP 协议的设备以及基于 EtherNet/IP 协议的远程监控系统和数…