Skip to main content

Command Palette

Search for a command to run...

Deepseek R1 QLoRA 파인튜닝

Updated
2 min read

사용 개념

Deepseek-R1-Distill-Llama-8B

이 블로그 글은 Deepseek-R1-Distill-Llama-8B를 4비트 양자화와 LoRA를 활용해 파인튜닝하고 허깅페이스에 모델을 호스팅하는 것까지를 설명한다.

코드 리뷰를 위해 파인튜닝하였는데, 그 코드를 변형하여 포스팅한다.

Deepseek-R1-Distill-Llama-8B모델은 딥시크 R1을 경량화한 모델로 8B크기라서 쓸만한 편이다.

양자화

모델을 그냥 파인튜닝(FP32)하면 메모리가 상당히 많이 필요하다. 이를 위해 모델의 가중치를 낮은 비트 정밀도로 변경하는 것을 양자화라 하는데 아래로 내려갈수록 성능이 떨어질 우려는 있지만 리소스 사용량과 속도 면에서 좋다.

model = AutoModelForCausalLM.from_pretrained( 
    MODEL_NAME,
    load_in_4bit=True, #4비트 양자화
    device_map="auto"
)

LoRA

모델 전체 업데이트가 아니라 특정 가중치만 학습하는 것이다. 전체 모델을 건드리는 것은 매우매우 거대한 작업이다...실제 필요한 작업에 비해 사이즈가 너무 크다. 따라서 일부 레이어만 변화를 주는 것.

코드에서는 q_proj, v_proj, k_proj같은 레이어에만 적용하고 있는 것이다. 이러면 메모리를 많이 절약할 수 있다.

Unsloth 라이브러리

LoRA 파인튜닝을 최적화하는 라이브러리다. 위의 양자화와 LoRA기법, 그러니까 QLoRA를 위해 사용하는 라이브러리다. 장점은 뭐 이렇다고 한다.

  • 트랜스포머보다 개별 모델에 최적화

  • 수동 그래디언트 계산(파이토치 Autograd는 LoRA에서 최적화가 좀 별로일수도...)

WandB

MLops 툴이다. 머신러닝계의 데이터독 가입하면 키를 받을 수 있는데 키를 등록하고

wandb.login(key="wandb키")
#프로젝트명은 알아서
wandb.init(project="Finetuning-Deepseek-R1", job_type="training")

이런식으로 등록하고 WandB 웹에 접속해서 모니터링할 수 있다.


코드

하단 코드는 코랩 T4 GPU면 충분하다.

필요한 라이브러리 설치

!pip install transformers datasets bitsandbytes huggingface-hub accelerate

!pip install --upgrade --force-reinstall --no-cache-dir git+https://github.com/unslothai/unsloth.git

!pip install wandb

!pip install unsloth_zoo

!pip install xformers

허깅페이스와 wandb로그인

from huggingface_hub import login
import wandb

hf_token = "HF토큰"
login(hf_token)

wandb.login(key="wandb키")
#프로젝트명은 알아서
wandb.init(project="Finetuning-Deepseek-R1", job_type="training")

데이터셋, 모델 로딩

from datasets import load_dataset
dataset = load_dataset("사용자명/데이터셋", split="필요한만큼")

prompt_style = """아래는 코드와 해당 코드에 대한 리뷰 요청이다.
코드를 검토하고 3~4줄의 간단한 코드 리뷰를 제공하라.

### 코드:
{}

### 코드 리뷰:
{}
"""

def format_prompt(example):
    code = example['prompt']
    review = example['response']
    return{"text": prompt_style.format(code, reviw)}

dataset = dataset.map(format_prompt)

모델 로드하기

from unsloth import FastLanguageModel
# 모델 로드 (4-bit 양자화 활성화)
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="unsloth/DeepSeek-R1-Distill-Llama-8B",
    max_seq_length=2048,
    load_in_4bit=True,
    token=hf_token
)

LoRA

model = FastLanguageModel.get_peft_model(
model=model,
r=16,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
lora_alpha=16,
lora_dropout=0,
)

훈련하기

from transformers import TrainingArguments

from trl import SFTTrainer

