转换模型权重

要运行MLC LLM的模型,需要将模型权重转换为 MLC 格式(例如 RedPajama-INCITE-Chat-3B-v1-q4f16_1-MLC)。本页指导通过使用 mlc_llm convert_weight 添加模型变体,它接受 Hugging Face 模型作为输入,并将其转换/量化为 MLC 兼容的权重。

具体来说,添加了 RedPjama-INCITE-Instruct-3B-v1,而 MLC 已经为 RedPjama-INCITE-Chat-3B-v1 提供了模型库,可以重用这个库。

这可以扩展到例如:

  • 当 MLC 已经支持 Mistral 时,添加 OpenHermes-Mistral

  • 当 MLC 已经支持 Llama-2 时,添加 Llama-2-uncensored

备注

在继续之前,请确保你已经按照 安装 TVM Unity 编译器 的说明安装了 TVM Unity,这是使用 MLC LLM 编译模型所需的后端。

请同时按照 CLI / Python API 中的说明获取 CLI 应用程序 / Python API,以便与编译后的模型进行聊天。

0. 验证安装

步骤 1. 验证 mlc_llm

使用 Python 包 mlc_llm 来编译模型。可以通过 安装 MLC LLM Python 包 安装该包,无论是从源码构建还是安装预构建的包。可以通过以下命令在命令行中验证 mlc_llm 的安装:

$ mlc_llm --help
# You should see help information with this line
usage: MLC LLM Command Line Interface. [-h] {compile,convert_weight,gen_config}

备注

如果遇到错误提示 command not found: mlc_llm,可以尝试运行 python -m mlc_llm --help

步骤 2. 验证 TVM

要编译模型,你还需要按照 安装 TVM Unity 编译器 的说明安装 TVM Unity。这里通过命令行快速验证 tvm (完整验证请参阅 验证 TVM 安装):

$ python -c "import tvm; print(tvm.__file__)"
/some-path/lib/python3.11/site-packages/tvm/__init__.py

1. 从 Hugging Face 克隆并转换权重

你可以在 mlc-llm 仓库下,或者你自己的工作目录中操作。请注意,所有平台可以共享相同的编译/量化权重。有关 convert_weight 的详细说明,请参阅 编译命令规范

# Create directory
mkdir -p dist/models && cd dist/models
# Clone HF weights
git lfs install
git clone https://huggingface.co/togethercomputer/RedPajama-INCITE-Instruct-3B-v1
cd ../..
# Convert weight
mlc_llm convert_weight ./dist/models/RedPajama-INCITE-Instruct-3B-v1/ \
    --quantization q4f16_1 \
    -o dist/RedPajama-INCITE-Instruct-3B-v1-q4f16_1-MLC

2. 生成 MLC Chat 配置文件

使用 mlc_llm gen_config 命令生成 mlc-chat-config.json 配置文件并处理分词器。有关 gen_config 的具体说明,请参阅 编译命令规范

mlc_llm gen_config ./dist/models/RedPajama-INCITE-Instruct-3B-v1/ \
    --quantization q4f16_1 --conv-template redpajama_chat \
    -o dist/RedPajama-INCITE-Instruct-3B-v1-q4f16_1-MLC/

备注

文件 mlc-chat-config.json 在模型编译和运行时聊天中都至关重要。这里仅关注后者(运行时聊天)的情况。

你可以 选择性地 自定义 dist/RedPajama-INCITE-Instruct-3B-v1-q4f16_1-MLC/mlc-chat-config.json 文件(查看 自定义 MLC Chat 配置 获取更详细的说明)。你也可以直接使用默认配置。

conversation_template 目录包含了 MLC 提供的完整对话模板列表。如果你添加的模型需要新的对话模板,你需要自行添加。可以参考 这个 PR 作为示例。不过,添加自定义模板需要你 从源码构建 mlc_llm,以便运行时能够识别它。

至此,你应该已经拥有以下文件。

~/mlc-llm > ls dist/RedPajama-INCITE-Instruct-3B-v1-q4f16_1-MLC
    mlc-chat-config.json                             # ===> the chat config
    ndarray-cache.json                               # ===> the model weight info
    params_shard_0.bin                               # ===> the model weights
    params_shard_1.bin
    ...
    tokenizer.json                                   # ===> the tokenizer files
    tokenizer_config.json

(可选)3. 将权重上传至 Hugging Face

你可以选择将已有的内容上传至 Hugging Face。

# First, please create a repository on Hugging Face.
# With the repository created, run
git lfs install
git clone https://huggingface.co/my-huggingface-account/my-redpajama3b-weight-huggingface-repo
cd my-redpajama3b-weight-huggingface-repo
cp path/to/mlc-llm/dist/RedPajama-INCITE-Instruct-3B-v1-q4f16_1-MLC/* .
git add . && git commit -m "Add redpajama-3b instruct model weights"
git push origin main

这将生成类似于 RedPajama-INCITE-Chat-3B-v1-q4f16_1-MLC 的内容,但适用于 Instruct 模型而非 Chat 模型。

干得漂亮!你已经成功分发了你编译的模型。接下来,将讨论如何在应用程序中使用这些模型权重。

下载已分发的模型

你现在可以使用现有的 MLC 工具(如 chat/serve/package)来处理已转换的权重。

mlc_llm chat HF://my-huggingface-account/my-redpajama3b-weight-huggingface-repo