--- license: cc-by-nc-4.0 base_model: - unsloth/llama-3-8b-bnb-4bit pipeline_tag: text-generation tags: - conversational - llama - ollama - unsloth - gguf - 8b --- # Training Process ## Model + LoRA Loading ```python from unsloth import FastLanguageModel import torch max_seq_length = 2048 dtype = None # None for auto detection. Float16 for Tesla T4, V100, Bfloat16 for Ampere+ load_in_4bit = True # Use 4bit quantization to reduce memory usage. Can be False. model, tokenizer = FastLanguageModel.from_pretrained( model_name = "unsloth/llama-3-8b-bnb-4bit", max_seq_length = max_seq_length, dtype = dtype, load_in_4bit = load_in_4bit, # token = "hf_...", # use one if using gated models like meta-llama/Llama-2-7b-hf ) model = FastLanguageModel.get_peft_model( model, r = 16, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128 target_modules = ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj",], lora_alpha = 16, lora_dropout = 0, # Supports any, but = 0 is optimized bias = "none", # Supports any, but = "none" is optimized use_gradient_checkpointing = "unsloth", # True or "unsloth" for very long context random_state = 3407, use_rslora = False, # We support rank stabilized LoRA loftq_config = None, # And LoftQ ) ``` ## Dataset Preparation ```python from datasets import load_dataset dataset = load_dataset( "csv", data_files = "/content/synth_data.csv", split = "train", ) from unsloth import to_sharegpt dataset = to_sharegpt( dataset, merged_prompt = "Labels: {available_entities}\n\nText: {text}\n", conversation_extension = 5, # Randomnly combines conversations into 1 output_column_name = "label", ) from unsloth import standardize_sharegpt dataset = standardize_sharegpt(dataset) chat_template = """{SYSTEM} USER: {INPUT} ASSISTANT: {OUTPUT}""" from unsloth import apply_chat_template dataset = apply_chat_template( dataset, tokenizer = tokenizer, chat_template = chat_template, default_system_message = "NER Task: Label the text based on the available Labels." ) ``` ## Training Configuration ```python from trl import SFTTrainer from transformers import TrainingArguments from unsloth import is_bfloat16_supported trainer = SFTTrainer( model = model, tokenizer = tokenizer, train_dataset = dataset, dataset_text_field = "text", max_seq_length = max_seq_length, dataset_num_proc = 2, packing = True, # Can make training 5x faster for short sequences. args = TrainingArguments( per_device_train_batch_size = 2, gradient_accumulation_steps = 4, warmup_steps = 5, # max_steps = None, num_train_epochs = 1, learning_rate = 2e-4, fp16 = not is_bfloat16_supported(), bf16 = is_bfloat16_supported(), logging_steps = 1, optim = "adamw_8bit", weight_decay = 0.01, lr_scheduler_type = "linear", seed = 3407, output_dir = "outputs", ), ) trainer_stats = trainer.train() # Save to 8bit Q8_0 if False: model.save_pretrained_gguf("model", tokenizer,) ``` ## Training Results ![image/png](https://cdn-uploads.huggingface.co/production/uploads/678fa336b0c8266724597a95/hcRhMrr2lC5f2b9enD_1z.png) - Steps Trained: 26 - Final Loss: 0.1870 - Total Time: 21:04 min - Full epoch had been 261 steps # Sample Inference ```python FastLanguageModel.for_inference(model) # Enable native 2x faster inference messages = [ # Change below! {"role": "user", "content": 'Labels: ATTR, CITY, CITY_PART, COUNTRY, O, ORG, PER, PHONE, REGION, REL, STREET, WORK_P, WORK_S\n\n'\ 'Text: "doctors in berlin"'}, ] input_ids = tokenizer.apply_chat_template( messages, add_generation_prompt = True, return_tensors = "pt", ).to("cuda") from transformers import TextStreamer text_streamer = TextStreamer(tokenizer, skip_prompt = True) _ = model.generate(input_ids, streamer = text_streamer, max_new_tokens = 128, pad_token_id = tokenizer.eos_token_id) ```