node-llama-cpp 3.3.2 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/bindings/AddonTypes.d.ts +12 -4
- package/dist/bindings/Llama.d.ts +9 -0
- package/dist/bindings/Llama.js +52 -28
- package/dist/bindings/Llama.js.map +1 -1
- package/dist/bindings/getLlama.d.ts +2 -1
- package/dist/bindings/getLlama.js +19 -9
- package/dist/bindings/getLlama.js.map +1 -1
- package/dist/bindings/utils/asyncSome.js +2 -0
- package/dist/bindings/utils/asyncSome.js.map +1 -1
- package/dist/bindings/utils/compileLLamaCpp.d.ts +1 -1
- package/dist/bindings/utils/compileLLamaCpp.js +115 -34
- package/dist/bindings/utils/compileLLamaCpp.js.map +1 -1
- package/dist/bindings/utils/detectAvailableComputeLayers.d.ts +1 -0
- package/dist/bindings/utils/detectAvailableComputeLayers.js +4 -4
- package/dist/bindings/utils/detectAvailableComputeLayers.js.map +1 -1
- package/dist/bindings/utils/detectBuildTools.d.ts +14 -0
- package/dist/bindings/utils/detectBuildTools.js +149 -0
- package/dist/bindings/utils/detectBuildTools.js.map +1 -0
- package/dist/bindings/utils/resolveActualBindingBinaryPath.d.ts +1 -0
- package/dist/bindings/utils/resolveActualBindingBinaryPath.js +18 -0
- package/dist/bindings/utils/resolveActualBindingBinaryPath.js.map +1 -0
- package/dist/bindings/utils/testBindingBinary.d.ts +1 -1
- package/dist/bindings/utils/testBindingBinary.js +58 -5
- package/dist/bindings/utils/testBindingBinary.js.map +1 -1
- package/dist/chatWrappers/AlpacaChatWrapper.d.ts +4 -0
- package/dist/chatWrappers/AlpacaChatWrapper.js +4 -0
- package/dist/chatWrappers/AlpacaChatWrapper.js.map +1 -1
- package/dist/chatWrappers/FalconChatWrapper.d.ts +4 -0
- package/dist/chatWrappers/FalconChatWrapper.js +4 -0
- package/dist/chatWrappers/FalconChatWrapper.js.map +1 -1
- package/dist/chatWrappers/GeneralChatWrapper.d.ts +4 -0
- package/dist/chatWrappers/GeneralChatWrapper.js +4 -0
- package/dist/chatWrappers/GeneralChatWrapper.js.map +1 -1
- package/dist/chatWrappers/utils/resolveChatWrapper.d.ts +2 -0
- package/dist/chatWrappers/utils/resolveChatWrapper.js +8 -27
- package/dist/chatWrappers/utils/resolveChatWrapper.js.map +1 -1
- package/dist/cli/commands/ChatCommand.d.ts +4 -0
- package/dist/cli/commands/ChatCommand.js +158 -13
- package/dist/cli/commands/ChatCommand.js.map +1 -1
- package/dist/cli/commands/CompleteCommand.d.ts +4 -0
- package/dist/cli/commands/CompleteCommand.js +143 -10
- package/dist/cli/commands/CompleteCommand.js.map +1 -1
- package/dist/cli/commands/DebugCommand.js +5 -5
- package/dist/cli/commands/DebugCommand.js.map +1 -1
- package/dist/cli/commands/InfillCommand.d.ts +4 -0
- package/dist/cli/commands/InfillCommand.js +142 -10
- package/dist/cli/commands/InfillCommand.js.map +1 -1
- package/dist/cli/commands/OnPostInstallCommand.js +12 -2
- package/dist/cli/commands/OnPostInstallCommand.js.map +1 -1
- package/dist/cli/commands/inspect/commands/InspectEstimateCommand.d.ts +1 -0
- package/dist/cli/commands/inspect/commands/InspectEstimateCommand.js +14 -7
- package/dist/cli/commands/inspect/commands/InspectEstimateCommand.js.map +1 -1
- package/dist/cli/commands/inspect/commands/InspectGgufCommand.js +13 -3
- package/dist/cli/commands/inspect/commands/InspectGgufCommand.js.map +1 -1
- package/dist/cli/commands/inspect/commands/InspectGpuCommand.js +20 -10
- package/dist/cli/commands/inspect/commands/InspectGpuCommand.js.map +1 -1
- package/dist/cli/commands/inspect/commands/InspectMeasureCommand.d.ts +2 -0
- package/dist/cli/commands/inspect/commands/InspectMeasureCommand.js +234 -77
- package/dist/cli/commands/inspect/commands/InspectMeasureCommand.js.map +1 -1
- package/dist/cli/recommendedModels.js +11 -1
- package/dist/cli/recommendedModels.js.map +1 -1
- package/dist/cli/utils/ConsoleTable.d.ts +1 -0
- package/dist/cli/utils/ConsoleTable.js +5 -1
- package/dist/cli/utils/ConsoleTable.js.map +1 -1
- package/dist/cli/utils/interactivelyAskForModel.d.ts +2 -1
- package/dist/cli/utils/interactivelyAskForModel.js +16 -13
- package/dist/cli/utils/interactivelyAskForModel.js.map +1 -1
- package/dist/cli/utils/isRunningUnderRosetta.d.ts +1 -0
- package/dist/cli/utils/isRunningUnderRosetta.js +20 -0
- package/dist/cli/utils/isRunningUnderRosetta.js.map +1 -0
- package/dist/cli/utils/printCommonInfoLines.d.ts +4 -2
- package/dist/cli/utils/printCommonInfoLines.js +67 -5
- package/dist/cli/utils/printCommonInfoLines.js.map +1 -1
- package/dist/cli/utils/resolveCommandGgufPath.d.ts +3 -1
- package/dist/cli/utils/resolveCommandGgufPath.js +6 -5
- package/dist/cli/utils/resolveCommandGgufPath.js.map +1 -1
- package/dist/cli/utils/toBytes.d.ts +1 -0
- package/dist/cli/utils/toBytes.js +5 -0
- package/dist/cli/utils/toBytes.js.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/evaluator/LlamaChat/LlamaChat.d.ts +12 -3
- package/dist/evaluator/LlamaChat/LlamaChat.js +21 -7
- package/dist/evaluator/LlamaChat/LlamaChat.js.map +1 -1
- package/dist/evaluator/LlamaChatSession/LlamaChatSession.d.ts +6 -2
- package/dist/evaluator/LlamaChatSession/LlamaChatSession.js +3 -0
- package/dist/evaluator/LlamaChatSession/LlamaChatSession.js.map +1 -1
- package/dist/evaluator/LlamaCompletion.d.ts +3 -0
- package/dist/evaluator/LlamaCompletion.js +5 -0
- package/dist/evaluator/LlamaCompletion.js.map +1 -1
- package/dist/evaluator/LlamaContext/LlamaContext.d.ts +81 -38
- package/dist/evaluator/LlamaContext/LlamaContext.js +678 -132
- package/dist/evaluator/LlamaContext/LlamaContext.js.map +1 -1
- package/dist/evaluator/LlamaContext/TokenPredictor.d.ts +55 -0
- package/dist/evaluator/LlamaContext/TokenPredictor.js +20 -0
- package/dist/evaluator/LlamaContext/TokenPredictor.js.map +1 -0
- package/dist/evaluator/LlamaContext/tokenPredictors/DraftSequenceTokenPredictor.d.ts +56 -0
- package/dist/evaluator/LlamaContext/tokenPredictors/DraftSequenceTokenPredictor.js +266 -0
- package/dist/evaluator/LlamaContext/tokenPredictors/DraftSequenceTokenPredictor.js.map +1 -0
- package/dist/evaluator/LlamaContext/tokenPredictors/InputLookupTokenPredictor.d.ts +58 -0
- package/dist/evaluator/LlamaContext/tokenPredictors/InputLookupTokenPredictor.js +138 -0
- package/dist/evaluator/LlamaContext/tokenPredictors/InputLookupTokenPredictor.js.map +1 -0
- package/dist/evaluator/LlamaContext/types.d.ts +198 -5
- package/dist/evaluator/LlamaEmbeddingContext.d.ts +3 -0
- package/dist/evaluator/LlamaEmbeddingContext.js +3 -0
- package/dist/evaluator/LlamaEmbeddingContext.js.map +1 -1
- package/dist/evaluator/LlamaGrammar.d.ts +7 -1
- package/dist/evaluator/LlamaGrammar.js +6 -0
- package/dist/evaluator/LlamaGrammar.js.map +1 -1
- package/dist/evaluator/LlamaGrammarEvaluationState.d.ts +4 -4
- package/dist/evaluator/LlamaGrammarEvaluationState.js +16 -8
- package/dist/evaluator/LlamaGrammarEvaluationState.js.map +1 -1
- package/dist/evaluator/LlamaJsonSchemaGrammar.d.ts +5 -0
- package/dist/evaluator/LlamaJsonSchemaGrammar.js +7 -0
- package/dist/evaluator/LlamaJsonSchemaGrammar.js.map +1 -1
- package/dist/evaluator/LlamaModel/LlamaModel.d.ts +19 -11
- package/dist/evaluator/LlamaModel/LlamaModel.js +23 -29
- package/dist/evaluator/LlamaModel/LlamaModel.js.map +1 -1
- package/dist/evaluator/LlamaRankingContext.d.ts +76 -0
- package/dist/evaluator/LlamaRankingContext.js +158 -0
- package/dist/evaluator/LlamaRankingContext.js.map +1 -0
- package/dist/evaluator/TokenBias.d.ts +3 -0
- package/dist/evaluator/TokenBias.js +3 -0
- package/dist/evaluator/TokenBias.js.map +1 -1
- package/dist/evaluator/utils/chunkDocument.d.ts +86 -0
- package/dist/evaluator/utils/chunkDocument.js +212 -0
- package/dist/evaluator/utils/chunkDocument.js.map +1 -0
- package/dist/gguf/insights/GgufInsights.d.ts +3 -1
- package/dist/gguf/insights/GgufInsights.js +114 -8
- package/dist/gguf/insights/GgufInsights.js.map +1 -1
- package/dist/gguf/insights/GgufInsightsConfigurationResolver.d.ts +6 -3
- package/dist/gguf/insights/GgufInsightsConfigurationResolver.js +11 -7
- package/dist/gguf/insights/GgufInsightsConfigurationResolver.js.map +1 -1
- package/dist/gguf/insights/utils/resolveModelGpuLayersOption.d.ts +2 -1
- package/dist/gguf/insights/utils/resolveModelGpuLayersOption.js +13 -7
- package/dist/gguf/insights/utils/resolveModelGpuLayersOption.js.map +1 -1
- package/dist/gguf/parser/GgufV2Parser.js +29 -8
- package/dist/gguf/parser/GgufV2Parser.js.map +1 -1
- package/dist/gguf/parser/parseGguf.js +11 -11
- package/dist/gguf/parser/parseGguf.js.map +1 -1
- package/dist/gguf/readGgufFileInfo.js +8 -3
- package/dist/gguf/readGgufFileInfo.js.map +1 -1
- package/dist/gguf/types/GgufFileInfoTypes.d.ts +1 -0
- package/dist/gguf/types/GgufMetadataTypes.d.ts +9 -9
- package/dist/gguf/types/GgufMetadataTypes.js +1 -1
- package/dist/gguf/types/GgufMetadataTypes.js.map +1 -1
- package/dist/gguf/types/GgufTensorInfoTypes.d.ts +13 -0
- package/dist/gguf/types/GgufTensorInfoTypes.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/LlamaText.d.ts +4 -1
- package/dist/utils/LlamaText.js +4 -1
- package/dist/utils/LlamaText.js.map +1 -1
- package/dist/utils/cmake.js +23 -0
- package/dist/utils/cmake.js.map +1 -1
- package/dist/utils/pushAll.d.ts +1 -1
- package/dist/utils/pushAll.js.map +1 -1
- package/dist/utils/tokenizerUtils.js +1 -1
- package/dist/utils/utilTypes.d.ts +5 -0
- package/llama/CMakeLists.txt +25 -8
- package/llama/addon/AddonContext.cpp +196 -22
- package/llama/addon/AddonContext.h +1 -0
- package/llama/addon/AddonGrammar.cpp +1 -4
- package/llama/addon/AddonGrammarEvaluationState.cpp +16 -5
- package/llama/addon/AddonModel.cpp +31 -39
- package/llama/addon/AddonModel.h +1 -1
- package/llama/addon/AddonModelLora.cpp +2 -2
- package/llama/addon/AddonModelLora.h +1 -1
- package/llama/addon/AddonSampler.cpp +7 -12
- package/llama/addon/addon.cpp +26 -7
- package/llama/addon/globals/getGpuInfo.cpp +30 -5
- package/llama/addon/globals/getGpuInfo.h +6 -1
- package/llama/addon/globals/getMemoryInfo.cpp +63 -0
- package/llama/addon/globals/getMemoryInfo.h +4 -0
- package/llama/binariesGithubRelease.json +1 -1
- package/llama/cmake/win32.ensureNinjaPath.cmake +68 -0
- package/llama/cmake/win32.ensureNodeLib.cmake +34 -0
- package/llama/cmake/win32.llvmApplyGnuModeAdaptations.cmake +12 -0
- package/llama/cmake/win32.llvmEnsureCmakeAr.cmake +37 -0
- package/llama/cmake/win32.llvmUseGnuModeCompilers.cmake +87 -0
- package/llama/cmake/win32.programFilesPaths.cmake +35 -0
- package/llama/gitRelease.bundle +0 -0
- package/llama/gpuInfo/vulkan-gpu-info.cpp +29 -2
- package/llama/gpuInfo/vulkan-gpu-info.h +1 -0
- package/llama/llama.cpp.info.json +1 -1
- package/llama/profiles/llvm.win32.host-arm64.target-arm64.cmake +14 -0
- package/llama/profiles/llvm.win32.host-x64.target-arm64.cmake +14 -0
- package/llama/profiles/llvm.win32.host-x64.target-x64.cmake +14 -0
- package/llama/toolchains/llvm.win32.host-x64.target-x64.cmake +20 -0
- package/llama/toolchains/win32.host-arm64.target-arm64.cmake +21 -0
- package/llama/toolchains/win32.host-x64.target-arm64.cmake +14 -34
- package/package.json +47 -44
- package/templates/README.md +1 -1
- package/templates/packed/electron-typescript-react.json +1 -1
- package/templates/packed/node-typescript.json +1 -1
|
@@ -30,7 +30,7 @@ class AddonModelLoraUnloadLoraWorker : public Napi::AsyncWorker {
|
|
|
30
30
|
} catch (const std::exception& e) {
|
|
31
31
|
SetError(e.what());
|
|
32
32
|
} catch(...) {
|
|
33
|
-
SetError("Unknown error when calling \"
|
|
33
|
+
SetError("Unknown error when calling \"llama_adapter_lora_free\"");
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
void OnOK() {
|
|
@@ -55,7 +55,7 @@ void AddonModelLora::dispose(bool skipErase) {
|
|
|
55
55
|
if (lora_adapter != nullptr) {
|
|
56
56
|
auto loraAdapterToDispose = lora_adapter;
|
|
57
57
|
lora_adapter = nullptr;
|
|
58
|
-
|
|
58
|
+
llama_adapter_lora_free(loraAdapterToDispose);
|
|
59
59
|
|
|
60
60
|
if (!skipErase && model->data != nullptr) {
|
|
61
61
|
model->data->removeLora(this);
|
|
@@ -10,8 +10,8 @@ AddonSampler::AddonSampler(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Ad
|
|
|
10
10
|
model = Napi::ObjectWrap<AddonModel>::Unwrap(info[0].As<Napi::Object>());
|
|
11
11
|
model->Ref();
|
|
12
12
|
|
|
13
|
-
tokenCandidates.resize(
|
|
14
|
-
tokenCandidates.reserve(
|
|
13
|
+
tokenCandidates.resize(llama_vocab_n_tokens(model->vocab));
|
|
14
|
+
tokenCandidates.reserve(llama_vocab_n_tokens(model->vocab));
|
|
15
15
|
}
|
|
16
16
|
AddonSampler::~AddonSampler() {
|
|
17
17
|
dispose();
|
|
@@ -142,7 +142,7 @@ void AddonSampler::acceptToken(llama_token token) {
|
|
|
142
142
|
repeatPenalty_lastTokens.push_back(token);
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
-
if (grammarEvaluationState != nullptr && grammarEvaluationState->sampler != nullptr && !
|
|
145
|
+
if (grammarEvaluationState != nullptr && grammarEvaluationState->sampler != nullptr && !llama_vocab_is_eog(model->vocab, token)) {
|
|
146
146
|
llama_sampler_accept(grammarEvaluationState->sampler, token);
|
|
147
147
|
}
|
|
148
148
|
}
|
|
@@ -231,8 +231,8 @@ Napi::Value AddonSampler::ApplyConfig(const Napi::CallbackInfo& info) {
|
|
|
231
231
|
}
|
|
232
232
|
|
|
233
233
|
const int32_t resolved_top_k = topKSampler_topK <= 0
|
|
234
|
-
?
|
|
235
|
-
: std::min(topKSampler_topK,
|
|
234
|
+
? llama_vocab_n_tokens(model->vocab)
|
|
235
|
+
: std::min(topKSampler_topK, llama_vocab_n_tokens(model->vocab));
|
|
236
236
|
|
|
237
237
|
topKSampler = llama_sampler_init_top_k(resolved_top_k);
|
|
238
238
|
}
|
|
@@ -350,15 +350,10 @@ Napi::Value AddonSampler::ApplyConfig(const Napi::CallbackInfo& info) {
|
|
|
350
350
|
|
|
351
351
|
if (shouldCreateSampler) {
|
|
352
352
|
repeatPenaltySampler = llama_sampler_init_penalties(
|
|
353
|
-
llama_n_vocab(model->model),
|
|
354
|
-
llama_token_eos(model->model),
|
|
355
|
-
llama_token_nl(model->model),
|
|
356
353
|
repeatPenaltyMaxTokens,
|
|
357
354
|
repeatPenalty,
|
|
358
355
|
repeatPenaltyFrequencyPenalty,
|
|
359
|
-
repeatPenaltyPresencePenalty
|
|
360
|
-
true,
|
|
361
|
-
false
|
|
356
|
+
repeatPenaltyPresencePenalty
|
|
362
357
|
);
|
|
363
358
|
repeatPenalty_lastTokens = RingBuffer<llama_token>(repeatPenaltyMaxTokens);
|
|
364
359
|
|
|
@@ -409,7 +404,7 @@ Napi::Value AddonSampler::ApplyConfig(const Napi::CallbackInfo& info) {
|
|
|
409
404
|
}
|
|
410
405
|
|
|
411
406
|
tokenBiasSampler = llama_sampler_init_logit_bias(
|
|
412
|
-
|
|
407
|
+
llama_vocab_n_tokens(model->vocab),
|
|
413
408
|
tokenBiasSampler_biases.size(),
|
|
414
409
|
tokenBiasSampler_biases.data()
|
|
415
410
|
);
|
package/llama/addon/addon.cpp
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
#include "globals/addonProgress.h"
|
|
10
10
|
#include "globals/getGpuInfo.h"
|
|
11
11
|
#include "globals/getSwapInfo.h"
|
|
12
|
+
#include "globals/getMemoryInfo.h"
|
|
12
13
|
|
|
13
14
|
bool backendInitialized = false;
|
|
14
15
|
bool backendDisposed = false;
|
|
@@ -25,6 +26,21 @@ Napi::Value addonGetSupportsMmap(const Napi::CallbackInfo& info) {
|
|
|
25
26
|
return Napi::Boolean::New(info.Env(), llama_supports_mmap());
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
Napi::Value addonGetGpuSupportsMmap(const Napi::CallbackInfo& info) {
|
|
30
|
+
const auto llamaSupportsMmap = llama_supports_mmap();
|
|
31
|
+
const auto gpuDevice = getGpuDevice().first;
|
|
32
|
+
|
|
33
|
+
if (gpuDevice == nullptr) {
|
|
34
|
+
return Napi::Boolean::New(info.Env(), false);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
ggml_backend_dev_props props;
|
|
38
|
+
ggml_backend_dev_get_props(gpuDevice, &props);
|
|
39
|
+
|
|
40
|
+
const bool gpuSupportsMmap = llama_supports_mmap() && props.caps.buffer_from_host_ptr;
|
|
41
|
+
return Napi::Boolean::New(info.Env(), gpuSupportsMmap);
|
|
42
|
+
}
|
|
43
|
+
|
|
28
44
|
Napi::Value addonGetSupportsMlock(const Napi::CallbackInfo& info) {
|
|
29
45
|
return Napi::Boolean::New(info.Env(), llama_supports_mlock());
|
|
30
46
|
}
|
|
@@ -152,16 +168,16 @@ class AddonBackendUnloadWorker : public Napi::AsyncWorker {
|
|
|
152
168
|
};
|
|
153
169
|
|
|
154
170
|
Napi::Value addonLoadBackends(const Napi::CallbackInfo& info) {
|
|
155
|
-
const
|
|
156
|
-
?
|
|
157
|
-
: info[0].
|
|
158
|
-
? info[0].As<Napi::
|
|
159
|
-
:
|
|
171
|
+
const std::string forceLoadLibrariesSearchPath = info.Length() == 0
|
|
172
|
+
? ""
|
|
173
|
+
: info[0].IsString()
|
|
174
|
+
? info[0].As<Napi::String>().Utf8Value()
|
|
175
|
+
: "";
|
|
160
176
|
|
|
161
177
|
ggml_backend_reg_count();
|
|
162
178
|
|
|
163
|
-
if (
|
|
164
|
-
|
|
179
|
+
if (forceLoadLibrariesSearchPath.length() > 0) {
|
|
180
|
+
ggml_backend_load_all_from_path(forceLoadLibrariesSearchPath.c_str());
|
|
165
181
|
}
|
|
166
182
|
|
|
167
183
|
return info.Env().Undefined();
|
|
@@ -210,6 +226,7 @@ Napi::Object registerCallback(Napi::Env env, Napi::Object exports) {
|
|
|
210
226
|
Napi::PropertyDescriptor::Function("systemInfo", systemInfo),
|
|
211
227
|
Napi::PropertyDescriptor::Function("getSupportsGpuOffloading", addonGetSupportsGpuOffloading),
|
|
212
228
|
Napi::PropertyDescriptor::Function("getSupportsMmap", addonGetSupportsMmap),
|
|
229
|
+
Napi::PropertyDescriptor::Function("getGpuSupportsMmap", addonGetGpuSupportsMmap),
|
|
213
230
|
Napi::PropertyDescriptor::Function("getSupportsMlock", addonGetSupportsMlock),
|
|
214
231
|
Napi::PropertyDescriptor::Function("getMathCores", addonGetMathCores),
|
|
215
232
|
Napi::PropertyDescriptor::Function("getBlockSizeForGgmlType", addonGetBlockSizeForGgmlType),
|
|
@@ -220,7 +237,9 @@ Napi::Object registerCallback(Napi::Env env, Napi::Object exports) {
|
|
|
220
237
|
Napi::PropertyDescriptor::Function("getGpuVramInfo", getGpuVramInfo),
|
|
221
238
|
Napi::PropertyDescriptor::Function("getGpuDeviceInfo", getGpuDeviceInfo),
|
|
222
239
|
Napi::PropertyDescriptor::Function("getGpuType", getGpuType),
|
|
240
|
+
Napi::PropertyDescriptor::Function("ensureGpuDeviceIsSupported", ensureGpuDeviceIsSupported),
|
|
223
241
|
Napi::PropertyDescriptor::Function("getSwapInfo", getSwapInfo),
|
|
242
|
+
Napi::PropertyDescriptor::Function("getMemoryInfo", getMemoryInfo),
|
|
224
243
|
Napi::PropertyDescriptor::Function("loadBackends", addonLoadBackends),
|
|
225
244
|
Napi::PropertyDescriptor::Function("init", addonInit),
|
|
226
245
|
Napi::PropertyDescriptor::Function("dispose", addonDispose),
|
|
@@ -89,17 +89,17 @@ Napi::Value getGpuDeviceInfo(const Napi::CallbackInfo& info) {
|
|
|
89
89
|
return result;
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
std::pair<ggml_backend_dev_t, std::string> getGpuDevice() {
|
|
93
93
|
for (size_t i = 0; i < ggml_backend_dev_count(); i++) {
|
|
94
94
|
ggml_backend_dev_t device = ggml_backend_dev_get(i);
|
|
95
95
|
const auto deviceName = std::string(ggml_backend_dev_name(device));
|
|
96
96
|
|
|
97
97
|
if (deviceName == "Metal") {
|
|
98
|
-
return
|
|
98
|
+
return std::pair<ggml_backend_dev_t, std::string>(device, "metal");
|
|
99
99
|
} else if (std::string(deviceName).find("Vulkan") == 0) {
|
|
100
|
-
return
|
|
100
|
+
return std::pair<ggml_backend_dev_t, std::string>(device, "vulkan");
|
|
101
101
|
} else if (std::string(deviceName).find("CUDA") == 0 || std::string(deviceName).find("ROCm") == 0 || std::string(deviceName).find("MUSA") == 0) {
|
|
102
|
-
return
|
|
102
|
+
return std::pair<ggml_backend_dev_t, std::string>(device, "cuda");
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
|
|
@@ -108,9 +108,34 @@ Napi::Value getGpuType(const Napi::CallbackInfo& info) {
|
|
|
108
108
|
const auto deviceName = std::string(ggml_backend_dev_name(device));
|
|
109
109
|
|
|
110
110
|
if (deviceName == "CPU") {
|
|
111
|
-
return
|
|
111
|
+
return std::pair<ggml_backend_dev_t, std::string>(device, "cpu");
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
return std::pair<ggml_backend_dev_t, std::string>(nullptr, "");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
Napi::Value getGpuType(const Napi::CallbackInfo& info) {
|
|
119
|
+
const auto gpuDeviceRes = getGpuDevice();
|
|
120
|
+
const auto device = gpuDeviceRes.first;
|
|
121
|
+
const auto deviceType = gpuDeviceRes.second;
|
|
122
|
+
|
|
123
|
+
if (deviceType == "cpu") {
|
|
124
|
+
return Napi::Boolean::New(info.Env(), false);
|
|
125
|
+
} else if (device != nullptr && deviceType != "") {
|
|
126
|
+
return Napi::String::New(info.Env(), deviceType);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return info.Env().Undefined();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
Napi::Value ensureGpuDeviceIsSupported(const Napi::CallbackInfo& info) {
|
|
133
|
+
#ifdef GPU_INFO_USE_VULKAN
|
|
134
|
+
if (!checkIsVulkanEnvSupported(logVulkanWarning)) {
|
|
135
|
+
Napi::Error::New(info.Env(), "Vulkan device is not supported").ThrowAsJavaScriptException();
|
|
136
|
+
return info.Env().Undefined();
|
|
137
|
+
}
|
|
138
|
+
#endif
|
|
139
|
+
|
|
115
140
|
return info.Env().Undefined();
|
|
116
141
|
}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
#pragma once
|
|
2
|
+
#include <utility>
|
|
3
|
+
#include <string>
|
|
2
4
|
#include "napi.h"
|
|
5
|
+
#include "llama.h"
|
|
3
6
|
|
|
4
7
|
Napi::Value getGpuVramInfo(const Napi::CallbackInfo& info);
|
|
5
8
|
Napi::Value getGpuDeviceInfo(const Napi::CallbackInfo& info);
|
|
6
|
-
|
|
9
|
+
std::pair<ggml_backend_dev_t, std::string> getGpuDevice();
|
|
10
|
+
Napi::Value getGpuType(const Napi::CallbackInfo& info);
|
|
11
|
+
Napi::Value ensureGpuDeviceIsSupported(const Napi::CallbackInfo& info);
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#include "getMemoryInfo.h"
|
|
2
|
+
#include "addonLog.h"
|
|
3
|
+
|
|
4
|
+
#ifdef __APPLE__
|
|
5
|
+
#include <iostream>
|
|
6
|
+
#include <mach/mach.h>
|
|
7
|
+
#include <sys/sysctl.h>
|
|
8
|
+
#elif __linux__
|
|
9
|
+
#include <fstream>
|
|
10
|
+
#include <sstream>
|
|
11
|
+
#include <string>
|
|
12
|
+
#elif _WIN32
|
|
13
|
+
#include <iostream>
|
|
14
|
+
#include <windows.h>
|
|
15
|
+
#include <psapi.h>
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
Napi::Value getMemoryInfo(const Napi::CallbackInfo& info) {
|
|
20
|
+
uint64_t totalMemoryUsage = 0;
|
|
21
|
+
|
|
22
|
+
#ifdef __APPLE__
|
|
23
|
+
struct mach_task_basic_info taskInfo;
|
|
24
|
+
mach_msg_type_number_t infoCount = MACH_TASK_BASIC_INFO_COUNT;
|
|
25
|
+
if (task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&taskInfo, &infoCount) == KERN_SUCCESS) {
|
|
26
|
+
totalMemoryUsage = taskInfo.virtual_size;
|
|
27
|
+
} else {
|
|
28
|
+
addonLlamaCppLogCallback(GGML_LOG_LEVEL_ERROR, std::string("Failed to get memory usage info").c_str(), nullptr);
|
|
29
|
+
}
|
|
30
|
+
#elif __linux__
|
|
31
|
+
std::ifstream procStatus("/proc/self/status");
|
|
32
|
+
std::string line;
|
|
33
|
+
bool foundMemoryUsage = false;
|
|
34
|
+
while (std::getline(procStatus, line)) {
|
|
35
|
+
if (line.rfind("VmSize:", 0) == 0) { // Resident Set Size (current memory usage)
|
|
36
|
+
std::istringstream iss(line);
|
|
37
|
+
std::string key, unit;
|
|
38
|
+
size_t value;
|
|
39
|
+
if (iss >> key >> value >> unit) {
|
|
40
|
+
totalMemoryUsage = value * 1024; // Convert from kB to bytes
|
|
41
|
+
foundMemoryUsage = true;
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!foundMemoryUsage) {
|
|
48
|
+
addonLlamaCppLogCallback(GGML_LOG_LEVEL_ERROR, std::string("Failed to get memory usage info").c_str(), nullptr);
|
|
49
|
+
}
|
|
50
|
+
#elif _WIN32
|
|
51
|
+
PROCESS_MEMORY_COUNTERS_EX memCounters;
|
|
52
|
+
|
|
53
|
+
if (GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&memCounters, sizeof(memCounters))) {
|
|
54
|
+
totalMemoryUsage = memCounters.PrivateUsage;
|
|
55
|
+
} else {
|
|
56
|
+
addonLlamaCppLogCallback(GGML_LOG_LEVEL_ERROR, std::string("Failed to get memory usage info").c_str(), nullptr);
|
|
57
|
+
}
|
|
58
|
+
#endif
|
|
59
|
+
|
|
60
|
+
Napi::Object obj = Napi::Object::New(info.Env());
|
|
61
|
+
obj.Set("total", Napi::Number::New(info.Env(), totalMemoryUsage));
|
|
62
|
+
return obj;
|
|
63
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
function(ensureNinjaPath)
|
|
2
|
+
if ((NOT DEFINED CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}" OR NOT CMAKE_MAKE_PROGRAM) AND (CMAKE_GENERATOR STREQUAL "Ninja" OR CMAKE_GENERATOR STREQUAL "Ninja Multi-Config"))
|
|
3
|
+
find_program(NINJA_EXECUTABLE ninja)
|
|
4
|
+
|
|
5
|
+
set(CMAKE_MAKE_PROGRAM "")
|
|
6
|
+
set(CMAKE_MAKE_PROGRAM "" PARENT_SCOPE)
|
|
7
|
+
|
|
8
|
+
if(NINJA_EXECUTABLE AND EXISTS "${NINJA_EXECUTABLE}")
|
|
9
|
+
set(CMAKE_MAKE_PROGRAM "${NINJA_EXECUTABLE}")
|
|
10
|
+
set(CMAKE_MAKE_PROGRAM "${NINJA_EXECUTABLE}" CACHE FILEPATH "Make program")
|
|
11
|
+
set(CMAKE_MAKE_PROGRAM "${NINJA_EXECUTABLE}" PARENT_SCOPE)
|
|
12
|
+
endif()
|
|
13
|
+
|
|
14
|
+
if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}")
|
|
15
|
+
set(PROGRAMDATA_PATH "$ENV{ProgramData}")
|
|
16
|
+
file(TO_CMAKE_PATH "${PROGRAMDATA_PATH}" PROGRAMDATA_PATH)
|
|
17
|
+
|
|
18
|
+
if (PROGRAMDATA_PATH AND EXISTS "${PROGRAMDATA_PATH}")
|
|
19
|
+
file(GLOB_RECURSE FOUND_NINJA_EXE "${PROGRAMDATA_PATH}/chocolatey/bin/ninja.exe")
|
|
20
|
+
|
|
21
|
+
if(FOUND_NINJA_EXE)
|
|
22
|
+
list(GET FOUND_NINJA_EXE 0 FOUND_CMAKE_MAKE_PROGRAM)
|
|
23
|
+
set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}")
|
|
24
|
+
set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}" CACHE FILEPATH "Make program")
|
|
25
|
+
set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}" PARENT_SCOPE)
|
|
26
|
+
endif()
|
|
27
|
+
endif()
|
|
28
|
+
endif()
|
|
29
|
+
|
|
30
|
+
if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}")
|
|
31
|
+
set(LOCALAPPDATA_PATH "$ENV{LOCALAPPDATA}")
|
|
32
|
+
file(TO_CMAKE_PATH "${LOCALAPPDATA_PATH}" LOCALAPPDATA_PATH)
|
|
33
|
+
|
|
34
|
+
if (LOCALAPPDATA_PATH AND EXISTS "${LOCALAPPDATA_PATH}")
|
|
35
|
+
file(GLOB_RECURSE FOUND_NINJA_EXE "${LOCALAPPDATA_PATH}/Microsoft/WinGet/Packages/Ninja-build.Ninja_Microsoft.Winget.*/ninja.exe")
|
|
36
|
+
|
|
37
|
+
if(FOUND_NINJA_EXE)
|
|
38
|
+
list(GET FOUND_NINJA_EXE 0 FOUND_CMAKE_MAKE_PROGRAM)
|
|
39
|
+
set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}")
|
|
40
|
+
set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}" CACHE FILEPATH "Make program")
|
|
41
|
+
set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}" PARENT_SCOPE)
|
|
42
|
+
endif()
|
|
43
|
+
endif()
|
|
44
|
+
endif()
|
|
45
|
+
|
|
46
|
+
if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}")
|
|
47
|
+
foreach(PATH IN LISTS PROGRAMFILES_PATHS)
|
|
48
|
+
file(GLOB_RECURSE FOUND_NINJA_EXE
|
|
49
|
+
"${PATH}/Microsoft Visual Studio/*/CMake/Ninja/ninja.exe"
|
|
50
|
+
"${PATH}/Microsoft Visual Studio/**/*/CMake/Ninja/ninja.exe"
|
|
51
|
+
"${PATH}/Microsoft Visual Studio/*/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe"
|
|
52
|
+
"${PATH}/Microsoft Visual Studio/**/*/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe")
|
|
53
|
+
|
|
54
|
+
if(FOUND_NINJA_EXE)
|
|
55
|
+
list(GET FOUND_NINJA_EXE 0 FOUND_CMAKE_MAKE_PROGRAM)
|
|
56
|
+
set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}")
|
|
57
|
+
set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}" CACHE FILEPATH "Make program")
|
|
58
|
+
set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}" PARENT_SCOPE)
|
|
59
|
+
break()
|
|
60
|
+
endif()
|
|
61
|
+
endforeach()
|
|
62
|
+
endif()
|
|
63
|
+
|
|
64
|
+
if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}")
|
|
65
|
+
message(FATAL_ERROR "Ninja build system not found. Please install Ninja or Visual Studio Build Tools.")
|
|
66
|
+
endif()
|
|
67
|
+
endif()
|
|
68
|
+
endfunction()
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
function(ensureNodeLib HOST_ARCH TARGET_ARCH)
|
|
2
|
+
if (CMAKE_JS_NODELIB_DEF AND CMAKE_JS_NODELIB_TARGET)
|
|
3
|
+
if (NOT DEFINED NODE_LIB_CMAKE_AR)
|
|
4
|
+
foreach(PATH IN LISTS PROGRAMFILES_PATHS)
|
|
5
|
+
if(NODE_LIB_CMAKE_AR)
|
|
6
|
+
break()
|
|
7
|
+
endif()
|
|
8
|
+
|
|
9
|
+
file(GLOB_RECURSE FOUND_LIB_EXE
|
|
10
|
+
"${PATH}/Microsoft Visual Studio/*/VC/Tools/MSVC/*/bin/Host${HOST_ARCH}/${TARGET_ARCH}/lib.exe"
|
|
11
|
+
"${PATH}/Microsoft Visual Studio/**/*/VC/Tools/MSVC/*/bin/Host${HOST_ARCH}/${TARGET_ARCH}/lib.exe")
|
|
12
|
+
|
|
13
|
+
if(FOUND_LIB_EXE)
|
|
14
|
+
list(GET FOUND_LIB_EXE 0 NODE_LIB_CMAKE_AR)
|
|
15
|
+
break()
|
|
16
|
+
endif()
|
|
17
|
+
endforeach()
|
|
18
|
+
endif()
|
|
19
|
+
|
|
20
|
+
set(NODE_LIB_CMAKE_AR_MACHINE_FLAG "")
|
|
21
|
+
if (TARGET_ARCH STREQUAL "x64")
|
|
22
|
+
set(NODE_LIB_CMAKE_AR_MACHINE_FLAG "/MACHINE:X64")
|
|
23
|
+
elseif (TARGET_ARCH STREQUAL "arm64")
|
|
24
|
+
set(NODE_LIB_CMAKE_AR_MACHINE_FLAG "/MACHINE:ARM64")
|
|
25
|
+
endif()
|
|
26
|
+
|
|
27
|
+
if (EXISTS "${NODE_LIB_CMAKE_AR}")
|
|
28
|
+
# Generate node.lib
|
|
29
|
+
execute_process(COMMAND ${NODE_LIB_CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS} ${NODE_LIB_CMAKE_AR_MACHINE_FLAG} /nologo)
|
|
30
|
+
else()
|
|
31
|
+
message(FATAL_ERROR "Windows Resource Compiler (lib.exe) not found. Please install Visual Studio Build Tools.")
|
|
32
|
+
endif()
|
|
33
|
+
endif()
|
|
34
|
+
endfunction()
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
function(llvmApplyGnuModeAdaptations)
|
|
2
|
+
# adapt cmake-js to work with llvm in GNU mode
|
|
3
|
+
if (NOT CMAKE_SHARED_LINKER_FLAGS MATCHES "-Xlinker /DELAYLOAD:NODE.EXE")
|
|
4
|
+
string(REPLACE "/DELAYLOAD:NODE.EXE" "-Xlinker /DELAYLOAD:NODE.EXE -Xlinker /defaultlib:delayimp"
|
|
5
|
+
UPDATED_CMAKE_SHARED_LINKER_FLAGS
|
|
6
|
+
"${CMAKE_SHARED_LINKER_FLAGS}")
|
|
7
|
+
set(CMAKE_SHARED_LINKER_FLAGS "${UPDATED_CMAKE_SHARED_LINKER_FLAGS}" PARENT_SCOPE)
|
|
8
|
+
endif()
|
|
9
|
+
|
|
10
|
+
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Xclang --dependent-lib=msvcrt" PARENT_SCOPE)
|
|
11
|
+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Xclang --dependent-lib=msvcrt" PARENT_SCOPE)
|
|
12
|
+
endfunction()
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
function(llvmEnsureCmakeAr CURRENT_ARCH)
|
|
2
|
+
set (LLVM_DIR_ARCH_NAME "")
|
|
3
|
+
if (CURRENT_ARCH STREQUAL "x64")
|
|
4
|
+
set (LLVM_DIR_ARCH_NAME "x64")
|
|
5
|
+
elseif (CURRENT_ARCH STREQUAL "arm64")
|
|
6
|
+
set (LLVM_DIR_ARCH_NAME "ARM64")
|
|
7
|
+
endif()
|
|
8
|
+
|
|
9
|
+
if (NOT DEFINED CMAKE_AR OR NOT EXISTS "${CMAKE_AR}")
|
|
10
|
+
set(LLVM_INSTALL_PATHS "")
|
|
11
|
+
foreach(PATH IN LISTS PROGRAMFILES_PATHS)
|
|
12
|
+
list(APPEND LLVM_INSTALL_PATHS "${PATH}/LLVM")
|
|
13
|
+
|
|
14
|
+
file(GLOB_RECURSE FOUND_LLVM_ROOT LIST_DIRECTORIES true
|
|
15
|
+
"${PATH}/Microsoft Visual Studio/*/VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}"
|
|
16
|
+
"${PATH}/Microsoft Visual Studio/**/*/VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}")
|
|
17
|
+
list(FILTER FOUND_LLVM_ROOT INCLUDE REGEX "VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}$")
|
|
18
|
+
|
|
19
|
+
if(FOUND_LLVM_ROOT)
|
|
20
|
+
list(APPEND LLVM_INSTALL_PATHS ${FOUND_LLVM_ROOT})
|
|
21
|
+
endif()
|
|
22
|
+
endforeach()
|
|
23
|
+
|
|
24
|
+
if(DEFINED LLVM_ROOT AND EXISTS "${LLVM_ROOT}")
|
|
25
|
+
list(INSERT LLVM_INSTALL_PATHS 0 "${LLVM_ROOT}")
|
|
26
|
+
endif()
|
|
27
|
+
|
|
28
|
+
list(REMOVE_DUPLICATES LLVM_INSTALL_PATHS)
|
|
29
|
+
|
|
30
|
+
foreach(PATH IN LISTS LLVM_INSTALL_PATHS)
|
|
31
|
+
if(EXISTS "${PATH}/bin/llvm-ar.exe" AND EXISTS "${PATH}/bin/llvm-ar.exe")
|
|
32
|
+
set(CMAKE_AR "${PATH}/bin/llvm-ar.exe" PARENT_SCOPE)
|
|
33
|
+
break()
|
|
34
|
+
endif()
|
|
35
|
+
endforeach()
|
|
36
|
+
endif()
|
|
37
|
+
endfunction()
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
function(llvmUseGnuModeCompilers CURRENT_ARCH)
|
|
2
|
+
set(LLVM_INSTALLATION_URL "https://github.com/llvm/llvm-project/releases/tag/llvmorg-19.1.5")
|
|
3
|
+
|
|
4
|
+
set(CMAKE_C_COMPILER clang)
|
|
5
|
+
set(CMAKE_C_COMPILER clang PARENT_SCOPE)
|
|
6
|
+
set(CMAKE_CXX_COMPILER clang++)
|
|
7
|
+
set(CMAKE_CXX_COMPILER clang++ PARENT_SCOPE)
|
|
8
|
+
set(CMAKE_RC_COMPILER llvm-rc)
|
|
9
|
+
set(CMAKE_RC_COMPILER llvm-rc PARENT_SCOPE)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
set (LLVM_DIR_ARCH_NAME "")
|
|
13
|
+
if (CURRENT_ARCH STREQUAL "x64")
|
|
14
|
+
set (LLVM_DIR_ARCH_NAME "x64")
|
|
15
|
+
elseif (CURRENT_ARCH STREQUAL "arm64")
|
|
16
|
+
set (LLVM_DIR_ARCH_NAME "ARM64")
|
|
17
|
+
endif()
|
|
18
|
+
|
|
19
|
+
set(LLVM_INSTALL_PATHS "")
|
|
20
|
+
foreach(PATH IN LISTS PROGRAMFILES_PATHS)
|
|
21
|
+
list(APPEND LLVM_INSTALL_PATHS "${PATH}/LLVM")
|
|
22
|
+
|
|
23
|
+
file(GLOB_RECURSE FOUND_LLVM_ROOT LIST_DIRECTORIES true
|
|
24
|
+
"${PATH}/Microsoft Visual Studio/*/VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}"
|
|
25
|
+
"${PATH}/Microsoft Visual Studio/**/*/VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}")
|
|
26
|
+
list(FILTER FOUND_LLVM_ROOT INCLUDE REGEX "VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}$")
|
|
27
|
+
|
|
28
|
+
if(FOUND_LLVM_ROOT)
|
|
29
|
+
list(APPEND LLVM_INSTALL_PATHS ${FOUND_LLVM_ROOT})
|
|
30
|
+
endif()
|
|
31
|
+
endforeach()
|
|
32
|
+
|
|
33
|
+
if(DEFINED LLVM_ROOT AND EXISTS "${LLVM_ROOT}")
|
|
34
|
+
list(INSERT LLVM_INSTALL_PATHS 0 "${LLVM_ROOT}")
|
|
35
|
+
endif()
|
|
36
|
+
|
|
37
|
+
list(REMOVE_DUPLICATES LLVM_INSTALL_PATHS)
|
|
38
|
+
|
|
39
|
+
set(LLVM_ROOT "")
|
|
40
|
+
set(LLVM_ROOT "" PARENT_SCOPE)
|
|
41
|
+
foreach(PATH IN LISTS LLVM_INSTALL_PATHS)
|
|
42
|
+
if(EXISTS "${PATH}/bin/clang.exe" AND EXISTS "${PATH}/bin/clang++.exe" AND EXISTS "${PATH}/bin/llvm-rc.exe")
|
|
43
|
+
set(LLVM_ROOT "${PATH}")
|
|
44
|
+
set(LLVM_ROOT "${PATH}" PARENT_SCOPE)
|
|
45
|
+
break()
|
|
46
|
+
endif()
|
|
47
|
+
endforeach()
|
|
48
|
+
|
|
49
|
+
if(LLVM_ROOT STREQUAL "")
|
|
50
|
+
if (CURRENT_ARCH STREQUAL "arm64")
|
|
51
|
+
message(FATAL_ERROR "LLVM installation was not found. Please install LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}")
|
|
52
|
+
else()
|
|
53
|
+
message(FATAL_ERROR "LLVM installation was not found. Please install LLVM: ${LLVM_INSTALLATION_URL}")
|
|
54
|
+
endif()
|
|
55
|
+
endif()
|
|
56
|
+
|
|
57
|
+
if (NOT EXISTS "${CMAKE_C_COMPILER}" OR NOT EXISTS "${CMAKE_CXX_COMPILER}" OR NOT EXISTS "${CMAKE_RC_COMPILER}")
|
|
58
|
+
set(CMAKE_C_COMPILER "${LLVM_ROOT}/bin/clang.exe")
|
|
59
|
+
set(CMAKE_C_COMPILER "${LLVM_ROOT}/bin/clang.exe" PARENT_SCOPE)
|
|
60
|
+
set(CMAKE_CXX_COMPILER "${LLVM_ROOT}/bin/clang++.exe")
|
|
61
|
+
set(CMAKE_CXX_COMPILER "${LLVM_ROOT}/bin/clang++.exe" PARENT_SCOPE)
|
|
62
|
+
set(CMAKE_RC_COMPILER "${LLVM_ROOT}/bin/llvm-rc.exe")
|
|
63
|
+
set(CMAKE_RC_COMPILER "${LLVM_ROOT}/bin/llvm-rc.exe" PARENT_SCOPE)
|
|
64
|
+
endif()
|
|
65
|
+
|
|
66
|
+
if (NOT EXISTS "${CMAKE_C_COMPILER}")
|
|
67
|
+
if (CURRENT_ARCH STREQUAL "arm64")
|
|
68
|
+
message(FATAL_ERROR "Clang compiler not found at ${CMAKE_C_COMPILER}. Please reinstall LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}")
|
|
69
|
+
else()
|
|
70
|
+
message(FATAL_ERROR "Clang compiler not found at ${CMAKE_C_COMPILER}. Please reinstall LLVM: ${LLVM_INSTALLATION_URL}")
|
|
71
|
+
endif()
|
|
72
|
+
endif()
|
|
73
|
+
if (NOT EXISTS "${CMAKE_CXX_COMPILER}")
|
|
74
|
+
if (CURRENT_ARCH STREQUAL "arm64")
|
|
75
|
+
message(FATAL_ERROR "Clang++ compiler not found at ${CMAKE_CXX_COMPILER}. Please reinstall LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}")
|
|
76
|
+
else()
|
|
77
|
+
message(FATAL_ERROR "Clang++ compiler not found at ${CMAKE_CXX_COMPILER}. Please reinstall LLVM: ${LLVM_INSTALLATION_URL}")
|
|
78
|
+
endif()
|
|
79
|
+
endif()
|
|
80
|
+
if (NOT EXISTS "${CMAKE_RC_COMPILER}")
|
|
81
|
+
if (CURRENT_ARCH STREQUAL "arm64")
|
|
82
|
+
message(FATAL_ERROR "LLVM Resource Compiler not found at ${CMAKE_RC_COMPILER}. Please reinstall LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}")
|
|
83
|
+
else()
|
|
84
|
+
message(FATAL_ERROR "LLVM Resource Compiler not found at ${CMAKE_RC_COMPILER}. Please reinstall LLVM: ${LLVM_INSTALLATION_URL}")
|
|
85
|
+
endif()
|
|
86
|
+
endif()
|
|
87
|
+
endfunction()
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
function(setProgramFilesPaths CURRENT_ARCH)
|
|
2
|
+
set(PROGRAMFILES_X86_ENV_NAME "ProgramFiles(x86)")
|
|
3
|
+
|
|
4
|
+
set(PROGRAMFILES "$ENV{ProgramFiles}")
|
|
5
|
+
set(PROGRAMFILES_X86 "$ENV{${PROGRAMFILES_X86_ENV_NAME}}")
|
|
6
|
+
file(TO_CMAKE_PATH "${PROGRAMFILES}" PROGRAMFILES)
|
|
7
|
+
file(TO_CMAKE_PATH "${PROGRAMFILES_X86}" PROGRAMFILES_X86)
|
|
8
|
+
|
|
9
|
+
if(CURRENT_ARCH STREQUAL "arm64")
|
|
10
|
+
set(PROGRAMFILES_ARM64_ENV_NAME "ProgramFiles(Arm)")
|
|
11
|
+
|
|
12
|
+
set(PROGRAMFILES_ARM64 "$ENV{${PROGRAMFILES_ARM64_ENV_NAME}}")
|
|
13
|
+
file(TO_CMAKE_PATH "${PROGRAMFILES_ARM64}" PROGRAMFILES_ARM64)
|
|
14
|
+
|
|
15
|
+
set(PROGRAMFILES_PATHS_LIST
|
|
16
|
+
"${PROGRAMFILES_ARM64}"
|
|
17
|
+
"${PROGRAMFILES}"
|
|
18
|
+
"${PROGRAMFILES_X86}"
|
|
19
|
+
"C:/Program Files (Arm)"
|
|
20
|
+
"C:/Program Files"
|
|
21
|
+
"C:/Program Files (x86)"
|
|
22
|
+
)
|
|
23
|
+
list(REMOVE_DUPLICATES PROGRAMFILES_PATHS_LIST)
|
|
24
|
+
set(PROGRAMFILES_PATHS ${PROGRAMFILES_PATHS_LIST} PARENT_SCOPE)
|
|
25
|
+
else()
|
|
26
|
+
set(PROGRAMFILES_PATHS_LIST
|
|
27
|
+
"${PROGRAMFILES}"
|
|
28
|
+
"${PROGRAMFILES_X86}"
|
|
29
|
+
"C:/Program Files"
|
|
30
|
+
"C:/Program Files (x86)"
|
|
31
|
+
)
|
|
32
|
+
list(REMOVE_DUPLICATES PROGRAMFILES_PATHS_LIST)
|
|
33
|
+
set(PROGRAMFILES_PATHS ${PROGRAMFILES_PATHS_LIST} PARENT_SCOPE)
|
|
34
|
+
endif()
|
|
35
|
+
endfunction()
|
package/llama/gitRelease.bundle
CHANGED
|
Binary file
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
typedef void (*gpuInfoVulkanWarningLogCallback_t)(const char* message);
|
|
7
7
|
|
|
8
|
-
static bool enumerateVulkanDevices(size_t* total, size_t* used, size_t* unifiedMemorySize, bool addDeviceNames, std::vector<std::string> * deviceNames, gpuInfoVulkanWarningLogCallback_t warningLogCallback) {
|
|
8
|
+
static bool enumerateVulkanDevices(size_t* total, size_t* used, size_t* unifiedMemorySize, bool addDeviceNames, std::vector<std::string> * deviceNames, gpuInfoVulkanWarningLogCallback_t warningLogCallback, bool * checkSupported) {
|
|
9
9
|
vk::ApplicationInfo appInfo("node-llama-cpp GPU info", 1, "llama.cpp", 1, VK_API_VERSION_1_2);
|
|
10
10
|
vk::InstanceCreateInfo createInfo(vk::InstanceCreateFlags(), &appInfo, {}, {});
|
|
11
11
|
vk::Instance instance = vk::createInstance(createInfo);
|
|
@@ -56,6 +56,22 @@ static bool enumerateVulkanDevices(size_t* total, size_t* used, size_t* unifiedM
|
|
|
56
56
|
if (size > 0 && addDeviceNames) {
|
|
57
57
|
(*deviceNames).push_back(std::string(deviceProps.deviceName.data()));
|
|
58
58
|
}
|
|
59
|
+
|
|
60
|
+
if (checkSupported != nullptr && checkSupported) {
|
|
61
|
+
VkPhysicalDeviceFeatures2 features2 = {};
|
|
62
|
+
features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
|
|
63
|
+
|
|
64
|
+
VkPhysicalDeviceVulkan11Features vk11Features = {};
|
|
65
|
+
vk11Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
|
|
66
|
+
features2.pNext = &vk11Features;
|
|
67
|
+
|
|
68
|
+
vkGetPhysicalDeviceFeatures2(physicalDevice, &features2);
|
|
69
|
+
VkPhysicalDeviceFeatures2 device_features2;
|
|
70
|
+
|
|
71
|
+
if (!vk11Features.storageBuffer16BitAccess) {
|
|
72
|
+
*checkSupported = false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
59
75
|
}
|
|
60
76
|
}
|
|
61
77
|
} else {
|
|
@@ -78,5 +94,16 @@ static bool enumerateVulkanDevices(size_t* total, size_t* used, size_t* unifiedM
|
|
|
78
94
|
}
|
|
79
95
|
|
|
80
96
|
bool gpuInfoGetTotalVulkanDevicesInfo(size_t* total, size_t* used, size_t* unifiedMemorySize, gpuInfoVulkanWarningLogCallback_t warningLogCallback) {
|
|
81
|
-
return enumerateVulkanDevices(total, used, unifiedMemorySize, false, nullptr, warningLogCallback);
|
|
97
|
+
return enumerateVulkanDevices(total, used, unifiedMemorySize, false, nullptr, warningLogCallback, nullptr);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
bool checkIsVulkanEnvSupported(gpuInfoVulkanWarningLogCallback_t warningLogCallback) {
|
|
101
|
+
size_t total = 0;
|
|
102
|
+
size_t used = 0;
|
|
103
|
+
size_t unifiedMemorySize = 0;
|
|
104
|
+
|
|
105
|
+
bool isSupported = true;
|
|
106
|
+
enumerateVulkanDevices(&total, &used, &unifiedMemorySize, false, nullptr, warningLogCallback, &isSupported);
|
|
107
|
+
|
|
108
|
+
return isSupported;
|
|
82
109
|
}
|
|
@@ -6,3 +6,4 @@
|
|
|
6
6
|
typedef void (*gpuInfoVulkanWarningLogCallback_t)(const char* message);
|
|
7
7
|
|
|
8
8
|
bool gpuInfoGetTotalVulkanDevicesInfo(size_t* total, size_t* used, size_t* unifiedMemorySize, gpuInfoVulkanWarningLogCallback_t warningLogCallback);
|
|
9
|
+
bool checkIsVulkanEnvSupported(gpuInfoVulkanWarningLogCallback_t warningLogCallback);
|