wllama 项目介绍
概述
wllama 是一个为 llama.cpp 提供 WebAssembly 绑定的项目,它允许用户直接在浏览器中运行推理,而无需依靠后端服务器或 GPU。这一特性使得使用 wllama 可以更加便捷和高效。用户可以在 Hugging Face 中心尝试这款应用。有关更多详细信息和使用说明,请参考文档。
主要特点
- Typescript 支持:wllama 提供了对 Typescript 的全面支持,方便开发者在项目中集成。
- 浏览器内推理:使用 WebAssembly SIMD 技术,wllama 可以直接在浏览器中进行推理,无需任何后台支持。
- 无运行时依赖:使用 wllama 不需要额外的运行时支持。
- 高级和低级 API:项目提供高层 API 用于实现文本补全和嵌入,也提供了低级 API 供更高级用户使用,包括令牌化控制、KV 缓存控制和采样控制。
- 模型分片:wllama 可以将模型分割为更小的文件并并行加载,以提高下载速度和内存使用效率。
- 自适应线程支持:基于浏览器的支持,自动在单线程和多线程构建之间切换。
- 独立于 UI 渲染的推理:推理操作在工作者线程中执行,保证不会阻塞用户界面的渲染。
限制
- 若要启用多线程,需要设置
Cross-Origin-Embedder-Policy
和Cross-Origin-Opener-Policy
头部。 - 目前不支持 WebGPU,将来可能会添加此功能。
- 文件最大大小为 2GB,受限于 ArrayBuffer 的尺寸限制。对于超过 2GB 的模型,可以参考“模型分片”部分。
使用指南
在 React Typescript 项目中使用 wllama
首先,需要安装 wllama:
npm i @wllama/wllama
关于如何在 React 项目中使用该库的具体代码示例,请参考项目中的React 示例。
准备模型
推荐将模型分割为最大 512MB 的块,这样可以提高下载速度并减少内存问题。更多信息请查阅“模型分片”章节。
简单用法
使用 ES6 模块可以方便地在项目中引入 wllama,具体代码示例如下:
import { Wllama } from './esm/index.js';
(async () => {
const CONFIG_PATHS = {
...
};
const wllama = new Wllama(CONFIG_PATHS);
const progressCallback = ({ loaded, total }) => {
const progressPercentage = Math.round((loaded / total) * 100);
console.log(`Downloading... ${progressPercentage}%`);
};
await wllama.loadModelFromUrl(
"https://huggingface.co/ggml-org/models/resolve/main/tinyllamas/stories260K.gguf",
{
progressCallback,
}
);
const outputText = await wllama.createCompletion(elemInput.value, {
nPredict: 50,
sampling: {
temp: 0.5,
top_k: 40,
top_p: 0.9,
},
});
console.log(outputText);
})();
模型分片
在某些情况下,需要将模型进行分片以规避 ArrayBuffer 的大小限制或加速下载。这可以通过 llama-gguf-split
工具完成。具体命令如下:
./llama-gguf-split --split-max-size 512M ./my_model.gguf ./my_model
自定义日志器
wllama 支持自定义日志,可以用来抑制调试信息或增加个性化内容,例如在日志前添加表情符号。
编译指南
wllama 项目中包含了预编译的二进制文件,但用户也可以选择自行编译。如果想获取最新的源码变更,可以通过以下命令进行编译:
git clone --recurse-submodules https://github.com/ngxson/wllama.git
cd wllama
npm i
npm run build:wasm
npm run build
未来计划
短期目标包括增加更实用的嵌入示例和在浏览器中进行全 RAG 示例。长期目标则包含支持 GPU 推理、支持多序列推理以及多模态改造等。