trainer = SFTTrainer(
    model=model,
    tokenizer=tokenizer,
    train_dataset=dataset,
    dataset_text_field="text",
    args=TrainingArguments(
        per_device_train_batch_size=4,
        gradient_accumulation_steps=2,
        max_steps=100,
        warmup_steps=10,
        learning_rate=2e-4,
        fp16=True,
        logging_steps=10,
        output_dir="outputs",
    ),
)

trainer.train()

모델 저장 후 호스팅

model.save_pretrained("저장경로")
tokenizer.save_pretrained("저장경로")

NEW_REPO_NAME = "호스팅 경로"
model.push_to_hub(NEW_REPO_NAME)
tokenizer.push_to_hub(NEW_REPO_NAME)
190 views

More from this blog

락프리 데이터 구조와 알고리즘

여기서는 락프리 데이터 구조를 설명한다. 락프리(lock-free) 란 배타락을 이용하지 않고 처리를 수행하는 데이터 구조 및 그에 대한 조작 알고리즘을 총칭한다. 왜 락프리인가? 전통적인 동시성 제어 방법인 뮤텍스나 세마포어는 여러 문제점을 가지고 있다: 성능 저하: 락 경합(lock contention)으로 인한 대기 시간 데드락: 여러 스레드가 서로의 락을 기다리는 상황 우선순위 역전: 낮은 우선순위 스레드가 높은 우선순위 스레드를 ...

Jul 27, 20257 min read119

소프트웨어 트랜잭셔널 메모리

소프트웨어 트랜잭셔널 메모리 동시성 프로그래밍에서 공유 자원에 대한 안전한 접근은 항상 중요한 과제다. 전통적으로 뮤텍스 락과 같은 비관적 락(Negative Lock) 방식을 사용해왔다. 이 방식은 크리티컬 섹션에 진입하기 전에 반드시 락을 획득해야 하며, 락을 얻지 못하면 코드 실행 자체가 블록된다. 하지만 이와는 다른 접근 방식이 있다. 바로 낙관적 락(Optimistic Lock) 방식인데, 이는 "일단 실행하고 나중에 검증하자"는 철학...

Jul 20, 202517 min read261

공평한 배타 제어

공평한 배타 제어 여기서는 공평한 배타 제어에 대해 설명한다. 먼저 컨텐션(contention) 이라는 개념을 이해할 필요가 있다. 컨텐션이란 여러 스레드가 동시에 같은 락을 획득하려고 경쟁하는 상황을 말한다. 컨텐션이 높을수록 스레드들이 락을 기다리는 시간이 길어지고 성능이 저하된다. 이러한 컨텐션 상황은 시스템 아키텍처에 따라 더욱 복잡해질 수 있다. 특히 비균일 메모리 접근(Non-Uniform Memory Access, NUMA) 와 같...

Jul 13, 20259 min read21

KernelSnitch[논문 리뷰]

Paper 1. Intro 이 글은 NDSS 2025에서 발표된 KernelSnitch 논문을 소개이다. 이 연구는 커널의 평범한 데이터 구조체들이 가진 본질적인 특성이 어떻게 심각한 보안 취약점이 되는지를 보여준다. 핵심은 이러하다: "데이터 구조체의 크기에 따른 접근 시간 차이를 이용해 커널의 비밀 정보를 유출할 수 있다" 여기서는 커널 힙 포인터 유출에 집중해서 설명한다. 이 공격이 성공하면 KASLR을 우회하고 더 심각한 커널 익스플로...

Jul 11, 20257 min read124

멀티태스크와 액터 모델

멀티태스크 협조적/비협조적 멀티태스크 선점: 프로세스와의 협조 없이 수행하는 컨택스트 스위칭이라고는 하나, 결국 뺏어오는 게 가능하냐의 문제다. 협조적 멀티태스크(비선점형, cooperative): 각각의 프로세스가 자발적으로 컨택스트 스위칭을 수행하는 멀티태스크 방식. 장점: 멀티태스크 매커니즘을 구현하기 쉽다. 단점: 프로세스가 자발적으로 컨텍스트 스위칭을 해야하는데, 만약 버그가 발생하여 프로세스가 무한 루프에 빠지거나 정지하게 되면 그 ...

Jul 6, 20252 min read24
M

MaxLog

35 posts