Qwen3.6-27B-mtp

Local LLM 시리즈

  1. (Local LLM) Ollama 시작하기
  2. Codex 와 Local LLM 연결하기

Qwen3.6-27B

  1. Qwen 3.6 27B는 로컬 개발의 최적 지점
  1. unsloth/Qwen 3.6 27B gguf

실행 (3080ti)

$ llama-server –help | grep -E “slot|parallel|draft”

1
2
llama-server -hf unsloth/Qwen3.6-27B-MTP-GGUF:Q8_0 \
--spec-type draft-mtp -ngl 999 -fa on -c 65536 --port 8080

Jackrong/Qwopus3.6-27B-Coder-Compat-MTP-GGUF

https://huggingface.co/Jackrong/Qwopus3.6-27B-Coder-Compat-MTP-GGUF

Codex 개발시 불편한 것

Local LLM 시리즈

  1. (Local LLM) Ollama 시작하기
  2. Codex 와 Local LLM 연결하기
  3. Codex 로 개발시 불편한 것

프로젝트에 여러 폴더 포함하기

결론부터 말씀드리면, Lib_StockMart 폴더를 굳이 Stock-Agent 아래로 이동시키지 않아도 외부 폴더 상태 그대로 Codex CLI에 주입할 수 있는 방법이 있습니다.

현재 /home/qkboo/Projects/Lib_StockMart의 소스코드를 볼 수 없는 이유는, Codex CLI가 실행될 때 기본적으로 현재 터미널이 위치한 디렉터리(Stock-Agent)와 그 하위 폴더만 자동으로 컨텍스트에 스캔(인덱싱)하도록 설계되어 있기 때문입니다. 프로필에 등록하는 행위는 ‘이 경로를 신뢰한다’는 허가 선언일 뿐, 실행 시 자동으로 멀리 떨어진 다른 폴더를 끌고 오지는 않습니다.

이 구조적 한계를 깨고 독립된 두 폴더를 유기적으로 탐색하게 만드는 2가지 확실한 해결책을 제시해 드립니다.


리눅스(WSL)의 심볼릭 링크 기능을 사용하면, Lib_StockMart 폴더를 원래 위치에 그대로 둔 채 Stock-Agent 내부에 바로가기(폴더 링크)를 심을 수 있습니다. 이렇게 하면 Codex는 해당 링크를 일반 하위 디렉터리로 인식하여 완벽하게 파일을 읽고 @ 검색 대상에 포함시킵니다.

터미널을 열고 다음 명령어를 실행하세요:

1
2
3
4
5
6
# Stock-Agent 디렉터리로 이동
cd /home/qkboo/Projects/Stock-Agent

# 원래 위치에 있는 Lib_StockMart를 현재 폴더에 'lib'라는 이름의 링크로 연결
ln -s /home/qkboo/Projects/Lib_StockMart ./lib

이렇게 세팅하면 구조는 아래와 같이 유지되며, Lib_StockMart 내부 코드를 수정하면 양쪽 모두 실시간으로 반영됩니다:

  • /home/qkboo/Projects/Stock-Agent/lib ➡️ (실제로는 Lib_StockMart를 가리킴)

💡 중요 조치 사항: 심볼릭 링크를 생성한 후, Codex 대화창에서 /reload 명령어를 입력하거나 터미널에서 **codex --profile goyangi_coder --refresh**를 실행해 새롭게 연결된 외부 라이브러리 폴더의 인덱싱을 강제로 갱신해 주어야 @ 검색에 나타나기 시작합니다.


해결책 2: 실행 시점에 다중 파일/디렉터리 명시적 주입

만약 폴더 내부에 바로가기를 심는 구조가 마음에 들지 않는다면, Codex CLI를 실행하는 스크립트 단에서 두 디렉터리를 강제로 병합하여 인덱싱하도록 명령하는 방법이 있습니다.

현재 사용 중이신 단축어(alias cx="...") 설정을 아래와 같이 변경해 보세요.

1
2
3
# 임시 인덱싱 경로로 외부 라이브러리 폴더를 추가 주입하는 단축어 예시
alias cx="codex --profile goyangi_coder --file /home/qkboo/Projects/Lib_StockMart"

  • 동작 원리: 이렇게 실행하면 현재 위치한 Stock-Agent 소스 코드뿐만 아니라, --file 옵션으로 전달된 공통 라이브러리(Lib_StockMart) 내부의 소스 트리까지 통째로 로컬 모델(gemma-4)의 기억(Context) 속에 밀어 넣어주게 됩니다.

🧐 요약 및 퀀트 개발 환경 제언

가장 깔끔하고 현업 표준에 맞는 방식은 [해결책 1 (심볼릭 링크)]입니다. 주식 데이터 분석 엔진(Stock-Agent)을 개발하다가 공통 마켓 데이터 라이브러리(Lib_StockMart)의 내부 클래스나 유틸리티 함수를 호출해야 할 때, 코드를 물리적으로 복사할 필요 없이 @lib/ 형식으로 참조하여 곧바로 퀀트 로직 최적화 팁을 얻을 수 있습니다.

Codex Tips1 - token

codex 사용중 config 에서 지정 가능한 옵션을 정리.


Local LLM 시리즈

  1. (Local LLM) Ollama 시작하기
  2. Codex 와 Local LLM 연결하기

로컬 llama-server는 자체 인터넷 검색 기능이 없습니다.

  1. enable_web_search,
  2. search_web_for_info:
1
2
3
4
5
6
7
8
model_reasoning_effort = "xhigh"
approval_policy = "on-request"
approvals_reviewer = "guardian_subagent"

personality = "pragmatic"
enable_web_search = false
search_web_for_info = false

codex 프로필중 token 영향

  1. max_context_tokens: 서버의 한계치보다 약 1,000~2,000 토큰 정도 낮게 설정
  2. autodetect_capabilities: 클라이언트가 서버의 기능을 자동으로 탐지하는 옵션입니다. 로컬 서버의 경우 가끔 툴 콜(Tool Call)이나 모델 스펙을 잘못 오인하여 맞지 않는 API 규격을 찔러넣을 수 있으므로, 기능을 끄고 명시적으로 수동 제어하는 것이 안정적입니다.
1
2
3
max_context_tokens = 30000
autodetect_capabilities = false
model_auto_compact_token_limit = 900000

token 초과 에러

토큰 초과 에러와 codex

1
"■ {"error":{"code":400,"message":"request (24592 tokens) exceeds the available context size (24576 tokens), try increasing it","type":"exceed_context_size_error","n_prompt_tokens":24592,"n_ctx":24576}}" 에러가 나면 /clear 를 해야 하는지 아니면 서버를 재시작 해야 한느지 

결과 백업하기

Codex(또는 Cline 등) 채팅창에서 /clear를 입력하면 이전 대화 기억이 완전히 포맷(초기화)되기 때문에, 말 그대로 ‘기존 대화 흐름을 완벽히 이어서’ 진행하는 것은 불가능합니다.

하지만 에이전트가 이전에 어디까지 작업했는지 컨텍스트(문맥)의 핵심 요약본만 찔러 넣어주면 바로 다음 단계부터 자연스럽게 이어서 작업하게 만들 수 있습니다.

1단계: 에이전트에게 상황 요약 요청하기 (최후의 유언)

에러가 나서 멈춘 바로 그 상태에서(아직 /clear를 치기 전), 채팅창에 아래와 같이 입력하여 에이전트 스스로 현재까지의 진행 상황을 요약하게 만듭니다. (토큰이 넘쳐도 짧은 단답형 요청은 서버가 처리해 줄 가능성이 높습니다.)

“우리가 지금까지 바꾼 파일 목록, 수정한 핵심 내용, 그리고 바로 다음에 진행해야 했던 ‘남은 작업 단계’를 리스트로 간결하게 요약해 줘.”

2단계: 요약본 복사 및 세션 초기화

  1. 에이전트가 출력해 준 요약본(진행 상황 + 남은 작업)을 마우스로 드래그하여 복사(Ctrl + C)해 둡니다.
  2. 이제 안심하고 채팅창에 /clear를 입력하여 무거워진 토큰 메모리를 완전히 비워줍니다. (컨텍스트가 0으로 리셋됩니다.)

3단계: 복사한 요약본을 주입하며 이어서 진행

초기화된 새 대화창에 복사해 둔 요약본과 함께 컨텍스트를 주입하는 프롬프트를 던집니다.

“방금 세션을 리셋했어. 이전 세션의 작업 문맥을 이어받아줘.
[이전 세션 요약]

  • 수정한 파일: src/models/trading.py
  • 수정 내용: GARCH 모델 인디케이터 연산 로직 추가 완료
  • 남은 작업: 변경된 로직을 기반으로 KRX API 연동 테스트 코드 작성하기

위 내용 이어서 다음 남은 작업을 바로 진행해 줘.”


💡 현실적인 추가 팁

만약 1단계에서조차 토큰이 완전히 꽉 막혀 에이전트가 대답을 아예 안 뱉는다면, 요약 요청을 건너뛰고 질문자님이 눈으로 보시던 마지막 작업 상태(예: “어떤 파일 가중치 수정하다가 멈춤”)를 기억하셨다가 3단계 형식처럼 직접 적어서 주입하시면 됩니다.

로컬 LLM을 활용한 에이전트 코딩 시에는 이처럼 “대화가 길어지면 요약본을 챙겨서 /clear 후 재주입한다”는 매커니즘을 기억해 두시면 흐름을 잃지 않고 쾌적하게 작업을 이어가실 수 있습니다.


plugin: caveman

https://github.com/JuliusBrussee/caveman#readme

1
2
# macOS · Linux · WSL · Git Bash
curl -fsSL https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.sh | bash

Turn it on: type /caveman or say “talk like caveman”. Turn it off: say “normal mode”. On Claude Code, Codex, and Gemini it’s already on from message one. No command needed.

(Local LLM) Ollama 시작하기

Local LLM 시리즈

  1. (Local LLM) Ollama 시작하기
  2. Codex 와 Local LLM 연결하기

Ollama 란

ollama 는 LLM model 을 local machine 에서 서버로 서비스를 제공할 수 있는 플랫폼이다.

  • ollama 제공 및 외부 LLM Model 을 서버 및 채팅 제공 CLI
  • LLM model 파라미터 조정

