# Grok 2

您现在可以运行 **Grok 2** （又名 Grok 2.5），由 xAI 提供的 2700 亿参数模型。全精度需要 **539GB**，而 Unsloth 的动态 3 位版本将大小缩减到仅 **118GB** （减少 75%）。GGUF： [Grok-2-GGUF](https://huggingface.co/unsloth/grok-2-GGUF)

最新的 **3 位 Q3\_K\_XL** 模型可在单台 **128GB Mac** 或 **24GB 显存 + 128GB 内存**上运行，能达到 **每秒 5+ 令牌** 的推理速度。感谢 llama.cpp 团队和社区 [对 Grok 2 的支持](https://github.com/ggml-org/llama.cpp/pull/15539) 并使这成为可能。我们也很高兴在此过程中能略尽绵力！

所有上传均使用 Unsloth [Dynamic 2.0](https://unsloth.ai/docs/zh/ji-chu/unsloth-dynamic-2.0-ggufs) 在 SOTA 的 5-shot MMLU 和 KL 散度性能上表现优异，这意味着您可以以极小的精度损失运行量化的 Grok 语言模型。

<a href="#run-in-llama.cpp" class="button secondary">在 llama.cpp 中运行 教程</a>

## :gear: 推荐设置

该 3 位动态量化占用 118GB（126GiB）磁盘空间——这在 128GB 内存的统一内存 Mac 或 1x24GB 显卡加 128GB 内存的配置中运行良好。建议至少有 120GB 内存以运行此 3 位量化模型。

{% hint style="warning" %}
您必须使用 `--jinja` 用于 Grok 2。如果不使用，您可能会得到不正确的结果 `--jinja`
{% endhint %}

8 位量化大约为 \~300GB，可适配单卡 80GB（将 MoE 层卸载到内存）的 GPU。如果同时有额外 200GB 内存，使用该配置预计可达到约每秒 5 令牌。要了解如何提高生成速度并适应更长上下文， [在此阅读](#improving-generation-speed).

{% hint style="info" %}
尽管不是必须，但为了最佳性能，请确保您的显存 + 内存之和等于您下载的量化模型的大小。如果不够，llama.cpp 的硬盘/SSD 卸载功能也可工作，但推理会更慢。
{% endhint %}

### 采样参数

* Grok 2 的最大上下文长度为 128K，因此请使用 `131,072` 上下文或更少。
* 使用 `--jinja` 针对 llama.cpp 变体

没有官方的模型采样参数，因此对于大多数模型可以使用标准默认值：

* 设置 <mark style="background-color:green;">**temperature = 1.0**</mark>
* <mark style="background-color:green;">**Min\_P = 0.01**</mark> （可选，但 0.01 效果良好，llama.cpp 的默认值是 0.1）

## 运行 Grok 2 教程：

目前您只能在 llama.cpp 中运行 Grok 2。

### ✨ 在 llama.cpp 中运行

{% stepper %}
{% step %}
安装指定的 `llama.cpp` 用于 Grok 2 的 PR 在 [此处的 GitHub](https://github.com/ggml-org/llama.cpp/pull/15539)。您也可以按照下面的构建说明进行。若 `-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
cd llama.cpp && git fetch origin pull/15539/head:MASTER && git checkout MASTER && cd ..
cmake llama.cpp -B llama.cpp/build \
    -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON
cmake --build llama.cpp/build --config Release -j --clean-first --target llama-quantize llama-cli llama-gguf-split llama-mtmd-cli llama-server
cp llama.cpp/build/bin/llama-* llama.cpp
```

{% endstep %}

{% step %}
如果您想直接使用 `llama.cpp` 直接加载模型，您可以执行下面操作：（:Q3\_K\_XL）是量化类型。您也可以通过 Hugging Face 下载（第 3 点）。这类似于 `ollama run` 类似。使用 `export LLAMA_CACHE="folder"` 来强制 `llama.cpp` 将模型保存到指定位置。请记住该模型最大上下文长度仅为 128K。

{% hint style="info" %}
请试用 `-ot ".ffn_.*_exps.=CPU"` 将所有 MoE 层卸载到 CPU！这实际上允许您将所有非 MoE 层放在一块 GPU 上，从而提高生成速度。如果您有更多 GPU 容量，可以自定义正则表达式以卸载更多层。

如果你有稍多的 GPU 内存，尝试 `-ot ".ffn_(up|down)_exps.=CPU"` 这会卸载上投影和下投影的 MoE 层。

尝试 `-ot ".ffn_(up)_exps.=CPU"` 如果你有更多的 GPU 内存。这只会卸载上投影的 MoE 层。

最后通过卸载所有层来做： `-ot ".ffn_.*_exps.=CPU"` 这使用最少的 VRAM。

你也可以自定义正则表达式，例如 `-ot "\.(6|7|8|9|[0-9][0-9]|[0-9][0-9][0-9])\.ffn_(gate|up|down)_exps.=CPU"` 表示从第 6 层起卸载 gate、up 和 down 的 MoE 层。
{% endhint %}

```bash
export LLAMA_CACHE="unsloth/grok-2-GGUF"
./llama.cpp/llama-cli \
    -hf unsloth/grok-2-GGUF:Q3_K_XL \
    --jinja \
    --n-gpu-layers 99 \
    --temp 1.0 \
    --top-p 0.95 \
    --min-p 0.01 \
    --ctx-size 16384 \
    --seed 3407 \
    -ot ".ffn_.*_exps.=CPU"
```

{% endstep %}

{% step %}
通过以下方式下载模型（在安装 `pip install huggingface_hub hf_transfer` 之后）。您可以选择 `UD-Q3_K_XL` （动态 3 位量化）或其他量化版本，例如 `Q4_K_M` 。我们 <mark style="background-color:green;">**建议使用我们的 2.7bit 动态量化**</mark><mark style="background-color:green;">**&#x20;**</mark><mark style="background-color:green;">**`UD-Q2_K_XL`**</mark><mark style="background-color:green;">**&#x20;**</mark><mark style="background-color:green;">**或以上以在大小与精度之间取得平衡**</mark>.

```python
# !pip install huggingface_hub hf_transfer
import os
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "0" # 有时会有限速，因此设为 0 以禁用
from huggingface_hub import snapshot_download
snapshot_download(
    repo_id = "unsloth/grok-2-GGUF",
    local_dir = "unsloth/grok-2-GGUF",
    allow_patterns = ["*UD-Q3_K_XL*"], # 动态 3 位
)
```

{% endstep %}

{% step %}
您可以编辑 `--threads 32` 用于设置 CPU 线程数， `--ctx-size 16384` 用于上下文长度， `--n-gpu-layers 2` 用于指定将多少层卸载到 GPU。若 GPU 出现内存不足，请尝试调整它。若仅使用 CPU 推理，请移除此项。

{% code overflow="wrap" %}

```bash
./llama.cpp/llama-cli \
    --model unsloth/grok-2-GGUF/UD-Q3_K_XL/grok-2-UD-Q3_K_XL-00001-of-00003.gguf \
    --jinja \
    --threads -1 \
    --n-gpu-layers 99 \
    --temp 1.0 \
    --top_p 0.95 \
    --min_p 0.01 \
    --ctx-size 16384 \
    --seed 3407 \
    -ot ".ffn_.*_exps.=CPU"
```

{% endcode %}
{% endstep %}
{% endstepper %}

## 模型上传

**我们所有的上传** ——包括那些不是基于 imatrix 或动态的，都使用我们的校准数据集，该数据集专门针对对话、编码和语言任务进行了优化。

| MoE 位数 | 类型 + 链接                                                                             | 磁盘大小        | 详情            |
| ------ | ----------------------------------------------------------------------------------- | ----------- | ------------- |
| 1.66 位 | [TQ1\_0](https://huggingface.co/unsloth/grok-2-GGUF/blob/main/grok-2-UD-TQ1_0.gguf) | **81.8 GB** | 1.92/1.56 位   |
| 1.78 位 | [IQ1\_S](https://huggingface.co/unsloth/grok-2-GGUF/tree/main/UD-IQ1_S)             | **88.9 GB** | 2.06/1.56 位   |
| 1.93 位 | [IQ1\_M](https://huggingface.co/unsloth/grok-2-GGUF/tree/main/UD-IQ1_M)             | **94.5 GB** | 2.5/2.06/1.56 |
| 2.42 位 | [IQ2\_XXS](https://huggingface.co/unsloth/grok-2-GGUF/tree/main/UD-IQ2_XXS)         | **99.3 GB** | 2.5/2.06 位    |
| 2.71 位 | [Q2\_K\_XL](https://huggingface.co/unsloth/grok-2-GGUF/tree/main/UD-Q2_K_XL)        | **112 GB**  | 3.5/2.5 位     |
| 3.12 位 | [IQ3\_XXS](https://huggingface.co/unsloth/grok-2-GGUF/tree/main/UD-IQ3_XXS)         | **117 GB**  | 3.5/2.06 位    |
| 3.5 位  | [Q3\_K\_XL](https://huggingface.co/unsloth/grok-2-GGUF/tree/main/UD-Q3_K_XL)        | **126 GB**  | 4.5/3.5 位     |
| 4.5 位  | [Q4\_K\_XL](https://huggingface.co/unsloth/grok-2-GGUF/tree/main/UD-Q4_K_XL)        | **155 GB**  | 5.5/4.5 位     |
| 5.5 位  | [Q5\_K\_XL](https://huggingface.co/unsloth/grok-2-GGUF/tree/main/UD-Q5_K_XL)        | **191 GB**  | 6.5/5.5 位     |

## :snowboarder: "content": \[{"type": "text", "text": "用 Python 创建一个 Fibonacci 函数并求 fib(20)。"}],

如果你有更多显存，可以尝试卸载更多 MoE 层，或将整个层本身卸载（offload）。

通常， `-ot ".ffn_.*_exps.=CPU"` 会将所有 MoE 层卸载到 CPU！这实际上允许你将所有非 MoE 层放在一块 GPU 上，从而提高生成速度。如果你有更多 GPU 容量，可以自定义正则表达式以适配更多层。

如果你有稍多的 GPU 内存，尝试 `-ot ".ffn_(up|down)_exps.=CPU"` 这会卸载上投影和下投影的 MoE 层。

尝试 `-ot ".ffn_(up)_exps.=CPU"` 如果你有更多的 GPU 内存。这只会卸载上投影的 MoE 层。

你也可以自定义正则表达式，例如 `-ot "\.(6|7|8|9|[0-9][0-9]|[0-9][0-9][0-9])\.ffn_(gate|up|down)_exps.=CPU"` 表示从第 6 层起卸载 gate、up 和 down 的 MoE 层。

最新的 [llama.cpp 版本](https://github.com/ggml-org/llama.cpp/pull/14363) 还引入了高吞吐量模式。使用 `llama-parallel`。在此处阅读更多内容 [这里](https://github.com/ggml-org/llama.cpp/tree/master/examples/parallel)。你也可以 **例如将 KV 缓存量化为 4 bit** 将 KV 缓存量化为 4 位

## 例如以减少 VRAM / RAM 数据移动，这也可能使生成过程更快。

要适配更长的上下文，你可以使用 **KV 缓存量化** 将 K 和 V 缓存量化到更低位数。这也可以由于减少 RAM / VRAM 数据移动而提高生成速度。K 量化的可用选项（默认是 `f16`）包括下列项。

`--cache-type-k f32, f16, bf16, q8_0, q4_0, q4_1, iq4_nl, q5_0, q5_1`

你应当使用那些 `_1` 变体以获得稍高的准确性，尽管速度会略慢。例如 `q4_1, q5_1`

你也可以对 V 缓存进行量化，但你需要 **在编译 llama.cpp 时启用 Flash Attention 支持** 通过 `-DGGML_CUDA_FA_ALL_QUANTS=ON`，并使用 `--flash-attn` --flash-attn `来启用它。然后您可以与` :

`--cache-type-k 一起使用 --cache-type-v f32, f16, bf16, q8_0, q4_0, q4_1, iq4_nl, q5_0, q5_1`
