hotdogs commited on
Commit
58a5c14
·
verified ·
1 Parent(s): 8e1d8e7

Upload METHOD_VN.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. METHOD_VN.md +221 -0
METHOD_VN.md ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Trích Xuất SVD Chênh Lệch Trọng Số: Phương Pháp Phổ Quát
2
+
3
+ ## Cách tạo Bộ Điều Hợp LoRA từ Chênh Lệch Trọng Số giữa Hai Mô Hình
4
+
5
+ Kỹ thuật này hoạt động với **bất kỳ kiến trúc LLM nào** có hai bộ điều hợp được huấn luyện từ cùng một mô hình cơ sở.
6
+ Không cần GPU, không cần dữ liệu huấn luyện, chạy trong 1-3 phút trên CPU.
7
+
8
+ ```
9
+ Mô hình A (merged LoRA) Mô hình B (merged LoRA)
10
+ │ │
11
+ └──────────┬─────────────────────┘
12
+ │ W_B - W_A = Δ
13
+
14
+ SVD Cắt Cụt (hạng r)
15
+
16
+
17
+ Bộ Điều Hợp LoRA A→B (7 MB)
18
+ ```
19
+
20
+ ---
21
+
22
+ ## 1. Điều Kiện
23
+
24
+ ✅ Hoạt động khi:
25
+ - Cả hai mô hình dùng chung **cùng kiến trúc cơ sở và trọng số cơ sở** (cùng commit hash)
26
+ - Cả hai mô hình được huấn luyện bằng **LoRA + merge** (không phải full fine-tune)
27
+ - Tên tensor khớp nhau trên cả hai mô hình
28
+ - Ít nhất 4 GB RAM để tải 2 tensor cùng lúc
29
+
30
+ ❌ KHÔNG hoạt động khi:
31
+ - Kiến trúc khác nhau (mô hình cơ sở khác nhau)
32
+ - Full fine-tune (chênh lệch có thể vượt quá giả định hạng thấp)
33
+ - config.json / tokenizer bị thay đổi trong quá trình fine-tune
34
+ - RAM dưới 4 GB
35
+
36
+ ---
37
+
38
+ ## 2. Hướng Dẫn Từng Bước
39
+
40
+ ### Bước 1: Chọn Hai Mô Hình
41
+
42
+ ```python
43
+ MODEL_A = "lordx64/Qwen3.6-35B-A3B-Claude-4.7-Opus-Reasoning-Distilled" # Nguồn
44
+ MODEL_B = "lordx64/Qwen3.6-35B-A3B-Kimi-K2.6-Reasoning-Distilled" # Đích
45
+ ```
46
+
47
+ Quy tắc: Cả hai mô hình phải có tên tensor giống hệt và config.json giống hệt.
48
+
49
+ ### Bước 2: Chọn Mô-đun Mục Tiêu
50
+
51
+ Chỉ chọn các lớp tuyến tính bạn muốn trích xuất:
52
+
53
+ ```python
54
+ TARGET_MODULES = ["q_proj", "k_proj", "v_proj", "o_proj"] # chỉ attention
55
+ # hoặc
56
+ TARGET_MODULES = ["q_proj", "k_proj", "v_proj", "o_proj",
57
+ "gate_proj", "up_proj", "down_proj"] # attention + MLP
58
+ ```
59
+
60
+ ⚠️ **Quan trọng:** Bỏ qua tensor 3D (ví dụ: lớp chuyên gia MoE `[256, 2048, 512]`) — chúng yêu cầu SVD từng lát phức tạp hơn.
61
+
62
+ ### Bước 3: Chọn Hạng LoRA
63
+
64
+ ```python
65
+ RANK = 16 # tiêu chuẩn: cân bằng tốt nhất giữa kích thước và chất lượng
66
+ RANK = 8 # tối thiểu: nhỏ hơn, nhanh hơn, lỗi tái tạo cao hơn
67
+ RANK = 32 # chất lượng cao: lớn gấp 2, lỗi ít hơn ~4%
68
+ ```
69
+
70
+ Mẹo: Chạy phân tích lỗi tái tạo để tìm hạng tối ưu cho trường hợp của bạn.
71
+
72
+ ### Bước 4: Chạy Script Trích Xuất
73
+
74
+ ```bash
75
+ python3 extract_lora_diff.py \
76
+ --model_a lordx64/Qwen3.6-35B-A3B-Claude-4.7-Opus-Reasoning-Distilled \
77
+ --model_b lordx64/Qwen3.6-35B-A3B-Kimi-K2.6-Reasoning-Distilled \
78
+ --output ./my-lora-adapter \
79
+ --rank 16 \
80
+ --target_modules q_proj,k_proj,v_proj,o_proj
81
+ ```
82
+
83
+ ### Bước 5: Sử Dụng Bộ Điều Hợp
84
+
85
+ **Python (PEFT):**
86
+ ```python
87
+ from peft import PeftModel
88
+ from transformers import AutoModelForCausalLM
89
+
90
+ base = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3.6-35B-A3B")
91
+ model = PeftModel.from_pretrained(base, "./my-lora-adapter")
92
+ # mô hình bây giờ có phong cách B!
93
+ ```
94
+
95
+ **llama.cpp (GGUF):**
96
+ ```bash
97
+ # Chuyển đổi sang GGUF trước
98
+ python3 llama.cpp/convert_lora_to_gguf.py ./my-lora-adapter
99
+
100
+ # Chạy suy luận
101
+ llama-cli -m base-Q6_K.gguf --lora my-lora-adapter.gguf -p "lời nhắc"
102
+ ```
103
+
104
+ ---
105
+
106
+ ## 3. Cơ Sở Toán Học
107
+
108
+ ```
109
+ Cho: M_A = W_base + Δ_A (Mô hình A = cơ sở + LoRA A)
110
+ M_B = W_base + Δ_B (Mô hình B = cơ sở + LoRA B)
111
+
112
+ CL: D = M_B - M_A = Δ_B - Δ_A (cơ sở triệt tiêu, chỉ còn delta)
113
+
114
+ SVD: D ≈ U_r · Σ_r · V_r^T (xấp xỉ hạng r)
115
+
116
+ LoRA: A = √Σ_r · V_r^T (lora_A)
117
+ B = U_r · √Σ_r (lora_B)
118
+
119
+ Truyền: h = W_0·x + B·A·x (truyền xuôi LoRA chuẩn)
120
+ ```
121
+
122
+ **Tại sao nó hoạt động:**
123
+ - Cả A và B được huấn luyện với LoRA hạng r → chênh lệch của chúng có hạng ≤ 2r
124
+ - SVD ở hạng r có thể tái tạo chênh lệch gần như hoàn toàn (giữ 91-95% năng lượng)
125
+ - Không cần huấn luyện — đây là phân rã toán học thuần túy
126
+
127
+ ---
128
+
129
+ ## 4. Ví Dụ Cho Các Mô Hình Khác
130
+
131
+ ### Llama 3.1 8B — Chuyển Đổi Phong Cách
132
+
133
+ ```bash
134
+ # Hai mô hình fine-tune từ cùng cơ sở Llama-3.1-8B
135
+ MODEL_A = "user/llama3.1-8b-formal-style" # phong cách trang trọng
136
+ MODEL_B = "user/llama3.1-8b-casual-style" # phong cách thân mật
137
+
138
+ python3 extract_lora_diff.py \
139
+ --model_a user/llama3.1-8b-formal-style \
140
+ --model_b user/llama3.1-8b-casual-style \
141
+ --output ./llama-formal-to-casual \
142
+ --rank 16 \
143
+ --target_modules q_proj,k_proj,v_proj,o_proj
144
+ ```
145
+
146
+ ### Mistral 7B — Thích Ứng Lĩnh Vực
147
+
148
+ ```bash
149
+ MODEL_A = "mistralai/Mistral-7B-Instruct-v0.3" # tổng quát
150
+ MODEL_B = "user/Mistral-7B-medical-finetuned" # lĩnh vực y tế
151
+
152
+ python3 extract_lora_diff.py \
153
+ --model_a mistralai/Mistral-7B-Instruct-v0.3 \
154
+ --model_b user/Mistral-7B-medical-finetuned \
155
+ --output ./mistral-medical-lora \
156
+ --rank 16 \
157
+ --target_modules q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj
158
+ ```
159
+
160
+ ### Qwen2.5 72B — Gỡ Bỏ An Toàn
161
+
162
+ ```bash
163
+ # Trích xuất delta từ chối giữa phiên bản an toàn và không kiểm duyệt
164
+ MODEL_A = "Qwen/Qwen2.5-72B-Instruct" # có an toàn
165
+ MODEL_B = "user/Qwen2.5-72B-uncensored" # không an toàn
166
+
167
+ python3 extract_lora_diff.py \
168
+ --model_a Qwen/Qwen2.5-72B-Instruct \
169
+ --model_b user/Qwen2.5-72B-uncensored \
170
+ --output ./qwen-safety-removal-lora \
171
+ --rank 16
172
+ ```
173
+
174
+ ---
175
+
176
+ ## 5. Tham Khảo Tham Số
177
+
178
+ | Tham số | Mặc định | Mô tả |
179
+ |-----------|---------|-------------|
180
+ | `--rank` | 16 | Hạng LoRA. Cao hơn = lớn hơn + chất lượng tốt hơn. Thấp hơn = nhỏ hơn + nhanh hơn |
181
+ | `--target_modules` | q,k,v,o_proj | Mô-đun để trích xuất. Thêm gate/up/down cho MLP |
182
+ | `--alpha` | 32 | LoRA alpha (hệ số tỉ lệ). Thường gấp 2 lần rank |
183
+ | `--skip_3d` | True | Tự động bỏ qua tensor 3D (chuyên gia MoE) |
184
+ | `--output_format` | peft | `peft` hoặc `gguf` hoặc `both` |
185
+
186
+ ---
187
+
188
+ ## 6. Khắc Phục Sự Cố
189
+
190
+ | Vấn đề | Nguyên nhân | Giải pháp |
191
+ |---------|-------|----------|
192
+ | `KeyError: tên tensor không khớp` | Mô hình cơ sở khác nhau | Dùng mô hình huấn luyện từ cùng cơ sở |
193
+ | `CUDA hết bộ nhớ` | Tải toàn bộ mô hình | Dùng chế độ từng-tensor (mặc định) |
194
+ | `ValueError: tensor không liên tục` | Đầu ra SVD không liên tục | Thêm `.contiguous()` trước khi lưu |
195
+ | `Chuyển đổi GGUF thất bại` | Tên tensor không khớp | PEFT dùng `.lora_A.default`, GGUF mong `.lora_A.weight` — đổi tên |
196
+ | `Hạng quá cao cho tensor` | Kích thước tensor < hạng | Giảm hạng hoặc bỏ qua tensor đó |
197
+
198
+ ---
199
+
200
+ ## 7. Hạn Chế
201
+
202
+ 1. **Thiên lệch chỉ-attention**: Chỉ dùng lớp attention có thể bỏ lỡ thay đổi ở lớp FFN/MLP
203
+ 2. **Giả định hạng thấp**: Tốt nhất với mô hình LoRA-merged; full fine-tune có thể vượt quá hạng
204
+ 3. **Không đảm bảo chất lượng**: Bộ điều hợp là tái tạo toán học — không bảo đảm khớp chất lượng huấn luyện trực tiếp
205
+ 4. **Chuyển đổi đơn phong cách**: Chỉ trích xuất sự khác biệt giữa 2 phong cách — cần 3+ phong cách thì tạo nhiều bộ điều hợp
206
+
207
+ ---
208
+
209
+ ## 8. Script Trích Xuất
210
+
211
+ `extract_lora_diff.py` (193 dòng) — script trích xuất sẵn sàng sản xuất có sẵn trong repo này.
212
+
213
+ ---
214
+
215
+ ## 9. Tài Liệu Tham Khảo & Ghi Công
216
+
217
+ - **Kỹ thuật:** UKA (Hermes Agent, Nous Research) & hotdogs
218
+ - **Bài báo:** [Trích Xuất SVD Chênh Lệch Trọng Số: Tổng Hợp Bộ Điều Hợp LoRA Zero-Shot](https://huggingface.co/hotdogs/qwen3.6-35b-opus-to-kimi-lora/blob/main/paper.pdf)
219
+ - **Mã + Bộ Điều Hợp:** https://huggingface.co/hotdogs/qwen3.6-35b-opus-to-kimi-lora
220
+ - **Bài báo LoRA:** Hu et al., 2021 (arXiv:2106.09685)
221
+ - **Bài báo QLoRA:** Dettmers et al., 2023 (arXiv:2305.14314)