Gemini 통해 그린 ollama 서비스 다이어그램.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
┌─────────────────────────────────────────────────────────────────┐
│ Windows 11 Host (ASUS A14 / RTX 4060 Laptop GPU 8GB) │
│ │
│ ┌────────────────────────┐ [Mirrored Network Mode] │
│ │ Windows App / IDE │ - Ports are shared directly │
│ │ (VS Code, Cursor 등) │ - No Port Forwarding Needed │
│ └───────────┬────────────┘ │
│ │ (HTTP Request to localhost:11434) │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ WSL2 Ubuntu Environment (goyangi2) │ │
│ │ │ │
│ │ ollama.service [systemd] │ │
│ │ └── Port: 0.0.0.0:11434 (LISTENING) │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────────┐ │ │
│ │ │ Ollama Runner (llama.cpp / GGML Backend) │ │ │
│ │ └──────────────────────┬───────────────────────┘ │ │
│ └────────────────────────────────┼────────────────────────────┘ │
│ │ │
│ ┌────────────────────────────────▼────────────────────────────┐ │
│ │ NVIDIA CUDA Driver Layer │ │
│ └────────────────────────────────┬────────────────────────────┘ │
│ │ (100% GPU Offload) │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ RTX 4060 VRAM (8GB) Dedicated Memory │ │
│ │ ├── Model Weights (Gemma 4 4.6B Q5) ─── [ 5.4 GiB ] │ │
│ │ ├── KV Cache (num_ctx: 12288) ───────── [ 392.0 MiB ] │ │
│ │ └── Compute Graph (CUDA0) ───────────── [ 302.0 MiB ] │ │
│ │ │ │
│ │ └── [ 🚀 Total GPU Memory Used: 6.6 GiB / 8.0 GiB ] │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

ollama 설치

ollama CLI 와 Model 은 아래 사이트에서 다운로드 받을 수 있다.

설치후 LLM Chat, API call, Codex / Claude CLI 에 연동해서 사용할 수 있다.


설치

https://ollama.com/download/linux

1
curl -fsSL https://ollama.com/install.sh | sh

ollama CLI 명령

ollama CLI 명령

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ ollama
Ollama 0.21.2

▸ Chat with a model
Start an interactive chat with a model

Launch OpenClaw (install)
Personal AI with 100+ skills

Launch Claude Code
Anthropic's coding tool with subagents

Launch OpenCode (not installed)
Anomaly's open-source coding agent

More...
Show additional integrations

사용 가능한 명령:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Usage:
ollama [flags]
ollama [command]

Available Commands:
serve Start Ollama
create Create a model
show Show information for a model
run Run a model
stop Stop a running model
pull Pull a model from a registry
push Push a model to a registry
signin Sign in to ollama.com
signout Sign out from ollama.com
list List models
ps List running models
cp Copy a model
rm Remove a model
launch Launch the Ollama menu or an integration
help Help about any command

Flags:
-h, --help help for ollama
--nowordwrap Don't wrap words to the next line automatically
--verbose Show timings for response
-v, --version Show version information

Use "ollama [command] --help" for more information about a command.

모델 다운로드 pull 명령으로 ollama 저장소 제공 모델 다운로드할 수 있다.


[pull 명령]

pull 명령으로 모델을 다운로드 한다.

1
2
3
$ ollama pull gemma4:e2b
pulling manifest
pulling 4e30e2665218: 2% ▕█ ▏ 109 MB/7.2 GB 56 MB/s 2m5s

pull 로 다운받은 모델 저장 디렉토리:

  • /usr/share/ollama/.ollama/models :(시스템 서비스 실행 시)

[Ollama 경로 변경]

Ollama는 환경 변수 OLLAMA_MODELS 를 참조합니다.

1
export OLLAMA_MODELS="/data/models/ollama"

설정 후 source ~/.bashrc와 sudo systemctl restart ollama를 잊지 마세요.


[ls 명령]

모델 목록 조회

1
2
3
4
5
6
$ ollama ls
NAME ID SIZE MODIFIED
gemma4:e2b 7fbdbf8f5e45 7.2 GB 3 days ago
gemma4-e4b-32k:latest 6d2a1a196ef9 9.6 GB 4 weeks ago
gemma4:e4b c6eb396dbd59 9.6 GB 4 weeks ago
qwen2.5-coder:latest dae161e27b0e 4.7 GB 4 weeks ag
  • gemma4-e4b: 다운로드한 원래 모델
  • gemma4-e4b-32k: 모델의 파라미터를 수정한 Modelfile 에서 생성한 새 모델

[rm 명령]

rm 명령으로 다운 받은 모델을 삭제한다.

1
ollama rm gemma4:e4b

[show 명령]

show 명령으로 모델의 세부 정보를 조회할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ ollama show gemma4:e4b
Model
architecture gemma4
parameters 8.0B
context length 131072
embedding length 2560
quantization Q4_K_M
requires 0.20.0

Capabilities
completion
vision
audio
tools
thinking

Parameters
temperature 1
top_k 64
top_p 0.95

License
Apache License
Version 2.0, January 2004
...

[run 명령]

run 명령은 ollama 모델로 다운받은 NAME 이름의 모델을 서비스로 시작해 준다.

  • 시스템의 ollama 서비스를 시작해 http로 11434 포트를 통해서 제공된다.
  • run 명령은 CLI 채팅을 시작
1
2
3
4
ollama run gemma4:e2b
>>> Send a message (/? for help)
>>>
Use Ctrl + d or /bye to exit

run NAME 명령 혹은 serve 명령으로 시스템 서비스로 11434 포트를 통해 웹서비스가 시작된다.

1
2
3
$ sudo ss -tunlp | grep ollama
tcp LISTEN 0 4096 127.0.0.1:35965 0.0.0.0:* users:(("ollama",pid=824718,fd=3))
tcp LISTEN 0 4096 127.0.0.1:11434 0.0.0.0:* users:(("ollama",pid=165,fd=3))

브라우저로 11434 포트에 접속해 보면 ‘Ollama is running’ 을 확인 가능하다.


[ps 명령]

ps 명령은 실행중인 ollama 프로세스를 확인할 수 있다.

1
2
3
$ ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
gemma4:e2b 7fbdbf8f5e45 7.7 GB 75%/25% CPU/GPU 4096 4 minutes from now

ollama 는 설치시 리눅스 계열에서는 systemd 로 설치된다. systemd 상태를 확인할 수 있다.

1
2
3
4
5
6
7
$ systemctl status ollama
● ollama.service - Ollama Service
Loaded: loaded (/etc/systemd/system/ollama.service; enabled; preset: enabled)
Active: active (running) since Fri 2026-05-29 22:02:07 KST; 9h ago
Main PID: 165 (ollama)
Tasks: 25 (limit: 28826)

[로그 확인]

로그 확인은 journalctl 를 사용한다.

1
2
3
4
journalctl -u ollama -f
5월 29 07:42:11 goyangi2 ollama[165]: time=2026-05-29T07:42:11.649+09:00 level=INFO source=server.go:1398 msg="waiting for server to become available" status="llm server loading model"
5월 29 07:42:19 goyangi2 ollama[165]: time=2026-05-29T07:42:19.188+09:00 level=INFO source=server.go:1402 msg="llama runner started in 69.72 seconds"
5월 29 07:42:19 goyangi2 ollama[165]: [GIN] 2026/05/29 - 07:42:19 | 200 | 1m10s | 127.0.0.1 | POST "/api/generate"

줄수 만큼 로그 기록 확인

1
journalctl -u ollama -n 100 

[OpenAI API 호환 엔드포인트]

Ollama는 별도의 설정 없이도 OpenAI와 호환되는 API 엔드포인트를 기본적으로 제공합니다.


[stop 명령]

1
ollama stop

ollama 시스템 서비스를 시작한다.

1
ollama serve

systemd 를 직접 종료할 수 있겠다.

1
sudo systemctl stop ollama

서비스 환경변수 확인

1
$ sudo systemctl show ollama --property=Environment


Modelfile 로 성능 조정

ollama 는 Modelfile 을 이용해 기존 모델의 파라미터를 조정해 새로운 모델로 서빙할 수 있다.

모델파일

Modelfile 은 텍스트 파일로 특정 모델의 파라미터, 프롬프를 조정해 새로운 모델로 생성할 수 있다.


모델은 FROM 구문에 지정한다. 1) ollma 에 등록된 모델을 사용하거나, 2) gguf 경로, 3) hf.co 의 URI 를 사용하면 된다.

1
2
3
4
5
6
7
$ ollama ls
NAME ID SIZE MODIFIED
qwen3-14b-han:latest bb1dc5fee044 9.0 GB 10 hours ago
hf.co/unsloth/Qwen3-14B-GGUF:Q4_K_M 1c75fc1b9127 9.0 GB 10 hours ago
gemma4-e4b-32k:latest 2bb4cc1b3660 9.6 GB 3 days ago
my-default:latest 2bb4cc1b3660 9.6 GB 3 days ago
gemma4:e4b c6eb396dbd59 9.6 GB 3 days ago

모델파일 작성

Modelfile 작성시 텍스트 파일에 FROM 구문으로 모델을 지정하고 팔라미터를 설정하면 된다.

다음은 ollama 모델에 할당한 num_ctx 토큰량 컨텍스트 크기를 직접 지정하는 예이다.

1
2
FROM qwen2.5-coder:7b              # 모델 이름(ollama 다운로드) 혹은 모델의 위치
PARAMETER num_ctx 32768 # 컨텍스트 크기를 32768(32k)로 설정

[모델 생성]

새 파라미터로 모델을 생성

1
ollama create qwen-7b-32k -f Modelfile

새 모델 런치

1
ollama run qwen-7b-32k

모델 파일 파라미터

  1. GPU 가속 최적화 (GPU Layers 설정)

Ollama는 기본적으로 GPU에 모델 레이어를 분배하지만, 때때로 VRAM 여유가 있음에도 일부를 CPU(RAM)에 남겨두는 경우가 있습니다. 모든 연산을 GPU에서 처리하도록 강제하면 속도가 비약적으로 향상됩니다.

  • gpu layers 는 모델 메타 정보에서 확인이 가능하다
