7.0. LoRA ๊ฐ์ ์ฌํญ
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
LoRA ๊ฐ์ ์ฌํญ
Tip
LoRA๋ ์ด๋ฏธ ํ๋ จ๋ ๋ชจ๋ธ์ ๋ฏธ์ธ ์กฐ์ ํ๋ ๋ฐ ํ์ํ ๊ณ์ฐ์ ๋ง์ด ์ค์ ๋๋ค.
LoRA๋ ๋ชจ๋ธ์ ์์ ๋ถ๋ถ๋ง ๋ณ๊ฒฝํ์ฌ ๋ํ ๋ชจ๋ธ์ ํจ์จ์ ์ผ๋ก ๋ฏธ์ธ ์กฐ์ ํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ํ๋ จํด์ผ ํ ๋งค๊ฐ๋ณ์์ ์๋ฅผ ์ค์ฌ ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ฐ ์์์ ์ ์ฝํฉ๋๋ค. ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
ํ๋ จ ๊ฐ๋ฅํ ๋งค๊ฐ๋ณ์ ์ ๊ฐ์: ๋ชจ๋ธ์ ์ ์ฒด ๊ฐ์ค์น ํ๋ ฌ์ ์ ๋ฐ์ดํธํ๋ ๋์ , LoRA๋ ๊ฐ์ค์น ํ๋ ฌ์ ๋ ๊ฐ์ ๋ ์์ ํ๋ ฌ( A์ B๋ผ๊ณ ํจ)๋ก ๋ถํ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ๋ จ์ด ๋ ๋นจ๋ผ์ง๊ณ ์ ๋ฐ์ดํธํด์ผ ํ ๋งค๊ฐ๋ณ์๊ฐ ์ ์ด์ ธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ํ์ํฉ๋๋ค.
-
์ด๋ ๋ ์ด์ด(ํ๋ ฌ)์ ์ ์ฒด ๊ฐ์ค์น ์ ๋ฐ์ดํธ๋ฅผ ๊ณ์ฐํ๋ ๋์ , ๋ ๊ฐ์ ๋ ์์ ํ๋ ฌ์ ๊ณฑ์ผ๋ก ๊ทผ์ฌํ์ฌ ์ ๋ฐ์ดํธ๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ ์ค์ด๊ธฐ ๋๋ฌธ์ ๋๋ค:\
 (1).png)
- ์๋ ๋ชจ๋ธ ๊ฐ์ค์น ๋ณ๊ฒฝ ์์: LoRA๋ ์๋ ๋ชจ๋ธ ๊ฐ์ค์น๋ฅผ ๋์ผํ๊ฒ ์ ์งํ๊ณ , ์๋ก์ด ์์ ํ๋ ฌ(A์ B)๋ง ์ ๋ฐ์ดํธํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ๋ชจ๋ธ์ ์๋ ์ง์์ด ๋ณด์กด๋๋ฉฐ, ํ์ํ ๋ถ๋ถ๋ง ์กฐ์ ํ ์ ์๋ค๋ ์ ์์ ์ ์ฉํฉ๋๋ค.
- ํจ์จ์ ์ธ ์์ ๋ณ ๋ฏธ์ธ ์กฐ์ : ๋ชจ๋ธ์ ์๋ก์ด ์์ ์ ์ ์์ํค๊ณ ์ ํ ๋, ๋๋จธ์ง ๋ชจ๋ธ์ ๊ทธ๋๋ก ๋๊ณ ์์ LoRA ํ๋ ฌ(A์ B)๋ง ํ๋ จํ๋ฉด ๋ฉ๋๋ค. ์ด๋ ์ ์ฒด ๋ชจ๋ธ์ ์ฌํ๋ จํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ํจ์จ์ ์ ๋๋ค.
- ์ ์ฅ ํจ์จ์ฑ: ๋ฏธ์ธ ์กฐ์ ํ, ๊ฐ ์์ ์ ๋ํด ์ ์ฒด ์๋ก์ด ๋ชจ๋ธ์ ์ ์ฅํ๋ ๋์ , ์ ์ฒด ๋ชจ๋ธ์ ๋นํด ๋งค์ฐ ์์ LoRA ํ๋ ฌ๋ง ์ ์ฅํ๋ฉด ๋ฉ๋๋ค. ์ด๋ ๋ง์ ์์ ์ ๋ชจ๋ธ์ ์ ์์ํค๋ ๋ฐ ๋๋ฌด ๋ง์ ์ ์ฅ ๊ณต๊ฐ์ ์ฌ์ฉํ์ง ์๋๋ก ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋๋ค.
๋ฏธ์ธ ์กฐ์ ์ค Linear ๋์ LoraLayers๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฌ๊ธฐ์์ ์ ์๋ ์ฝ๋๋ https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb์ ๋๋ค:
import math
# Create the LoRA layer with the 2 matrices and the alpha
class LoRALayer(torch.nn.Module):
def __init__(self, in_dim, out_dim, rank, alpha):
super().__init__()
self.A = torch.nn.Parameter(torch.empty(in_dim, rank))
torch.nn.init.kaiming_uniform_(self.A, a=math.sqrt(5)) # similar to standard weight initialization
self.B = torch.nn.Parameter(torch.zeros(rank, out_dim))
self.alpha = alpha
def forward(self, x):
x = self.alpha * (x @ self.A @ self.B)
return x
# Combine it with the linear layer
class LinearWithLoRA(torch.nn.Module):
def __init__(self, linear, rank, alpha):
super().__init__()
self.linear = linear
self.lora = LoRALayer(
linear.in_features, linear.out_features, rank, alpha
)
def forward(self, x):
return self.linear(x) + self.lora(x)
# Replace linear layers with LoRA ones
def replace_linear_with_lora(model, rank, alpha):
for name, module in model.named_children():
if isinstance(module, torch.nn.Linear):
# Replace the Linear layer with LinearWithLoRA
setattr(model, name, LinearWithLoRA(module, rank, alpha))
else:
# Recursively apply the same function to child modules
replace_linear_with_lora(module, rank, alpha)
References
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


