python中文分词-JSONDecodeError错误

本文详细解析了JSONDecodeError:额外数据错误的原因,通常发生在尝试多次写入同一个json文件时。文章提供了有效的解决方案,强调在重复运行程序前应先清除原有的json文件内容,避免连续写入引发的解析错误。

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

JSONDecodeError: Extra data: line 1 column 70 (char 69)
错误解析:JSONDecodeError:额外数据:第1行第70列(char 69)
你的json文件已经写入了内容,再次写入相同内容的时候,就会出现这样的错误

解决方案:

需要注意的是每次运行程序结束,如若需要再次运行时,要删除已生成的json文件再来运行程序,否则会继续对原文件写入内容,出现解析错误。

 model = './hmm_model.json'
    if os.path.exists(model):
        f = open(model, 'rb')
        trans_prob = json.loads(f.readline())
        emit_prob = json.loads(f.readline())
        init_prob = json.loads(f.readline())
        f.close()
    else:
        trans_prob = {}
        emit_prob = {}
        init_prob = {}

利用json模块中的loads函数,来调用前面已保存的json文件,运行一次以后,文件里面的内容就会自动写入json文件中






使用fp32精度可能会使我的电脑内存被占满。这是我的代码,请你给我解决方案from transformers import Trainer, TrainingArguments, DataCollatorForSeq2Seq from datasets import Dataset import json import pandas as pd from transformers import AutoModelForCausalLM, AutoTokenizer import torch from sklearn.metrics import accuracy_score, recall_score, f1_score, precision_score from tqdm import tqdm from transformers import DataCollatorForLanguageModeling import numpy as np data = [] with open("E:/train.jsonl", "r", encoding="utf-8") as f: for line_number, line in enumerate(f, 1): line = line.strip() if not line: continue # 跳过空行 try: record = json.loads(line) data.append(record) except json.JSONDecodeError as e: print(f"第 {line_number} 行解析失败:{e}") # 可以在此处记录错误或跳过这行 train_df = pd.DataFrame(data) print(train_df.head()) val_data = [] with open("E:/valid.jsonl", "r", encoding="utf-8") as f: for line_number, line in enumerate(f, 1): line = line.strip() if not line: continue # 跳过空行 try: record = json.loads(line) val_data.append(record) except json.JSONDecodeError as e: print(f"第 {line_number} 行解析失败:{e}") # 可以在此处记录错误或跳过这行 valid_df = pd.DataFrame(val_data) # 指定本地模型路径 local_model_path = "E:/Qwen/Qwen2.5-1.5B-Instruct" # 加载模型和分词器(确保 local_files_only=True) model = AutoModelForCausalLM.from_pretrained( local_model_path, # torch_dtype="auto", torch_dtype=torch.float16, # 强制使用 FP16 device_map="auto", local_files_only=True ) tokenizer = AutoTokenizer.from_pretrained( local_model_path, local_files_only=True ) # 设置 pad_token 以避免生成时出现问题 tokenizer.pad_token = tokenizer.eos_token tokenizer.pad_token_id = tokenizer.eos_token_id model.config.pad_token_id = tokenizer.pad_token_id def construct_prompt(code): prompt_template = ( "请扮演一位软件安全专家。分析以下函数代码,判断代码中是否存在安全漏洞。当函数代码存在漏洞时,你只需要输出一个单词:yes,当代码不存在漏洞时,
03-16
<think>好的,用户的问题是希望减少在训练Transformers模型时的显存占用,特别是因为使用FP32精度导致的内存问题。用户提到了使用FP16或其他方法来优化内存。我需要先回顾一下常见的内存优化方法,然后结合Transformers库和PyTorch的特性来给出建议。 首先,降低精度是一个直接的方法,比如使用混合精度训练,这可以通过FP16或BF16来实现。混合精度训练不仅减少显存占用,还能加速计算。但要注意,可能需要使用梯度缩放来防止下溢,尤其是在使用FP16时。NVIDIA的Apex库或者PyTorch自带的AMP(自动混合精度)都可以实现这一点。 然后,检查内存优化的工具,比如Transformers库中的内存分析功能。比如,可以使用`memory_stats`来监控内存使用情况,找出内存消耗大的模块。此外,`accelerate`库提供的工具可以帮助更好地管理分布式训练和内存优化。 接下来,考虑梯度累积。这种方法通过多次前向传播后再执行一次反向传播,有效减少每次迭代的显存使用,但可能会增加训练时间。 另外,模型并行和数据并行也是有效的手段。模型并行将模型拆分到多个GPU上,而数据并行则分发数据到不同GPU。不过,对于大部分用户来说,数据并行更常见,尤其是使用`DataParallel`或`DistributedDataParallel`。 优化器选择也很重要。例如,使用Adam优化器相比SGD需要更多的内存,因为要保存动量和方差。换成如Adafactor这样的优化器可以减少内存占用,或者使用8位优化器,如bitsandbytes库提供的。 激活重计算(梯度检查点)是一个有效的方法,通过在反向传播时重新计算中间激活而不是存储它们,从而节省显存。Transformers库中的模型大多支持`gradient_checkpointing_enable()`来启用这一功能。 量化是另一种方法,包括训练后的动态量化、静态量化,以及训练时量化(QAT)。不过,量化可能会影响模型精度,需要测试量化后的性能。例如,使用Optimum库中的工具可以方便地进行模型量化和加速。 此外,调整batch size和序列长度也能直接影响显存使用。减小batch size或截断过长的序列可以显著降低内存需求,但可能会影响模型效果。 最后,确保使用的库和框架都是最新版本,因为PyTorch和Transformers团队会不断优化内存使用。例如,PyTorch的`memory_format`参数或使用更高效的内核可能带来改进。 需要将这些方法按优先级排序,先推荐用户最容易实施且效果明显的方法,比如混合精度训练和梯度检查点,然后逐步介绍其他高级技巧。同时,要注意引用之前提到的参考资料中的内容,比如引用[1]中的内存分析,引用[2]中的优化器和损失函数,以及引用[3]中的量化效果。</think>### 降低Transformers模型训练显存占用的方法 在训练大型Transformer模型时,显存占用问题尤为突出。以下是几种有效降低显存占用的方法,按实现难度和效果综合排序: --- #### 1. **混合精度训练(FP16/BF16)** - **原理**:使用半精度(FP16)或脑浮点16(BF16)代替FP32存储模型参数和中间变量,显存占用可减少约50%。配合梯度缩放(Gradient Scaling)避免下溢问题。 - **实现方法**: ```python from torch.cuda.amp import autocast, GradScaler scaler = GradScaler() for input, target in data: with autocast(): output = model(input) loss = loss_fn(output, target) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() ``` - **注意**:NVIDIA GPU需支持Tensor Core(如V100/A100),且BF16在Ampere架构后支持更好[^1]。 --- #### 2. **梯度检查点(激活重计算)** - **原理**:在反向传播时重新计算部分中间激活值,而非全程保存,牺牲约30%的计算时间换取显存减少20%-30%[^1]。 - **实现方法**: ```python from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained("gpt2") model.gradient_checkpointing_enable() # 一行代码启用 ``` --- #### 3. **优化器与参数量化** - **8-bit优化器**:使用`bitsandbytes`库将优化器状态量化为8位。 ```python import bitsandbytes as bnb optimizer = bnb.optim.Adam8bit(model.parameters(), lr=1e-3) ``` - **Adafactor优化器**:适用于显存敏感场景,替代Adam。 ```python from transformers.optimization import Adafactor optimizer = Adafactor(model.parameters(), scale_parameter=False) ``` --- #### 4. **分布式训练与并行策略** - **数据并行**:使用`torch.nn.DataParallel`或`accelerate`库分发数据到多GPU。 - **模型并行**:手动拆分模型层到不同GPU(适合超大规模模型)。 --- #### 5. **动态批处理与序列截断** - **动态批处理**:根据序列长度动态调整batch size,避免填充过多。 - **序列截断**:限制最大序列长度(如从512降至256),显存需求与序列长度平方相关。 --- #### 6. **量化训练(QAT)与模型压缩** - **训练后动态量化**:适用于推理阶段。 ```python from optimum.onnxruntime import ORTQuantizer quantizer = ORTQuantizer.from_pretrained("bert-base-uncased") quantizer.quantize(save_dir="quantized_model") ``` - **量化感知训练**:在训练中模拟量化误差,保持精度[^3]。 --- #### 7. **监控与调试工具** - **显存分析**: ```python print(torch.cuda.memory_summary()) # 查看显存分配 ``` - **使用`accelerate`库配置**: ```bash accelerate config # 生成分布式训练配置 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值