模型相同输入预测结果不一致,加载时遇pytorch_model.bin无法打开错误
问题分析与解决方案
核心原因
出现RuntimeError: File test/CustomModel\pytorch_model.bin cannot be opened的主要原因集中在路径不规范、目标目录不存在、并发场景下的资源竞争这三点。
具体修复步骤
1. 统一路径生成方式,避免跨平台斜杠冲突
代码中混用了/和\,不同操作系统对路径分隔符处理逻辑不同,直接拼接字符串会导致路径无效。改用os.path.join生成标准路径:
import os # 替换保存和加载的路径代码 model_dir = os.path.join(username, "CustomModel") with lock: model.save_pretrained(model_dir) with lock: model = BertForSequenceClassification.from_pretrained(model_dir)
2. 确保保存目录存在
save_pretrained不会自动创建不存在的目录,保存前需检查并创建目录:
import os model_dir = os.path.join(username, "CustomModel") # 递归创建目录(包括父目录) os.makedirs(model_dir, exist_ok=True) with lock: model.save_pretrained(model_dir)
3. 强化并发场景下的锁机制
当前锁仅覆盖了模型保存和加载,但预测函数predict_label中getmodelfromusername可能正在读取模型文件,会和训练时的写入操作冲突。需要将所有涉及模型读写的操作都纳入锁保护:
修改预测函数:
def predict_label(text, username): with lock: model = getmodelfromusername(username) input_ids = tokenizer(text, padding=True, truncation=True, max_length=500, return_tensors="pt") logits = model(**input_ids)[0] probs = torch.nn.functional.softmax(logits, dim=1) return probs
优化训练函数的锁范围:
将模型训练后的保存、加载、更新操作合并到同一个锁块中,减少锁的切换次数,避免中间状态的竞争:
def train_and_update_model(model, parseddata, code, username, number): optimizer = torch.optim.AdamW(model.parameters(), lr=4e-5) lr_scheduler = get_scheduler( name="linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=2 ) input_ids = torch.tensor([tokenizer.encode(str(parseddata), add_special_tokens=True)]) labels = torch.tensor([number]) model.train(mode=True) for i in range(2): outputs = model(input_ids, labels=labels) loss = outputs[0] loss.backward() optimizer.step() lr_scheduler.step() optimizer.zero_grad() # 合并锁块,统一处理模型保存、加载与更新 model_dir = os.path.join(username, "CustomModel") os.makedirs(model_dir, exist_ok=True) with lock: model.save_pretrained(model_dir) model = BertForSequenceClassification.from_pretrained(model_dir) changemodelwithcode(code, model)
4. 检查文件权限
确保运行程序的进程拥有username目录的读写权限,避免因权限不足导致文件无法创建或写入。
内容的提问来源于stack exchange,提问作者tidekis doritos
相关产品推荐
相关产品推荐

