Moin,
ich beschäftige mich aktuell ein wenig mit KI und habe lokal nun was zum Laufen bekommen, konkret "text-generation-webui-main" was aber mit Python arbeitet. So wirklich mag ich Python nicht, der Syntax ist schon etwas schludrig, aber ist ja eine Frage des persönlichen Geschmacks.
Nun habe ich mal geschaut, was es da so für Java gibt und wurde hier fündig:
github.com
Habe ich mir mit git so mal nach Eclipse gezogen und alles soweit ohne Fehler und der build läuft auch sauber durch. Beim Testen gibt es aber diesen Fehler:
Starte ich das MainExamle direkt:
bekomme ich diese Fehlermeldung:
So, dazu sei gesagt, ich habe hier "D:\DEV\64\java\oracle\jdk1.8.0_131" ein jdk liegen, nutze das aber eigentlich nicht, habe das Projekt und alles schon auf "D:\DEV\64\java\oracle\jdk-21.0.1" umgestellt. Ich habe erstmal keine Ahnung, wo er sich diesen Pfad mit dem "jdk1.8.0_131" überhaut noch herholt.
Dennoch hab ich mal "llama.dll" nach "D:\DEV\64\java\oracle\jdk1.8.0_131\bin\" kopiert, hätte ja helfen können, hat es aber nicht.
Nun bin ich dann in den Debugger und wollte mal sehen, wo zum ... er sich diesen Pfad zieht und was da nun falsch sein soll. Aber keine Chance, ich starte in der Klasse:
Dann geht es nach:
Und weiter:
Und das war es, egal wie ich es versuche, ich lande mit dem Debugger dann immer:
in der Funktion
Ich würde ja gerne einen Breakpoint ind der Funktion hier setzten:
... glaub ich müsste dafür aber den Quellcode der Klassen einbinden, soweit bin ich noch nicht gekommen.
Ja, das ist schon eine etwas knifflige Frage, aber eventuell gibt es ja hier doch einen echten Speziallisten, der mir hier weiterhelfen kann.
Mein Ziel ist es, einen Chat wie er in Python ja schon richtig gut läuft, über Java zu realisieren, also mehr, ich will das über ein Web-Frontend dann im Tomcat laufen lassen, mit ein wenig JSP und so. Dazu eine MySQL Datenbank, welche die Chats speichert und die ganzen Daten für die Konfiguration.
Bei "text-generation-webui-main" schaut das schon richtig gut aus, sollte doch auch mit JAVA was geben.
Also wenn mir da wer Tipps geben kann, wie ich mich weiter an den Fehler heranarbeiten kann, ich würde mich echt freuen.
Ich wünsche allen ein guten Rutsch ins neue Jahr und schöne Feiertage
Manuel
ich beschäftige mich aktuell ein wenig mit KI und habe lokal nun was zum Laufen bekommen, konkret "text-generation-webui-main" was aber mit Python arbeitet. So wirklich mag ich Python nicht, der Syntax ist schon etwas schludrig, aber ist ja eine Frage des persönlichen Geschmacks.
Nun habe ich mal geschaut, was es da so für Java gibt und wurde hier fündig:
GitHub - kherud/java-llama.cpp: Java Bindings for llama.cpp - A Port of Facebook's LLaMA model in C/C++
Java Bindings for llama.cpp - A Port of Facebook's LLaMA model in C/C++ - GitHub - kherud/java-llama.cpp: Java Bindings for llama.cpp - A Port of Facebook's LLaMA model in C/C++
Habe ich mir mit git so mal nach Eclipse gezogen und alles soweit ohne Fehler und der build läuft auch sauber durch. Beim Testen gibt es aber diesen Fehler:
Java:
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running de.kherud.llama.[1mLlamaModelIT[m
[ERROR] [1;31mTests [0;1mrun: [0;1m1[m, Failures: 0, [1;31mErrors: [0;1;31m1[m, Skipped: 0, Time elapsed: 0.125 s[1;31m <<< FAILURE![m -- in de.kherud.llama.[1mLlamaModelIT[m
[ERROR] de.kherud.llama.LlamaModelIT -- Time elapsed: 0.117 s <<< ERROR!
java.lang.ExceptionInInitializerError
at de.kherud.llama.LlamaModelIT.setup(LlamaModelIT.java:22)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.RunBefores.invokeMethod(RunBefores.java:33)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:316)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:240)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:214)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:155)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
Caused by: java.nio.file.InvalidPathException: Illegal char <"> at index 0: "D:\DEV\64\java\oracle\jdk1.8.0_131\bin\llama.dll
at java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:204)
at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:175)
at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
at java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92)
at java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:231)
at java.base/java.nio.file.Path.of(Path.java:148)
at java.base/java.nio.file.Paths.get(Paths.java:69)
at de.kherud.llama.LlamaLoader.loadNativeLibrary(LlamaLoader.java:132)
at de.kherud.llama.LlamaLoader.initialize(LlamaLoader.java:65)
at de.kherud.llama.LlamaModel.<clinit>(LlamaModel.java:29)
... 19 more
[INFO]
[INFO] Results:
[INFO]
[ERROR] [1;31mErrors: [m
[ERROR] [1;31m LlamaModelIT.setup:22 ExceptionInInitializer[m
[INFO]
[ERROR] [1;31mTests run: 1, Failures: 0, Errors: 1, Skipped: 0[m
[INFO]
[INFO]
[INFO] [1m--- [0;32mfailsafe:3.2.3:verify[m [1m(default)[m @ [36mllama[0;1m ---[m
[INFO] [1m------------------------------------------------------------------------[m
[INFO] [1;31mBUILD FAILURE[m
[INFO] [1m------------------------------------------------------------------------[m
[INFO] Total time: 5.415 s
[INFO] Finished at: 2023-12-26T19:21:12+01:00
[INFO] [1m------------------------------------------------------------------------[m
[ERROR] Failed to execute goal [32morg.apache.maven.plugins:maven-failsafe-plugin:3.2.3:verify[m [1m(default)[m on project [36mllama[m: [1;31m[m
[ERROR] [1;31m[m
[ERROR] [1;31mPlease refer to D:\DEV\64\workspace\llama\java-llama.cpp\target\failsafe-reports for the individual test results.[m
[ERROR] [1;31mPlease refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.[m
[ERROR] -> [1m[Help 1][m
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the [1m-e[m switch.
[ERROR] Re-run Maven using the [1m-X[m switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [1m[Help 1][m http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
Starte ich das MainExamle direkt:
Code:
package examples;
import de.kherud.llama.ModelResolver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import de.kherud.llama.InferenceParameters;
import de.kherud.llama.LlamaModel;
import de.kherud.llama.ModelParameters;
public class MainExample {
public static void main(String... args) throws IOException
{
System.out.println(args);
LlamaModel.setLogger((level, message) -> System.out.print(message));
ModelParameters modelParams = new ModelParameters()
.setNGpuLayers(43);
InferenceParameters inferParams = new InferenceParameters()
.setTemperature(0.7f)
.setPenalizeNl(true)
// .setNProbs(10)
.setMirostat(InferenceParameters.MiroStat.V2)
.setAntiPrompt("User:");
String modelName = System.getProperty("model.name");
String modelPath = ModelResolver.getPathToModel(modelName);
String system = "This is a conversation between User and Llama, a friendly chatbot.\n" +
"Llama is helpful, kind, honest, good at writing, and never fails to answer any " +
"requests immediately and with precision.\n\n" +
"User: Hello Llama\n" +
"Llama: Hello. How may I help you today?";
;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
try (LlamaModel model = new LlamaModel(modelPath, modelParams)) {
System.out.print(system);
String prompt = system;
while (true) {
prompt += "\nUser: ";
System.out.print("\nUser: ");
String input = reader.readLine();
prompt += input;
System.out.print("Llama: ");
prompt += "\nLlama: ";
// String answer = model.complete(prompt, inferParams);
// System.out.print(answer);
// prompt += answer;
for (LlamaModel.Output output : model.generate(prompt, inferParams)) {
System.out.print(output);
prompt += output;
}
}
}
}
}
bekomme ich diese Fehlermeldung:
Code:
[Ljava.lang.String;@4517d9a3
Exception in thread "main" java.lang.ExceptionInInitializerError
at examples.MainExample.main(MainExample.java:19)
Caused by: java.nio.file.InvalidPathException: Illegal char <"> at index 0: "D:\DEV\64\java\oracle\jdk1.8.0_131\bin\llama.dll
at java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:204)
at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:175)
at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
at java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92)
at java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:231)
at java.base/java.nio.file.Path.of(Path.java:148)
at java.base/java.nio.file.Paths.get(Paths.java:69)
at de.kherud.llama.LlamaLoader.loadNativeLibrary(LlamaLoader.java:132)
at de.kherud.llama.LlamaLoader.initialize(LlamaLoader.java:65)
at de.kherud.llama.LlamaModel.<clinit>(LlamaModel.java:29)
... 1 more
Dennoch hab ich mal "llama.dll" nach "D:\DEV\64\java\oracle\jdk1.8.0_131\bin\" kopiert, hätte ja helfen können, hat es aber nicht.
Nun bin ich dann in den Debugger und wollte mal sehen, wo zum ... er sich diesen Pfad zieht und was da nun falsch sein soll. Aber keine Chance, ich starte in der Klasse:
Code:
package examples;
import de.kherud.llama.ModelResolver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import de.kherud.llama.InferenceParameters;
import de.kherud.llama.LlamaModel;
import de.kherud.llama.ModelParameters;
public class MainExample {
public static void main(String... args) throws IOException
{
LlamaModel.setLogger((level, message) -> System.out.print(message));
ModelParameters modelParams = new ModelParameters()
.setNGpuLayers(43);
InferenceParameters inferParams = new InferenceParameters()
.setTemperature(0.7f)
.setPenalizeNl(true)
// .setNProbs(10)
.setMirostat(InferenceParameters.MiroStat.V2)
.setAntiPrompt("User:");
String modelName = System.getProperty("model.name");
String modelPath = ModelResolver.getPathToModel(modelName);
String system = "This is a conversation between User and Llama, a friendly chatbot.\n" +
"Llama is helpful, kind, honest, good at writing, and never fails to answer any " +
"requests immediately and with precision.\n\n" +
"User: Hello Llama\n" +
"Llama: Hello. How may I help you today?";
;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
try (LlamaModel model = new LlamaModel(modelPath, modelParams)) {
System.out.print(system);
String prompt = system;
while (true) {
prompt += "\nUser: ";
System.out.print("\nUser: ");
String input = reader.readLine();
prompt += input;
System.out.print("Llama: ");
prompt += "\nLlama: ";
// String answer = model.complete(prompt, inferParams);
// System.out.print(answer);
// prompt += answer;
for (LlamaModel.Output output : model.generate(prompt, inferParams)) {
System.out.print(output);
prompt += output;
}
}
}
}
}
Code:
LlamaModel.setLogger((level, message) -> System.out.print(message));
Code:
/**
* Sets a callback for both Java and C++ log messages. Can be set to {@code null} to disable logging.
*
* @param callback a method to call for log messages
*/
public static native void setLogger(@Nullable BiConsumer<LogLevel, String> callback);
Code:
package sun.nio.fs;
import java.nio.file.InvalidPathException;
/**
* A parser of Windows path strings
*/
class WindowsPathParser {
...
/**
* Remove redundant slashes from the rest of the path, forcing all slashes
* into the preferred slash.
*/
private static String normalize(StringBuilder sb, String path, int off) {
int len = path.length();
off = nextNonSlash(path, off, len);
int start = off;
char lastC = 0;
while (off < len) {
char c = path.charAt(off);
if (isSlash(c)) {
if (lastC == ' ')
throw new InvalidPathException(path,
"Trailing char <" + lastC + ">",
off - 1);
sb.append(path, start, off);
off = nextNonSlash(path, off, len);
if (off != len) //no slash at the end of normalized path
sb.append('\\');
start = off;
} else {
if (isInvalidPathChar(c))
throw new InvalidPathException(path,
"Illegal char <" + c + ">",
off);
lastC = c;
off++;
}
}
if (start != off) {
if (lastC == ' ')
throw new InvalidPathException(path,
"Trailing char <" + lastC + ">",
off - 1);
sb.append(path, start, off);
}
return sb.toString();
}
in der Funktion
Code:
String normalize(StringBuilder sb, String path, int off)
Ich würde ja gerne einen Breakpoint ind der Funktion hier setzten:
Code:
/**
* Remove redundant slashes from the rest of the path, forcing all slashes
* into the preferred slash.
*/
private static String normalize(StringBuilder sb, String path, int off) {
int len = path.length();
off = nextNonSlash(path, off, len);
int start = off;
char lastC = 0;
while (off < len) {
char c = path.charAt(off);
if (isSlash(c)) {
if (lastC == ' ')
throw new InvalidPathException(path,
"Trailing char <" + lastC + ">",
off - 1);
sb.append(path, start, off);
off = nextNonSlash(path, off, len);
if (off != len) //no slash at the end of normalized path
sb.append('\\');
start = off;
} else {
if (isInvalidPathChar(c))
throw new InvalidPathException(path,
"Illegal char <" + c + ">",
off);
lastC = c;
off++;
}
}
if (start != off) {
if (lastC == ' ')
throw new InvalidPathException(path,
"Trailing char <" + lastC + ">",
off - 1);
sb.append(path, start, off);
}
return sb.toString();
}
Ja, das ist schon eine etwas knifflige Frage, aber eventuell gibt es ja hier doch einen echten Speziallisten, der mir hier weiterhelfen kann.
Mein Ziel ist es, einen Chat wie er in Python ja schon richtig gut läuft, über Java zu realisieren, also mehr, ich will das über ein Web-Frontend dann im Tomcat laufen lassen, mit ein wenig JSP und so. Dazu eine MySQL Datenbank, welche die Chats speichert und die ganzen Daten für die Konfiguration.
Bei "text-generation-webui-main" schaut das schon richtig gut aus, sollte doch auch mit JAVA was geben.
Also wenn mir da wer Tipps geben kann, wie ich mich weiter an den Fehler heranarbeiten kann, ich würde mich echt freuen.
Ich wünsche allen ein guten Rutsch ins neue Jahr und schöne Feiertage
Manuel