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

banq發表於2024-10-23


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

相關文章