tensorflow 程序挂起的原因,即整个进程不报错又不执行的原因

在测试集上对训练好的模型实验时,代码无报错却卡在session.run()处。原因是tf数据线程未启动,导致数据流图无法计算。因tensorflow计算和数据读入异步,无数据时会一直等待。解决办法有两种,一是启动线程并做同步,二是使用Supervisor简化操作。

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

在测试集上对训练好的模型进行实验的时候,发现写好的代码没有报错但是会卡在session.run()那里不动。查了好久终于明白是开启线程的问题。

tf的数据线程没有启动,导致数据流图没办法计算,整个程序就卡在那里。

更深层次的原因是tensorflow的计算和数据读入是异步的,合理的方式是主线程进行模型的训练,然后开一个数据读入线程异步读入数据.tensorflow会在内存中维护一个队列,然后数据线程异步从磁盘中将样本推入队列当中。并且,因为tensorflow的训练和读数据是异步的,故即使当前没有数据进来,tensorflow也没办法报错,因为可能接下来会有数据进队列,所以,tensorflow就一直处于等待的状态
下面以别人的例子说明:

错误情况:

在Session当中,没有启动数据读入线程。所以,sess.run(train_input.input_data)就是无数据可取,程序就处于一种挂起的状态。

#-*- coding:utf-8 -*-
import numpy as np
import tensorflow as tf
 
from tensorflow.models.rnn.ptb import reader
 
