PEFT documentation
Menggabungkan model
Menggabungkan model
Melatih model untuk setiap tugas dapat memakan biaya, menghabiskan ruang penyimpanan, dan model-model tersebut tidak mampu mempelajari informasi baru untuk meningkatkan kinerjanya. Pembelajaran multitugas dapat mengatasi beberapa keterbatasan ini dengan melatih model untuk mempelajari beberapa tugas, tetapi proses pelatihannya mahal dan merancang dataset untuknya menantang. Penggabungan model menawarkan solusi untuk tantangan ini dengan menggabungkan beberapa model pralatih menjadi satu model, memberikannya kemampuan gabungan dari masing-masing model individu tanpa pelatihan tambahan.
PEFT menyediakan beberapa metode untuk menggabungkan model, seperti kombinasi linear atau SVD. Panduan ini berfokus pada dua metode yang lebih efisien untuk menggabungkan adapter LoRA dengan menghilangkan parameter yang redundan:
- TIES - TrIm, Elect, and Merge (TIES) adalah metode tiga langkah untuk menggabungkan model. Pertama, parameter yang redundan dipangkas, kemudian tanda yang saling bertentangan diselesaikan menjadi vektor agregat, dan akhirnya parameter yang tandanya sama dengan tanda agregat dirata-ratakan. Metode ini memperhitungkan bahwa beberapa nilai (redundansi dan ketidaksepakatan tanda) dapat menurunkan kinerja pada model gabungan.
- DARE - Drop And REscale adalah metode yang dapat digunakan untuk mempersiapkan metode penggabungan model lainnya seperti TIES. Metode ini bekerja dengan cara membuang parameter secara acak berdasarkan tingkat penghapusan (drop rate) dan melakukan penskalaan ulang (rescaling) pada parameter yang tersisa. Hal ini membantu mengurangi jumlah parameter yang redundan dan berpotensi saling mengganggu di antara beberapa model.
Model digabungkan dengan metode add_weighted_adapter(), dan metode penggabungan model yang spesifik ditentukan dalam parameter combination_type.
Metode penggabungan
Dengan TIES dan DARE, penggabungan diaktifkan dengan mengatur combination_type dan density ke nilai bobot yang akan dipertahankan dari model-model individual. Sebagai contoh, mari kita gabungkan tiga model TinyLlama/TinyLlama-1.1B-intermediate-step-1431k-3T yang telah di-finetune: tinyllama_lora_nobots, tinyllama_lora_sql, dan tinyllama_lora_adcopy.
Saat Anda mencoba menggabungkan model yang telah dilatih sepenuhnya dengan TIES, Anda perlu memperhatikan token khusus yang mungkin telah ditambahkan oleh masing-masing model ke lapisan embedding, yang bukan merupakan bagian dari kosakata checkpoint asli. Hal ini dapat menyebabkan masalah karena masing-masing model mungkin telah menambahkan token khusus ke posisi embedding yang sama. Jika demikian, Anda harus menggunakan metode resize_token_embeddings untuk menghindari penggabungan token khusus pada indeks embedding yang sama.
Ini seharusnya bukan masalah jika Anda hanya menggabungkan adapter LoRA yang dilatih dari model dasar yang sama.
Muat model dasar dan dapat menggunakan metode load_adapter() untuk memuat dan memberi nama setiap adapter:
from peft import PeftConfig, PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
config = PeftConfig.from_pretrained("smangrul/tinyllama_lora_norobots")
model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path, load_in_4bit=True, device_map="auto").eval()
tokenizer = AutoTokenizer.from_pretrained("smangrul/tinyllama_lora_norobots")
model.config.vocab_size = 32005
model.resize_token_embeddings(32005)
model = PeftModel.from_pretrained(model, "smangrul/tinyllama_lora_norobots", adapter_name="norobots")
_ = model.load_adapter("smangrul/tinyllama_lora_sql", adapter_name="sql")
_ = model.load_adapter("smangrul/tinyllama_lora_adcopy", adapter_name="adcopy")Atur adapter, bobot, adapter_name, combination_type, dan density dengan metode add_weighted_adapter().
Nilai bobot yang lebih besar dari 1.0 biasanya menghasilkan hasil yang lebih baik karena mempertahankan skala yang benar. Nilai awal default yang baik untuk bobot adalah dengan mengatur semua nilai menjadi 1.0.
adapters = ["norobots", "adcopy", "sql"]
weights = [2.0, 1.0, 1.0]
adapter_name = "merge"
density = 0.2
model.add_weighted_adapter(adapters, weights, adapter_name, combination_type="ties", density=density)adapters = ["norobots", "adcopy", "sql"]
weights = [2.0, 0.3, 0.7]
adapter_name = "merge"
density = 0.2
model.add_weighted_adapter(adapters, weights, adapter_name, combination_type="dare_ties", density=density)Atur model yang baru digabungkan sebagai model aktif dengan metode set_adapter().
model.set_adapter("merge")Sekarang Anda dapat menggunakan model gabungan sebagai model yang telah diinstruksikan untuk menulis salinan iklan atau kueri SQL!
device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"
messages = [
{"role": "user", "content": "Write an essay about Generative AI."},
]
text = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
inputs = tokenizer(text, return_tensors="pt")
inputs = {k: v.to(device) for k, v in inputs.items()}
outputs = model.generate(**inputs, max_new_tokens=256, do_sample=True, top_p=0.95, temperature=0.2, repetition_penalty=1.2, eos_token_id=tokenizer.eos_token_id)
print(tokenizer.decode(outputs[0]))device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"
messages = [
{"role": "system", "content": "Create a text ad given the following product and description."},
{"role": "user", "content": "Product: Sony PS5 PlayStation Console\nDescription: The PS5 console unleashes new gaming possibilities that you never anticipated."},
]
text = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
inputs = tokenizer(text, return_tensors="pt")
inputs = {k: v.to(device) for k, v in inputs.items()}
outputs = model.generate(**inputs, max_new_tokens=128, do_sample=True, top_p=0.95, temperature=0.2, repetition_penalty=1.2, eos_token_id=tokenizer.eos_token_id)
print(tokenizer.decode(outputs[0]))device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"
text = """Table: 2-11365528-2
Columns: ['Team', 'Head Coach', 'President', 'Home Ground', 'Location']
Natural Query: Who is the Head Coach of the team whose President is Mario Volarevic?
SQL Query:"""
inputs = tokenizer(text, return_tensors="pt")
inputs = {k: v.to(device) for k, v in inputs.items()}
outputs = model.generate(**inputs, max_new_tokens=64, repetition_penalty=1.1, eos_token_id=tokenizer("</s>").input_ids[-1])
print(tokenizer.decode(outputs[0]))Menggabungkan Model (IA)³
Model (IA)³ memfasilitasi penggabungan linier adapter. Untuk menggabungkan adapter dalam model (IA)³, gunakan metode add_weighted_adapter dari kelas IA3Model. Metode ini serupa dengan metode add_weighted_adapter yang digunakan dalam LoraModel, dengan perbedaan utama berupa ketiadaan parameter combination_type. Sebagai contoh, untuk menggabungkan tiga adapter (IA)³ ke dalam model PEFT, Anda dapat melakukan langkah-langkah berikut:
adapters = ["adapter1", "adapter2", "adapter3"]
weights = [0.4, 0.3, 0.3]
adapter_name = "merge"
model.add_weighted_adapter(adapters, weights, adapter_name)Disarankan agar jumlah bobot sama dengan 1.0 untuk mempertahankan skala model. Model gabungan kemudian dapat disetel sebagai model aktif menggunakan metode set_adapter:
model.set_adapter("merge")