실행 프로그램과 확장

최종 업데이트

3090 언락 검증법: 부팅·GEMM·llama-bench 기록

같은 조건을 기록하지 않으면 언락의 몫을 분리할 수 없어요.

언락 전후 비교는 조건을 고정하는 일에서 시작해요. 커널·드라이버·VBIOS·전력 상한·문맥 길이를 적고, torch GEMM으로 행렬 연산을, llama-bench로 프리필1과 디코드2를 잽니다. 콜드 부팅 뒤 로그를 확인하고, 실패하면 커널 명령줄에서 옵션을 지워 되돌립니다.

실행 조건과 핵심 내용
  • 커널·드라이버·VBIOS·전력 상한을 기록해야 전후 비교가 성립해요.
  • GEMM은 행렬 연산을, llama-bench는 프리필과 디코드를 따로 보여 줘요.
  • 콜드 부팅 로그를 확인하고, 실패하면 명령줄 옵션을 지워 되돌려요.

기준선을 먼저 기록해요

측정 전에 커널 버전, NVIDIA 드라이버, VBIOS, 전력 상한, 현재 클록을 적어 두세요. uname -r, nvidia-smi, nvidia-smi -q로 확인할 수 있어요. 같은 카드라도 드라이버와 전력 설정이 다르면 결과가 달라집니다.

전력 상한은 실험 내내 고정하세요. 3090의 기본값은 350W이고, 300W나 280W로 낮추면 디코드가 조금 느려집니다. 언락 전후를 비교할 때 전력을 바꾸면 연산 변화와 전력 변화가 섞여요.

기준선 기록 명령
uname -r
nvidia-smi --query-gpu=name,driver_version,vbios_version,power.limit,clocks.max.sm,memory.total --format=csv
nvidia-smi -q | grep -A2 "GPU Power Limit"
출력값을 그대로 노트에 남기세요. 드라이버와 VBIOS가 바뀌면 다음 비교는 별도 실험으로 취급합니다.
그래픽카드 본체와 팬·전원 커넥터·PCIe 접점을 확대해 보여 주는 그림
카드의 연결 상태와 전원, 슬롯을 확인하는 것부터 검증이에요.

GEMM으로 행렬 연산만 재요

저장소가 공개한 비교는 8192³ dense GEMM, FP323 누적, 5회 중앙값이었어요. 같은 조건으로 FP164·BF165·TF32를 재면 언락이 행렬 연산에 준 영향을 분리할 수 있습니다. 워밍업을 빼고 중앙값을 쓰세요.

PyTorch6에서 torch.backends.cuda.matmul.allow_tf32를 켜야 TF32가 실제로 쓰입니다. BF16은 입력을 torch.bfloat16으로 바꿔야 해요. 측정 스크립트는 저장소 이슈의 조건을 참고해 직접 작성하는 편이 안전합니다.

GEMM 측정 예시 (조건을 직접 확인하세요)
import torch, time, statistics
assert torch.cuda.is_available()
torch.backends.cuda.matmul.allow_tf32 = True
n = 8192
for dtype in (torch.float16, torch.bfloat16):
    a = torch.randn(n, n, device='cuda', dtype=dtype)
    b = torch.randn(n, n, device='cuda', dtype=dtype)
    for _ in range(3): a @ b
    torch.cuda.synchronize()
    times = []
    for _ in range(5):
        start = time.perf_counter(); a @ b; torch.cuda.synchronize()
        times.append(time.perf_counter() - start)
    med = statistics.median(times)
    print(dtype, round(2 * n**3 / med / 1e12, 2), 'TFLOPS')
이 예시는 FP16·BF16만 잽니다. TF32는 별도 설정과 dtype으로 재세요. 절대값보다 전후 비율을 보세요.

llama-bench로 프리필·디코드를 재요

llama-bench는 같은 모델에서 프리필과 디코드를 분리해 보여 줘요. -p 4096 -n 128 -r 5처럼 문맥과 반복 횟수를 고정하고, 모델·양자화7·전력 상한을 전후 동일하게 맞춥니다. 모델은 카드에 이미 있는 GGUF8를 쓰세요.

llama.cpp의 양자화 커널은 BF16 행렬 곱을 쓰지 않는 경로가 많아요. 그래서 GEMM에서 큰 차이가 나도 llama-bench 디코드가 그대로일 수 있습니다. 이 차이를 설명할 수 있어야 측정 결과를 해석할 수 있어요.

프리필·디코드 측정 예시
llama-bench -m /path/to/model.gguf -p 4096 -n 128 -r 5
전후 실행에서 모델 경로와 옵션을 똑같이 유지하세요. 결과의 표준 편차도 함께 기록합니다.

콜드 부팅 뒤 로그를 확인해요