class PTBInput(object):
  """The input data."""
  def __init__(self, config, data, name=None):
    self.batch_size = batch_size = config.batch_size
    self.num_steps = num_steps = config.num_steps
    #为何要进行-1操作
    self.epoch_size = ((len(data) // batch_size) - 1) // num_steps
    self.input_data, self.targets = reader.ptb_producer(
        data, batch_size, num_steps, name=name)
 
class SmallConfig(object):
  """Small config."""
  init_scale = 0.1
  learning_rate = 1.0
  max_grad_norm = 5
  num_layers = 2
  num_steps = 20
  hidden_size = 200
  max_epoch = 4
  max_max_epoch = 13
  keep_prob = 1.0
  lr_decay = 0.5
  batch_size = 20
  vocab_size = 10000
 
if __name__ == '__main__':
	config = SmallConfig()
        data_path = '/home/jdlu/jdluTensor/data/simple-examples/data'       
	raw_data = reader.ptb_raw_data(data_path)
	train_data, valid_data, test_data, _ = raw_data
	train_input = PTBInput(config=config, data=train_data, name="TrainInput")
        print "end--------------------------------"
        
	#wrong,使用session就会出现读不出数据的错误,读不出数据,整个数据流图就无法计算,整个程序就处于挂起的状态
	#使用session会出错
	with tf.Session() as sess:
		for step in range(1):
			print sess.run(train_input.input_data)	

解决方法:

有两种办法:

  1. 使用tf.train.range_input_producer(epoch_size, shuffle=False),会默认将QueueRunner添加到全局图中,我们必须使用tf.train.start_queue_runners(sess=sess),去启动该线程。然后使用coord = tf.train.Coordinator()去做一些线程的同步工作。
  2. 第二种方法比较简单,使用sv = tf.train.Supervisor(),文档上说,The Supervisor is a small wrapper around a Coordinator, a Saver, and a SessionManager
    也即使用了Supervisor(),那么保存模型,线程同步的事情都不用我们去干涉了。
     
#-*- coding:utf-8 -*-
import numpy as np
import tensorflow as tf
 
from tensorflow.models.rnn.ptb import reader
 
class PTBInput(object):
  """The input data."""
  def __init__(self, config, data, name=None):
    self.batch_size = batch_size = config.batch_size
    self.num_steps = num_steps = config.num_steps
    #为何要进行-1操作
    self.epoch_size = ((len(data) // batch_size) - 1) // num_steps
    self.input_data, self.targets = reader.ptb_producer(
        data, batch_size, num_steps, name=name)
 
class SmallConfig(object):
  """Small config."""
  init_scale = 0.1
  learning_rate = 1.0
  max_grad_norm = 5
  num_layers = 2
  num_steps = 20
  hidden_size = 200
  max_epoch = 4
  max_max_epoch = 13
  keep_prob = 1.0
  lr_decay = 0.5
  batch_size = 20
  vocab_size = 10000
 
if __name__ == '__main__':
	config = SmallConfig()
        data_path = '/home/jdlu/jdluTensor/data/simple-examples/data'       
	raw_data = reader.ptb_raw_data(data_path)
	train_data, valid_data, test_data, _ = raw_data
	train_input = PTBInput(config=config, data=train_data, name="TrainInput")
        print "end--------------------------------"
        
 
	#right,使用Supervisor() 方法二
	#sv = tf.train.Supervisor()
        #with sv.managed_session() as sess:
	#	for step in range(1):
	#		print sess.run(train_input.input_data)	
        
	#right 方法一
	# Create a session for running operations in the Graph.
	sess = tf.Session()
	# Start input enqueue threads.
	coord = tf.train.Coordinator()
	threads = tf.train.start_queue_runners(sess=sess, coord=coord)
	# Run training steps or whatever
	try:
		for step in range(2):
			print sess.run(train_input.input_data)
	except Exception,e:
		#Report exceptions to the coordinator
		coord.request_stop(e)
	coord.request_stop()
	# Terminate as usual.  It is innocuous to request stop twice.
	coord.join(threads)
	sess.close()

 

<think>我们正在讨论LLaMA-Factory微调过程中常见的环境配置问题及解决方法。根据用户提供的错误日志和引用内容,结合微调实践,总结如下: ### 常见环境配置问题及解决方法 #### 1. **依赖库版本冲突** - **问题描述**:在安装LLaMA-Factory所需依赖时,容易出现`transformers`、`torch`、`accelerate`等核心库版本兼容,导致运行时错误(如API变更、属性存在等)。 - **解决方法**: - 使用项目提供的`requirements.txt`严格安装指定版本: ```bash pip install -r requirements.txt ``` - 若需升级,优先使用兼容版本(如`transformers>=4.41.0,<4.42`),避免最新版引入破坏性变更。 #### 2. **CUDA与PyTorch匹配** - **问题描述**:PyTorch版本与CUDA驱动版本一致,引发`RuntimeError: CUDA out of memory`或`Unable to load CUDA backend`等错误。 - **解决方法**: - 通过[PyTorch官方命令](https://pytorch.org/)安装匹配版本: ```bash # 示例:CUDA 12.1环境 pip install torch==2.3.0 torchvision==0.18.0 torchaudio==2.3.0 --index-url https://download.pytorch.org/whl/cu121 ``` - 验证环境: ```python import torch print(torch.cuda.is_available()) # 应输出True print(torch.version.cuda) # 应与nvidia-smi显示的驱动版本兼容 ``` #### 3. **分布式训练配置错误** - **问题描述**:多训练时因`accelerate`配置当导致进程挂起或内存溢出。 - **解决方法**: - 初始化`accelerate`配置并严格检查: ```bash accelerate config # 交互式生成配置文件 accelerate test # 验证配置 ``` - 训练命令前添加`accelerate launch`: ```bash accelerate launch src/train_bash.py ... # 替代原python命令 ``` #### 4. **文件路径权限问题** - **问题描述**:数据集或模型缓存路径权限足(常见于Docker/Linux环境),导致`PermissionError`。 - **解决方法**: - 显式指定可读写路径: ```yaml # train_lora.yaml model_name_or_path: /your_writable_path/model cache_dir: /your_writable_path/cache ``` - 修改目录权限: ```bash chmod -R 777 /your_writable_path ``` #### 5. **环境变量冲突** - **问题描述**:环境变量(如`CUDA_VISIBLE_DEVICES`、`TF_ENABLE_ONEDNN_OPTS`)被全局设置,干扰训练进程。 - **解决方法**: - 在训练命令前重置关键变量: ```bash export CUDA_VISIBLE_DEVICES=0,1 # 指定使用的GPU export TF_ENABLE_ONEDNN_OPTS=0 # 关闭oneDNN(避免日志警告) ``` #### 6. **Tokenizer加载失败** - **问题描述**:因网络问题无法下载tokenizer文件(如`tokenizer.json`),或本地路径未正确映射。 - **解决方法**: - 使用离线缓存:提前下载模型文件至本地,并通过`model_name_or_path`指向该目录。 - 配置代理(若需在线下载): ```python # 在代码中添加 import os os.environ["HTTP_PROXY"] = "http://your_proxy:port" os.environ["HTTPS_PROXY"] = "http://your_proxy:port" ``` ### 预防性建议 - **隔离环境**:使用`conda`或`virtualenv`创建独立Python环境。 - **日志分析**:关注`WARNING`信息(如示例中的`distutils`弃用警告),它们可能在未来版本引发错误。 - **最小化验证**:先在小规模数据集和单GPU环境测试,再扩展到全量训练。 > 示例配置:成功运行Qwen1.5微调的典型环境[^1] > ``` > Python 3.11 > torch==2.3.0+cu121 > transformers==4.41.0 > accelerate==0.30.1 > ``` §§相关问题§§ 1. 如何解决微调过程中的内存溢出(OOM)问题? 2. LLaMA-Factory支持哪些模型架构的微调? 3. 微调后的模型如何部署到生产环境?</think>### LLaMA-Factory微调常见环境配置问题及解决方法 #### 1. **依赖库版本冲突** - **问题现象**: `transformers`、`torch`等核心库版本兼容导致报错(如示例中的`distutils`弃用警告) - **解决方法**: 1. 使用项目要求的精确版本: ```bash pip install transformers==4.41.0 torch==2.3.0 ``` 2. 创建隔离环境: ```bash conda create -n llama_factory python=3.11 conda activate llama_factory pip install -r requirements.txt ``` #### 2. **CUDA环境配置问题** - **问题现象**: `TensorFlow/TRT`警告,GPU未有效利用 - **解决方法**: 1. 验证CUDA兼容性: ```bash nvcc --version # 查看CUDA版本 python -c "import torch; print(torch.cuda.is_available())" ``` 2. 安装匹配的PyTorch版本: ```bash pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 ``` #### 3. **分词器处理失败** - **问题现象**: `Running tokenizer on dataset`阶段顿或报错 - **解决方法**: 1. 预下载分词器文件: ```python from transformers import AutoTokenizer AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B", cache_dir="./tokenizer_cache") ``` 2. 在配置文件中指定缓存路径: ```yaml model_name_or_path: meta-llama/Meta-Llama-3-8B cache_dir: ./tokenizer_cache ``` #### 4. **并行处理错误** - **问题现象**: `TypeError: argument of type 'NoneType' is not iterable` - **解决方法**: 在训练脚本开头添加: ```python import transformers if transformers.modeling_utils.ALL_PARALLEL_STYLES is None: transformers.modeling_utils.ALL_PARALLEL_STYLES = ["none"] ``` #### 5. **文件权限问题** - **问题现象**: 数据集处理时`Permission denied`错误 - **解决方法**: 1. 更改工作目录权限: ```bash sudo chown -R $USER:$USER /workspace ``` 2. 使用Docker时正确挂载卷: ```bash docker run -v /host/path:/container/path ... ``` #### 6. **内存足问题** - **问题现象**: `CUDA out of memory`或处理中断 - **解决方法**: 1. 启用梯度检查点: ```yaml # config.yaml gradient_checkpointing: true ``` 2. 使用量化加载: ```python model = AutoModelForCausalLM.from_pretrained(..., load_in_4bit=True) ``` > **最佳实践**:建议使用官方Docker镜像避免环境问题[^1] > ```bash > docker pull hpcaitech/llama-factory:latest > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值