使用 Hugging Face Transformers 库微调 TheBloke/Llama-2-13B-chat-GPTQ 模型会引发 Exllama 错误

Pat*_*iuk 5 nlp huggingface-transformers huggingface fine-tuning llama

我正在尝试使用 Hugging Face Transformers 库微调 TheBloke/Llama-2-13B-chat-GPTQ 模型。我使用 JSON 文件作为训练和验证数据集。但是,当我尝试运行脚本时遇到与 Exllama 后端相关的错误。

这是我的代码:

from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from datasets import load_dataset
import torch

# Check GPU availability
print("Available GPU devices:", torch.cuda.device_count())
print("Name of the first available GPU:", torch.cuda.get_device_name(0))

# Load model and tokenizer
model_name = "TheBloke/Llama-2-13B-chat-GPTQ"

# Load tokenizer and model
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# Move the model to GPU
model.to('cuda')

# Load training and validation data
train_data = load_dataset('json', data_files='train_data.jsonl')
val_data = load_dataset('json', data_files='val_data.jsonl')

# Function to format the data
def formatting_func(example):
    return tokenizer(example['input'], example.get('output', ''), truncation=True, padding='max_length')

# Prepare training and validation data
train_data = train_data.map(formatting_func)
val_data = val_data.map(formatting_func)

# Set training arguments
training_args = TrainingArguments(
    output_dir="./output",
    overwrite_output_dir=True,
    num_train_epochs=1,
    per_device_train_batch_size=32,
    per_device_eval_batch_size=64,
    save_steps=10_000,
    save_total_limit=2,
)

# Create trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_data,
    eval_dataset=val_data,
)

# Start training
trainer.train()

# Save the model
model.save_pretrained("./output")

Run Code Online (Sandbox Code Playgroud)

我收到的错误消息是:

ValueError:在 cpu/磁盘上找到模块。使用 Exllama 后端要求所有模块都位于 GPU 上。disable_exllama=True您可以通过在量化配置对象中进行设置来停用 exllama 后端。

我已经使用 model.to('cuda') 将模型移动到 GPU,但错误仍然存​​在。任何帮助将不胜感激。

在开始训练过程之前,我尝试使用 model.to('cuda') 将模型移动到 GPU,如 Hugging Face 文档中的建议。我还确保我的环境安装了所有必需的包和依赖项。我希望模型能够对我的自定义 JSON 数据集进行微调,而不会出现任何问题。

然而,尽管将模型移至 GPU,我仍然遇到 Exllama 后端错误。我不确定为什么会发生这种情况,因为根据我的代码,模型应该位于 GPU 上。我正在寻找一种方法来解决此错误并成功微调自定义数据集上的模型。

小智 -2

根据错误消息,虽然模型可能已移至 GPU,但某些模块(可能是模型的一部分或数据管道的一部分)仍位于 CPU 上。当您尝试使用 Exllama 后端进行量化时,这种不匹配会导致错误。

您可以采取以下一些步骤来排除故障:

  1. 检查设备分配:确保与模型交互的所有组件(例如优化器或附加层)也移至 GPU。使用model.parameters()并循环它们来确认它们的设备位置。

    for param in model.parameters():
        print(param.device)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 数据管道:确保您的数据也加载到 GPU 上。例如,如果您使用 DataLoader,请检查数据是否也加载到 GPU 上。

    for batch in dataloader:
        # Move batch to the same device as the model
        batch = {k: v.to('cuda') for k, v in batch.items()}
    
    Run Code Online (Sandbox Code Playgroud)
  3. 禁用 Exllamadisable_exllama=True :作为最后的手段,您可以通过在量化配置对象中进行设置来禁用 Exllama 后端。这可能会影响模型的性能和准确性,但应该允许您的代码运行而不会出现此特定错误。

  4. 日志和诊断:有时,库会输出日志,这些日志可以为您提供有关哪些内容尚未移至 GPU 的线索。您可能希望增加日志记录的详细程度,以查看是否显示任何其他信息。

  5. 依赖项检查:确保 Exllama 后端没有需要安装或配置才能正确识别 GPU 资源的其他依赖项。确保您的 CUDA 工具包和 cuDNN 库是最新的。

  6. 环境变量:有时,您可能需要设置特定的环境变量以确保使用 GPU。这通常记录在图书馆的手册中。

  7. 查阅文档或社区:既然您提到了 Hugging Face,他们就有一个活跃的论坛来讨论类似的问题。您可能会在那里找到解决方案。

  8. 显式移动子模块:有时,特别是对于具有子模块的复杂模型,简单的.to('cuda')调用可能不够。尝试将每个子模块显式移动到 GPU。

  9. PyTorch 版本:确保您的 PyTorch 版本与 Exllama 后端兼容。有时后端功能与框架的特定版本紧密耦合。

通过系统地检查每个因素,您应该能够确定问题的原因并采取措施解决它。