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
16 changes: 15 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,14 @@ set(BUILD_WEB_APP OFF CACHE BOOL "" FORCE)
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
add_subdirectory(third_party/lemonade EXCLUDE_FROM_ALL)

add_executable(onebit app/main.cpp)
add_executable(onebit app/main.cpp app/serve.cpp)
set_target_properties(onebit PROPERTIES OUTPUT_NAME 1bit)
target_link_libraries(onebit PRIVATE lemonade-server-core)

# ── `1bit serve` end to end (docs/serve.md) ───────────────────────────────
# Needs a GGUF (e.g. Qwen3-0.6B Q4_K_M); tests each device this build has.
set(ONEBIT_SERVE_TEST_GGUF "" CACHE FILEPATH "GGUF the serve_e2e tests load")

# ── Step 2: HRX + Vulkan in one llama.cpp build (docs/hrx.md) ─────────────
# Off by default: it needs TheRock/ROCm and the three HRX submodules, and it
# only runs on AMD GPUs. `1bit lemonade` then uses this llama-server for both
Expand All @@ -48,6 +52,12 @@ if(ONEBIT_HRX)
include(cmake/hrx.cmake)
add_dependencies(onebit llama_hrx)
target_compile_definitions(onebit PRIVATE ONEBIT_HRX_SERVER="${ONEBIT_HRX_SERVER}" ONEBIT_HRX_LIBHSA="${ONEBIT_HRX_LIBHSA}")
if(ONEBIT_SERVE_TEST_GGUF)
foreach(_dev vulkan hrx)
add_test(NAME serve_e2e_${_dev}
COMMAND ${CMAKE_SOURCE_DIR}/tests/serve_e2e.sh $<TARGET_FILE:onebit> ${ONEBIT_SERVE_TEST_GGUF} ${_dev})
endforeach()
endif()
add_test(NAME hrx_lemonade_e2e
COMMAND ${CMAKE_SOURCE_DIR}/tests/hrx_lemonade_e2e.sh $<TARGET_FILE:onebit> ${ONEBIT_HRX_SERVER})
endif()
Expand All @@ -70,6 +80,10 @@ if(ONEBIT_ZINC)
USES_TERMINAL)
add_dependencies(onebit zinc)
target_compile_definitions(onebit PRIVATE ONEBIT_ZINC_SERVER="${ONEBIT_ZINC_SERVER}")
if(ONEBIT_SERVE_TEST_GGUF)
add_test(NAME serve_e2e_zinc
COMMAND ${CMAKE_SOURCE_DIR}/tests/serve_e2e.sh $<TARGET_FILE:onebit> ${ONEBIT_SERVE_TEST_GGUF} zinc)
endif()
add_test(NAME zinc_lemonade_e2e
COMMAND ${CMAKE_SOURCE_DIR}/tests/zinc_lemonade_e2e.sh $<TARGET_FILE:onebit> ${ONEBIT_ZINC_SERVER})
endif()
Expand Down
10 changes: 10 additions & 0 deletions app/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include "model.h"
#include "unified.h"
#endif
#include "serve.h"

#include <chrono>
#include <cstdio>
Expand All @@ -61,6 +62,7 @@ void usage(FILE* out) {
"\n"
"commands:\n"
" lemonade [lemond options] run Lemonade's server with the engine behind it\n"
" serve -m <model> one model on any device, OpenAI-compatible API\n"
#ifdef ONEBIT_NPU
" unified -m <model dir> serve one NPU model (OpenAI endpoints)\n"
" npu-run [options] generate on the NPU fast lane (npu-run --help)\n"
Expand Down Expand Up @@ -237,6 +239,14 @@ int main(int argc, char** argv) {
for (int i = 2; i < argc; ++i) args.push_back(argv[i]);
return run_lemonade(static_cast<int>(args.size()), args.data());
}
if (cmd == "serve") {
try {
return onebit::run_serve(argc - 2, argv + 2);
} catch (const std::exception& e) {
std::fprintf(stderr, "1bit serve: %s\n", e.what());
return 1;
}
}
#ifdef ONEBIT_NPU
if (cmd == "unified") {
try {
Expand Down
Loading
Loading