# QwQ-32B: 効果的な実行方法

Qwen は QwQ-32B をリリースしました。これは多くの [ベンチマーク](https://qwenlm.github.io/blog/qwq-32b/)で DeepSeek-R1 に匹敵する性能を持つ推論モデルです。しかし、人々は **無限生成**, **大量の繰り返し**、\<think> トークンの問題やファインチューニングの問題を経験しています。このガイドが、ほとんどの問題のデバッグと修正に役立つことを願っています！

{% hint style="info" %}
私たちの修正を含むモデルアップロードは、ファインチューニング、vLLM、Transformers でうまく動作します。llama.cpp や llama.cpp をバックエンドとして使うエンジンを使用している場合は、無限生成を修正するためにこちらの [手順に従ってください](#tutorial-how-to-run-qwq-32b) 。
{% endhint %}

**私たちの修正を含む Unsloth の QwQ-32B アップロード：**

| [GGUF](https://huggingface.co/unsloth/QwQ-32B-GGUF) | [ダイナミック 4-bit](https://huggingface.co/unsloth/QwQ-32B-unsloth-bnb-4bit) | [BnB 4-bit](https://huggingface.co/unsloth/QwQ-32B-bnb-4bit) | [16-bit](https://huggingface.co/unsloth/QwQ-32B) |
| --------------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------ |

## :gear: 公式推奨設定

によると [Qwen](https://huggingface.co/Qwen/QwQ-32B)、推論に推奨される設定は以下のとおりです：

* Temperature 0.6
* Top\_K を 40 に設定（または 20 から 40）
* Min\_P 0.00（任意ですが、0.01 でもうまく動作します。llama.cpp のデフォルトは 0.1 です）
* Top\_P 0.95
* Repetition Penalty 1.0。（1.0は llama.cpp と transformers では無効を意味します）
* チャットテンプレート： `<|im_start|>user\nPython で Flappy Bird ゲームを作成してください。<|im_end|>\n<|im_start|>assistant\n<think>\n`

{% hint style="warning" %}
`llama.cpp` は `min_p = 0.1`がデフォルトで、問題を引き起こす可能性があります。0.0 に強制してください。
{% endhint %}

## :thumbsup: llama.cpp に推奨される設定

多くの人が `繰り返しペナルティ` を 1.0 より大きく設定していることに気づきました。たとえば 1.1 から 1.5 です。これは実際には llama.cpp のサンプリング機構に干渉します。繰り返しペナルティの目的は、繰り返し生成を罰することですが、これが期待どおりには機能しないことが分かりました。

をオフにする `繰り返しペナルティ` のも有効です（つまり 1.0 に設定することです）が、無限生成を抑制するために使うのは有用だと分かりました。

これを使うには、適用前に llama.cpp のサンプラーの順序も編集する必要があることが分かりました `繰り返しペナルティ`。そうしないと無限生成が起こります。なので、これを追加してください：

```bash
--samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc"
```

デフォルトでは、llama.cpp は次の順序を使います：

```bash
--samplers "dry;top_k;typ_p;top_p;min_p;xtc;temperature"
```

実質的に temperature と dry の順序を入れ替え、min\_p を前方へ移動します。つまり、次の順序でサンプラーを適用します：

```bash
top_k=40
top_p=0.95
min_p=0.0
temperature=0.6
dry
typ_p
xtc
```

それでも問題が続く場合は、`--repeat-penalty 1.0 を 1.2 または 1.3 に上げてみてください。`

ご助力に感謝します [@krist486](https://x.com/krist486/status/1897885598196654180) llama.cpp のサンプリングの手順について教えてくれたことに感謝します。

## :sunny: Dry 繰り返しペナルティ

私たちは `dry penalty` の使用を調査しました。 <https://github.com/ggml-org/llama.cpp/blob/master/examples/main/README.md> で提案されているように 0.8 を使ってみましたが、実際にはこれが **特にコーディングで構文の問題を引き起こすことが分かりました**。それでも問題が続く場合は、`dry penalty を 0.8 に上げてください。`

サンプリング順序を入れ替える私たちの方法も、 `dry penalty`.

## :llama: チュートリアル: QwQ-32B を Ollama で実行する方法

1. インストール `ollama` まだなら、

```bash
apt-get update
apt-get install pciutils -y
curl -fsSL https://ollama.com/install.sh | sh
```

2. モデルを実行してください！失敗した場合は別のターミナルから `ollama serve`を呼び出せます。私たちの修正と推奨パラメータ（temperature、min\_p など）は `param` に含まれています！

```bash
ollama run hf.co/unsloth/QwQ-32B-GGUF:Q4_K_M
```

## 📖 チュートリアル: QwQ-32B を llama.cpp で実行する方法

1. 最新の `llama.cpp` を [GitHub こちら](https://github.com/ggml-org/llama.cpp)から取得してください。以下のビルド手順に従うこともできます。 `-DGGML_CUDA=ON` を `-DGGML_CUDA=OFF` に変更してください。GPU がない場合、または CPU 推論だけを使いたい場合です。 **Apple Mac / Metal デバイスの場合**、次を設定して `-DGGML_CUDA=OFF` その後は通常どおり続けてください - Metal サポートは既定で有効です。

```bash
apt-get update
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
git clone https://github.com/ggml-org/llama.cpp
cmake llama.cpp -B llama.cpp/build \\
    -DBUILD_SHARED_LIBS=ON -DGGML_CUDA=ON -DLLAMA_CURL=ON
cmake --build llama.cpp/build --config Release -j --clean-first --target llama-quantize llama-cli llama-gguf-split
cp llama.cpp/build/bin/llama-* llama.cpp
```

2. モデルのダウンロード（ `pip install huggingface_hub hf_transfer` ）。Q4\_K\_M、または他の量子化版（たとえばBF16のフル精度）を選べます。その他の版はこちら： <https://huggingface.co/unsloth/QwQ-32B-GGUF>

```python
# !pip install huggingface_hub hf_transfer
import os
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"
from huggingface_hub import snapshot_download
snapshot_download(
    repo_id = "unsloth/QwQ-32B-GGUF",
    local_dir = "unsloth-QwQ-32B-GGUF",
    allow_patterns = ["*Q4_K_M*"], # Q4_K_M 用
)
```

3. Unsloth の Flappy Bird テストを実行すると、出力は `Q4_K_M_yes_samplers.txt`
4. 編集 `--threads 32` CPU スレッド数を `--ctx-size 16384` コンテキスト長を `--n-gpu-layers 99` GPU オフロードする層数を指定します。GPU のメモリ不足になる場合は調整してみてください。CPU のみで推論する場合は、これも削除してください。
5. に保存されます `--repeat-penalty 1.1` および `--dry-multiplier 0.5` を使用しています。これは調整可能です。

```bash
./llama.cpp/llama-cli \\
    --model unsloth-QwQ-32B-GGUF/QwQ-32B-Q4_K_M.gguf \
    --threads 32 \\
    --ctx-size 16384 \\
    --n-gpu-layers 99 \\
    --seed 3407 \\
    --prio 2 \\
    --temp 0.6 \\
    --repeat-penalty 1.1 \
    --dry-multiplier 0.5 \
    --min-p 0.01 \\
    --top-k 40 \
    --top-p 0.95 \
    -no-cnv \\
    --samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc" \
    --prompt "<|im_start|>user\nPython で Flappy Bird ゲームを作成してください。以下を必ず含めてください:\n1. pygame を使用すること。\n2. 背景色はランダムに選ばれた明るい色にすること。最初は薄い青色から始めること。\n3. SPACE を複数回押すと鳥が加速すること。\n4. 鳥の形は四角、円、三角形のいずれかからランダムに選ぶこと。色は暗い色からランダムに選ぶこと。\n5. 下部に、暗い茶色または黄色からランダムに選ばれた色の地面を置くこと。\n6. 右上にスコアを表示すること。パイプを通過して当たらなければ加算すること。\n7. 十分な間隔を空けたパイプをランダムに配置すること。色は暗い緑、薄い茶色、または暗い灰色からランダムにすること。\n8. 負けたらベストスコアを表示すること。テキストは画面内に収めること。q または Esc を押すとゲームを終了すること。再開は SPACE を再度押すこと。\n最終的なゲームは Python のマークダウンセクション内に入れてください。最終的なマークダウンセクションの前に、コードのエラーを確認して修正してください。<|im_end|>\n<|im_start|>assistant\n<think>\n"  \
        2>&1 | tee Q4_K_M_yes_samplers.txt
```

私たちの <https://unsloth.ai/blog/deepseekr1-dynamic> 1.58bitブログからの全文入力は次のとおりです:

```
<|im_start|>user
Python で Flappy Bird ゲームを作成してください。以下を必ず含めてください:
1. pygame を使うこと。
2. 背景色はランダムに選び、明るい色にすること。最初は薄い青にしてください。
3. SPACE を何度も押すと鳥が加速すること。
4. 鳥の形は四角、円、三角形のいずれかからランダムに選ぶこと。色は暗い色からランダムに選ぶこと。
5. 画面下部に、濃い茶色または黄色からランダムに選んだ色の地面を配置すること。
6. 右上にスコアを表示すること。パイプを通過して当たらなければ加点すること。
7. 十分な間隔を空けてランダムな位置にパイプを配置すること。色は濃い緑、薄い茶色、または濃い灰色からランダムにすること。
8. 失敗したらベストスコアを表示すること。テキストは画面内に収めること。q または Esc を押すとゲームを終了し、SPACE をもう一度押すと再開すること。
最終的なゲームは Python のマークダウンセクション内に入れてください。最終的なマークダウンセクションの前に、コードのエラーを確認して修正してください。<|im_end|>
<|im_start|>assistant
<think>
```

思考部分を削除した後の最終的な Python 出力の冒頭と末尾：

```python
import pygame
import random
import sys

pygame.init()
### 続き

class Bird:
    def __init__(self):
        ### 続き

def main():
    best_score = 0
    current_score = 0
    game_over = False
    pipes = []
    first_time = True  # 最初のゲームプレイを追跡

    # 初期設定
    background_color = (173, 216, 230)  # 最初は薄い青
    land_color = random.choice(land_colors)
    bird = Bird()

    while True:
        for event in pygame.event.get():
            ### 続き

        if not game_over:
            # 鳥とパイプを更新
            bird.update()
            ### 続き

        # 描画
        ### 続き
        pygame.display.flip()
        clock.tick(60)

if __name__ == "__main__":
    main()
```

<details>

<summary>完全な最終 Python 出力（思考部分を削除）：</summary>

{% code fullWidth="false" %}

```python
import pygame
import random
import sys

pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Flappy Bird Clone")
clock = pygame.time.Clock()

# 色
pipe_colors = [(0, 100, 0), (210, 180, 140), (50, 50, 50)]
land_colors = [(139, 69, 19), (255, 255, 0)]

# ゲーム定数
GRAVITY = 0.5
PIPE_SPEED = 5
BIRD_SIZE = 30
LAND_HEIGHT = 50
PIPE_WIDTH = 50
PIPE_GAP = 150

class Bird:
    def __init__(self):
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.velocity = 0
        self.shape = random.choice(['square', 'circle', 'triangle'])
        self.color = (random.randint(0, 100), random.randint(0, 100), random.randint(0, 100))
        self.rect = pygame.Rect(self.x - BIRD_SIZE//2, self.y - BIRD_SIZE//2, BIRD_SIZE, BIRD_SIZE)
    
    def update(self):
        self.velocity += GRAVITY
        self.y += self.velocity
        self.rect.y = self.y - BIRD_SIZE//2
        self.rect.x = self.x - BIRD_SIZE//2  # x を中央に保つ
    
    def draw(self):
        if self.shape == 'square':
            pygame.draw.rect(screen, self.color, self.rect)
        elif self.shape == 'circle':
            pygame.draw.circle(screen, self.color, (self.rect.centerx, self.rect.centery), BIRD_SIZE//2)
        elif self.shape == 'triangle':
            points = [
                (self.rect.centerx, self.rect.top),
                (self.rect.left, self.rect.bottom),
                (self.rect.right, self.rect.bottom)
            ]
            pygame.draw.polygon(screen, self.color, points)

def spawn_pipe():
    pipe_x = WIDTH
    top_height = random.randint(50, HEIGHT - PIPE_GAP - LAND_HEIGHT)
    rect_top = pygame.Rect(pipe_x, 0, PIPE_WIDTH, top_height)
    bottom_y = top_height + PIPE_GAP
    bottom_height = (HEIGHT - LAND_HEIGHT) - bottom_y
    rect_bottom = pygame.Rect(pipe_x, bottom_y, PIPE_WIDTH, bottom_height)
    color = random.choice(pipe_colors)
    return {
        'rect_top': rect_top,
        'rect_bottom': rect_bottom,
        'color': color,
        'scored': False
    }

def main():
    best_score = 0
    current_score = 0
    game_over = False
    pipes = []
    first_time = True  # 最初のゲームプレイを追跡

    # 初期設定
    background_color = (173, 216, 230)  # 最初は薄い青
    land_color = random.choice(land_colors)
    bird = Bird()

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE or event.key == pygame.K_q:
                    pygame.quit()
                    sys.exit()
                if event.key == pygame.K_SPACE:
                    if game_over:
                        # ゲームをリセット
                        bird = Bird()
                        pipes.clear()
                        current_score = 0
                        if first_time:
                            # 初回のゲームオーバー後の再開
                            background_color = (random.randint(200, 255), random.randint(200, 255), random.randint(200, 255))
                            first_time = False
                        else:
                            background_color = (random.randint(200, 255), random.randint(200, 255), random.randint(200, 255))
                        land_color = random.choice(land_colors)
                        game_over = False
                    else:
                        # 鳥をジャンプさせる
                        bird.velocity = -15  # 初期上向き速度

        if not game_over:
            # 鳥とパイプを更新
            bird.update()

            # パイプを左へ移動
            remove_pipes = []
            for pipe in pipes:
                pipe['rect_top'].x -= PIPE_SPEED
                pipe['rect_bottom'].x -= PIPE_SPEED
                # 鳥がパイプを通過したか確認
                if not pipe['scored'] and bird.rect.x > pipe['rect_top'].right:
                    current_score += 1
                    pipe['scored'] = True
                # パイプが画面外か確認
                if pipe['rect_top'].right < 0:
                    remove_pipes.append(pipe)
            # 画面外のパイプを削除
            for p in remove_pipes:
                pipes.remove(p)

            # 必要なら新しいパイプを生成
            if not pipes or pipes[-1]['rect_top'].x < WIDTH - 200:
                pipes.append(spawn_pipe())

            # 衝突を確認
            land_rect = pygame.Rect(0, HEIGHT - LAND_HEIGHT, WIDTH, LAND_HEIGHT)
            bird_rect = bird.rect
            # パイプを確認
            for pipe in pipes:
                if bird_rect.colliderect(pipe['rect_top']) or bird_rect.colliderect(pipe['rect_bottom']):
                    game_over = True
                    break
            # 地面と上端を確認
            if bird_rect.bottom >= land_rect.top or bird_rect.top <= 0:
                game_over = True

            if game_over:
                if current_score > best_score:
                    best_score = current_score

        # 描画
        screen.fill(background_color)
        # パイプを描画
        for pipe in pipes:
            pygame.draw.rect(screen, pipe['color'], pipe['rect_top'])
            pygame.draw.rect(screen, pipe['color'], pipe['rect_bottom'])
        # 地面を描画
        pygame.draw.rect(screen, land_color, (0, HEIGHT - LAND_HEIGHT, WIDTH, LAND_HEIGHT))
        # 鳥を描画
        bird.draw()
        # スコアを描画
        font = pygame.font.SysFont(None, 36)
        score_text = font.render(f'Score: {current_score}', True, (0, 0, 0))
        screen.blit(score_text, (WIDTH - 150, 10))
        # ゲームオーバー画面
        if game_over:
            over_text = font.render('Game Over!', True, (255, 0, 0))
            best_text = font.render(f'Best: {best_score}', True, (255, 0, 0))
            restart_text = font.render('Press SPACE to restart', True, (255, 0, 0))
            screen.blit(over_text, (WIDTH//2 - 70, HEIGHT//2 - 30))
            screen.blit(best_text, (WIDTH//2 - 50, HEIGHT//2 + 10))
            screen.blit(restart_text, (WIDTH//2 - 100, HEIGHT//2 + 50))
        
        pygame.display.flip()
        clock.tick(60)

if __name__ == "__main__":
    main()
```

{% endcode %}

</details>

6. 実行すると、動作可能なゲームが得られます！

<figure><img src="/files/28d01ac460beca8c29821f31bbc8e5e8a275ad10" alt=""><figcaption></figcaption></figure>

7. 今度は、修正なしで同じことを試してみましょう！なので削除してください `--samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc"` これにより出力は `Q4_K_M_no_samplers.txt`

```bash
./llama.cpp/llama-cli \\
    --model unsloth-QwQ-32B-GGUF/QwQ-32B-Q4_K_M.gguf \
    --threads 32 \\
    --ctx-size 16384 \\
    --n-gpu-layers 99 \\
    --seed 3407 \\
    --prio 2 \\
    --temp 0.6 \\
    --repeat-penalty 1.1 \
    --dry-multiplier 0.5 \
    --min-p 0.01 \\
    --top-k 40 \
    --top-p 0.95 \
    -no-cnv \\
    --prompt "<|im_start|>user\nPython で Flappy Bird ゲームを作成してください。以下を必ず含めてください:\n1. pygame を使用すること。\n2. 背景色はランダムに選ばれた明るい色にすること。最初は薄い青色から始めること。\n3. SPACE を複数回押すと鳥が加速すること。\n4. 鳥の形は四角、円、三角形のいずれかからランダムに選ぶこと。色は暗い色からランダムに選ぶこと。\n5. 下部に、暗い茶色または黄色からランダムに選ばれた色の地面を置くこと。\n6. 右上にスコアを表示すること。パイプを通過して当たらなければ加算すること。\n7. 十分な間隔を空けたパイプをランダムに配置すること。色は暗い緑、薄い茶色、または暗い灰色からランダムにすること。\n8. 負けたらベストスコアを表示すること。テキストは画面内に収めること。q または Esc を押すとゲームを終了すること。再開は SPACE を再度押すこと。\n最終的なゲームは Python のマークダウンセクション内に入れてください。最終的なマークダウンセクションの前に、コードのエラーを確認して修正してください。<|im_end|>\n<|im_start|>assistant\n<think>\n"  \
        2>&1 | tee Q4_K_M_no_samplers.txt
```

いくらかループしますが、 **問題のある不正確な Python 構文** やその他多くの問題が発生します。たとえば、下のものは正しく見えますが、間違っています！つまり 39 行目 `pipes.clear() ### <<< NameError: name 'pipes' is not defined. Did you forget to import 'pipes'?`

{% code overflow="wrap" lineNumbers="true" %}

```python
import pygame
import random

pygame.init()

# 定数
WIDTH, HEIGHT = 800, 600
GROUND_HEIGHT = 20
GRAVITY = 0.7
PIPE_SPEED = -3
BIRD_SIZE = 45
MIN_GAP = 130
MAX_GAP = 200
PIPE_COLORS = [(0, 96, 0), (205, 133, 63), (89, 97, 107)]
DARK_BROWN = (94, 72, 4)
YELLOW = (252, 228, 6)

screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

def random_light_color():
    return (
        random.randint(180, 230),
        random.randint(190, 300),
        random.randint(250, 255)
    )

def reset_game():
    global bird_x, bird_y
    global pipes, score
    global background_color, land_color
    global bird_shape, bird_color

    # 鳥のプロパティ
    bird_x = WIDTH * 0.3
    bird_y = HEIGHT // 2
    bird_vel = -5  # 初期上向き推力

    pipes.clear() ### <<< NameError: name 'pipes' is not defined. Did you forget to import 'pipes'?
```

{% endcode %}

8. もし `--repeat-penalty 1.5`を使うと、さらに悪化してより明白になり、実際には完全に誤った構文になります。

```python
import pygame
from random import randint  # 色/形/位置をランダムに生成するため 
pygame.init()

# 定数:
WIDTH, HEIGHT =456 ,702   #
BACKGROUND_COLOR_LIGHTS=['lightskyblue']
GAP_SIZE=189           #

BIRD_RADIUS=3.  
PIPE_SPEED=- ( )    ? 
class Game():
def __init__(self):
        self.screen_size=( )

def reset_game_vars():
    global current_scor e
   # 0 とその他の初期状態に設定する。

# メインゲームループ:
while running :
     for event in pygame.event.get() : 
        if quit ... etc

pygame.quit()
print("コードは簡略化されています。時間制約のため、完全に動作する版にはさらなる実装が必要です。")
```

9. Q4\_K\_M だからでしょうか？B16、つまりフル精度なら問題なく動くはずですよね？ いいえ、違います。私たちの修正である -`-samplers "top_k;top_p;min_p;temperature;dry;typ_p;xtc"` を適用しないと、出力は再び失敗します。

## :sunrise\_over\_mountains: まだ動作しませんか？ Min\_p = 0.1、Temperature = 1.5 を試してください

Min\_p の論文によると <https://arxiv.org/pdf/2407.01082>、より創造的で多様な出力のために、まだ繰り返しが見える場合は top\_p と top\_k を無効にしてみてください！

```bash
./llama.cpp/llama-cli --model unsloth-QwQ-32B-GGUF/QwQ-32B-Q4_K_M.gguf \
    --threads 32 --n-gpu-layers 99 \
    --ctx-size 16384 \\
    --temp 1.5 \
    --min-p 0.1 \
    --top-k 0 \
    --top-p 1.0 \\
    -no-cnv \\
    --prompt "<|im_start|>user\nPython で Flappy Bird ゲームを作成してください。以下を必ず含めてください:\n1. pygame を使用すること。\n2. 背景色はランダムに選ばれた明るい色にすること。最初は薄い青色から始めること。\n3. SPACE を複数回押すと鳥が加速すること。\n4. 鳥の形は四角、円、三角形のいずれかからランダムに選ぶこと。色は暗い色からランダムに選ぶこと。\n5. 下部に、暗い茶色または黄色からランダムに選ばれた色の地面を置くこと。\n6. 右上にスコアを表示すること。パイプを通過して当たらなければ加算すること。\n7. 十分な間隔を空けたパイプをランダムに配置すること。色は暗い緑、薄い茶色、または暗い灰色からランダムにすること。\n8. 負けたらベストスコアを表示すること。テキストは画面内に収めること。q または Esc を押すとゲームを終了すること。再開は SPACE を再度押すこと。\n最終的なゲームは Python のマークダウンセクション内に入れてください。最終的なマークダウンセクションの前に、コードのエラーを確認して修正してください。<|im_end|>\n<|im_start|>assistant\n<think>\n"
```

別の方法として、 `min_p` を直接無効にすることもできます。llama.cpp はデフォルトで `min_p = 0.1`!

```bash
./llama.cpp/llama-cli --model unsloth-QwQ-32B-GGUF/QwQ-32B-Q4_K_M.gguf \
    --threads 32 --n-gpu-layers 99 \
    --ctx-size 16384 \\
    --temp 0.6 \\
    --min-p 0.0 \\
    --top-k 40 \
    --top-p 0.95 \
    -no-cnv \\
    --prompt "<|im_start|>user\nPython で Flappy Bird ゲームを作成してください。以下を必ず含めてください:\n1. pygame を使用すること。\n2. 背景色はランダムに選ばれた明るい色にすること。最初は薄い青色から始めること。\n3. SPACE を複数回押すと鳥が加速すること。\n4. 鳥の形は四角、円、三角形のいずれかからランダムに選ぶこと。色は暗い色からランダムに選ぶこと。\n5. 下部に、暗い茶色または黄色からランダムに選ばれた色の地面を置くこと。\n6. 右上にスコアを表示すること。パイプを通過して当たらなければ加算すること。\n7. 十分な間隔を空けたパイプをランダムに配置すること。色は暗い緑、薄い茶色、または暗い灰色からランダムにすること。\n8. 負けたらベストスコアを表示すること。テキストは画面内に収めること。q または Esc を押すとゲームを終了すること。再開は SPACE を再度押すこと。\n最終的なゲームは Python のマークダウンセクション内に入れてください。最終的なマークダウンセクションの前に、コードのエラーを確認して修正してください。<|im_end|>\n<|im_start|>assistant\n<think>\n"
```

## :thinking: \<think> トークンが表示されない？

一部の人は、チャットテンプレートに \<think> がデフォルトで追加されるため、いくつかのシステムでは思考トレースが正しく出力されないと報告しています。Jinja テンプレートを手動で次のように編集する必要があります：

{% code overflow="wrap" %}

```
```

{% endcode %}

から別のものへ、末尾の `<think>\n` を削除することで。これでモデルは推論時に手動で `<think>\n` を追加する必要がありますが、常に成功するとは限りません。DeepSeek もすべてのモデルを編集して、デフォルトで `<think>` トークンを追加し、モデルを推論モデルに入るよう強制しています。

したがって、次のように変更してください `{%- if add_generation_prompt %} {{- '<|im_start|>assistant\n<think>\n' }} {%- endif %}` を `{%- if add_generation_prompt %} {{- '<|im_start|>assistant\n' }} {%- endif %}`

つまり `<think>\n`

<details>

<summary>&#x3C;think>\n 部分を削除した完全な jinja テンプレート</summary>

{% code overflow="wrap" %}

```
```

{% endcode %}

</details>

## 追加メモ

最初は、次のように考えました：

1. QwQ のコンテキスト長はネイティブには 128K ではなく、YaRN 拡張付きの 32K なのではないかと。たとえば <https://huggingface.co/Qwen/QwQ-32B>の readme ファイルでは、次のように見えます：

```json
{
  ...,
  "rope_scaling": {
    "factor": 4.0,
    "original_max_position_embeddings": 32768,
    "type": "yarn"
  }
}
```

llama.cpp の YaRN 処理を上書きしてみましたが、何も変わりませんでした。

{% code overflow="wrap" %}

```bash
--override-kv qwen2.context_length=int:131072 \
--override-kv qwen2.rope.scaling.type=str:yarn \
--override-kv qwen2.rope.scaling.factor=float:4 \
--override-kv qwen2.rope.scaling.original_context_length=int:32768 \
--override-kv qwen2.rope.scaling.attn_factor=float:1.13862943649292 \
```

{% endcode %}

2. RMS LayerNorm の epsilon が間違っているのではないかとも考えました。1e-5 ではなく 1e-6 かもしれないと。たとえば [こちらは](https://huggingface.co/Qwen/Qwen2.5-32B-Instruct/blob/main/config.json) を持ち、 `rms_norm_eps=1e-06`、一方で [こちらは](https://huggingface.co/Qwen/Qwen2.5-32B/blob/main/config.json) を持ち、 `rms_norm_eps=1e-05` を持っています。これも上書きしましたが、うまくいきませんでした：

{% code overflow="wrap" %}

```bash
--override-kv qwen2.attention.layer_norm_rms_epsilon=float:0.000001 \
```

{% endcode %}

3. トークナイザー ID が llama.cpp と通常の Transformers で一致するかも、 [@kalomaze](https://x.com/kalomaze/status/1897875332230779138)のご助力により確認しました。一致していたので、これが原因ではありませんでした。

以下に私たちの実験結果を示します：

{% file src="/files/b5fe28d29d17241bd7317be64e53b4c82609933c" %}
サンプリング修正なしの BF16 フル精度
{% endfile %}

{% file src="/files/8eba60e84ad1a91400590f67702d1daa4f9e497c" %}
サンプリング修正ありの BF16 フル精度
{% endfile %}

{% file src="/files/587cc726e17fa4a766173ec9cdb2b86c1f6365c7" %}
サンプリング修正なしの Q4\_K\_M 精度
{% endfile %}

{% file src="/files/c208423616543304561325cbbe42e7765cc071f0" %}
サンプリング修正ありの Q4\_K\_M 精度
{% endfile %}

## :pencil2: トークナイザーのバグ修正

* ファインチューニングに特に影響するいくつかの問題も見つかりました！EOS トークンは正しいですが、PAD トークンはむしろ `"<|vision_pad|>`" にすべきだと思われます。私たちは以下で更新しました： <https://huggingface.co/unsloth/QwQ-32B/blob/main/tokenizer_config.json>

```
"eos_token": "<|im_end|>",
"pad_token": "<|endoftext|>",
```

## :tools: ダイナミック 4-bit 量子化

また、単純な 4bit 量子化より精度を向上させるダイナミック 4bit 量子化もアップロードしました！活性化量子化誤差と重み量子化誤差の両方について、QwQ の量子化誤差プロット分析を添付します：

<figure><img src="/files/6a5e63f462267e9328fa0ee744ee0803e2563886" alt=""><figcaption></figcaption></figure>

ダイナミック 4-bit 量子化を次にアップロードしました： <https://huggingface.co/unsloth/QwQ-32B-unsloth-bnb-4bit>

vLLM 0.7.3 以降（2025年2月20日） <https://github.com/vllm-project/vllm/releases/tag/v0.7.3>、vLLM は Unsloth のダイナミック 4bit 量子化の読み込みをサポートするようになりました！

すべての GGUF はこちらにあります <https://huggingface.co/unsloth/QwQ-32B-GGUF>!


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://unsloth.ai/docs/jp/moderu/tutorials/qwq-32b-how-to-run-effectively.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
