用 Rust 写的极简 LLM 推理库,零外部依赖,适合在资源受限环境或边缘设备运行 LLM。对性能敏感的开发者有实用价值。
WebUI | Hugging Face | Text Demo | Vision Demo
🌃 现已支持多模态,采用 PHI-3.5-vision 模型!PHI-3.5-mini 纯文本模型也已受支持。
受 Karpathy 的 llama2.c 和 llm.c 启发,我决定创建最小化的代码(目前还不够最小化)来在 CPU 上进行完整的语言模型推理,无需 ML 库。之前仅支持 Google 的 Gemma 2 模型,但我决定添加对新的 Llama 3.2 模型的支持,最近还增加了使用图像的 PHI-3.5 的选项。
新闻:实现了批处理,图像编码速度提升了约 3 倍。Llama 3.2 1B 在我的 16 核机器上现在运行速度为 50 tok/s。
声明:代码中有些部分可以优化和改进。这只是我第一次编写 Rust 代码的借口。难以置信的是,几年后,我们可能会有 AGI 在几行写得不太好的 Rust 代码中运行?
一些基准和模型与分词器的下载链接。我建议使用 Q8_0,Q4_0 量化仍在改进中。速度在 16 核 AMD Epyc 上测量。
你可以从 huggingface 下载 lmrs 格式的准备好的量化模型和分词器模型文件。如果你更喜欢自己转换 Google/Meta 在 huggingface 上发布的模型,请参考以下部分。否则,你可以跳到构建部分。
安装 export.py 和 tokenizer.py 使用的额外 python 依赖(假设你已经安装了 pytorch):
pip install -r requirements.txt
从 huggingface 上的原始模型页面下载 .safetensors 和 config.json 文件(这样我们就不必克隆 pytorch 仓库)。对于多模态模型(PHI3.5 Vision),我们还需要 CLIP .config 文件。
使用 export.py 脚本将模型 bfloat16 权重转换为 LMRS 格式:
python export.py --files [ordered .safetensor files] --config [model config.json] --save-path [name and path to save] --type [model type (GEMMA/LLAMA/PHI)]
要导出量化版本,请使用 --quantize 和 --quantize-type 标志。int8 量化模型大小应该小 4 倍(从约 9.8G 到约 2.5G,具体取决于组大小)。对于多模态模型,包括 --vision-config 参数。
使用 tokenizer.py 脚本将分词器模型转换为 LMRS 分词器格式:
python tokenizer.py --model-id [huggingface model_id] --tokenizer-type [type of the tokenizer (GEMMA/LLAMA/PHI)]
使用 cargo 编译 rust 代码(确保传递 target-cpu 标志):
RUSTFLAGS="-C target-cpu=native" cargo build --release --bin chat
要启用多模态,请通过传递 --features multimodal 参数来包含 multimodal 特性。
你就可以开始使用了:
./target/release/chat --model [model weights file]
其他参数包括 tokenizer、temperature、top-p、show-metrics 等。要检查可用参数,请使用 --help 运行。对于多模态模型,使用 --image 参数加上图像路径。使用 PHI3.5-vision 时,我建议使用温度为 0。
要运行 WebUI 的后端,首先编译:
RUSTFLAGS="-C target-cpu=native" cargo build --release --features backend --bin backend
对于多模态,启用 backend-multimodal 特性。
./target/release/backend --model [model weights file]
你可以使用 --ip 和 --port 更改 IP 和端口。其他标志如 temperature 等也可用。为了多模态兼容性,使用 --multimodal 标志。现在你可以通过 web 界面连接。