5个版本
0.1.1 | 2023年5月8日 |
---|---|
0.1.0-rc4 | 2023年5月8日 |
0.1.0-rc3 | 2023年5月7日 |
0.1.0-rc1 | 2023年5月4日 |
#701 in 机器学习
282次每月下载
用于llm
115KB
2K SLoC
llm
图片由@darthdeus提供,使用Stable Diffusion制作
llm
是一个运行在大语言模型上的推理库生态系统,灵感来源于llama.cpp。
主要的crate是llm
crate,它封装了llm-base
和支持的模型crate。
在llm
之上,还有一个命令行应用程序llm-cli
,它提供了一个方便的界面来运行支持的模型的推理。此CLI可以从最新的GitHub发布版中获取。
它由ggml
张量库提供动力,旨在将Rust的健壮性和易用性带到大型语言模型的世界。
目前支持以下模型
- GPT-2
- GPT-J
- LLaMA:LLaMA、Alpaca、Vicuna、Koala、GPT4All v1、GPT4-X、Wizard
- GPT-NeoX:GPT-NeoX、StableLM、Dolly v2(部分,不是相同的张量名称?)
- BLOOM:BLOOMZ
入门指南
请确保您已设置Rust 1.65.0或更高版本以及C工具链[^1]。
llm
是一个Rust库,它重新导出llm-base
和模型crate(例如bloom
、gpt2
、llama
)。
llm-cli
(二进制名称为llm
)是一个基本应用程序,它为库提供CLI接口。
注意:为了获得最佳结果,请确保以发布模式构建和运行。调试构建会非常慢。
使用cargo
进行构建
运行
cargo install --git https://github.com/rustformers/llm llm-cli
将 llm
安装到您的 Cargo bin
目录中,这可能是 rustup
添加到您的 PATH
的位置。
然后可以通过 llm
运行 CLI 应用程序。
从仓库构建
克隆仓库,然后使用以下命令构建:
git clone --recurse-submodules [email protected]:rustformers/llm.git
cargo build --release
生成的二进制文件将位于 target/release/llm[.exe]
。
也可以直接通过 Cargo 运行,使用
cargo run --release -- <ARGS>
这对于开发很有用。
获取模型
GGML 文件很容易获得。有关已测试模型的列表,请参阅 已知良好的模型。
此项目不支持某些较旧的 GGML 格式,但目标是与上游 GGML 项目的功能保持一致。有关加载模型的问题或请求对 支持的 GGML 模型类型 的支持,请 创建一个问题。
从 Hugging Face
Hugging Face 🤗 是开源机器学习领域的领导者,托管了数百个 GGML 模型。在 Hugging Face 🤗 上搜索 GGML 模型。
r/LocalLLaMA
这个 Reddit 社区维护了一个与 GGML 模型相关的 维基,包括获取 GGML 模型 的链接列表(大部分来自 Hugging Face 🤗)。
LLaMA 原始权重
目前,获取原始权重的唯一合法来源是 这个仓库。
获取权重后,需要将其转换为与 ggml 兼容的格式。为此,请按照以下步骤操作
警告
要运行 Python 脚本,需要 3.9 或 3.10 版本的 Python。写作时 3.11 版本不受支持。
# Convert the model to f16 ggml format
python3 scripts/convert-pth-to-ggml.py /path/to/your/models/7B/ 1
# Quantize the model to 4-bit ggml format
cargo run --release llama quantize /path/to/your/models/7B/ggml-model-f16.bin /path/to/your/models/7B/ggml-model-q4_0.bin q4_0
将来,我们希望提供 更简化的模型转换方式。
注意
llama.cpp 仓库 提供了有关如何获取和运行特定模型的其他信息。
运行
例如,尝试以下提示
llm llama infer -m <path>/ggml-model-q4_0.bin -p "Tell me how cool the Rust programming language is:"
尝试其他一些事情
-
使用
--help
查看可用选项列表。 -
如果您有 alpaca-lora 权重,请尝试
repl
模式!llm llama repl -m <path>/ggml-alpaca-7b-q4.bin -f examples/alpaca_prompt.txt
-
可以将会话加载到文件中(使用
--load-session
)或保存到文件中(使用--save-session
)。要自动加载和保存相同的会话,请使用--persist-session
。这也可以用于缓存提示以减少加载时间
[^1]: 编译 ggml
需要一个现代 C 工具链。不需要 C++ 工具链。
Docker
# To build (This will take some time, go grab some coffee):
docker build -t llm .
# To run with prompt:
docker run --rm --name llm -it -v ${PWD}/data:/data -v ${PWD}/examples:/examples llm llama infer -m data/gpt4all-lora-quantized-ggml.bin -p "Tell me how cool the Rust programming language is:"
# To run with prompt file and repl (will wait for user input):
docker run --rm --name llm -it -v ${PWD}/data:/data -v ${PWD}/examples:/examples llm llama repl -m data/gpt4all-lora-quantized-ggml.bin -f examples/alpaca_prompt.txt
Q&A
你为什么要这么做?
这不是我的选择。费里斯出现在我的梦中,并要求我以圣甲壳虫的名义重写这篇文章。
说正经的。
来吧!我不想卷入口水战。你知道怎么回事,什么什么 内存 什么什么 cargo 很好,别让我说它,大家都知道这一点。
我坚持。
哎呀!好吧。在看到 llama.cpp 的巨大潜力后,我首先想到的是将其转换成一个库嵌入我的项目中,这有多难。我开始深入研究代码,发现繁重的工作是由 ggml
(一个C库,易于绑定到Rust)完成的,整个项目大约有2k行C++代码(绑定起来并不容易)。在尝试了几次(失败的)将HTTP服务器构建到工具中之后,我意识到如果我只是将代码移植到Rust(我在那里更舒适),我会更有效率。
这是真正的理由吗?
哈哈。当然不是。我只是喜欢收集那些人们似乎在我不懈地重写某些东西时给予我的虚拟互联网积分,形式是小小的星星。
这与 llama.cpp
有什么不同?
这是对 llama.cpp
的重新实现,除了 ggml
之外,它与它没有共享任何代码。这是出于各种原因
llama.cpp
需要C++编译器,这可能会在编译到更专业的平台时引起问题。一个这样的平台是WebAssembly,它可能需要一个非标准的编译器SDK。- Rust在开发和开源方面更容易使用;它提供了更好的工具来编写由许多其他作者编写的“大型代码”。此外,我们可以轻松地从更大的Rust生态系统中受益。
- 我们希望将
ggml
建成一个可选的后端(见 这个问题)。
总的来说,我们希望构建一个模型推理解决方案,它的使用和部署与任何其他Rust crate一样简单。
哪些应用程序和库使用 llm
?
应用程序
- llmcord:使用
llm
生成消息的Discord机器人。
库
依赖项
~5.5MB
~68K SLoC