1
2
3
FROM qwen2.5-coder:7b
# -1은 가능한 모든 레이어를 GPU에 올리라는 뜻입니다.
PARAMETER num_gpu -1
  1. Context Window

ollma 모델은 **Context Window(문맥 창)**가 4096 으로 제한되는데 num_ctx 토큰량 컨텍스트 크기를 직접 지정한다.

1
PARAMETER num_ctx 32768            # 컨텍스트 크기를 32768(32k)로 설정
  1. KV 캐시 양자화 (Flash Attention 및 메모리 절약)

32k와 같은 긴 컨텍스트를 사용할 때 가장 많은 메모리를 잡아먹는 것은 모델 자체보다 KV Cache(이전 대화를 기억하는 메모리)입니다. Ollama 최신 버전에서는 이를 압축하여 VRAM 부담을 줄일 수 있습니다.

1
PARAMETER temperature 1.0
  1. 무작위 토큰 선택을 제한하여 코드 일관성 유지

PARAMETER top_p 0.95
PARAMETER top_k 64


기존 모델의 파라미터 확인

다운 받은 모델의 세부 파라미터를 확인할 수 있다. 이 정보를 모델 파일로 리다이렉트해서 편집해 사용할 수 있다.

ollama show 로 모델의 파라미터를 확인하고 결과를 모델 파일로 리다이렉트하면 저장할 수 있다.

1
ollama show qwen3-14b-coding --modelfile > Modelfile

필요한 부분을 수정후 새 모델로 실행하면 된다.

1
2
ollama create ds-v4 -f Modelfile
ollama run ds-v4

Codex 와 Local LLM 연결하기

Local LLM 시리즈

  1. (Local LLM) Ollama 시작하기
  2. Codex 와 Local LLM 연결하기

Codex 와 Local LLM 연결하기

Codex 를 Local LLM 로 서빙하는 API End point 에 연동해 사용하는 방법을 정리 요약한다.

  1. codexcli: 0.134 (20260526 설치)
  2. client: Ausus A14 / RTX 4060 8GB
  3. server: RTX 3080ti

설치와 시작

codex 를 설치하고 프로젝트 폴더에서 codex를 실행한다.

프로젝트를 시작하면 .codex/ 폴더의 config.toml 설정 파일에 [projects.] 섹션이 생성된다.

프로젝트 섹션에 codex 를 시작한 폴더가 설정된다.

1
2
3
4
5
6
7
8
# .codex/config.toml
personality = "pragmatic"

[projects."/home/user/My_Project"]
trust_level = "trusted"

[tui.model_availability_nux]
"gpt-5.5" = 4

모델 Provider 설정

config.toml[model_providers.] 섹션에 LLM endpoint 를 명시적으로 설정할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# .codex/config.toml
personality = "pragmatic"

[projects."/home/user/My_Project"]
trust_level = "trusted"

[model_providers.goyangi]
name = "openai" # openai chat
base_url = "http://192.168.0.3:8001" # llama-server
wire_api = "responses"
requires_openai_auth = false

[model_providers.local_llm]
name = "openai"
base_url = "http://localhost:11434/v1" # openai endpoint /v1 지정 필요
wire_api = "responses"
requires_openai_auth = false


[tui.model_availability_nux]
"gpt-5.5" = 4
  • wire_api = "responses" : 최신 버전의 codex 는 response 로 지정해야 한다고 한다.

모델에 대한 provider 설정을 알아보자.


프로파일 설정

config.toml 의 model_providers 의 선언한 provider 이름은 별도의 동일한 파일로 설정한다.

해당 provider 의 동일 이름의 .codex/PROFILENAME.tomy 파일을 참조하게 된다.

이곳에 LLM endpoiint 의 세부 모델에 대한 파라미터를 선언한다.

예를 들의 위의 goyangi_coder 는 다음 같이 구성된다.

1
2
3
4
5
6
7
#.codex/goyangi_coder.config.toml
model_provider = "goyangi"
model = "gpt-5"
approvals_reviewer = "user"
# 필요 시 추가 옵션
# max_tokens = 2048
# context_length = 8192

다른 프로바이더 local_llm 프로파일은 다음 같이 구성된다.

1
2
3
4
5
6
7
#.codex/local_llm.config.toml
model_provider = "local_llm"
model = "gemma-4" # 서비스가 제공하는 정확안 모델 이름
approvals_reviewer = "user"
# 필요 시 추가 옵션
# max_tokens = 2048
# context_length = 8192

시작

프로파일을 사용해서 codex 를 시작할 수 있다.

1
codex --profile local_llm

테스트

1
curl http://192.168.0.3:8001/v1/models

반환된 JSON 결과의 id 값이 "gemma-4"가 아니라 파일명 전체(예: "gemma-4-it-Q4_K_M.gguf")로 되어 있다면, 그 값을 그대로 model 필드에 적어주어야 매칭 실패 에러가 나지 않습니다.


한국어

Linux에서 Codex 한글 설정
Linux는 시스템 로케일이 UTF-8이면 추가 설정 없이 정상 작동합니다. locale 명령으로 확인하세요.

locale

LANG=ko_KR.UTF-8 또는 en_US.UTF-8이면 정상

만약 UTF-8이 아니라면:

sudo locale-gen ko_KR.UTF-8

sudo update-locale LANG=ko_KR.UTF-8

CUDA Toolkit 설치 (Ubuntu, WSL)

WSL, Linux 기반 환경에서 CUDA Toolkit 설치

CUDA 설치 - Linux

  1. WSL 환경
  2. CUDA Toolkit 설치
  3. CUDA cuDNN 설치

1. WSL

Install WSL 2

1
wsl.exe --install

Ensure you have the latest WSL kernel:

1
wsl.exe --update

CUDA support for WSL2

WSL 의 Linux에 NVIDIA Driver 를 설치하면 안된다.


2. CUDA Toolkit 설치

cuda toolkit 과 cudnn 을 설치한다. 설치한 버전의 환경변수를 설정한다.

1. CUDA Toolkit 설치

https://developer.nvidia.com/cuda-downloads

2. cuDNN 설치

https://developer.nvidia.com/cudnn

3. 환경변수

설치한 cuda 버전에 맞춰 CUDA_PATH, PATH, LD_LIBRARY 를 설정해 준다.

1
2
3
4
5
# CUDA PATH
export CUDA_PATH=/usr/local/cuda-13.2
export CUDA_HOME=/usr/local/cuda-13.2
export PATH=$CUDA_PATH/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-13.2/lib64:$LD_LIBRARY_PATH

nvcc 명령이 실행되는지 확인한다.

1
2
3
4
5
6
~$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2026 NVIDIA Corporation
Built on Thu_Mar_19_11:12:51_PM_PDT_2026
Cuda compilation tools, release 13.2, V13.2.78
Build cuda_13.2.r13.2/compiler.37668154_0

OLD 문서

WSL 에서 CUDA 사용을 위한 User Guide

LLM02 - 활용방법

대형언어모델을 운용할 때 사용하는 다양한 활용 방법을 요약했다.

LLM 활용

Open-source LLMs

2025 년 주요 LLM base models

