在Colab中微调Llama 3.1时的上下文长度限制问题
Llama 3.1 LoRA微调后上下文长度相关问题
背景说明
我在Google Colab Pro的A100 GPU上,使用Unsloth库通过LoRA技术,基于自定义数据集微调Llama 3.1模型,所用LoRA配置及训练代码如下:
max_seq_length = 2048 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 ) 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=False, # Can make training 5x faster for short sequences. args=TrainingArguments( per_device_train_batch_size=2, gradient_accumulation_steps=4, warmup_steps=5, # num_train_epochs = 1, # Set this for 1 full training run. max_steps=60, 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", ), )
Llama 3.1原生支持最高128k的上下文长度,但受计算和显存限制,训练时我将max_seq_length设为2048。另外代码通过is_bfloat16_supported()自动检测GPU是否支持BF16格式,以此提升训练稳定性(该特性仅支持Ampere及更新架构的GPU)。
问题解答
训练时设置
max_seq_length=2048,训练完成后模型的基础上下文长度仍是原生的128k。max_seq_length只是训练阶段限制输入序列的最大长度,不会修改模型本身的架构参数(比如注意力层的位置编码、上下文窗口相关底层设置)。LoRA微调仅针对指定模块添加小参数适配器,不会改变原模型的上下文能力。训练完成后完全可以使用128k的上下文长度。只要在加载微调后的模型(包含LoRA适配器)时,将推理阶段的序列长度设置为128k,模型就能正常处理长上下文。需注意推理时要确保显存足够支撑128k序列的计算,A100 GPU的显存容量(40GB/80GB)通常可以满足需求,具体还要看模型量化方式和推理配置。
内容的提问来源于stack exchange,提问作者AYUSH NATH TIWARI
相关产品推荐
相关产品推荐

