跳到主要内容

jitLLM

jitLLM は、GGUF 形式の LLM を JVM 内で実行します。 TornadoVM を通じて GPU 上で実行します。 TornadoVM は、モデルのカーネルを CUDA、OpenCL、または Metal 向けに JIT コンパイルします。CPU 上での実行も可能です。 別途推論サーバーを用意する必要はありません。

プロジェクトのセットアップ​

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-jitllm</artifactId>
<version>1.23.0-beta33</version>
</dependency>
implementation 'dev.langchain4j:langchain4j-jitllm:1.23.0-beta33'

要件​

  • JDK 21 以降。JDK 21 の場合は、JDK 21 での実行を参照してください。
  • GGUF 形式のモデル(FP16、Q8_0、または Q4_0)。サポートされるファミリーには、Llama 3、Mistral、Qwen 2.5、Qwen 3、 Phi-3、IBM Granite 3.3 / 4.0、Gemma 4、DeepSeek-R1-Distill が含まれます。 動作確認済みのモデルは Hugging Face にまとめられています。
  • JVM オプション --add-modules jdk.incubator.vector。
  • GPU で実行する場合: お使いの JDK ライン(jdk21 または jdk22plus)と GPU のバックエンドに対応した TornadoVM SDK。 たとえば SDKMAN! でインストールできます(sdk install tornadovm)。 JVM は、TornadoVM の tornado ランチャーを -Duse.tornadovm=true 付きで使って起動する必要があります。
  • 通常の JVM(TornadoVM のランチャーを使わない)で CPU 上で実行する場合: io.github.beehive-lab:tornado-api:7.0.1-jdk22plus (JDK 21 では 7.0.1-jdk21)を runtime 依存関係として追加します。TornadoVM 経由で実行する場合は、すでに提供されているため追加しないでください。

サポートされるのは JVM モードのみで、GraalVM ネイティブイメージはサポートされません。

JDK 21 での実行​

jitLLM は 2 つのビルドで公開されています。langchain4j-jitllm が依存している jdk22plus と、jdk21 です。 JDK 21 では、前者を後者に置き換え、--enable-preview を付けて JVM を起動してください。 jdk21 ビルドは Foreign Function & Memory API を使用しており、これは JDK 21 ではプレビュー機能であるためです。

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-jitllm</artifactId>
<version>1.23.0-beta33</version>
<exclusions>
<exclusion>
<groupId>io.github.beehive-lab</groupId>
<artifactId>jitllm</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>io.github.beehive-lab</groupId>
<artifactId>jitllm</artifactId>
<version>1.0.2-jdk21</version>
</dependency>

チャット​

try (JitLLMChatModel model = JitLLMChatModel.builder()
.modelPath(Path.of("Qwen3-0.6B-Q8_0.gguf"))
.build()) {

String answer = model.chat("What is the capital of Germany?");
}

モデルはビルド時にロードされ、close() が呼び出されるまで、GPU メモリを含むメモリを保持し続けます。 一度だけビルドして、再利用してください。

ストリーミング​

try (JitLLMStreamingChatModel model = JitLLMStreamingChatModel.builder()
.modelPath(Path.of("Qwen3-0.6B-Q8_0.gguf"))
.build()) {

model.chat("Tell me a story", new StreamingChatResponseHandler() {

@Override
public void onPartialResponse(String partialResponse) {
System.out.print(partialResponse);
}

@Override
public void onCompleteResponse(ChatResponse completeResponse) {
System.out.println();
}

@Override
public void onError(Throwable error) {
error.printStackTrace();
}
});
}

chat(...) はレスポンスが完了してから戻ります。モデルは呼び出しスレッドで実行され、ハンドラーも そのスレッドで呼び出されます。ブロックを避けるには、別のスレッド(たとえば仮想スレッド)から呼び出してください。 ストリーミングは、onPartialResponse(PartialResponse, PartialResponseContext) で取得できる StreamingHandle を通じて 停止できます。

GPU での実行​

tornado --jvm="-Duse.tornadovm=true --add-modules jdk.incubator.vector -Dtornado.device.memory=8GB" \
-cp "target/my-app.jar:target/dependency/*" com.example.Main

target/dependency は mvn dependency:copy-dependencies で作成できます。 この方法で JVM を起動すると、モデルは TornadoVM SDK が提供するバックエンドを使って GPU 上で実行されます。 onGPU(false) は CPU を強制し、onGPU(true) は、JVM が TornadoVM 経由で起動されていない場合にビルド時に失敗します。

設定​

ビルダーのメソッドデフォルト説明
modelPath必須GGUF ファイルへのパス。
contextLength4096レスポンスを含む会話全体の最大トークン数。そのためのメモリはロード時に確保されます。
onGPU-Duse.tornadovm=true で起動した場合は trueGPU 上で実行するか、CPU 上で実行するか。
temperature0.1サンプリング温度。
topP0.95Nucleus サンプリングの確率。
maxTokens512思考を含む、1 回のレスポンスで生成される最大トークン数。
stopSequencesレスポンスを終了させるシーケンス。思考ではなく、回答に適用されます。
seedリクエストごとにランダム再現可能なレスポンスのための、サンプリングのシード。
thinkモデルのデフォルト推論モデルが回答の前に思考するかどうか。false にすると、直接回答します。
returnThinkingfalse推論モデルの思考を AiMessage.thinking() で返し、onPartialThinking にストリーミングします。
defaultRequestParametersデフォルトの ChatRequestParameters。上記の値が優先されます。
listenersリクエスト、レスポンス、エラーが通知されるリスナー。

temperature、topP、maxOutputTokens、stopSequences は、ChatRequestParameters でリクエストごとに設定することもできます。

1 つのモデルインスタンスを複数のスレッドで使用できますが、一度に生成できるレスポンスは 1 つだけです。 同時に届いたリクエストは、互いに待機します。

機能​

  • キャンセル可能なストリーミング。
  • 同期およびストリーミングのツール。1 つのレスポンスに複数のツール呼び出しを含めることもできます。 ツールを使用する場合、ストリーミングされるレスポンスは、完了した時点で一度にまとめて配信されます。
  • 推論モデルの思考(<think> と </think> の間のテキスト)。think でオン/オフを切り替えられ、 returnThinking(true) を設定すると返されます。
  • ChatResponse のトークン使用量と終了理由。
  • サポートされないもの: JSON レスポンス形式、ToolChoice.REQUIRED、画像、および modelName、topK、 frequencyPenalty、presencePenalty パラメータ。

GPULlama3.java からの移行​

jitLLM は GPULlama3.java の後継であり、langchain4j-jitllm は 非推奨となった langchain4j-gpu-llama3 モジュールを置き換えるものです。

  • GPULlama3ChatModel を JitLLMChatModel に、GPULlama3StreamingChatModel を JitLLMStreamingChatModel に置き換えます。
  • maxTokens は、生成されるトークンのみを制限するようになりました。コンテキストウィンドウは contextLength で設定します。
  • メモリの解放には、freeTornadoVMGPUResources() の代わりに close() を使用します。モデルがガベージコレクションされても、 自動的なクリーンアップは行われません。
  • 思考は returnThinking(true) の場合にのみ返され、<think> タグは含まれません。
  • printLastMetrics() は ChatResponse.tokenUsage() に置き換えられました。
  • onGPU を設定しない場合、モデルは JVM が -Duse.tornadovm=true で起動されたときにのみ GPU 上で実行されます。