Trainer Huggingface - RuntimeError:无法固定“torch.cuda.FloatTensor”,只能固定密集的 CPU 张量

问题描述 投票:0回答:1

我最近遇到以下错误:

RuntimeError: cannot pin 'torch.cuda.FloatTensor' only dense CPU tensors can be pinned
当在小型法学硕士上做 LoRA 时。

我在discord上看到有人说:

该问题可能源于您手动放置 GPU 上的输入(使用 to(model.device)),但是 Trainer 期望数据位于 CPU 上并将处理到 GPU 的传输 内部。

我找不到 Huggingface 的培训师文档中写的任何内容https://huggingface.co/docs/transformers/en/main_classes/trainer

这是真的吗?如果没有,我怎样才能摆脱这个错误?

MRE:

import torch
from torch.utils.data import Dataset
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers import TrainingArguments
from transformers import Trainer
from peft import LoraConfig, get_peft_model

model_name = "croissantllm/CroissantLLMBase"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")

texts = [
    "The first sentence for fine-tuning. </s>",
    "The second sentence for fine-tuning. </s>"
]

inputs = [tokenizer(text, return_tensors="pt").to(model.device) for text in texts]

lora_config = LoraConfig(
    r=8,
    lora_alpha=16,
    lora_dropout=0.1,
    target_modules=["q_proj", "v_proj"],
)

model = get_peft_model(model, lora_config)

class CustomDataset(Dataset):
    def __init__(self, input_list):
        self.input_list = input_list

    def __len__(self):
        return len(self.input_list)

    def __getitem__(self, idx):
        input_ids = self.input_list[idx]['input_ids'].squeeze()
        labels = input_ids.clone()
        return {"input_ids": input_ids, "labels": labels}

train_dataset = CustomDataset(inputs)

training_args = TrainingArguments(
    output_dir="./lora_croissantllm",
    per_device_train_batch_size=1,
    num_train_epochs=1,
    save_steps=10,
    save_total_limit=2,
    logging_dir="./logs",
    logging_steps=10,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
)

trainer.train()

这个问题很容易直接在 colab 上重现(在第一个单元格中运行

%pip install --upgrade torch transformers peft
)。

nlp huggingface-transformers
1个回答
0
投票

由于固定内存仅在 CPU 上可用,而在 GPU 上不可用,因此当在 Colab 上在 GPU 上运行时,您可以通过将

dataloader_pin_memory
设置为
False
来禁用它(对于
TrainingArguments

training_args = TrainingArguments(
    output_dir="./lora_croissantllm",
    dataloader_pin_memory=False,
    per_device_train_batch_size=1,
    num_train_epochs=1,
    save_steps=10,
    save_total_limit=2,
    logging_dir="./logs",
    logging_steps=10,
)
© www.soinside.com 2019 - 2024. All rights reserved.