IndexError при создании экземпляра SFTTrainer() для точной настройки Llama2. ⇐ Python
IndexError при создании экземпляра SFTTrainer() для точной настройки Llama2.
Я новичок в НЛП и просматриваю руководство по точной настройке Llama2. Я следовал инструкциям, и это сработало хорошо, но я столкнулся с ошибкой IndexError, когда пытался создать экземпляр SFTTrainer() для обучения моей модели. Прежде чем я столкнулся с ошибкой, я сделал следующее:
# библиотеки импорта импортировать JSON импортировать повторно из печати импортировать печать импортировать панд как pd импортный фонарь из наборов данных импортировать набор данных, load_dataset из Huggingface_hub импортировать блокнот_логин из импорта Peft LoraConfig, PeftModel из импорта трансформаторов ( AutoModelForCausalLM, Автотокенайзер, биты и байтыконфигурация, ОбучениеАргументы ) из trl импорта SFTTrainer УСТРОЙСТВО = "cuda:0", если torch.cuda.is_available(), иначе "процессор" MODEL_NAME = "мета-лама/Ллама-2-7b-hf" # импортировать набор данных dataset = load_dataset("Salesforce/dialogstudio", "Empathetic") набор данных # быстрые инструкции DEFAULT_SYSTEM_PROMPT = """ Ниже приведен разговор между двумя пользователями. Опишите в 1 слове чувство, которое испытали пользователи во время этого разговора. """.полоска() Защитуgenerate_training_prompt( разговоры: str, чувство: str, system_prompt: str = DEFAULT_SYSTEM_PROMPT ) -> ул: return f"""### Инструкция: {system_prompt} ### Вход: {conversations.strip()} ### Ответ: {чувство} """.полоска() # чистый текст защита clean_text(текст): text = re.sub(r"http\S+", "", текст) text = re.sub(r"@[^\s]+", "", text) text = re.sub(r"\s+", " ", текст) return re.sub(r"\^[^ ]+", "", текст) защита create_conversation_text(data_points): текст = "" для элемента в data_points["log"]: user1 = clean_text(item["высказывание пользователя"]) text += f"user1: {user1.strip()}\n" user2 = clean_text(item["ответ системы"]) text += f"user2: {user2.strip()}\n" вернуть текст #генерируем текст Защиту генерировать_текст (точка_данных): чувство = json.loads(data_point["исходная информация диалога"])["контекст"] диалог_текст = create_conversation_text(точка_данных) возвращаться { «разговор»: разговор_текст, «чувство»: чувство, «текст»: генерировать_тренинг_подсказку (текст_разговора, чувство) } пример = генерировать_текст(набор данных["поезд"][1]) print(пример["чувство"]) print(пример["разговор"]) печать(пример["текст"]) # набор данных процесса Защиту Process_dataset (данные: Набор данных): возвращаться ( data.shuffle(сид = 333) .map(generate_text) .remove_columns( [ "идентификатор исходного диалога", "идентификатор нового диалога", "указатель диалога", "исходная информация диалога", "бревно", "быстрый" ] ) ) набор данных["поезд"] = набор_данных_процесса(набор данных["поезд"]) набор данных["проверка"] = набор_данных(набор данных["проверка"]) набор данных["тест"] = набор_данных_процесса(набор данных["тест"]) набор данных # войдите в HF !huggingface-cli login --token "отредактировано" # создаем модель и токенизатор защита create_model_and_tokenizer(): bnb_config = BitsAndBytesConfig( bnb_4bit_compute_dtype=torch.float16, llm_int8_enable_fp32_cpu_offload=Истина ) модель = AutoModelForCausalLM.from_pretrained( НАЗВАНИЕ МОДЕЛИ, use_safetensors = Правда, quantization_config=bnb_config, Trust_remote_code = Верно, device_map="авто" ) tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) tokenizer.pad_token = tokenizer.eos_token tokenizer.padding_side = "право" модель возврата, токенизатор модель, токенизатор = create_model_and_tokenizer() model.config.use_cache = Ложь лора_альфа = 32 lora_dropout = 0,05 лора_р = 16 lora_target_modules = [ "q_proj", "вверх_проект", "о_проект", "к_проект", "down_proj", "gate_proj", "в_проект", ] peft_config = ЛораКонфиг( lora_alpha=lora_alpha, lora_dropout=lora_dropout, г=лора_р, target_modules=lora_target_modules, предвзятость = "нет", Task_type="CAUSAL_LM" ) OUTPUT_DIR = "эксперименты" Тензорная доска %load_ext %tensorboard --logdir эксперименты/запуск Training_arguments = TrainingArguments( per_device_train_batch_size = 4, градиент_аккумуляция_шаги = 4, optim="paged_adamw_32bit", logging_steps=1, Learning_rate=0,0001, # fp16=Верно, max_grad_norm=0,3, num_train_epochs=2, Assessment_strategy="шаги", eval_steps=0,2, разминка_ratio=0,05, save_strategy="эпоха", group_by_length = Правда, output_dir=OUTPUT_DIR, report_to="тензорная доска", save_safetensors = Правда, lr_scheduler_type="косинус", семя = 333 ) После успешного выполнения вышеописанного, запуск следующего фрагмента кода для создания экземпляра SFTTrainer выдает мне IndexError:
trainer = SFTTrainer( модель = модель, train_dataset=набор данных["поезд"], eval_dataset=набор данных["проверка"], peft_config=peft_config, dataset_text_field="текст", max_seq_length=4096, токенизатор = токенизатор, args=training_arguments ) -------------------------------------------- ------------------------------- IndexError Traceback (последний вызов, последний) Ячейка In[2], строка 1 --- -> 1 тренер = SFTTrainer( 2 model=model, 3 train_dataset=dataset["train"], 4 eval_dataset=dataset["validation"], 5 peft_config=peft_config, 6 dataset_text_field="text", 7 max_seq_length=4096, 8 tokenizer= tokenizer, 9 args=training_arguments 10) Файл [c:\Users\wl\AppData\Local\Programs\Python\Python311\Lib\site-packages\trl\trainer\sft_trainer.py:219](file:///C :/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/trl/trainer/sft_trainer.py:219), в SFTTrainer.__init__(self, model, args, data_collator, train_dataset, eval_dataset, tokenizer, model_init, Compute_metrics, обратные вызовы, оптимизаторы, preprocess_logits_for_metrics, peft_config, dataset_text_field, упаковка, formatting_func, max_seq_length, бесконечность, num_of_sequences, chars_per_token, dataset_num_proc, dataset_batch_size) [213](file:///c%3A/Users/wl/AppData /Local/Programs/Python/Python311/Lib/site-packages/trl/trainer/sft_trainer.py?line=212), если tokenizer.padding_side не имеет значения None и tokenizer.padding_side != "right": [214](file: ///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/trl/trainer/sft_trainer.py?line=213) alerts.warn( [215](file:/ //c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/trl/trainer/sft_trainer.py?line=214) «Вы передали токенизатор с `padding_side`, не равным `право` для SFTTrainer. Это может привести к неожиданному поведению из-за " [216](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/trl/trainer/sft_trainer.py ?line=215) "проблемы с переполнением при обучении модели с половинной точностью. Вы можете рассмотреть возможность добавления `tokenizer.padding_side = 'right'` в свой код." [217](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages /trl/trainer/sft_trainer.py?line=216) ) --> [219](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/ trl/trainer/sft_trainer.py?line=218) super().__init__( [220](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages /trl/trainer/sft_trainer.py?line=219) model=model, [221](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/ trl/trainer/sft_trainer.py?line=220) args=args, [222](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/trl /trainer/sft_trainer.py?line=221) data_collator=data_collator, [223](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/trl/ тренер/sft_trainer.py?line=222) train_dataset=train_dataset, ... [400](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/transformers/trainer.py?line=399) «Вы загрузили модель на несколько графических процессоров. Атрибут `is_model_parallel` будет установлен принудительно" [401](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/transformers/trainer. py?line=400) "на True, чтобы избежать непредвиденного поведения, например несовпадения размещения устройства." [402](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/transformers/trainer.py?line=401)) IndexError: индекс списка вышел за пределы диапазон Вывод усекается. Просмотреть как [прокручиваемый элемент](команда:cellOutput.enableScrolling?f80cd8a1-e6c5-4e39-ba7e-fd3bf680aa55) или открыть в [текстовом редакторе](команда:workbench.action.openLargeOutput?f80cd8a1-e6c5-4e39-ba7e-fd3bf680aa55 ). Настройте вывод ячейки [настройки] (команда:workbench.action.openSettings?%5B%22%40tag%3AnotebookOutputLayout%22%5D)... Я проверил свои наборы данных и форматирование, но так и не смог найти ничего, вызывающего эту ошибку. Буду рад, если кто-нибудь знает, почему это происходит.
Я пытался загрузить модель hf llama2 в 8-битном режиме и думаю, не в этом ли причина того, что он выдает ошибку, поскольку исходное руководство загружает модель в 4-битном формате.
Я новичок в НЛП и просматриваю руководство по точной настройке Llama2. Я следовал инструкциям, и это сработало хорошо, но я столкнулся с ошибкой IndexError, когда пытался создать экземпляр SFTTrainer() для обучения моей модели. Прежде чем я столкнулся с ошибкой, я сделал следующее:
# библиотеки импорта импортировать JSON импортировать повторно из печати импортировать печать импортировать панд как pd импортный фонарь из наборов данных импортировать набор данных, load_dataset из Huggingface_hub импортировать блокнот_логин из импорта Peft LoraConfig, PeftModel из импорта трансформаторов ( AutoModelForCausalLM, Автотокенайзер, биты и байтыконфигурация, ОбучениеАргументы ) из trl импорта SFTTrainer УСТРОЙСТВО = "cuda:0", если torch.cuda.is_available(), иначе "процессор" MODEL_NAME = "мета-лама/Ллама-2-7b-hf" # импортировать набор данных dataset = load_dataset("Salesforce/dialogstudio", "Empathetic") набор данных # быстрые инструкции DEFAULT_SYSTEM_PROMPT = """ Ниже приведен разговор между двумя пользователями. Опишите в 1 слове чувство, которое испытали пользователи во время этого разговора. """.полоска() Защитуgenerate_training_prompt( разговоры: str, чувство: str, system_prompt: str = DEFAULT_SYSTEM_PROMPT ) -> ул: return f"""### Инструкция: {system_prompt} ### Вход: {conversations.strip()} ### Ответ: {чувство} """.полоска() # чистый текст защита clean_text(текст): text = re.sub(r"http\S+", "", текст) text = re.sub(r"@[^\s]+", "", text) text = re.sub(r"\s+", " ", текст) return re.sub(r"\^[^ ]+", "", текст) защита create_conversation_text(data_points): текст = "" для элемента в data_points["log"]: user1 = clean_text(item["высказывание пользователя"]) text += f"user1: {user1.strip()}\n" user2 = clean_text(item["ответ системы"]) text += f"user2: {user2.strip()}\n" вернуть текст #генерируем текст Защиту генерировать_текст (точка_данных): чувство = json.loads(data_point["исходная информация диалога"])["контекст"] диалог_текст = create_conversation_text(точка_данных) возвращаться { «разговор»: разговор_текст, «чувство»: чувство, «текст»: генерировать_тренинг_подсказку (текст_разговора, чувство) } пример = генерировать_текст(набор данных["поезд"][1]) print(пример["чувство"]) print(пример["разговор"]) печать(пример["текст"]) # набор данных процесса Защиту Process_dataset (данные: Набор данных): возвращаться ( data.shuffle(сид = 333) .map(generate_text) .remove_columns( [ "идентификатор исходного диалога", "идентификатор нового диалога", "указатель диалога", "исходная информация диалога", "бревно", "быстрый" ] ) ) набор данных["поезд"] = набор_данных_процесса(набор данных["поезд"]) набор данных["проверка"] = набор_данных(набор данных["проверка"]) набор данных["тест"] = набор_данных_процесса(набор данных["тест"]) набор данных # войдите в HF !huggingface-cli login --token "отредактировано" # создаем модель и токенизатор защита create_model_and_tokenizer(): bnb_config = BitsAndBytesConfig( bnb_4bit_compute_dtype=torch.float16, llm_int8_enable_fp32_cpu_offload=Истина ) модель = AutoModelForCausalLM.from_pretrained( НАЗВАНИЕ МОДЕЛИ, use_safetensors = Правда, quantization_config=bnb_config, Trust_remote_code = Верно, device_map="авто" ) tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) tokenizer.pad_token = tokenizer.eos_token tokenizer.padding_side = "право" модель возврата, токенизатор модель, токенизатор = create_model_and_tokenizer() model.config.use_cache = Ложь лора_альфа = 32 lora_dropout = 0,05 лора_р = 16 lora_target_modules = [ "q_proj", "вверх_проект", "о_проект", "к_проект", "down_proj", "gate_proj", "в_проект", ] peft_config = ЛораКонфиг( lora_alpha=lora_alpha, lora_dropout=lora_dropout, г=лора_р, target_modules=lora_target_modules, предвзятость = "нет", Task_type="CAUSAL_LM" ) OUTPUT_DIR = "эксперименты" Тензорная доска %load_ext %tensorboard --logdir эксперименты/запуск Training_arguments = TrainingArguments( per_device_train_batch_size = 4, градиент_аккумуляция_шаги = 4, optim="paged_adamw_32bit", logging_steps=1, Learning_rate=0,0001, # fp16=Верно, max_grad_norm=0,3, num_train_epochs=2, Assessment_strategy="шаги", eval_steps=0,2, разминка_ratio=0,05, save_strategy="эпоха", group_by_length = Правда, output_dir=OUTPUT_DIR, report_to="тензорная доска", save_safetensors = Правда, lr_scheduler_type="косинус", семя = 333 ) После успешного выполнения вышеописанного, запуск следующего фрагмента кода для создания экземпляра SFTTrainer выдает мне IndexError:
trainer = SFTTrainer( модель = модель, train_dataset=набор данных["поезд"], eval_dataset=набор данных["проверка"], peft_config=peft_config, dataset_text_field="текст", max_seq_length=4096, токенизатор = токенизатор, args=training_arguments ) -------------------------------------------- ------------------------------- IndexError Traceback (последний вызов, последний) Ячейка In[2], строка 1 --- -> 1 тренер = SFTTrainer( 2 model=model, 3 train_dataset=dataset["train"], 4 eval_dataset=dataset["validation"], 5 peft_config=peft_config, 6 dataset_text_field="text", 7 max_seq_length=4096, 8 tokenizer= tokenizer, 9 args=training_arguments 10) Файл [c:\Users\wl\AppData\Local\Programs\Python\Python311\Lib\site-packages\trl\trainer\sft_trainer.py:219](file:///C :/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/trl/trainer/sft_trainer.py:219), в SFTTrainer.__init__(self, model, args, data_collator, train_dataset, eval_dataset, tokenizer, model_init, Compute_metrics, обратные вызовы, оптимизаторы, preprocess_logits_for_metrics, peft_config, dataset_text_field, упаковка, formatting_func, max_seq_length, бесконечность, num_of_sequences, chars_per_token, dataset_num_proc, dataset_batch_size) [213](file:///c%3A/Users/wl/AppData /Local/Programs/Python/Python311/Lib/site-packages/trl/trainer/sft_trainer.py?line=212), если tokenizer.padding_side не имеет значения None и tokenizer.padding_side != "right": [214](file: ///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/trl/trainer/sft_trainer.py?line=213) alerts.warn( [215](file:/ //c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/trl/trainer/sft_trainer.py?line=214) «Вы передали токенизатор с `padding_side`, не равным `право` для SFTTrainer. Это может привести к неожиданному поведению из-за " [216](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/trl/trainer/sft_trainer.py ?line=215) "проблемы с переполнением при обучении модели с половинной точностью. Вы можете рассмотреть возможность добавления `tokenizer.padding_side = 'right'` в свой код." [217](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages /trl/trainer/sft_trainer.py?line=216) ) --> [219](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/ trl/trainer/sft_trainer.py?line=218) super().__init__( [220](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages /trl/trainer/sft_trainer.py?line=219) model=model, [221](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/ trl/trainer/sft_trainer.py?line=220) args=args, [222](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/trl /trainer/sft_trainer.py?line=221) data_collator=data_collator, [223](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/trl/ тренер/sft_trainer.py?line=222) train_dataset=train_dataset, ... [400](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/transformers/trainer.py?line=399) «Вы загрузили модель на несколько графических процессоров. Атрибут `is_model_parallel` будет установлен принудительно" [401](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/transformers/trainer. py?line=400) "на True, чтобы избежать непредвиденного поведения, например несовпадения размещения устройства." [402](file:///c%3A/Users/wl/AppData/Local/Programs/Python/Python311/Lib/site-packages/transformers/trainer.py?line=401)) IndexError: индекс списка вышел за пределы диапазон Вывод усекается. Просмотреть как [прокручиваемый элемент](команда:cellOutput.enableScrolling?f80cd8a1-e6c5-4e39-ba7e-fd3bf680aa55) или открыть в [текстовом редакторе](команда:workbench.action.openLargeOutput?f80cd8a1-e6c5-4e39-ba7e-fd3bf680aa55 ). Настройте вывод ячейки [настройки] (команда:workbench.action.openSettings?%5B%22%40tag%3AnotebookOutputLayout%22%5D)... Я проверил свои наборы данных и форматирование, но так и не смог найти ничего, вызывающего эту ошибку. Буду рад, если кто-нибудь знает, почему это происходит.
Я пытался загрузить модель hf llama2 в 8-битном режиме и думаю, не в этом ли причина того, что он выдает ошибку, поскольку исходное руководство загружает модель в 4-битном формате.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Не удалось сгенерировать ответ после точной настройки Bloomz-560M с помощью LoRA.
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Не удалось сгенерировать ответ после точной настройки Bloomz-560M с помощью LoRA.
Anonymous » » в форуме Python - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-