Jlama 是一个基于 Java 的推理引擎,适用于 huggingface 上的许多文本到文本模型:Llama 3+、Gemma2、Qwen2、Mistral、Mixtral 等。
它旨在用于将 gen ai 集成到 java 应用程序中,就是可以通过它将 LLM 推理直接添加到您的 Java 应用程序。
- Jlama 使用 Panama 矢量 API 在 CPU 上进行快速推理,因此非常适合小型模型。
- 较大的模型可以在分布式模式下运行,该模式按层和/或注意力头对模型进行分片。
它与langchain4j 集成 并包含与 OpenAI 兼容的 rest api。
它支持 Q4_0 和 Q8_0 量化并使用safetensor格式的模型。预量化模型在我的[url=https://huggingface.co/tjake]huggingface[/url]页面 上维护, 但您可以使用 jlama cli 在本地量化模型。
非常容易安装,并且在 Linux/Mac/Windows 上运行良好
#Install jbang (or https://www.jbang.dev/download/) curl -Ls https://sh.jbang.dev | bash -s - app setup
#Install Jlama CLI jbang app install --force jlama@tjake
# Run the openai chat api and UI on a model jlama restapi tjake/Llama-3.2-1B-Instruct-JQ4 --auto-download
|
模型支持:
- Gemma & Gemma 2 型号
- Llama & Llama2 & Llama3 模型
- Mistral 和 Mixtral 模型
- Qwen2 模型
- GPT-2 模型
- BERT 模型
- BPE 标记器
- WordPiece 标记器
实现:
- 分页关注
- 专家汇聚
- 工具调用
- 生成嵌入
- 分类器支持
- Huggingface SafeTensors模型和 tokenizer 格式
- 支持F32、F16、BF16类型
- 支持Q8、Q4模型量化
- 快速 GEMM 操作
- 分布式推理!
Jlama 需要 Java 20 或更高版本,并利用新的Vector API 进行更快的推理。
如何在 Java 项目中使用
Jlama 的主要目的是提供一种在 Java 中使用大型语言模型的简单方法。
在您的应用程序中嵌入 Jlama 的最简单方法是使用Langchain4j 集成。
如果您想嵌入不带 langchain4j 的 Jlama,请将以下maven依赖项添加到您的项目中:
<dependency> <groupId>com.github.tjake</groupId> <artifactId>jlama-core</artifactId> <version>${jlama.version}</version> </dependency>
<dependency> <groupId>com.github.tjake</groupId> <artifactId>jlama-native</artifactId> <!-- supports linux-x86_64, macos-x86_64/aarch_64, windows-x86_64 Use https://github.com/trustin/os-maven-plugin to detect os and arch --> <classifier>${os.detected.name}-${os.detected.arch}</classifier> <version>${jlama.version}</version> </dependency>
|
jlama 使用 Java 21 预览功能。您可以通过以下方式全局启用这些功能:
export JDK_JAVA_OPTIONS="--add-modules jdk.incubator.vector --enable-preview"
或者通过配置 maven 编译器和 failsafe 插件来启用预览功能。
然后您可以使用 Model 类来运行模型:
public void sample() throws IOException { String model = "tjake/Llama-3.2-1B-Instruct-JQ4"; String workingDirectory = "./models";
String prompt = "What is the best season to plant avocados?";
//下载模型,如果已经下载,则只返回本地路径 File localModelPath = new Downloader(workingDirectory, model).huggingFaceModel(); // 加载量化模型并指定使用量化内存 AbstractModel m = ModelSupport.loadModel(localModelPath, DType.F32, DType.I8);
PromptContext ctx; // 检查模型是否支持聊天提示,并为该模型添加预期格式的提示 if (m.promptSupport().isPresent()) { ctx = m.promptSupport() .get() .builder() .addSystemMessage("You are a helpful chatbot who writes short responses.") .addUserMessage(prompt) .build(); } else { ctx = PromptContext.of(prompt); }
System.out.println("Prompt: " + ctx.getPrompt() + "\n"); //生成对提示的响应并打印 // 应用程序允许流式或非流式响应 // 生成的响应温度为 0.7,最大令牌长度为 256 Generator.Response r = m.generate(UUID.randomUUID(), ctx, 0.0f, 256, (s, f) -> {}); System.out.println(r.responseText); }
|