[https://blog.n8n.io/open-source-llm/\]

LLM의 주요 활용 분야

LLM은 그 자체로도 강력하지만, 다른 기술과 결합하거나 특정 목적에 맞춰 미세 조정될 때 더욱 큰 시너지를 낼 수 있습니다. 주요 활용 분야는 다음과 같습니다.

1. 콘텐츠 생성 및 요약

  • 보고서, 기사, 블로그 게시물 작성: 주어진 주제나 키워드를 바탕으로 자연스럽고 설득력 있는 글을 자동으로 생성합니다.
  • 마케팅 문구 및 광고 카피: 제품이나 서비스의 특징을 분석하여 매력적인 광고 문구를 제안합니다.
  • 창의적인 글쓰기: 시, 소설, 시나리오 등 문학 작품 창작에 도움을 주거나 새로운 아이디어를 제시합니다.
  • 텍스트 요약 및 정보 추출: 긴 문서나 여러 개의 문서를 핵심 내용만 간추려 요약하거나 특정 정보를 추출합니다.
  • 번역: 자연스럽고 정확한 언어 번역을 제공하며, 문맥을 이해하여 문화적 뉘앙스까지 반영하려 노력합니다.

2. 고객 서비스 및 상호작용

  • 챗봇 및 가상 비서: 고객 문의에 실시간으로 응답하고, FAQ를 기반으로 정보를 제공하며, 기본적인 상담 업무를 처리합니다.
  • 개인화된 추천 시스템: 사용자의 선호도나 과거 행동을 분석하여 맞춤형 제품, 콘텐츠, 서비스를 추천합니다.
  • 음성 인식 및 합성: 음성 명령을 텍스트로 변환하거나 텍스트를 자연스러운 음성으로 변환하여 상호작용을 돕습니다.

3. 교육 및 학습

  • 개인 맞춤형 학습 콘텐츠: 학생의 학습 수준과 목표에 맞춰 최적화된 학습 자료나 문제 풀이를 제공합니다.
  • 튜터링 및 질의응답: 특정 개념에 대한 질문에 답변하고, 예시를 들어 설명하며 학습을 돕습니다.
  • 언어 학습: 외국어 학습 시 발음 교정, 문법 오류 수정, 회화 연습 상대 등의 역할을 수행합니다.

4. 코드 생성 및 개발

  • 코드 자동 완성 및 생성: 개발자가 코드를 작성할 때 다음 코드를 예측하여 자동 완성하거나, 특정 기능에 대한 코드를 생성합니다.
  • 버그 수정 및 코드 최적화: 기존 코드의 오류를 찾아내고 수정 방법을 제안하거나, 성능 개선을 위한 최적화 방안을 제시합니다.
  • 설명서 작성: 코드에 대한 주석이나 API 문서 등을 자동으로 생성하여 개발 생산성을 높입니다.

5. 데이터 분석 및 인사이트 도출

  • 비정형 데이터 분석: 고객 피드백, 소셜 미디어 게시물 등 비정형 텍스트 데이터에서 유의미한 패턴이나 트렌드를 발견합니다.
  • 시장 조사: 방대한 양의 시장 보고서나 뉴스 기사를 분석하여 시장 동향이나 경쟁사 정보를 파악합니다.

장점

  • 생산성 향상: 반복적이거나 시간이 많이 소요되는 작업을 자동화하여 효율성을 극대화합니다.
  • 비용 절감: 특정 업무에 필요한 인력이나 자원을 줄일 수 있습니다.
  • 새로운 가치 창출: 기존에는 불가능했거나 비효율적이었던 작업을 가능하게 하여 새로운 비즈니스 모델을 창출합니다.
  • 개인화된 경험 제공: 사용자 개개인의 니즈에 맞는 맞춤형 서비스를 제공하여 만족도를 높입니다.

한계

  • 환각(Hallucination): 사실이 아닌 정보를 그럴듯하게 생성하여 제공할 수 있습니다.
  • 편향성: 학습 데이터에 존재하는 편향이 모델에 반영되어 차별적이거나 부적절한 결과를 초래할 수 있습니다.
  • 최신 정보 부족: 학습 시점 이후의 최신 정보를 반영하지 못할 수 있습니다.
  • 복잡한 추론의 한계: 아직까지는 인간 수준의 복잡한 논리적 추론이나 문제 해결 능력에는 한계가 있습니다.
  • 데이터 보안 및 프라이버시: 민감한 정보를 다룰 때 데이터 유출이나 오용의 위험이 존재합니다.

크게 Finetuning 과 RAG 가 있다.

LLM 응용 전략

실제 서비스나 애플리케이션에 적용할 때 중요한 전략인 RAG(Retrieval-Augmented Generation), Fine-tuning, Agent에 대해 살펴보자

  1. Fineturning
  2. RAG
  3. Agent

1. Fineturning

파인튜닝은 LLM 모델을 특별한 상황에 더 맞도록 훈련을 시키는 방법

Fine-tuning은 미리 학습된 LLM(Pre-trained LLM)을 특정 데이터셋(도메인 특화 데이터, 작업별 데이터, 지역 데이터 등)으로 추가 학습시키는 과정으로 이를 통해 모델의 파라미터를 조정하여 특정 작업이나 특정 도메인에 더욱 집중해서 성능을 발휘하도록 만드는 기술이다.

작동 방식:

  1. 사전 학습된 LLM 선택: GPT-3, Llama, BERT 등 이미 대량의 데이터로 학습된 LLM을 선택합니다.

  2. 데이터셋 준비: Fine-tuning에 사용할 고품질의 도메인 특화 데이터나 특정 작업에 대한 데이터를 준비합니다 (예: 질문-답변 쌍, 특정 스타일의 텍스트).

  3. 모델 추가 학습: 준비된 데이터셋으로 LLM을 추가적으로 학습시킵니다. 이 과정에서 모델의 가중치(파라미터)가 조정됩니다.

  4. 평가 및 배포: Fine-tuning된 모델의 성능을 평가하고, 실제 서비스에 배포합니다


<[1] 2단계에 걸치 파인튜닝 사례: https://floatbot.ai/tech/llm-fine-tuning-strategies>

전이학습

이렇게 한 분야 모델을 다른 분야를 학습시키는 것을 전이학습(Trasfer Learning)이라고 한다. 기존 학습한 모델의 내용이 다른 분야에도 전이된다는 의미로 이해한다.


<[2] 전이학습>

전이학습은 파인튜닝 보다 포괄적인 의미를 갖는다. 파인튜닝은 전이학습의 한 형태로 특정 분야, 특정 작업에 집중해 추가학습하는 과정을 말한다.


https://thebook.io/080413/0006/

파인 튜닝의 어려움

  • 기존 모델에 추가 학습해야 하는데, 1) 어느 정도 데이터로 어느 정도 훈련해야 하는지 정하기 어렵다. 2) 학습에 과도한 비용이 발생, 즉 LLM 모델에 추가 학습에도 방대한 자원이 필요 3) 데이터 준비가 어렵다. 파인튜닝을 위해서 “질문-답변” 형식의 세트가 필요한데 새 데이터를 이렇게 준비하는게 쉽지 않다.

활용 예:

  1. 고객 상담 챗봇의 응대 방식 개선: 특정 기업의 고객 응대 매뉴얼, 과거 상담 기록으로 Fine-tuning하여 챗봇이 기업의 가이드라인과 톤앤매너에 맞게 응대하도록 합니다.

  2. 특정 분야 텍스트 생성: 의학 전문 기사를 작성하는 LLM을 만들기 위해 방대한 의학 논문으로 Fine-tuning합니다.

  3. 코드 생성 모델 개선: 특정 프로그래밍 언어나 특정 프레임워크의 코드 샘플로 Fine-tuning하여 해당 분야의 코드 생성 능력을 향상시킵니다.

파인 튜닝에 대한 자세한 OpenAI 문서

2. RAG

RAG (Retrieval-Augmented Generation, 검색 증강 생성) 은 정보 검색과 생성을 결합한 인공지능 모델이다. RAG 는 복잡한 정보가 필요한 질문에 답변하기 위해 설계되었다. LLM의 ‘환각(Hallucination)’ 문제를 줄이고, 최신 정보나 특정 도메인의 전문 지식을 활용하게 하는 데 매우 효과적일 수 있다.

작동 방식:

  1. 사용자 질문: 사용자가 LLM에 질문을 합니다.

  2. 정보 검색: 질문과 관련된 정보를 외부 지식 소스(벡터 데이터베이스 등)에서 검색합니다. (이때 질문을 임베딩하여 유사한 임베딩을 가진 문서를 찾는 방식이 주로 사용됩니다.)

  3. 컨텍스트 추가: 검색된 관련 정보(문서 조각 등)를 사용자 질문과 함께 LLM의 프롬프트에 추가하여 전달합니다.

  4. 답변 생성: LLM은 추가된 컨텍스트를 기반으로 답변을 생성합니다.

RAG는 2단계로 구성된다. 정보검색 단계와 텍스트 생성 단계이다.

  1. 정보검색 단계

    • 질문: 프롬프트 입력
    • 쿼리: 문서 검색으로 데이터베이스, 문서 등의 콘텐츠 저장소에서 질문을 검색한다.
    • 결과: 검색 결과중에서 관련성 높은 문서와 사용자 질문을 결합해서 LLM에 전달한다.
  2. 테스트 생성 단계

    • 정보전달: 선택 문서 내용, 즉 사용자 질문 + 검색결과을 모델에 전달하면 LLM 모델이 의미를 이해하기 시작한다
    • 텍스트 생성: 질문의 답변을 생성한다.


https://apmonitor.com/dde/index.php/Main/RAGLargeLanguageModel

활용예

  • 기업 내부 지식 챗봇: 회사 규정, 제품 매뉴얼, 인사 정책 등 내부 문서를 학습시키지 않고, RAG를 통해 필요할 때 해당 문서에서 정보를 찾아 답변합니다.

  • 법률 자문 시스템: 방대한 법조문 및 판례 데이터를 RAG에 연동하여 특정 사건에 대한 법률적 해석이나 관련 판례를 제시합니다.

  • 뉴스 요약 및 분석: 실시간으로 업데이트되는 뉴스 기사를 RAG를 통해 검색하고, 사용자의 질문에 맞춰 요약하거나 분석합니다.

3. Agent

Agent는 LLM을 추론 엔진으로 활용하여, 특정 목표를 달성하기 위해 일련의 행동을 계획하고 실행하며, 필요시 도구를 사용하고 피드백을 받아 스스로 개선해나가는 시스템입니다. LLM은 단순히 텍스트를 생성하는 것을 넘어, 문제 해결을 위한 ‘두뇌’ 역할을 합니다.

작동 방식:

  1. 목표 설정: 사용자 또는 시스템이 에이전트에게 특정 목표를 부여합니다 (예: “다음 주 파리 여행 계획을 세워줘”).

  2. 계획 수립 (LLM의 추론): LLM은 목표를 달성하기 위한 단계별 계획을 세웁니다 (예: 항공권 검색 -> 호텔 예약 -> 관광지 조사 -> 예산 책정).

  3. 도구 사용: 계획에 따라 필요한 외부 도구(예: 항공권 예약 API, 구글 지도 API, 날씨 정보 API)를 호출하고 사용합니다.

  4. 관찰 및 피드백: 도구 사용 결과나 현재 상황을 관찰하고, 목표 달성에 얼마나 근접했는지 평가합니다.

  5. 반복 및 개선: 피드백을 바탕으로 다음 행동을 결정하거나, 필요시 계획을 수정하여 목표를 달성할 때까지 이 과정을 반복합니다.

4. 퓨샷, 제로샷 러닝

퓨샷러닝은 매우 적은 양의 데이터로 학습하는 능력을 말한다. 기존 모델에 매우 제한된 데이터로 부터 적응시키는 것이다.

퓨샷 러닝과 더불어 제로샷 러닝, 원샷 러닝들이 있다.

제로샷 러닝

기존 모델에 전혀 보지 못한 데이터가 제시되었을 때 예측을 수행할 수 있는 것을 제로샷 러닝이라고 한다.
- 기존 모델이 방대한 데이터를 바탕으로 추상화하고 일반화할 수 있는 능력이 필요

원샷 러닝

반면에 얼룩말 이미지 하나만 학습해서 얼룩말을 분류하는 것을 원샷 러닝이라고 한다 보통 지도학습 분야가 그렇다

퓨샷 러닝

또한 여러개의 얼룩말 이미지를 학습하고 얼룩말을 분류하는 것을 퓨샷러닝이라고 한다.

— 참고 —

  1. LLM Fine-Tuning Strategies for Domain-Specific Applications

  2. transfer learning

LLM01 - Models

대형언어모델에 대해서 간략이 정리한다.

언어모델(LM, Language Model)

https://brunch.co.kr/@brunchgpjz/49

  1. 통계적 언어모델 (SLM)

  2. 신경 언어모델 (NLM)

  3. 사전학습된 언어모델 (PLM)

    • LSTM, biLSTM, ELMo. 그리고 Self-attention 을 갖춘 Transformer 아키텍처의 BERT
  4. 대규모 언어모델 (LLM)

    • PLM의 확장(모델 크기, 데이터 크기) 하면 성능 향상

BERT

2018년 구글이 발표한 잔연어 처리 모델