언락은 전원을 완전히 끈 뒤 다시 켜야 적용돼요. 부팅 후 journalctl -k -b | grep gpu_unlock으로 모듈 로그를, lspci -nnk -s <PCI 주소>로 드라이버 바인딩을 확인합니다. nvidia-smi에서 카드가 정상으로 보이는지도 함께 보세요.

Xid 오류나 드라이버 리셋이 보이면 실험을 중단하세요. 같은 전원 주기에 이미 드라이버가 사용한 카드는 거부되므로, 재시도 전에 반드시 전원을 끕니다.

부팅 후 확인
journalctl -k -b | grep gpu_unlock
lspci -nnk -s 0000:21:00.0
nvidia-smi
PCI 주소는 `lspci -D`로 확인한 값으로 바꾸세요. 주소는 GPU 번호와 다릅니다.
RTX 3090가 장착된 케이스 옆에 체크 표시가 있고, 펼친 노트에 흐름도가 그려진 책상
노트에 조건을 적어 두면 다음 비교에서 같은 기준을 쓸 수 있어요.

되돌리기와 실패 복구

문제가 생기면 커널 명령줄에서 gpu_unlock.targets= 항목을 지우고 재부팅하세요. 패키지를 제거하면 모듈과 initramfs 설정도 함께 정리됩니다. 화면이 나오지 않으면 부트로더 편집 화면에서 옵션을 임시로 지우고 부팅합니다.

펌웨어가 멈추지 않았다는 로그가 남으면 다음 전원 차단까지 DMA 버퍼가 유지돼요. 새로 시도하기 전에 전원을 끄고, 가능하면 시험용 카드에서 먼저 확인하세요.

기록 양식

아래 항목을 전후 두 번 적으면 비교가 재현돼요. 같은 값이 아니면 그 차이를 먼저 설명하고, 설명되지 않으면 언락의 효과로 계산하지 않습니다.

전후 비교 기록 항목
기록 항목예
커널·드라이버·VBIOS7.2.8-1, 615.71.09, 94.02.42.00.9b
전력 상한350W
BF16 GEMM87.50 → 157.41 TFLOPS
llama-bench 프리필조건과 함께 기록
llama-bench 디코드68.9 tok/s (3090, 350W)
팬이 하나인 짧은 그래픽카드와 팬이 두 개인 긴 그래픽카드가 나란히 놓인 그림
같은 모델·같은 전력에서 전후를 재야 언락의 몫을 분리할 수 있어요.

용어 각주

  1. 프리필 — LLM이 입력 프롬프트를 읽고 각 토큰의 내부 표현을 계산하는 단계입니다. 입력이 길수록 처리할 토큰이 많아집니다.

    본문으로 돌아가기
  2. 토큰 디코드 — 입력과 앞서 만든 답변을 바탕으로 다음 출력 토큰을 차례로 생성하는 단계입니다.

    본문으로 돌아가기
  3. FP32 — 32비트 부동소수점 수치 형식입니다. BF16보다 값 하나에 더 많은 메모리를 쓰며 수치를 더 세밀하게 표현할 수 있습니다.

    본문으로 돌아가기
  4. FP16 — 16비트 부동소수점 수치 형식입니다. BF16과 비트 수는 같지만 지수부와 유효숫자 배분이 다릅니다.

    본문으로 돌아가기
  5. BF16 — 모델 수치를 저장하고 계산하는 16비트 부동소수점 형식입니다. FP32와 같은 폭의 지수부를 써 넓은 값 범위를 표현합니다.

    본문으로 돌아가기
  6. PyTorch — AI 모델을 만들고 실행하는 소프트웨어 프레임워크입니다. 모델과 함께 호환되는 PyTorch 버전 및 하드웨어 지원도 확인해야 합니다.

    본문으로 돌아가기
  7. 양자화 — 모델의 가중치나 계산값을 더 적은 비트로 표현해 저장 공간과 메모리 사용량을 줄이는 방법입니다. 표현 단계가 거칠어져 정확도에도 영향을 줄 수 있습니다.

    본문으로 돌아가기
  8. GGUF — 모델 정보를 담는 파일 형식으로 llama.cpp 계열 도구에서 널리 사용됩니다.

    본문으로 돌아가기

자주 묻는 질문

이 글에서 가장 먼저 확인할 것은 무엇인가요?
언락 전후 비교는 조건을 고정하는 일에서 시작해요. 커널·드라이버·VBIOS·전력 상한·문맥 길이를 적고, torch GEMM으로 행렬 연산을, llama-bench로 프리필과 디코드를 잽니다. 콜드 부팅 뒤 로그를 확인하고, 실패하면 커널 명령줄에서 옵션을 지워 되돌립니다.