[THUDM/ChatGLM-6B][Help] ptuning中的数据集如何使用?

2024-07-12 918 views
1

如果想要训练自己的数据,无监督,非问答的。这个数据集应该如何改造?比如一篇文章,怎么填充成这种格式

Environment
- OS:
- Python:
- Transformers:
- PyTorch:
- CUDA Support (`python -c "import torch; print(torch.cuda.is_available())"`) :

回答

1

好像这里改改就行:

    def preprocess_function_train(examples):
        max_seq_length = data_args.max_source_length + data_args.max_target_length

        model_inputs = {
            "input_ids": [],
            "labels": [],
        }
        for i in range(len(examples[prompt_column])):
            if examples[prompt_column][i] and examples[response_column][i]:
                prompt, answer = examples[prompt_column][i], examples[response_column][i]
                prompt = prefix + prompt
                a_ids = tokenizer.encode(text=prompt, add_special_tokens=False)
                b_ids = tokenizer.encode(text=answer, add_special_tokens=False)

                if len(a_ids) > data_args.max_source_length - 1:
                    a_ids = a_ids[: data_args.max_source_length - 1]

                if len(b_ids) > data_args.max_target_length - 2:
                    b_ids = b_ids[: data_args.max_target_length - 2]

                input_ids = a_ids + [150001, 150004] + b_ids + [150005]

                context_length = input_ids.index(150004)
                mask_position = context_length - 1
                labels = [-100] * context_length + input_ids[mask_position+1:]

                pad_len = max_seq_length - len(input_ids)
                input_ids = input_ids + [tokenizer.pad_token_id] * pad_len
                labels = labels + [tokenizer.pad_token_id] * pad_len

                model_inputs["input_ids"].append(input_ids)
                model_inputs["labels"].append(labels)

        return model_inputs

其中input_ids = a_ids + [150001, 150004] + b_ids + [150005]改成input_ids = b_ids + [150005]然后数据集的summary填内容,content留空。

5

不行呢,会得到这样结果……

Traceback (most recent call last):
File "/media/j/新加卷/chatglm_ft/ChatGLM-6B/ptuning/main.py", line 390, in main() File "/media/j/新加卷/chatglm_ft/ChatGLM-6B/ptuning/main.py", line 219, in main print_dataset_example(train_dataset[0]) File "/home/j/anaconda3/envs/chatglm/lib/python3.9/site-packages/datasets/arrow_dataset.py", line 2658, in getitem return self._getitem(key) File "/home/j/anaconda3/envs/chatglm/lib/python3.9/site-packages/datasets/arrow_dataset.py", line 2642, in _getitem pa_subtable = query_table(self._data, key, indices=self._indices if self._indices is not None else None) File "/home/j/anaconda3/envs/chatglm/lib/python3.9/site-packages/datasets/formatting/formatting.py", line 588, in query_table _check_valid_index_key(key, size) File "/home/j/anaconda3/envs/chatglm/lib/python3.9/site-packages/datasets/formatting/formatting.py", line 531, in _check_valid_index_key raise IndexError(f"Invalid key: {key} is out of bounds for size {size}") IndexError: Invalid key: 0 is out of bounds for size 0

9

您好,我有楼主同样的疑问…… 我看过了您给出的readme内容,但仍不确定自己应该如何制作数据集……

(像楼主说的,如何让chatglm学习一篇文章的知识:【如果想要训练自己的数据,无监督,非问答的。这个数据集应该如何改造?比如一篇文章,怎么填充成这种格式】)

如果有一个示例,相信会对很多伙伴带来帮助……谢谢!

9

@eeyrw @jiaozn 我也是,不大行,留空的就会出现IndexError: Invalid key: 0 is out of bounds for size 0,如果把content都设置为0,然后按照input_ids = b_ids + [150005]来跑就会出现ValueError: 150004 is not in list。只能按照原来的跑,但是这样就失去本来的目的。

1

所以请问这个问题的最终答案是什么呢?我如何使用大量的领域内文本(不是QA数据,就是单纯的文章)来无监督微调呢? 有demo可以参考吗

9

+1 ,很多离线的本地知识不一定都像例子一样 以 q & a 的方式的,比如公司内部有很多知识(文章,说明书之类的),该如何组织训练数据呢?

9

同求拿公司文本无监督微调的方法