BERT(Bidirectional Encoder Representations from Transformers)는 Google이 2018년에 발표한 언어 모델입니다. BERT는 텍스트 이해를 위해 주로 사용되며, 특히 텍스트의 양방향(contextual) 특성을 잘 이해하는 데 능력이 있습니다. BERT의 핵심 메커니즈다는 self-attention, 즉 자기 주의력이 있습니다.

Transformer 아키텍처

RNN 기반의 단점인 기억상실을 극복하고 self-attention 으로 문장 안의 단어 사이 관계 파악에 주력

Self-attention

문장 내의 모든 단어들에 대해 각각 중요도를 계산하고 특정 단어와 관련한 다른 단어들의 정보를 종합하는 방식을 통해서 문장의 문맥 속에서 단어의 의미를 더 정확히 파악할 수 있다.

Parallelize

RNN 과 달리 병렬로 계산해 속도 향상

사전학습

BERT는 라벨 없는 대규모 텍스트 데이터를 사전학습한다. 언어의 지식을 습득하고 다양한 NLP task 에 적용을 준비한다.

부호제거

BERT는 마스크한 언어모델 (Masked Language Model, MLM)과 다음 문장 예측(Next Sentence Prediction, NSP) 의 2가 방식으로 사전학습을 진행한다.

  • MLM
    • 문장에서 일부 단어를 가리고 가려진 단어를 예측한다.
  • NSP
    • 2개의 문장을 주어지면 두번째 문장이 첫번째 문장 다음 문장인지 판단하는 학습을 한다.

양방향 언어모델

문장의 양방향(앞, 뒤) 정보를 모두 활용하여 단어의 의미를 파악한다. 기존 모델들이 주로 단방향 또는 제한적인 양방향 정보만 활용했던 것에 비해 BERT는 문맥 정보를 활용해 높은 성능을 보여준다.

self-attention

self-attention은 BERT의 구조에서 중요한 역할을 합니다. 이는 각 단어에 대해 다른 모든 단어와의 관계를 평가하여 중요도를 계산합니다. 이를 통해 각 단어가 문맥 속에서 얼마나 중요한지, 다른 단어들과 어떻게 상호작용하는지를 파악할 수 있습니다.

BERT의 self-attention은 주로 두 가지로 구성됩니다:

  1. Self-Attention Mechanism:

    • BERT는 입력한 시퀀스에 대해 self-attention mechanism을 사용하여 각 단어의 의미를 계산합니다.
    • 각 단어는 입력 시퀀스의 모든 단어에 대한 가중치를 계산하고, 그 가중치에 따라 다른 단어들로부터의 정보를 수집합니다.
    • 이를 통해 각 단어가 문맥 내에서 어떻게 관련이 있는지 파악할 수 있습니다.
  2. Multi-Head Attention:

    • BERT는 여러 개의 attention head를 사용하여 더 복잡하고 다양한 관계를 포착할 수 있습니다.
    • 각 attention head는 입력 시퀀스에 대해 독립적으로 작업을 수행하며, 서로 다른 기능을 가진 여러 attention matrix를 생성합니다.
    • 이를 통해 모델이 다양한 관점에서 입력 텍스트를 이해할 수 있습니다.

self-attention의 구체적인 계산 과정은 다음과 같습니다:

  1. Query, Key, Value:

    • BERT는 입력 시퀀스를 Q(query), K(key), V(value)로 나누어 각 단어에 대해 attention을 계산합니다.
  2. Attention Score Calculation:

    • Q와 K를 Dot Product로 계산하여 attention score를 얻습니다.
    • 이를 통해 각 단어가 다른 단어들과 얼마나 관련이 있는지를 평가합니다.
  3. Attention Weight Calculation:

    • Softmax 함수를 사용하여 attention score를 정규화하고, 이를 attention weight로 사용합니다.
  4. Contextualized Embedding:

    • 최종적으로 attention weight에 따라 다른 단어들로부터의 정보를 가중치하여, 각 단어의 contextualized embedding을 계산합니다.

이러한 과정을 통해 BERT는 입력 텍스트의 모든 단어가 문맥 내에서 어떻게 상호작용하는지를 이해하고, 이를 바탕으로 더 정교한 텍스트 이해를 가능하게 합니다.

BERT의 self-attention mechanism은 기존의 언어 모델들에 비해 텍스트 이해 및 시각화 능력이 더 뛰어나며, 이는 다양한 NLP 작업에서 높은 성능을 발휘하는 데 기여하고 있습니다.

날짜 모델 특징 비고
2024년 12월 DeepSeek-V3 - 6710억 개의 파라미터와 370억 개의 활성화된 파라미터 기반 MoE 모델 - 적은 비용으로 높은 성능을 달성하여 화제가 됨
2025년 1월 DeepSeek-R1 - 강화 학습 기반 추론 모델 - 높은 성능과 가성비로 주목받음
2025년 1월 DeepSeek-R1-Zero - DeepSeek-R1 모델의 Zero 버전 - 추가 정보 필요

LLM 모델, 파라미터 별 비교

모델 개발사 파라미터 크기 주요 특징 활용 분야
Llama 1 Meta 7B, 13B, 33B, 65B 연구용, 제한적 공개 연구, 개발
Llama 2 Meta 7B, 13B, 70B 상업적 이용 가능, 다양한 기능 추가 챗봇, 텍스트 생성, 번역 등
Llama 3.1 Meta 8B, 70B, 405B 128k 컨텍스트, 8개 언어 지원, 도구 사용, Llama Guard 3 및 Prompt Guard 등 안전 도구 강화 챗봇, 텍스트 생성, 번역, 코딩, 수학 문제 해결 등
DeepSeek-V3 DeepSeek 671B 16-bit Transformer, MoE, dynamic biases 텍스트 생성, 코딩, 수학 문제 해결 등
DeepSeek-R1 DeepSeek - 강화 학습 기반, 추론 특화 추론, 문제 해결
DeepSeek-R1-Distill DeepSeek 1.5B, 7B, 8B, 14B, 32B, 70B DeepSeek-R1 지식 증류, 다양한 크기 제공 추론, 문제 해결

Deepseek V3

  • 딥시크-V3: 2024년 12월 공개된 LLM으로, 적은 비용으로 높은 성능을 달성하여 주목받았습니다.
  • 딥시크-R1: 2025년 1월 공개된 추론 AI 모델로, 일부 성능 테스트에서 OpenAI의 모델을 능가하는 결과를 보여 화제가 되었습니다.

DeepSeek R1, 복잡한 아이디어 대신 단순한 RL 방식으로도 충분한 추론 성능 달성

DeepSeek R1은 복잡한 아이디어(DPO, MCTS) 대신 단순한 RL 방식으로도 충분한 추론 성능을 달성할 수 있음을 보여주는 대표적인 사례입니다.

기존 방식의 한계

DPO(Direct Preference Optimization)와 MCTS(Monte Carlo Tree Search)는 복잡한 계산 과정과 많은 자원을 필요로 합니다.

이러한 복잡성은 모델의 학습 속도를 늦추고, 대규모 모델에 적용하기 어렵다는 단점이 있습니다.

DeepSeek R1의 접근 방식

DeepSeek R1은 단순한 RL 알고리즘을 사용하여 추론 능력을 향상시켰습니다.

지도 학습 데이터 없이 순수 강화 학습만으로 모델을 학습시켜 추론 능력을 끌어올렸습니다.

자체 학습(Self-evolution) 과정을 통해 모델이 점진적으로 복잡한 추론 작업을 해결하는 능력을 개발했습니다.

Deepseek Timeline

  • 2024년 9월 12일: o1-preview 출시
  • 2024년 12월 5일: o1 정식 버전 및 o1-pro 출시
  • 2024년 12월 20일: o3 발표 (ARC-AGI 통과, “AGI”로 주목받음)
  • 2024년 12월 26일: DeepSeek V3 출시
  • 2025년 1월 20일: DeepSeek R1 출시 (o1과 유사한 성능인데 오픈 소스)
  • 2025년 1월 25일: 홍콩대학교 연구진이 R1 결과 복제 성공
  • 2025년 1월 25일: Huggingface에서 R1을 복제한 완전 오픈소스 open-r1 프로젝트 발표

특징

DeepSeek v3는 Float8 E4M3, FP8 Master Accumulation, Latent Attention C Cache, Dynamic Biases for MoE 등 다양한 혁신적인 기술을 통해 높은 성능과 효율성을 동시에 달성했습니다.

DeepSeek v3 특징

  1. E4M3 를 Float8 로 사용한다.
    • Float8 중에서도 E4M3 형식을 사용하여 메모리 사용량을 줄이면서도 높은 정밀도를 유지합니다. 기존에는 E5M2 형식이 주로 사용되었지만, DeepSeek v3는 E4M3를 사용하여 연산 효율성을 높였습니다.
  2. 매 4번째 FP8 합산을을 마스터 FP32 accum 에 합산된다.
    • DeepSeek v3는 매 4번째 FP8 누적 결과를 FP32 Master Accumulation에 더하여 정밀도를 향상시킵니다. 이는 FP8 연산의 단점을 보완하고 안정적인 학습을 가능하게 합니다.
  3. Latent Attention stores C cache not KV cache
    • Latent Attention의 Key(K)와 Value(V) 캐시 대신 C 캐시를 사용하여 메모리 사용량을 줄이고 연산 속도를 향상시킵니다. 이는 더욱 효율적인 Attention 연산을 가능하게 합니다.
  4. No MoE loss balancing - dynamic biases instead
    • 기존의 MoE Loss Balancing 대신 Dynamic Biases를 사용하여 모델의 균형을 맞추고 학습 효율성을 높입니다. 이는 더욱 안정적인 MoE 학습을 가능하게 합니다.

주요 기법

  1. Float8 E4M3

    • Float8 을 4비트 지수 (Exponent), 3비트 가수(Mantissa) 로 표현한다.
  2. FP8 Master Accumulation

    • FP8 연산 결과를 FP32 형식으로 누적하는 기술
  3. Latency Attention

    • Attension 으로 Latency Attention 으로 사용한다.
  4. MoE ( Mixture of Experts)

    • MoE 여러 개의 전문가 네트워크를 결합하여 성능을 향상시키는 기술, Dynamic Biases는 MoE의 각 전문가 네트워크에 동적으로 적용되는 편향(Bias)입니다.

LLM 기법 해설

전통 Attention 매커니즘

Attention 메커니즘은 인공지는 자연어 처리에서 문맥 속에서 중요한 정보를 선별하고 집중하여 처리함으로써 효율성을 높이는 기술이다.

https://jalammar.github.io/illustrated-transformer/

전통적 Attention 매커니즘 작동방식

  1. 유사도 계산 (Similarity Calculation)

    입력된 각 단어(또는 토큰) 간의 유사도를 계산합니다. 이는 Query, Key, Value 벡터를 사용하여 수행됩니다.

    • Query (Q): 질문 또는 현재 처리해야 할 정보를 나타내는 벡터
    • Key (K): 입력 데이터의 각 단어(또는 토큰)를 나타내는 벡터
    • Value (V): 입력 데이터의 각 단어(또는 토큰)의 실제 값을 나타내는 벡터
  2. 가중치 계산 (Weight Calculation)

    계산된 유사도를 바탕으로 각 단어에 대한 가중치를 계산합니다. 이 가중치는 해당 단어가 얼마나 중요한지를 나타냅니다. Softmax 함수를 사용하여 가중치를 정규화합니다.

  3. 가중 평균 (Weighted Average)

    계산된 가중치를 사용하여 입력 단어들의 가중 평균을 계산합니다. 이 가중 평균은 Attention 값을 나타냅니다.

  4. 출력 (Output)

    계산된 Attention 값을 사용하여 최종 결과를 생성합니다.

토큰화한 단어 사이의 의미를 파악하기 위해 Sel-attention 을 Q, K, V 벡터로 수행한다.

https://www.linkedin.com/pulse/what-self-attention-impact-large-language-models-llm-nikhil-goel-srpbc/

Self-Attention

다양한 Attention 매커니즘

다양한 Attention 메커니즘 종류

  1. Self-Attention

Self-Attention은 입력 시퀀스 내에서 각 요소들 간의 관계를 파악하는 데 사용되는 Attention 메커니즘입니다. Query, Key, Value가 모두 동일한 입력에서 파생된다는 특징을 가집니다.

작동 방식

  1. Query, Key, Value 생성: 입력 시퀀스를 사용하여 Query, Key, Value 벡터를 생성합니다.
  2. 유사도 계산: Query와 Key 벡터 간의 유사도를 계산합니다.
  3. 가중치 계산: 계산된 유사도를 바탕으로 각 Key에 대한 가중치를 계산합니다.
  4. 가중 평균: 가중치를 사용하여 Value 벡터의 가중 평균을 계산합니다.
  5. 출력: 계산된 가중 평균을 Self-Attention의 출력으로 사용합니다.

특징

  • 입력 시퀀스 내의 장거리 의존성을 효과적으로 파악할 수 있습니다.
  • 병렬 처리가 가능하여 계산 효율성이 높습니다.
  1. Multi-Head Attention

Multi-Head Attention은 Self-Attention을 여러 개의 head로 나누어 다양한 관점에서 입력 시퀀스를 분석하는 기법입니다.

각 head는 독립적으로 Self-Attention을 수행하고, 그 결과를 concat하여 최종 출력을 생성합니다.

작동 방식

  1. 입력 분할: 입력을 여러 개의 head로 나눕니다.
  2. Self-Attention: 각 head에서 독립적으로 Self-Attention을 수행합니다.
  3. 결과 concat: 각 head의 출력 결과를 concat합니다.
  4. 출력: concat된 결과를 Multi-Head Attention의 출력으로 사용합니다.

특징

다양한 의미를 가진 정보를 효과적으로 추출할 수 있습니다.
모델의 표현력을 높여줍니다.

  1. 기타 Attention 메커니즘
  • Global Attention: 입력 시퀀스 전체를 사용하여 Attention 값을 계산합니다.
  • Local Attention: 입력 시퀀스의 특정 부분만 사용하여 Attention 값을 계산합니다.
  • Hierarchical Attention: 계층적인 구조를 가진 입력 데이터에 적용되는 Attention 메커니즘입니다.

전통 Attention 한계

전통적인 Attention 메커니즘은 계산 복잡도가 높고, 긴 시퀀스에 취약하다는 단점이 있습니다.

Offload

인공지능 LLM(Large Language Model) 분야에서 Offload는 특정 작업을 메인 프로세서(CPU 또는 GPU)에서 다른 보조 프로세서(GPU, TPU, NPU 등)로 이전하여 처리하는 것을 의미합니다.

Offload의 핵심 개념

  • 작업 분산: LLM은 막대한 연산 능력을 요구하기 때문에, 하나의 프로세서만으로는 처리하기 어려울 수 있습니다. Offload는 이러한 문제를 해결하기 위해 작업을 여러 프로세서에 분산하여 처리합니다.
  • 성능 향상: Offload를 통해 각 프로세서는 자신에게 특화된 작업을 효율적으로 처리할 수 있습니다. 이는 전체 시스템의 성능 향상으로 이어집니다.
  • 자원 효율성: Offload는 시스템 자원을 효율적으로 활용할 수 있도록 도와줍니다. 예를 들어, CPU는 복잡한 연산을 처리하고, GPU는 병렬 연산에 특화된 작업을 처리하는 방식으로 자원을 분배할 수 있습니다.

Offload의 중요성

  • LLM의 효율적인 실행: LLM은 엄청난 크기의 모델과 데이터를 처리해야 합니다. Offload는 이러한 대규모 작업을 효율적으로 처리하는 데 필수적인 기술입니다.
  • 추론 속도 향상: Offload를 통해 LLM의 추론 속도를 크게 향상시킬 수 있습니다. 이는 사용자 경험 개선에 중요한 역할을 합니다.
  • 다양한 하드웨어 활용: Offload는 다양한 종류의 하드웨어를 활용하여 LLM을 실행할 수 있도록 도와줍니다. 이는 하드웨어 선택의 폭을 넓혀주고, 비용 효율적인 시스템 구축을 가능하게 합니다.

Offload의 활용 예시

  • GPU Offloading: LLM의 연산 중 많은 부분을 GPU로 Offload하여 처리합니다. GPU는 병렬 연산에 특화되어 있어 LLM의 연산 속도를 크게 향상시킬 수 있습니다.
  • TPU Offloading: Google에서 개발한 TPU(Tensor Processing Unit)는 LLM 연산에 특화된 하드웨어입니다. TPU Offloading을 통해 LLM의 성능을 극대화할 수 있습니다.
  • NPU Offloading: NPU(Neural Processing Unit)는 신경망 연산에 특화된 하드웨어입니다. NPU Offloading을 통해 LLM의 추론 속도를 더욱 빠르게 만들 수 있습니다.

결론

Offload는 인공지능 LLM의 효율적인 실행을 위한 핵심 기술입니다. Offload를 통해 LLM의 성능을 향상시키고, 다양한 하드웨어를 활용하여 LLM을 더욱 폭넓게 활용할 수 있습니다.

LLM 인퍼런스 훑어보기 (1) - LLM을 이용한 문장 생성

LLM 인퍼런스 훑어보기 (6) - quantization


— 참고 —

거대언어모델(LLM)의 현 주소

unsloth 의 양자화

  1. Cool things from DeepSeek v3’s paper: https://x.com/danielhanchen/status/1872719599029850391
  2. https://unsloth.ai/blog/deepseekr1-dynamic

DeepSeek

Korean LLM

https://huggingface.co/collections/spow12/korean-llm-66416dfe6b649b6aa331c4f8

LLM model Hosting

Local LLM 실험: bench mark - kanana-nano-2.1B, ExaOne (RTX 3080Ti)

RTX 3080TI 를 사용해서 LLM 모델 llama-bench 로 벤치마크 테스트를 수행했다.

  1. kanana-nano-7b
  2. exaone-

kanana-nano-7b-Q8

1
2
$ llama-bench -m kanana-nano-2.1b-instruct.Q8_0.gguf \
-ngl 45,47,52,55,57,60 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
llama 8B Q8_0 2.07 GiB 2.09 B CUDA 45 pp512 11015.00 ± 48.73
llama 8B Q8_0 2.07 GiB 2.09 B CUDA 45 tg1000 184.19 ± 14.65
llama 8B Q8_0 2.07 GiB 2.09 B CUDA 47 pp512 10965.95 ± 158.97
llama 8B Q8_0 2.07 GiB 2.09 B CUDA 47 tg1000 183.49 ± 15.45
llama 8B Q8_0 2.07 GiB 2.09 B CUDA 52 pp512 10891.63 ± 105.68
llama 8B Q8_0 2.07 GiB 2.09 B CUDA 52 tg1000 183.41 ± 14.09
llama 8B Q8_0 2.07 GiB 2.09 B CUDA 55 pp512 10663.79 ± 150.73
llama 8B Q8_0 2.07 GiB 2.09 B CUDA 55 tg1000 183.14 ± 13.67
llama 8B Q8_0 2.07 GiB 2.09 B CUDA 57 pp512 10784.13 ± 43.64
llama 8B Q8_0 2.07 GiB 2.09 B CUDA 57 tg1000 183.82 ± 12.81
llama 8B Q8_0 2.07 GiB 2.09 B CUDA 60 pp512 10772.47 ± 98.95
llama 8B Q8_0 2.07 GiB 2.09 B CUDA 60 tg1000 184.45 ± 13.08

ExaOne-deep-7.8B-Q8

ExaOne-deep-7.8B-Q8 버전

1
(Deepseek_R1) qkboo:/mnt/d/LLM_Local$ llama-bench -m /mnt/e/LLM_Run/EXAONE-Deep-7.8B-Q8_0.gguf  -ngl 27,30,33,35,40 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
exaone 8B Q8_0 7.74 GiB 7.82 B CUDA 27 pp512 2224.32 ± 55.56
exaone 8B Q8_0 7.74 GiB 7.82 B CUDA 27 tg1000 14.72 ± 0.28
exaone 8B Q8_0 7.74 GiB 7.82 B CUDA 30 pp512 3048.43 ± 61.25
exaone 8B Q8_0 7.74 GiB 7.82 B CUDA 30 tg1000 27.83 ± 0.43
exaone 8B Q8_0 7.74 GiB 7.82 B CUDA 33 pp512 4376.37 ± 16.93
exaone 8B Q8_0 7.74 GiB 7.82 B CUDA 33 tg1000 83.44 ± 3.36
exaone 8B Q8_0 7.74 GiB 7.82 B CUDA 35 pp512 4509.89 ± 19.90
exaone 8B Q8_0 7.74 GiB 7.82 B CUDA 35 tg1000 81.71 ± 3.20
exaone 8B Q8_0 7.74 GiB 7.82 B CUDA 40 pp512 4414.70 ± 12.80
exaone 8B Q8_0 7.74 GiB 7.82 B CUDA 40 tg1000 81.99 ± 3.09

ExaOne-deep-2.4B

(Deepseek_R1) qkboo:/mnt/d/LLM_Local$ DLLAMA_CUBLAS=on llama-bench -m /mnt/e/LLM_Run/EXAONE-Deep-2.4B-BF16.gguf -ngl 35,39,43,47,5
0 -n 1000
ggml_cuda_init: GGML_CUDA_FORCE_MMQ: no
ggml_cuda_init: GGML_CUDA_FORCE_CUBLAS: no
ggml_cuda_init: found 1 CUDA devices:
Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
exaone ?B BF16 4.97 GiB 2.67 B CUDA 35 pp512 5185.28 ± 22.56
exaone ?B BF16 4.97 GiB 2.67 B CUDA 35 tg1000 117.92 ± 16.01
exaone ?B BF16 4.97 GiB 2.67 B CUDA 39 pp512 5273.68 ± 12.42
exaone ?B BF16 4.97 GiB 2.67 B CUDA 39 tg1000 123.80 ± 13.00
exaone ?B BF16 4.97 GiB 2.67 B CUDA 43 pp512 5065.21 ± 472.49
exaone ?B BF16 4.97 GiB 2.67 B CUDA 43 tg1000 125.65 ± 14.67
exaone ?B BF16 4.97 GiB 2.67 B CUDA 47 pp512 5488.28 ± 16.52
exaone ?B BF16 4.97 GiB 2.67 B CUDA 47 tg1000 125.00 ± 18.64
exaone ?B BF16 4.97 GiB 2.67 B CUDA 50 pp512 5481.39 ± 20.48
exaone ?B BF16 4.97 GiB 2.67 B CUDA 50 tg1000 128.38 ± 14.02

build: 98f6b0fd (4676)

ExaOne-deep-2.4B-Reasoning-MAX-NEO

1
2
$ DLLAMA_CUBLAS=on llama-bench -m /mnt/e/LLM_Run/EXAONE-Deep-2.4B-Reasoning-MAX-NEO-D_AU-Q8_0-imat.gguf \
-ngl 50,57,65,70,78 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
exaone ?B Q8_0 3.10 GiB 2.67 B CUDA 50 pp512 10672.83 ± 289.15
exaone ?B Q8_0 3.10 GiB 2.67 B CUDA 50 tg1000 175.51 ± 3.57
exaone ?B Q8_0 3.10 GiB 2.67 B CUDA 57 pp512 10791.99 ± 153.87
exaone ?B Q8_0 3.10 GiB 2.67 B CUDA 57 tg1000 163.48 ± 29.00
exaone ?B Q8_0 3.10 GiB 2.67 B CUDA 65 pp512 11039.36 ± 118.98
exaone ?B Q8_0 3.10 GiB 2.67 B CUDA 65 tg1000 173.37 ± 1.97
exaone ?B Q8_0 3.10 GiB 2.67 B CUDA 70 pp512 10539.79 ± 56.69
exaone ?B Q8_0 3.10 GiB 2.67 B CUDA 70 tg1000 155.61 ± 23.00
exaone ?B Q8_0 3.10 GiB 2.67 B CUDA 78 pp512 10077.84 ± 57.26
exaone ?B Q8_0 3.10 GiB 2.67 B CUDA 78 tg1000 159.27 ± 21.50

Local LLM 실험: RTX 3080Ti 에서 bench mark 결과

RTX 3080TI 를 사용해서 LLM 모델 llama-bench 로 벤치마크 테스트를 수행했다.

  1. llama-3-korean-bllossom-8B
  2. llama-3.1-korean-reasoning-8B
  3. UNIVA-Deepseek-llama3.1-Bllossom-8B
  4. Deepseek-r1-distill-llama-8B
  5. DeepSeek-R1-Distill-Qwen-14B
  6. DeepSeek-R1-Distill-Qwen-32B

벤치마크 결과는 아래 테이블 같이 나온다.

model size params backend ngl test t/s
llama 8B Q4_K - Medium 4.58 GiB 8.03 B CUDA 99 pp512 3730.08 ± 65.93
llama 8B Q4_K - Medium 4.58 GiB 8.03 B CUDA 99 tg1000 91.75 ± 1.07

컬럼의 의미는 다음 같다.

  • Prompt processing (pp): processing a prompt in batches (-p)
  • Text generation (tg) :
  • n-gpu-layers (ngl) : GPU offload layers

llama-3-Korean-Bllossom-8B-Q4_K_M.gguf

8B 파라미터 크기를 가진 Llama3 fintuned 모델

  • MLP-KTLim/llama-3-Korean-Bllossom-8B-Q4_K_M.gguf

ngl 을 변경하며 벤치마킹,

1
llama-bench -m llama-3-Korean-Bllossom-8B-Q4_K_M.gguf -ngl 10,20,30,40,50 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
llama 8B Q4_K - Medium 4.58 GiB 8.03 B CUDA 10 pp512 1303.36 ± 16.36
llama 8B Q4_K - Medium 4.58 GiB 8.03 B CUDA 10 tg1000 10.85 ± 0.02
llama 8B Q4_K - Medium 4.58 GiB 8.03 B CUDA 20 pp512 1719.75 ± 69.73
llama 8B Q4_K - Medium 4.58 GiB 8.03 B CUDA 20 tg1000 16.87 ± 0.04
llama 8B Q4_K - Medium 4.58 GiB 8.03 B CUDA 30 pp512 2906.49 ± 23.43
llama 8B Q4_K - Medium 4.58 GiB 8.03 B CUDA 30 tg1000 39.91 ± 0.16
llama 8B Q4_K - Medium 4.58 GiB 8.03 B CUDA 40 pp512 3483.66 ± 259.95
llama 8B Q4_K - Medium 4.58 GiB 8.03 B CUDA 40 tg1000 89.85 ± 2.06
llama 8B Q4_K - Medium 4.58 GiB 8.03 B CUDA 50 pp512 3419.22 ± 348.84
llama 8B Q4_K - Medium 4.58 GiB 8.03 B CUDA 50 tg1000 89.79 ± 0.37

정리:

  • RTX3080TI 에서 ngl=40 개 정도에서 꽤, 쓸만하게 반응한다. (시간적으로)

lemon-mint/LLaMa-3.1-Korean-Reasoning-8B-Instruct-Q8

llama3.1-8B 는 32 layers 를 가진 모델이다.

여기서는 lemon-mint/llama-3.1-korean-reasoning-8b-instruct-q8_0.gguf 모델을 사용ㅇ했다.

1
llama-bench -m Bllossom/lemon-mint/llama-3.1-korean-reasoning-8b-instruct-q8_0.gguf -ngl 25,30,35,40,45

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 25 pp512 1784.23 ± 93.34
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 25 tg1000 14.80 ± 0.06
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 30 pp512 2786.34 ± 31.32
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 30 tg1000 26.87 ± 0.30
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 35 pp512 3733.38 ± 187.10
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 35 tg1000 73.87 ± 3.13
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 40 pp512 3797.38 ± 166.76
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 40 tg1000 74.09 ± 3.33
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 45 pp512 3791.58 ± 82.35
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 45 tg1000 74.12 ± 3.20

정리

  • RTX3080TI 는 8B 모델들은 적당히 잘 돌아 간다.
  • bllossom 8B 와 비슷하게 ngl=40 가 적당하다.


UNIVA-Deepseek-llama3.1-Bllossom-8B

DeepSeek-Bllossom Series는 기존 DeepSeek-R1-Distill Series 모델의 language mixing, 다국어 성능 저하 문제를 해결하기 위해 추가로 학습된 모델입니다.

DeepSeek-llama3.1-Bllossom-8B는 DeepSeek-R1-distill-Llama-8B 모델을 베이스로 구축된 모델로, 한국어 환경에서의 추론 성능 향상을 목표로 개발되었습니다.

6Bit

1
llama-bench -m UNIVA-DeepSeek-llama3.1-Bllossom-8B-Q6_K.gguf -ngl 20,23,25,27,30 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 20 pp512 1543.16 ± 24.32
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 20 tg1000 13.13 ± 0.11
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 23 pp512 1765.23 ± 58.73
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 23 tg1000 16.08 ± 0.07
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 25 pp512 2027.43 ± 43.47
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 25 tg1000 19.04 ± 0.30
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 27 pp512 2249.32 ± 57.11
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 27 tg1000 23.01 ± 0.82
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 30 pp512 3001.55 ± 29.89
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 30 tg1000 33.67 ± 0.20
1
(Deepseek_R1) qkboo:~$ llama-bench -m /mnt/e/LLM_Run/UNIVA-DeepSeek-llama3.1-Bllossom-8B-Q6_K.gguf -ngl 30,33,35,37,40 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 30 pp512 3011.60 ± 50.04
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 30 tg1000 34.08 ± 1.11
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 33 pp512 3895.08 ± 25.09
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 33 tg1000 76.81 ± 4.94
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 35 pp512 3933.71 ± 32.81
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 35 tg1000 77.27 ± 6.96
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 37 pp512 3883.86 ± 20.62
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 37 tg1000 77.30 ± 4.44
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 40 pp512 3909.77 ± 14.13
^[[C llama 8B Q6_K 6.14 GiB 8.03 B CUDA 40 tg1000

8bit

1
$ llama-bench -m UNIVA-DeepSeek-llama3.1-Bllossom-8B-Q8_0.gguf -ngl 17,23,27,30,33 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 17 pp512 1152.58 ± 20.30
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 17 tg1000 8.79 ± 0.06
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 23 pp512 1653.79 ± 44.44
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 23 tg1000 12.79 ± 0.08
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 27 pp512 2170.69 ± 66.22
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 27 tg1000 18.02 ± 0.10
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 30 pp512 2997.54 ± 36.25
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 30 tg1000 26.93 ± 0.28
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 33 pp512 4311.76 ± 17.63
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 33 tg1000 80.54 ± 2.72
1
$ llama-bench -m /mnt/e/LLM_Run/UNIVA-DeepSeek-llama3.1-Bllossom-8B-Q8_0.gguf -ngl 47,53,57,60,65 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 47 pp512 4252.55 ± 170.94
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 47 tg1000 79.03 ± 8.48
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 53 pp512 4341.45 ± 181.79
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 53 tg1000 80.21 ± 8.60
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 57 pp512 4470.11 ± 27.91
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 57 tg1000 80.12 ± 6.18
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 60 pp512 4542.52 ± 23.46
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 60 tg1000 80.92 ± 9.37
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 65 pp512 4502.80 ± 57.29
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 65 tg1000 81.02 ± 10.89


DeepSeek-R1-Distill-Llama-8B-Q8_0.gguf

그 유명한 deepseek r1 으로 unsloth 의 distill 버전을 사용했다.

deepseek r1 은 61 layers 를 사용한다.

1
2
$ llama-bench -m DeepSeek-R1-Distill-Llama-8B-GGUF/DeepSeek-R1-Distill-Llama-8B-Q8_0.gguf -ngl 10,20,30
,40,50 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 10 pp512 849.57 ± 12.77
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 10 tg1000 6.34 ± 0.06
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 20 pp512 1279.56 ± 22.85
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 20 tg1000 10.41 ± 0.08
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 30 pp512 2712.69 ± 96.48
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 30 tg1000 26.45 ± 0.42
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 40 pp512 3581.72 ± 261.82
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 40 tg1000 72.33 ± 1.53
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 50 pp512 3653.35 ± 292.75
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 50 tg1000 73.69 ± 2.39

정리

  • RTX3080TI 에서 ngl=40 에서 잘 반응한다.
  • 역시 8B 파라미터라서 앞의 llama 3- bllossom, llama-3.1 8B 모델과 비슷하다.



DeepSeek-R1-Distill-Llama-8B_korean_reasoning

https://huggingface.co/mradermacher/DeepSeek-R1-Distill-Llama-8B_korean_reasoning-GGUF

6bit

1
$ llama-bench -m DeepSeek_R1_Distill/Llama-8B/DeepSeek-R1-Distill-Llama-8B_korean_reasoning.Q6_K.gguf -ngl 17,25,30,35,40,45 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 17 pp512 1420.67 ± 56.23
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 17 tg1000 10.87 ± 0.45
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 25 pp512 2126.29 ± 80.18
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 25 tg1000 18.29 ± 0.83
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 30 pp512 3136.95 ± 97.13
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 30 tg1000 33.18 ± 1.54
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 37 pp512 3670.82 ± 41.77
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 37 tg1000 77.20 ± 1.17
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 40 pp512 3711.66 ± 33.40
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 40 tg1000 77.59 ± 1.12
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 42 pp512 3725.29 ± 18.83
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 42 tg1000 77.39 ± 1.52
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 45 pp512 3690.92 ± 26.38
llama 8B Q6_K 6.14 GiB 8.03 B CUDA 45 tg1000 77.49 ± 1.37

RTX3080ti 에서

  • pp 는 bllossom 버전보다 꽤 빠르다고 생각된다
  • tg 는 유사하다.
  • ngl은 40 정도가 적당할 듯.

8bit

l$ llama-bench -m DeepSeek_R1_Distill/Llama-8B/DeepSeek-R1-Distill-Llama-8B_korean_reasoning.Q8_0.gguf -ngl 25,29,35,39,42 -n 1000
ggml_cuda_init: GGML_CUDA_FORCE_MMQ: no
ggml_cuda_init: GGML_CUDA_FORCE_CUBLAS: no
ggml_cuda_init: found 1 CUDA devices:
Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 25 pp512 1811.10 ± 51.70
llama 8B Q8_0 7.95 GiB 8.03 B CUDA 25 tg1000 14.25 ± 0.66
^C

RTX3080ti 에서




DeepSeek-R1-Distill-Qwen-14B

8bit Quantitization

1
$ llama-bench -m DeepSeek_R1_Distill/unsloth/DeepSeek-R1-Distill-Qwen-14B-Q8_0.gguf -ngl 25,28,30,33,35 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
qwen2 14B Q8_0 14.62 GiB 14.77 B CUDA 25 pp512 649.52 ± 7.97
qwen2 14B Q8_0 14.62 GiB 14.77 B CUDA 25 tg1000 4.73 ± 0.03
qwen2 14B Q8_0 14.62 GiB 14.77 B CUDA 28 pp512 593.29 ± 188.35

6bit Quantitization

1
$ llama-bench -m DeepSeek_R1_Distill/unsloth/DeepSeek-R1-Distill-Qwen-14B-Q6_K.gguf -ngl 15,18,20,25,30 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
qwen2 14B Q6_K 11.29 GiB 14.77 B CUDA 15 pp512 490.09 ± 191.57
qwen2 14B Q6_K 11.29 GiB 14.77 B CUDA 15 tg1000 4.52 ± 0.04
qwen2 14B Q6_K 11.29 GiB 14.77 B CUDA 18 pp512 629.45 ± 14.33
qwen2 14B Q6_K 11.29 GiB 14.77 B CUDA 18 tg1000 4.93 ± 0.03
qwen2 14B Q6_K 11.29 GiB 14.77 B CUDA 20 pp512 685.08 ± 14.48
qwen2 14B Q6_K 11.29 GiB 14.77 B CUDA 25 pp512 787.79 ± 18.55

$ llama-bench -m DeepSeek_R1_Distill/unsloth/DeepSeek-R1-Distill-Qwen-14B-Q5_K_M.gguf -ngl 20,25
,30,35 -n 1000
ggml_cuda_init: GGML_CUDA_FORCE_MMQ: no
ggml_cuda_init: GGML_CUDA_FORCE_CUBLAS: no
ggml_cuda_init: found 1 CUDA devices:
Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
qwen2 14B Q5_K - Medium 9.78 GiB 14.77 B CUDA 20 pp512 735.40 ± 7.36
qwen2 14B Q5_K - Medium 9.78 GiB 14.77 B CUDA 20 tg1000 5.74 ± 0.12
qwen2 14B Q5_K - Medium 9.78 GiB 14.77 B CUDA 25 pp512 829.91 ± 7.98
qwen2 14B Q5_K - Medium 9.78 GiB 14.77 B CUDA 25 tg1000 6.77 ± 0.16
^C

DeepSeek-R1-Distill-Qwen-32B

320만개 파라미터를 가진 Deepssek 와 Qwen-32B 를 distill 한 버전이다.

  • unsloth/DeepSeek-R1-Distill-Qwen-32B-Q3
  • unsloth/DeepSeek-R1-Distill-Qwen-32B-Q2

DeepSeek-R1-Distill-Qwen-32B-Q3_K_M.gguf

1
$ llama-bench -m unsloth/DeepSeek-R1-Distill-Qwen-32B-Q3_K_M.gguf -ngl 27,30,33,35 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
qwen2 32B Q3_K - Medium 14.84 GiB 32.76 B CUDA 27 pp512 392.53 ± 2.94
qwen2 32B Q3_K - Medium 14.84 GiB 32.76 B CUDA 27 tg1000 3.76 ± 0.02
qwen2 32B Q3_K - Medium 14.84 GiB 32.76 B CUDA 30 pp512 411.41 ± 4.29
qwen2 32B Q3_K - Medium 14.84 GiB 32.76 B CUDA 30 tg1000 4.04 ± 0.02
qwen2 32B Q3_K - Medium 14.84 GiB 32.76 B CUDA 33 pp512 362.17 ± 93.15
qwen2 32B Q3_K - Medium 14.84 GiB 32.76 B CUDA 33 tg1000 4.11 ± 0.01
qwen2 32B Q3_K - Medium 14.84 GiB 32.76 B CUDA 35 pp512 427.65 ± 24.95
qwen2 32B Q3_K - Medium 14.84 GiB 32.76 B CUDA 35 tg1000 4.44 ± 0.05

정리

  • 8B 모델 대비 확실히 1/10로 반응시간이 느려졌다. 그래서 실행해서 프롬프트 테스트하기 버겁다.
  • ngl 당 걸린 시간이 너무 오래 걸린다. 측정을 못했지만 20분 이상 걸리는 것 같다.

DeepSeek-R1-Distill-Qwen-32B-Q2_K.gguf

1
$ llama-bench -m DeepSeek_R1_Distill/unsloth/DeepSeek-R1-Distill-Qwen-32B-Q2_K.gguf -ngl 25,28,30,33,35 -n 1000

Device 0: NVIDIA GeForce RTX 3080 Ti, compute capability 8.6, VMM: yes

model size params backend ngl test t/s
qwen2 32B Q2_K - Medium 11.46 GiB 32.76 B CUDA 25 pp512 360.50 ± 104.74
qwen2 32B Q2_K - Medium 11.46 GiB 32.76 B CUDA 25 tg1000 4.49 ± 0.07
qwen2 32B Q2_K - Medium 11.46 GiB 32.76 B CUDA 28 pp512 422.67 ± 6.60
qwen2 32B Q2_K - Medium 11.46 GiB 32.76 B CUDA 28 tg1000 4.83 ± 0.03
qwen2 32B Q2_K - Medium 11.46 GiB 32.76 B CUDA 30 pp512 466.25 ± 3.99

정리

  1. 320만개 파라미터는 RTX3080TI 에서 무리이다.
  2. 80만개 파라미터를 가진 모델은 돌릴만 하다.

RTX 3080Ti 에서 적절한 ngl 표.

model size params backend ngl test t/s
llama3-Korean-Bllossom-8B-Q4_K 4.58 GiB 8.03 B CUDA 40 pp512 3483.66 ± 259.95
llama3-Korean-Bllossom-8B-Q4_K 4.58 GiB 8.03 B CUDA 40 tg1000 89.85 ± 2.06
llama-3.1-korean-reasoning-8b-instruct-q8_0 7.95 GiB 8.03 B CUDA 35 pp512 3733.38 ± 187.10
llama-3.1-korean-reasoning-8b-instruct-q8_0 7.95 GiB 8.03 B CUDA 35 tg1000 73.87 ± 3.13