Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,18 @@ For Debian Linux:
apt install libgomp1
```

### GPU support

It is possible to force GPU support for a training:
* rebuild the [LightGBM with GPU support]: use `-DUSE_CUDA=1 -DUSE_SWIG=ON` CMake options. You should also match the native/JNI versions precisely.
* LightGBM4j loads native libraries by default from bundled resources. This can be overridden by setting the `LIGHTGBM_NATIVE_LIB_PATH` environment variable. It should point to a directory with `lib_lightgbm.so` and `lib_lightgbm_swig.so` files (or with `dll`/`dylib` extensions on Windows/MacOS).

If the native override was able to successfully load a custom library you've built, then you'll see the following line in logs:
```
LIGHTGBM_NATIVE_LIB_PATH is set: loading /home/user/code/LightGBM/lib_lightgbm.so
LIGHTGBM_NATIVE_LIB_PATH is set: loading /home/user/code/LightGBM/lib_lightgbm_swig.so
```

## Usage

There are two main classes available:
Expand Down
61 changes: 38 additions & 23 deletions src/main/java/io/github/metarank/lightgbm4j/LGBMBooster.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,12 @@ public synchronized static void loadNative() throws IOException {
if (os.startsWith("Linux") || os.startsWith("LINUX")) {
try {
if (arch.startsWith("amd64") || arch.startsWith("x86_64")) {
loadNative("linux/x86_64/lib_lightgbm.so", "lib_lightgbm.so");
loadNative("linux/x86_64/lib_lightgbm_swig.so", "lib_lightgbm_swig.so");
loadNative("linux/x86_64/", "lib_lightgbm.so");
loadNative("linux/x86_64/", "lib_lightgbm_swig.so");
nativeLoaded = true;
} else if (arch.startsWith("aarch64") || arch.startsWith("arm64")) {
loadNative("linux/aarch64/lib_lightgbm.so", "lib_lightgbm.so");
loadNative("linux/aarch64/lib_lightgbm_swig.so", "lib_lightgbm_swig.so");
loadNative("linux/aarch64/", "lib_lightgbm.so");
loadNative("linux/aarch64/", "lib_lightgbm_swig.so");
nativeLoaded = true;
}
} catch (UnsatisfiedLinkError err) {
Expand All @@ -73,12 +73,12 @@ public synchronized static void loadNative() throws IOException {
} else if (os.startsWith("Mac")) {
try {
if (arch.startsWith("amd64") || arch.startsWith("x86_64")) {
loadNative("osx/x86_64/lib_lightgbm.dylib", "lib_lightgbm.dylib");
loadNative("osx/x86_64/lib_lightgbm_swig.dylib", "lib_lightgbm_swig.dylib");
loadNative("osx/x86_64/", "lib_lightgbm.dylib");
loadNative("osx/x86_64/", "lib_lightgbm_swig.dylib");
nativeLoaded = true;
} else if (arch.startsWith("aarch64") || arch.startsWith("arm64")) {
loadNative("osx/aarch64/lib_lightgbm.dylib", "lib_lightgbm.dylib");
loadNative("osx/aarch64/lib_lightgbm_swig.dylib", "lib_lightgbm_swig.dylib");
loadNative("osx/aarch64/", "lib_lightgbm.dylib");
loadNative("osx/aarch64/", "lib_lightgbm_swig.dylib");
nativeLoaded = true;
} else {
System.out.println("arch " + arch + " is not supported");
Expand All @@ -100,8 +100,8 @@ public synchronized static void loadNative() throws IOException {
throw err;
}
} else if (os.startsWith("Windows")) {
loadNative("windows/x86_64/lib_lightgbm.dll", "lib_lightgbm.dll");
loadNative("windows/x86_64/lib_lightgbm_swig.dll", "lib_lightgbm_swig.dll");
loadNative("windows/x86_64/", "lib_lightgbm.dll");
loadNative("windows/x86_64/", "lib_lightgbm_swig.dll");
nativeLoaded = true;
} else {
System.out.println("Only Linux@x86_64, Windows@x86_64, Mac@x86_64 and Mac@aarch are supported");
Expand All @@ -110,20 +110,35 @@ public synchronized static void loadNative() throws IOException {
}

private static void loadNative(String path, String name) throws IOException, UnsatisfiedLinkError {
System.out.println("Loading native lib " + path);
String tmp = System.getProperty("java.io.tmpdir");
File libFile = new File(tmp + File.separator + name);
if (libFile.exists()) {
System.out.println(libFile + " already exists");
String nativePathOverride = System.getenv("LIGHTGBM_NATIVE_LIB_PATH");
if (nativePathOverride != null) {
if (!nativePathOverride.endsWith("/")) {
nativePathOverride = nativePathOverride + "/";
}
String libFile = nativePathOverride + name;
System.out.println("LIGHTGBM_NATIVE_LIB_PATH is set: loading " + libFile);
try {
System.load(libFile);
} catch (UnsatisfiedLinkError err) {
System.out.println("Cannot load library:" + err.getMessage());
throw err;
}
} else {
extractResource(path, name, libFile);
}
System.out.println("Extracted file: exists=" + libFile.exists() + " path=" + libFile);
try {
System.load(libFile.toString());
} catch (UnsatisfiedLinkError err) {
System.out.println("Cannot load library:" + err.getMessage());
throw err;
System.out.println("Loading native lib from resource " + path + "/" + name);
String tmp = System.getProperty("java.io.tmpdir");
File libFile = new File(tmp + File.separator + name);
if (libFile.exists()) {
System.out.println(libFile + " already exists");
} else {
extractResource(path + name, name, libFile);
}
System.out.println("Extracted file: exists=" + libFile.exists() + " path=" + libFile);
try {
System.load(libFile.toString());
} catch (UnsatisfiedLinkError err) {
System.out.println("Cannot load library:" + err.getMessage());
throw err;
}
}
}

Expand Down