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
4 changes: 4 additions & 0 deletions src/common/AutoModel/modeling_qwen2vl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
/************ Qwen2VL family **************/
Qwen2VL::Qwen2VL(xrt::device* npu_device_inst) : AutoModel(npu_device_inst, "Qwen2VL") {}

void Qwen2VL::set_special_flags(int resize) {
this->resize = resize;
}

void Qwen2VL::load_model(std::string model_path, json model_info, int default_context_length, bool enable_preemption) {
this->_shared_load_model(model_path, model_info, default_context_length, enable_preemption);

Expand Down
22 changes: 20 additions & 2 deletions src/common/AutoModel/modeling_qwen2vl_image.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -512,17 +512,35 @@ void Qwen2VL::preprocess_image(qwen2vl_image_t& image, std::vector<bf16> &pixel_
const int width = image.width;
const int height = image.height;
const int channels = 3; // RGB
int downscaled_height;
int downscaled_width;
int resized_height;
int resized_width;

//std::cout << "height " << height << " width " << width << std::endl;

int target_longest_edge = (resize == 0) ? 1080 : (resize == 1) ? 1920 : (resize == 2) ? 2560 : 0;

if (target_longest_edge > 0) {
float scale = target_longest_edge / static_cast<float>(std::max(height, width));
scale = std::min(scale, 1.0f);
downscaled_height = static_cast<int>(height * scale);
downscaled_width = static_cast<int>(width * scale);
}
else {
downscaled_height = height;
downscaled_width = width;
}

// do the automatically resizing in here
smart_resize(
height, width,
downscaled_height, downscaled_width,
resized_height, resized_width,
QWEN2_PATCH_SIZE * QWEN2_IMAGE_MERGE_SIZE,
QWEN2_SHORTEST_EDGE,
QWEN2_LONGEST_EDGE
);
// std::cout << "resized_height "<< resized_height << " resized_width " << resized_width <<std::endl;
//std::cout << "resized_height "<< resized_height << " resized_width " << resized_width <<std::endl;

// Use non-optimized path for consistent results across platforms
auto resize_image = imgproc::avx512::resize_bicubic_antialias_rgb_planar_avx512(
Expand Down
4 changes: 4 additions & 0 deletions src/common/AutoModel/modeling_qwen3vl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
/************ Qwen3VL family **************/
Qwen3VL::Qwen3VL(xrt::device* npu_device_inst) : AutoModel(npu_device_inst, "Qwen3VL") {}

void Qwen3VL::set_special_flags(int resize) {
this->resize = resize;
}

void Qwen3VL::load_model(std::string model_path, json model_info, int default_context_length, bool enable_preemption) {
this->_shared_load_model(model_path, model_info, default_context_length, enable_preemption);

Expand Down
25 changes: 22 additions & 3 deletions src/common/AutoModel/modeling_qwen3vl_image.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -512,17 +512,36 @@ void Qwen3VL::preprocess_image(qwen3vl_image_t& image, std::vector<bf16> &pixel_
const int width = image.width;
const int height = image.height;
const int channels = 3; // RGB
int downscaled_height;
int downscaled_width;
int resized_height;
int resized_width;
int resized_width;

//std::cout << "height "<< height << " width " << width <<std::endl;

int target_longest_edge = (resize == 0) ? 1080 : (resize == 1) ? 1920 : (resize == 2) ? 2560 : 0;

if (target_longest_edge > 0) {
float scale = target_longest_edge / static_cast<float>(std::max(height, width));
scale = std::min(scale, 1.0f);
downscaled_height = static_cast<int>(height * scale);
downscaled_width = static_cast<int>(width * scale);
}
else {
downscaled_height = height;
downscaled_width = width;
}

// do the automatically resizing in here
smart_resize(
height, width,
downscaled_height, downscaled_width,
resized_height, resized_width,
QWEN3_PATCH_SIZE * QWEN3_IMAGE_MERGE_SIZE,
QWEN3_SHORTEST_EDGE,
QWEN3_LONGEST_EDGE
);
// std::cout << "resized_height "<< resized_height << " resized_width " << resized_width <<std::endl;

//std::cout << "resized_height " << resized_height << " resized_width " << resized_width << std::endl;

// Cache size calculations for efficiency
const uint32_t single_frame_size = resized_height * resized_width * channels;
Expand Down
3 changes: 2 additions & 1 deletion src/include/AutoModel/automodel.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,8 @@ class AutoModel {
}

//************ Unique for each model *************/

virtual void set_special_flags(int) {}

virtual void load_model(std::string model_path, json model_info, int default_context_length = -1, bool enable_preemption = false) {}
virtual std::string generate(chat_meta_info_t& meta_info, int length_limit, std::ostream& os, std::function<bool()> is_cancelled = [] { return false; }) = 0;
virtual chat_template_type_t get_chat_template_type() {
Expand Down
4 changes: 3 additions & 1 deletion src/include/AutoModel/modeling_qwen2vl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ class Qwen2VL : public AutoModel {
qwen2vl_image_t load_image_base64(const std::string& base64_string);


int debug_count= 0;
int debug_count = 0;
int resize = 0;
void smart_resize(
int height, int width,
int& h_bar,int& w_bar,
Expand All @@ -59,6 +60,7 @@ class Qwen2VL : public AutoModel {
public:
Qwen2VL(xrt::device* npu_device_inst);

void set_special_flags(int resize) override;
void load_model(std::string model_path, json model_inf, int default_context_length = -1, bool enable_preemption = false) override;
//void toggle_enable_think() override;
bool insert(chat_meta_info_t& meta_info, lm_uniform_input_t& input) override;
Expand Down
7 changes: 5 additions & 2 deletions src/include/AutoModel/modeling_qwen3vl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,19 +47,22 @@ class Qwen3VL : public AutoModel {
qwen3vl_image_t load_image_base64(const std::string& base64_string);


int debug_count= 0;
int debug_count = 0;
int resize = 0;

void smart_resize(
int height, int width,
int& h_bar,int& w_bar,
int factor,
int min_pixels,
int max_pixels);

void preprocess_image(qwen3vl_image_t& image, std::vector<bf16> &pixel_values);
void preprocess_image(qwen3vl_image_t& image, std::vector<bf16> &pixel_values);

public:
Qwen3VL(xrt::device* npu_device_inst);

void set_special_flags(int resize) override;
void load_model(std::string model_path, json model_inf, int default_context_length = -1, bool enable_preemption = false) override;
//void toggle_enable_think() override;
bool insert(chat_meta_info_t& meta_info, lm_uniform_input_t& input) override;
Expand Down
5 changes: 5 additions & 0 deletions src/include/utils/vm_args.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ struct ParsedArgs {
bool quiet_list;
bool preemption;
int ctx_length;
int resize;
size_t max_socket_connections;
size_t max_npu_queue;
int port;
Expand Down Expand Up @@ -70,6 +71,8 @@ bool parse_options(int argc, char *argv[], ParsedArgs& parsed_args) {
("quiet", "Hide emojis in the model list (can be used with --filter)")
("ctx-len,c", po::value<int>(&parsed_args.ctx_length)->default_value(-1),
"Set context length")
("resize,r", po::value<int>(&parsed_args.resize)->default_value(0),
"Pre-resize the image")
("socket,s", po::value<size_t>(&parsed_args.max_socket_connections)->default_value(10),
"Set the maximum number of socket connections allowed (for serve command)")
("q-len,q", po::value<size_t>(&parsed_args.max_npu_queue)->default_value(10),
Expand Down Expand Up @@ -132,6 +135,7 @@ bool parse_options(int argc, char *argv[], ParsedArgs& parsed_args) {
std::cout << " " << argv[0] << " serve llama3.2:1b --cors 0" << std::endl;
std::cout << " " << argv[0] << " serve llama3.2:1b --asr 1" << std::endl;
std::cout << " " << argv[0] << " serve llama3.2:1b --embed 1" << std::endl;
std::cout << " " << argv[0] << " serve qwen3vl-it:4b --resize 0" << std::endl;
std::cout << " " << argv[0] << " list" << std::endl;
std::cout << " " << argv[0] << " list --quiet" << std::endl;
std::cout << " " << argv[0] << " list --filter installed" << std::endl;
Expand Down Expand Up @@ -176,6 +180,7 @@ bool parse_options(int argc, char *argv[], ParsedArgs& parsed_args) {
std::cout << " " << argv[0] << " serve llama3.2:1b --cors 0" << std::endl;
std::cout << " " << argv[0] << " serve llama3.2:1b --asr 1" << std::endl;
std::cout << " " << argv[0] << " serve llama3.2:1b --embed 1" << std::endl;
std::cout << " " << argv[0] << " serve qwen3vl-it:4b --resize 0" << std::endl;
std::cout << " " << argv[0] << " list" << std::endl;
std::cout << " " << argv[0] << " list --quiet" << std::endl;
std::cout << " " << argv[0] << " list --filter installed" << std::endl;
Expand Down
3 changes: 2 additions & 1 deletion src/runner/runner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ std::map<std::string, runner_cmd_t> cmd_map = {
/// \param supported_models - the list of supported models
/// \param downloader - the downloader for the models
/// \param tag - the tag of the model to load
Runner::Runner(model_list& supported_models, ModelDownloader& downloader, std::string& tag, bool asr, bool embed, int ctx_length, bool preemption)
Runner::Runner(model_list& supported_models, ModelDownloader& downloader, std::string& tag, bool asr, bool embed, int ctx_length, int resize, bool preemption)
: supported_models(supported_models), downloader(downloader), tag(tag), asr(asr), embed(embed) {

this->npu_device_inst = xrt::device(0);
Expand Down Expand Up @@ -83,6 +83,7 @@ Runner::Runner(model_list& supported_models, ModelDownloader& downloader, std::s
this->downloader.pull_model(this->tag);
}
auto [new_tag, model_info] = this->supported_models.get_model_info(this->tag);
this->auto_chat_engine->set_special_flags(resize);
this->auto_chat_engine->load_model(this->supported_models.get_model_path(new_tag), model_info, this->ctx_length, this->preemption);

this->generate_limit = -1;
Expand Down
2 changes: 1 addition & 1 deletion src/runner/runner.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ typedef enum {
/// \brief Runner class
class Runner {
public:
Runner(model_list& supported_models, ModelDownloader& downloader, std::string& tag, bool asr, bool embed, int ctx_length, bool preemption);
Runner(model_list& supported_models, ModelDownloader& downloader, std::string& tag, bool asr, bool embed, int ctx_length, int resize, bool preemption);
void run();
private:
std::string tag;
Expand Down
5 changes: 3 additions & 2 deletions src/server/rest_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,8 @@ static json normalize_template(json messages) {
///@param downloader the downloader
///@param default_tag the default tag
///@return the rest handler
RestHandler::RestHandler(model_list& models, ModelDownloader& downloader, const std::string& default_tag, bool asr, bool embed, int ctx_length, bool preemption)
: supported_models(models), downloader(downloader), default_model_tag(default_tag), current_model_tag(""), asr(asr), embed(embed), preemption(preemption){
RestHandler::RestHandler(model_list& models, ModelDownloader& downloader, const std::string& default_tag, bool asr, bool embed, int ctx_length, int resize, bool preemption)
: supported_models(models), downloader(downloader), default_model_tag(default_tag), current_model_tag(""), asr(asr), embed(embed), resize(resize), preemption(preemption){
this->npu_device_inst = xrt::device(0);

if (ctx_length != -1) {
Expand Down Expand Up @@ -207,6 +207,7 @@ void RestHandler::ensure_model_loaded(const std::string& model_tag) {
downloader.pull_model(ensure_tag);
}
auto [new_ensure_tag, model_info] = supported_models.get_model_info(ensure_tag);
auto_chat_engine->set_special_flags(resize);
auto_chat_engine->load_model(supported_models.get_model_path(new_ensure_tag), model_info, ctx_length, preemption);
current_model_tag = ensure_tag;
}
Expand Down
3 changes: 2 additions & 1 deletion src/server/rest_handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ using StreamResponseCallback = std::function<void(const json&, bool)>; // data,

class RestHandler {
public:
RestHandler(model_list& models, ModelDownloader& downloader, const std::string& default_tag, bool asr, bool embed, int ctx_length = -1, bool preemption = false);
RestHandler(model_list& models, ModelDownloader& downloader, const std::string& default_tag, bool asr, bool embed, int ctx_length = -1, int resize = 0, bool preemption = false);
~RestHandler();

void handle_show(const json& request,
Expand Down Expand Up @@ -127,6 +127,7 @@ class RestHandler {
int generate_context_id;
int chat_context_id;
int ctx_length;
int resize;
std::string last_question;
bool preemption;
PromptCache prompt_cache;
Expand Down
4 changes: 2 additions & 2 deletions src/server/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -741,9 +741,9 @@ bool WebServer::handle_request(http::request<http::string_body>& req,
///@param default_tag the default tag
///@param port the port
///@return the server
std::unique_ptr<WebServer> create_lm_server(model_list& models, ModelDownloader& downloader, const std::string& default_tag, bool asr, bool embed, std::string host, int port, int ctx_length, bool cors, bool preemption) {
std::unique_ptr<WebServer> create_lm_server(model_list& models, ModelDownloader& downloader, const std::string& default_tag, bool asr, bool embed, std::string host, int port, int ctx_length, int resize, bool cors, bool preemption) {
auto server = std::make_unique<WebServer>(host, port, cors);
auto rest_handler = std::make_shared<RestHandler>(models, downloader, default_tag, asr, embed, ctx_length);
auto rest_handler = std::make_shared<RestHandler>(models, downloader, default_tag, asr, embed, ctx_length, resize);

// Register Ollama-compatible routes
server->register_handler("POST", "/api/show",
Expand Down
7 changes: 4 additions & 3 deletions src/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ void handle_user_input() {
///@param default_tag the default tag
///@param port the port to listen on, default is 52625, same with the ollama server
///@return the server
std::unique_ptr<WebServer> create_lm_server(model_list& models, ModelDownloader& downloader, const std::string& default_tag, bool asr, bool embed, std::string host, int port, int ctx_length, bool cors, bool preemption);
std::unique_ptr<WebServer> create_lm_server(model_list& models, ModelDownloader& downloader, const std::string& default_tag, bool asr, bool embed, std::string host, int port, int ctx_length, int resize, bool cors, bool preemption);


///@brief get_server_port gets the server port from environment variable FLM_SERVE_PORT
Expand Down Expand Up @@ -264,6 +264,7 @@ int main(int argc, char* argv[]) {
std::string power_mode = parsed_args.power_mode;
bool got_power_mode = (power_mode != "performance"); // Check if user explicitly set power mode
int ctx_length = parsed_args.ctx_length;
int resize = parsed_args.resize;
bool preemption = parsed_args.preemption;
size_t max_socket_connections = parsed_args.max_socket_connections;
size_t max_npu_queue = parsed_args.max_npu_queue;
Expand Down Expand Up @@ -332,14 +333,14 @@ int main(int argc, char* argv[]) {
}
else if (command == "run") {
check_and_notify_new_version();
Runner runner(availble_models, downloader, tag, asr, embed, ctx_length, preemption);
Runner runner(availble_models, downloader, tag, asr, embed, ctx_length, resize, preemption);
runner.run();

} else if (command == "serve") {
check_and_notify_new_version();
// Create the server
int port = utils::get_server_port(user_port);
auto server = create_lm_server(availble_models, downloader, tag, asr, embed, user_host, port, ctx_length, cors, preemption);
auto server = create_lm_server(availble_models, downloader, tag, asr, embed, user_host, port, ctx_length, resize, cors, preemption);
server->set_max_connections(max_socket_connections); // Allow up to 10 concurrent connections
server->set_io_threads(10); // Allow up to 5 io threads
server->set_npu_queue_length(max_npu_queue); // Allow up to 10 concurrent queue
Expand Down