You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

模型相同输入预测结果不一致,加载时遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:45:15