Jlama:基于Java 20+大模型LLM引擎


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);
 }