Skip to content

Instantly share code, notes, and snippets.

@viliamvolosv
Created June 17, 2024 18:14
Show Gist options
  • Save viliamvolosv/fdd641d77721a48bf38225d088683d07 to your computer and use it in GitHub Desktop.
Save viliamvolosv/fdd641d77721a48bf38225d088683d07 to your computer and use it in GitHub Desktop.
Settings for qlora
{"messages":
[
{"content":"Ты помошник писателя. ты помогаешь писателю писать главы для книги. ","role":"system"},
{"content":"Напиши текс похожий на текст автора Чехов А","role":"user"},
{"content":"Наступило молчание. Доктор медленно застегнул пальто и стал искать шляпу, которую он уронил, шагая.\r\n- Я вышел из себя, - бормотал он, низко нагибаясь к полу. - Совсем выпустил из виду, что вам теперь не до меня... Бог знает, чего наговорил. Вы, Ольга, не обращайте внимания.\r\nОн нашел шляпу и направился к темному углу.\r\n- Я оскорбил вас, - сказал он тихим, нежным полушёпотом. - Но еще раз умоляю вас, Ольга. Скажите мне правду. Между нами не должна стоять ложь.\r\n.. Я проговорился, и вы теперь знаете, что Петров и Куровский не составляют для меня тайны. Стало быть, вам теперь легко сказать правду.\r\nОльга Ивановна подумала и, заметно колеблясь, сказала:\n - Николай, я не лгу. Миша ваш.\r\n- Боже мой, - простонал Цветков, - так я же вам скажу еще больше: у меня хранится ваше письмо к Петрову где вы называете его отцом Миши!\r\nОльга, я знаю правду, но мне хочется слышать ее от вас! Слышите?\r\nОльга Ивановна не отвечала и продолжала плакать. Подождав ответа, Цветков пожал плечами и вышел.\r\n- Я завтра приеду, - крикнул он из передней. Всю дорогу, сидя в своей карете, он пожимал плечами и бормотал:\r\n- Как жаль, что я не умею говорить! У меня нет дара убеждать и уверять. Очевидно, она не понимает меня, если лжет! Очевидно! Как же ей обьяснить? Как?\r\nСИРЕНА\r\nПосле одного из заседаний N-ского мирового съезда судьи собрались в совещательной комнате, чтобы снять свои мундиры, минутку отдохнуть и ехать домой обедать.\r\nПредседатель съезда, очень видный мужчина с пушистыми бакенами, оставшийся по одному из только что разобранных дел \"при особом мнении\", сидел за столом и спешил записать свое мнение.\r\nУчастковый мировой судья Милкин, молодой человек с томным, меланхолическим лицом, слывущий за философа,\r\nнедовольного средой и ищущего цели жизни, стоял у окна и печально глядел во двор.\r\nДругой участковый и один из почетных уже ушли.\r\nОставшийся почетный, обрюзглый, тяжело дышащий толстяк, и товарищ прокурора, молодой немец с катаральным лицом,\r\nсидели на диванчике и ждали, когда кончит писать председатель, чтобы ехать вместе обедать.\r\nПеред ними стоял секретарь съезда Жилин, маленький человечек с бачками около ушей и с выражением сладости на лице. Медово улыбаясь и глядя на толстяка, он говорил вполголоса:\r\n- Все мы сейчас желаем кушать, потому что утомились и уже четвертый час, но это, душа моя Григорий Саввич, не настоящий аппетит.\r\nНастоящий, волчий аппетит, когда, кажется, отца родного съел бы, бывает только после физических движений,\r\nнапример, после охоты с гончими, или когда отмахаешь на обывательских верст сто без передышки.\r\nТоже много значит и воображение-с.\r\nЕжели, положим, вы едете с охоты домой и желаете с аппетитом пообедать, то никогда не нужно думать об умном; умное да ученое всегда аппетит отшибает.\r\nСами изволите знать, философы и ученые насчет еды самые последние люди и хуже их, извините, не едят даже свиньи.\r\nЕдучи домой, надо стараться, чтобы голова думала только о графинчике да закусочке.\r\nЯ раз дорогою закрыл глаза и вообразил себе поросеночка с хреном, так со мной от аппетита истерика сделалась.\r\nНу-с, а когда вы въезжаете к себе во двор, то нужно, чтобы в это время из кухни пахло чем-нибудь этаким, знаете ли...\r\n- Жареные гуси мастера пахнуть, - сказал почетный мировой, тяжело дыша.\r\n- Не говорите, душа моя Григорий Саввич, утка или бекас могут гусю десять очков вперед дать. В гусином букете нет нежности и деликатности.\r\nЗабористее всего пахнет молодой лук, когда, знаете ли, начинает поджариваться и, понимаете ли, шипит, подлец, на весь дом.\r\nНу-с, когда вы входите в дом, то стол уже должен быть накрыт, а когда сядете, сейчас салфетку за галстук и не спеша тянетесь к графинчику с водочкой.\r\nДа ее, мамочку, наливаете не в рюмку, а в какой-нибудь допотопный дедовский стаканчик из серебра или в этакий пузатенький с надписью \"его же и монаси приемлют\", и выпиваете не сразу,\r\nа сначала вздохнете, руки потрете, равнодушно на потолок поглядите, потом, этак не спеша, поднесете ее, водочку-то, к губам и - тотчас же у вас из желудка по всему телу искры.\r\n..\r\nСекретарь изобразил на своем сладком лице блаженство.\n - Искры... - повторил он, жмурясь. - Как только выпили, сейчас же закусить нужно.\r\n- Послушайте, - сказал председатель, поднимая глаза на секретаря, - говорите потише! Я из-за вас уже второй лист порчу.\r\n- Ах, виноват-с, Петр Николаич! Я буду тихо, - сказал секретарь и продолжал полушёпотом: - Ну-с, а закусить, душа моя Григорий Саввич, тоже нужно умеючи.\r\nНадо знать, чем закусывать. Самая лучшая закуска, ежели желаете знать, селедка.\r\nСъели вы ее кусочек с лучком и с горчичным соусом, сейчас же, благодетель мой, пока еще чувствуете в животе искры, кушайте икру саму по себе или, ежели желаете, с лимончиком,\r\nпотом простой редьки с солью, потом опять селедки, но всего лучше, благодетель, рыжики соленые, ежели их изрезать мелко, как икру, и, понимаете ли, с луком, с прованским маслом.\r\n.. объедение! Но налимья печенка - это трагедия!\r\n- М-да... - согласился почетный мировой, жмуря глаза. - Для закуски хороши также, того... душоные белые грибы...\r\n- Да, да, да... с луком, знаете ли, с лавровым листом и всякими специями. Откроешь кастрюлю, а из нее пар, грибной дух...\r\nдаже слеза прошибает иной раз! Ну-с, как только из кухни приволокли кулебяку, сейчас же, немедля, нужно вторую выпить.\r\n- Иван Гурьич! - сказал плачущим голосом председатель. - Из-за вас я третий лист испортил!\r\n- Чёрт его знает, только об еде и думает! - проворчал философ Милкин, делая презрительную гримасу. - Неужели, кроме грибов да кулебяки, нет других интересов в жизни?\r\n- Ну-с, перед кулебякой выпить, - продолжал секретарь вполголоса; он уже так увлекся, что, как поющий соловей, не слышал ничего, кроме собственного голоса.\r\n- Кулебяка должна быть аппетитная, бесстыдная, во всей своей наготе, чтоб соблазн был.\r\nПодмигнешь на нее глазом, отрежешь этакий кусище и пальцами над ней пошевелишь вот этак, от избытка чувств.\r\nСтанешь ее есть, а с нее масло, как слезы, начинка жирная, сочная, с яйцами, с потрохами, с луком...\r\nСекретарь подкатил глаза и перекосил рот до самого уха. Почетный мировой крякнул и, вероятно, воображая себе кулебяку, пошевелил пальцами.\r\n- Это чёрт знает что... - проворчал участковый, отходя к другому окну.\r\n- Два куска съел, а третий к щам приберег, - продолжал секретарь вдохновенно. - Как только кончили с кулебякой, так сейчас же, чтоб аппетита не перебить, велите щи подавать.\r\n.. Щи должны быть горячие, огневые. Но лучше всего, благодетель мой, борщок из свеклы на хохлацкий манер, с ветчинкой и с сосисками.\r\nК нему подаются сметана и свежая петрушечка с укропцем.\r\nВеликолепно также рассольник из потрохов и молоденьких почек, а ежели любите суп, то из супов наилучший, который засыпается кореньями и зеленями:\r\nморковкой, спаржей, цветной капустой и всякой тому подобной юриспруденцией.\r\n- Да, великолепная вещь...\r\n- вздохнул председатель, отрывая глаза от бумаги, но тотчас же спохватился и простонал: - Побойтесь вы бога! Этак я до вечера не напишу особого мнения! Четвертый лист порчу!\r\n- Не буду, не буду! Виноват-с! - извинился секретарь и продолжал шепотом: - Как только скушали борщок или суп, сейчас же велите подавать рыбное, благодетель.\r\nИз рыб безгласных самая лучшая - это жареный карась в сметане; только, чтобы он не пах тиной и имел тонкость, нужно продержать его живого в молоке целые сутки.\r\n- Хорошо также стерлядку кольчиком, - сказал почетный мировой, закрывая глаза, но тотчас же,\r\nнеожиданно для всех, он рванулся с места, сделал зверское лицо и заревел в сторону председателя:\r\n- Петр Николаич, скоро ли вы?\r\nНе могу я больше ждать! Не могу!\r\n- Дайте мне кончить!\r\n- Ну, так я сам поеду! Чёрт с вами!\r\nТолстяк махнул рукой, схватил шляпу и, не простившись, выбежал из комнаты. Секретарь вздохнул и, нагнувшись к уху товарища прокурора, продолжал вполголоса:\r\n- Хорош также судак или карпий с подливкой из помидоров и грибков.\r\nНо рыбой не насытишься, Степан Францыч; это еда несущественная, главное в обеде не рыба, не соусы, а жаркое. Вы какую птицу больше обожаете?\r\nТоварищ прокурора сделал кислое лицо и сказал со вздохом:\n - К несчастью, я не могу вам сочувствовать: у меня катар желудка.\r\n- Полноте, сударь! Катар желудка доктора выдумали! Больше от вольнодумства да от гордости бывает эта болезнь.\r\nВы не обращайте внимания. Положим, вам кушать не хочется или тошно, а вы не обращайте внимания и кушайте себе.\r\nЕжели, положим, подадут к жаркому парочку дупелей, да ежели прибавить к этому куропаточку или парочку перепелочек жирненьких,\r\nто тут про всякий катар забудете, честное благородное слово.\r\nА жареная индейка? Белая, жирная, сочная этакая, знаете ли, вроде нимфы...\r\n- Да, вероятно, это вкусно, - сказал прокурор, грустно улыбаясь. - Индейку, пожалуй, я ел бы.\r\n- Господи, а утка?\r\nЕсли взять молодую утку, которая только что в первые морозы ледку хватила, да изжарить ее на противне вместе с картошкой,\r\nда чтоб картошка была мелко нарезана, да подрумянилась бы, да чтоб утиным жиром пропиталась, да чтоб.\r\n..\r\nФилософ Милкин сделал зверское лицо и, по-видимому, хотел что-то сказать, но вдруг причмокнул губами, вероятно,\r\nвообразив жареную утку, и, не сказав ни слова, влекомый неведомою силой, схватил шляпу и выбежал вон.\r\n- Да, пожалуй, я поел бы и утки... - вздохнул товарищ прокурора.\r\nПредседатель встал, прошелся и опять сел.\r\n- После жаркого человек становится сыт и впадает в сладостное затмение, - продолжал секретарь.\r\n- В это время и телу хорошо и на душе умилительно. Для услаждения можете выкушать рюмочки три запеканочки.\r\nПредседатель крякнул и перечеркнул лист.\n - Я шестой лист порчу, - сказал он сердито. - Это бессовестно!\r\n- Пишите, пишите, благодетель! - зашептал секретарь. - Я не буду! Я потихоньку.\r\nЯ вам по совести, Степан Францыч, - продолжал он едва слышным шёпотом, - домашняя самоделковая запеканочка лучше всякого шампанского.\r\nПосле первой же рюмки всю вашу душу охватывает обоняние, этакий мираж, и кажется вам, что вы не в кресле у себя дома, а где-нибудь в Австралии, на каком-нибудь мягчайшем страусе...\r\n- Ах, да поедемте, Петр Николаич! - сказал прокурор, нетерпеливо дрыгнув ногой.\r\n- Да-с, - продолжал секретарь.\r\n- Во время запеканки хорошо сигарку выкурить и кольца пускать, и в это время в голову приходят такие мечтательные мысли,\r\nбудто вы генералиссимус или женаты на первейшей красавице в мире, и будто эта красавица плавает целый день перед вашими окнами в этаком бассейне с золотыми рыбками.\r\nОна плавает, а вы ей: \"Душенька, иди поцелуй меня!\"\r\n- Петр Николаич! - простонал товарищ прокурора.\r\n- Да-с, - продолжал секретарь. - Покуривши, подбирайте полы халата и айда к постельке! Этак ложитесь на спинку, животиком вверх, и берите газетку в руки.\r\nКогда глаза слипаются и во всем теле дремота стоит, приятно читать про политику:\r\nтам, глядишь, Австрия сплоховала, там Франция кому-нибудь не потрафила, там папа римский наперекор пошел - читаешь, оно и приятно.\r\nПредседатель вскочил, швырнул в сторону перо и обеими руками ухватился за шляпу. Товарищ прокурора, забывший о своем катаре и млевший от нетерпения, тоже вскочил.\r\n- Едемте! - крикнул он.\n - Петр Николаич, а как же особое мнение, - испугался секретарь. - Когда же вы его, благодетель, напишете? Ведь вам в шесть часов в город ехать!\r\nПредседатель махнул рукой и бросился к двери. Товарищ прокурора тоже махнул рукой и, подхватив свой портфель, исчез вместе с председателем.\r\nСекретарь вздохнул, укоризненно поглядел им вслед и стал убирать бумаги.\r\nСВИРЕЛЬ\r\nРазморенный духотою еловой чащи, весь в паутине и в хвойных иглах, пробирался с ружьем к опушке приказчик из Дементьева хутора, Мелитон Шишкин.\r\nЕго Дамка - помесь дворняги с сеттером - необыкновенно худая и беременная, поджимая под себя мокрый хвост, плелась за хозяином и всячески старалась не наколоть себе носа.\r\nУтро было нехорошее, пасмурное. С деревьев, окутанных легким туманом, и с папоротника сыпались крупные брызги, лесная сырость издавала острый запах гнили.\r\nВпереди, где кончалась чаща, стояли березы, а сквозь их стволы и ветви видна была туманная даль. Кто-то за березами играл на самоделковой, пастушеской свирели.\r\nИгрок брал не более пяти-шести нот, лениво тянул их, не стараясь связать их в мотив, но тем не менее в его писке слышалось что-то суровое и чрезвычайно тоскливое.\r\nКогда чаща поредела и елки уже мешались с молодой березой, Мелитон увидел стадо. Спутанные лошади, коровы и овцы бродили между кустов и, потрескивая сучьями, обнюхивали лесную траву.\r\nНа опушке, прислонившись к мокрой березке, стоял старик пастух, тощий, в рваной сермяге и без шапки. Он глядел в землю, о чем-то думал и играл на свирели, по-видимому, машинально.\r\n- Здравствуй, дед! Бог на помощь! - приветствовал его Мелитон тонким, сиплым голоском, который совсем не шел к его громадному росту и большому, мясистому лицу.\r\n- А ловко ты на дудочке дудишь! Чье стадо пасешь?\r\n- Артамоновское, - нехотя ответил пастух и сунул свирель за пазуху.\r\n- Стало быть, и лес артамоновский? - спросил Мелитон, оглядываясь. - И впрямь артамоновский, скажи на милость... Совсем было заблудился. Всю харю себе в чепыге исцарапал.\r\nОн сел на мокрую землю и стал лепить из газетной бумаги папиросу.\r\nПодобно жиденькому голоску, всё у этого человека было мелко и не соответствовало его росту, ширине и мясистому лицу:\r\nи улыбка, и глазки, и пуговки, и картузик, едва державшийся на жирной стриженой голове.\r\nКогда он говорил и улыбался, то в его бритом, пухлом лице и во всей фигуре чувствовалось что-то бабье, робкое и смиренное.\r\n- Ну, погода, не дай бог! - сказал он и покрутил головой. - Люди еще овса не убрали, а дождик словно нанялся, бог с ним.\r\nПастух поглядел на небо, откуда моросил дождь, на лес, на мокрую одежду приказчика, подумал и ничего не сказал.\r\n- Всё лето такое было... - вздохнул Мелитон. - И мужикам плохо, и господам никакого удовольствия.\r\nПастух еще раз поглядел на небо, подумал и сказал с расстановкой, точно разжевывая каждое слово:","role":"assistant"}
]
}
# script parameters
model_id: "IlyaGusev/saiga_llama3_8b" # Hugging Face model id
dataset_path: "." # path to dataset
max_seq_len: 8000 # 2048 # max sequence length for model and packing of the dataset
# training parameters
output_dir: "./saiga_llama3_8b_rubooks_2" # Temporary output directory for model checkpoints
report_to: "tensorboard" # report metrics to tensorboard
learning_rate: 0.0002 # learning rate 2e-4
lr_scheduler_type: "constant" # learning rate scheduler
num_train_epochs: 10 # number of training epochs
per_device_train_batch_size: 4 # batch size per device during training
per_device_eval_batch_size: 4 # batch size for evaluation
gradient_accumulation_steps: 4 # number of steps before performing a backward/update pass
optim: paged_adamw_8bit # use torch adamw optimizer
logging_steps: 10 # log every 10 steps
save_strategy: epoch # save checkpoint every epoch
eval_strategy: epoch # evaluate every epoch
max_grad_norm: 0.3 # max gradient norm
warmup_ratio: 0.5 # warmup ratio
bf16: true # use bfloat16 precision
tf32: true # use tf32 precision
gradient_checkpointing: true # use gradient checkpointing to save memory
# FSDP parameters: https://huggingface.co/docs/transformers/main/en/fsdp
import logging
from dataclasses import dataclass, field
import os
import random
import torch
from datasets import load_dataset
from transformers import AutoTokenizer, TrainingArguments
from trl.commands.cli_utils import TrlParser
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig,
set_seed,
)
from trl import setup_chat_format
from peft import LoraConfig
from trl import (
SFTTrainer)
# Comment in if you want to use the Llama 3 instruct template but make sure to add modules_to_save
# LLAMA_3_CHAT_TEMPLATE="{% set loop_messages = messages %}{% for message in loop_messages %}{% set content = '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n'+ message['content'] | trim + '<|eot_id|>' %}{% if loop.index0 == 0 %}{% set content = bos_token + content %}{% endif %}{{ content }}{% endfor %}{% if add_generation_prompt %}{{ '<|start_header_id|>assistant<|end_header_id|>\n\n' }}{% endif %}"
# Anthropic/Vicuna like template without the need for special tokens
LLAMA_3_CHAT_TEMPLATE = (
"{% for message in messages %}"
"{% if message['role'] == 'system' %}"
"{{ message['content'] }}"
"{% elif message['role'] == 'user' %}"
"{{ '\n\nHuman: ' + message['content'] + eos_token }}"
"{% elif message['role'] == 'assistant' %}"
"{{ '\n\nAssistant: ' + message['content'] + eos_token }}"
"{% endif %}"
"{% endfor %}"
"{% if add_generation_prompt %}"
"{{ '\n\nAssistant: ' }}"
"{% endif %}"
)
# ACCELERATE_USE_FSDP=1 FSDP_CPU_RAM_EFFICIENT_LOADING=1 torchrun --nproc_per_node=4 ./scripts/run_fsdp_qlora.py --config llama_3_70b_fsdp_qlora.yaml
_PATH = os.path.expanduser('~/parfiriy/booksdata')
@dataclass
class ScriptArguments:
dataset_path: str = field(
default=_PATH,
metadata={
"help": "Path to the dataset"
},
)
model_id: str = field(
default=None, metadata={"help": "Model ID to use for SFT training"}
)
max_seq_length: int = field(
default=512, metadata={"help": "The maximum sequence length for SFT Trainer"}
)
_PATH = os.path.expanduser('~/parfiriy/booksdata')
def training_function(script_args, training_args):
################
# Dataset
################
train_dataset = load_dataset(
"json",
data_files=os.path.join(_PATH, "train_dataset.json"),
split="train",
)
test_dataset = load_dataset(
"json",
data_files=os.path.join(_PATH, "test_dataset.json"),
split="train",
)
val_dataset = load_dataset(
"json",
data_files=os.path.join(_PATH, "validation_dataset.json"),
split="train",
)
################
# Model & Tokenizer
################
# Tokenizer
tokenizer = AutoTokenizer.from_pretrained(script_args.model_id, use_fast=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.chat_template = LLAMA_3_CHAT_TEMPLATE
# template dataset
def template_dataset(examples):
return{"text": tokenizer.apply_chat_template(examples["messages"], tokenize=False)}
train_dataset = train_dataset.map(template_dataset, remove_columns=["messages"])
test_dataset = test_dataset.map(template_dataset, remove_columns=["messages"])
val_dataset = val_dataset.map(template_dataset, remove_columns=["messages"])
# Model
torch_dtype = torch.bfloat16
quant_storage_dtype = torch.bfloat16
quantization_config = BitsAndBytesConfig(
load_in_8bit= True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch_dtype,
#device_map="auto",
#torch_dtype = torch_dtype,
bnb_4bit_quant_storage=quant_storage_dtype,
)
model = AutoModelForCausalLM.from_pretrained(
script_args.model_id,
quantization_config=quantization_config,
torch_dtype=quant_storage_dtype,
use_cache=False if training_args.gradient_checkpointing else True, # this is needed for gradient checkpointing
)
model.eval()
if training_args.gradient_checkpointing:
model.gradient_checkpointing_enable()
################
# PEFT
################
peft_config = LoraConfig(
r=8,
lora_alpha=32,
lora_dropout=0.05,
bias="none",
target_modules="all-linear",
task_type="CAUSAL_LM",
# modules_to_save = ["lm_head", "embed_tokens"] # add if you want to use the Llama 3 instruct template
)
model.train()
################
# Training
################
trainer = SFTTrainer(
model=model,
train_dataset=train_dataset,
eval_dataset = val_dataset,
args=training_args,
dataset_text_field="text",
peft_config=peft_config,
max_seq_length=script_args.max_seq_length,
tokenizer=tokenizer,
packing=True,
dataset_kwargs={
"add_special_tokens": False, # We template with special tokens
"append_concat_token": False, # No need to add additional separator token
},
)
if trainer.accelerator.is_main_process:
trainer.model.print_trainable_parameters()
##########################
# Train model
##########################
checkpoint = None
if training_args.resume_from_checkpoint is not None:
checkpoint = training_args.resume_from_checkpoint
trainer.train(resume_from_checkpoint=checkpoint,)
##########################
# SAVE MODEL FOR SAGEMAKER
##########################
if trainer.is_fsdp_enabled:
trainer.accelerator.state.fsdp_plugin.set_state_dict_type("FULL_STATE_DICT")
trainer.save_model()
if __name__ == "__main__":
parser = TrlParser((ScriptArguments, TrainingArguments))
script_args, training_args = parser.parse_args_and_config()
# set use reentrant to False
if training_args.gradient_checkpointing:
training_args.gradient_checkpointing_kwargs = {"use_reentrant": True}
# set seed
set_seed(training_args.seed)
# launch training
training_function(script_args, training_args)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment