윈디하나의 누리사랑방. 이런 저런 얘기

글쓴시간
분류 문화,취미
DeepSeek R1 로컬에서 실행

딥 시크 R1 을 Python vLLM 을 사용해 로컬에서 실행해 보았다. DeepSeek-R1-Distill-Qwen-1.5B 모델을 사용했는데, 이 모델은 DeepSeek R1 에서 Distill 된 모델중 가장 작은 모델로, 수학 모델이다. 한글을 잘 인식하질 못해서 영어로 질문했다. 인터넷에서 영문 수학 문제를 검색해 문의해보았다.

인터넷을 찾아보면 한글 지원하는 모델도 쉽게 구할 수 있고, 7B 모델만 되어도 한글 잘 인식한다고 한다. 하지만 필자의 사양에서는 못 돌린다. 그래서 INT8 으로 양자화된 모델을 찾고 있기도 하다.

서버 사양은 Ubuntu 22.04, i7-7700K, 32GB, RTX 2060 12G 이다. 아래와 같이 실행했다.

$ mkdir DeepSeek-R1-Distill-Qwen-1.5B
$ cd DeepSeek-R1-Distill-Qwen-1.5B
$ python3 -m venv venv
$ . venv/bin/activate
(venv) $ pip install vllm
(venv) $ vi run.py
from vllm import LLM, SamplingParams

llm = LLM(
    model="deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B",
    dtype="half",
    max_model_len=8_000
)

sampling_params = SamplingParams(
    temperature=0.5,
    max_tokens=8_000
)

prompts = [
    """The day before yesterday I was 25. The next year I will be 28. This is true only one day in a year. What day is my Birthday?"""
]

conversations = [
    [{"role": "user", "content": x}] for x in prompts
]

outputs = llm.chat(conversations, sampling_params=sampling_params)

for output in outputs:
    print(output.outputs[0].text)
(venv) $ python run.py

실행 결과는 아래와 같다. 보기좋게 편집되어있다. 질문은 생일을 맞추는 문제인데, "2일 전에는 25살, 내년에는 28살"일 때 생일을 묻는 문제로, 생일은 12월 31일이다. 정확하게 맞췄다. 약 25초 정도 걸렸다. VRAM 사용량은 약 9.5GB 정도 된다. (nvidia-smi 으로 측정)

(venv) $ python run.py
INFO 02-00 18:51:00 __init__.py:183] Automatically detected platform cuda.
WARNING 02-00 18:51:02 config.py:2368] Casting torch.bfloat16 to torch.float16.
INFO 02-00 18:51:07 config.py:526] This model supports multiple tasks: ...
INFO 02-00 18:51:07 llm_engine.py:232] Initializing a V0 LLM engine (v0.7.1) ...
INFO 02-00 18:51:08 cuda.py:184] Cannot use FlashAttention-2 backend for Volta and Turing GPUs.
INFO 02-00 18:51:08 cuda.py:232] Using XFormers backend.
INFO 02-00 18:51:09 model_runner.py:1111] Starting to load model
deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B...
INFO 02-00 18:51:09 weight_utils.py:251] Using model weights format ['*.safetensors']
INFO 02-00 18:51:10 weight_utils.py:296] No model.safetensors.index.json found in remote.
Loading safetensors checkpoint shards: 0% Completed | 0/1 [00:00<?, ?it/s]
Loading safetensors checkpoint shards: 100% Completed | 1/1 [00:00<00:00, 1.06it/s]
Loading safetensors checkpoint shards: 100% Completed | 1/1 [00:00<00:00, 1.06it/s]

INFO 02-00 18:51:11 model_runner.py:1116] Loading model weights took 3.3460 GB
INFO 02-00 18:51:12 worker.py:266] Memory profiling takes 1.05 seconds
INFO 02-00 18:51:12 worker.py:266] the current vLLM instance can use
total_gpu_memory (11.55GiB) x gpu_memory_utilization (0.90) = 10.40GiB
INFO 02-00 18:51:12 worker.py:266] model weights take 3.35GiB;
non_torch_memory takes 0.04GiB; PyTorch activation peak memory takes 1.41GiB;
the rest of the memory reserved for KV Cache is 5.60GiB.
INFO 02-00 18:51:12 executor_base.py:108] # CUDA blocks: 13097, # CPU blocks: 9362
INFO 02-00 18:51:12 executor_base.py:113] Maximum concurrency for 8000 tokens per request: 26.19x
INFO 02-00 18:51:14 model_runner.py:1435] Capturing cudagraphs for decoding.
This may lead to unexpected consequences if the model is not static.
To run the model in eager mode, set 'enforce_eager=True' or use '--enforce-eager' in the CLI.
If out-of-memory error occurs during cudagraph capture,
consider decreasing `gpu_memory_utilization` or switching to eager mode.
You can also reduce the `max_num_seqs` as needed to decrease memory usage.
Capturing CUDA graph shapes: 100%|█████████████| 35/35 [00:09<00:00, 3.63it/s]
INFO 02-00 18:51:24 model_runner.py:1563] Graph capturing finished in 10 secs, took 0.19 GiB
INFO 02-00 18:51:24 llm_engine.py:429] init engine (profile, create kv cache, warmup model)
took 13.48 seconds
INFO 02-00 18:51:24 chat_utils.py:330] Detected the chat template content format to be 'string'.
You can set `--chat-template-content-format` to override this.
Processed prompts: 100%|███████████████████████
[00:04<00:00, 4.14s/it, est. speed input: 9.66 toks/s, output: 81.16 toks/s]
<think>
To determine the day of the birthday, I start by analyzing the information given.

First, it's stated that the day before yesterday, the person was 25.
This means that yesterday was the birthday day, and today is the day after birthday.

Next, it's mentioned that the next year, the person will be 28.
This implies that the current age is 25 plus 1, which is 26.

Since the person will be 28 in the next year, their birthday must be on December 31st.
This is because the next year's birthday will occur on the same date,
and the age will increase by one year.

Therefore, the birthday is December 31st.
</think>

To determine the day of your birthday, let's analyze the information step by step:

1. **Day Before Yesterday:**
- You were **25** years old the day before yesterday.
- This means **yesterday** was your birthday day.

2. **Next Year:**
- You will be **28** years old in the next year.
- If you are currently 26 years old, your birthday will be on **December 31st** because:
- **Today** is **December 31st**.
- **Tomorrow** will be **January 1st**, and you'll turn **27**.
- **Next Year** (two years from now) you'll be **28** years old.

**Conclusion:**

Your birthday is on **\boxed{December 31st}**.

Think 태그에 보면 사고의 흐름을 볼 수 있다. 이런게 나오긴 한다 정도로 생각하면 된다. 정답은 맞췄지만 논리적 사고를 한다기 보다는 문장의 흐름, 패턴을 검색해 유추한다고 생각한다.